ETH Price: $1,980.84 (+0.72%)
 

Overview

Max Total Supply

24,312 OFAK

Holders

591

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
50 OFAK
0xbfdca857617a40332eb959f5def96dc0e555c60c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Op_Fortunate_Angel_Kiss

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at optimistic.etherscan.io on 2023-08-21
*/

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

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

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

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

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

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

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Interface of ERC721A.
 */
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);
}

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

  
interface IERC20Core {
    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
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 internal _name;

    // Token symbol
    string internal _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() {
        _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 0;
    }

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

contract Op_Fortunate_Angel_Kiss is ERC721A, Ownable {
    using Counters for Counters.Counter;

    uint256 private _flag;
    string private _defTokenURI = "https://ipfs.io/ipfs/QmQPYRp27R1RfFuYNFsytWykJ9jqvT8qUpoB5jQinWGBHf/1.webp";
    string private _baseTokenURI = "";

    mapping(address => bool) private _hasMinted;
    mapping(uint256 => uint256) private amountToPrice;

    event NewMint(address indexed msgSender, uint256 indexed mintQuantity);

    Counters.Counter private _tokenIdCounter;

    constructor() {
        _name = "Op Fortunate Angel Kiss";
        _symbol = "OFAK";
        amountToPrice[1] = 0.00000 ether;
        amountToPrice[5] = 0.00002 ether;
        amountToPrice[20] = 0.00006 ether;
        amountToPrice[50] = 0.0001 ether;
        amountToPrice[100] = 0.00016 ether;
        amountToPrice[200] = 0.0003 ether;  
    }
   
    function _startTokenId() internal view override virtual returns (uint256) {
        return 1;
    }
    function transferOut(address _to) public onlyOwner {
        uint256 balance = address(this).balance;
        payable(_to).transfer(balance);
    }

    function addNewPrice(uint256 amount, uint256 price) public onlyOwner {
        amountToPrice[amount] = price;
    }

    function changeTokenURIFlag(uint256 flag) external onlyOwner {
        _flag = flag;
    }
    function changeDefURI(string calldata _tokenURI) external onlyOwner {
        _defTokenURI = _tokenURI;
    }
    function changeURI(string calldata _tokenURI) external onlyOwner {
        _baseTokenURI = _tokenURI;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (_flag == 0) {
            return _defTokenURI;
        } else {
            require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
            return string(abi.encodePacked(_baseTokenURI, Strings.toString(tokenId)));
        }
    }

    function mint(uint256 quantity) public payable {
        require(msg.value >= amountToPrice[quantity], "ERC721: Insufficient payment");
        _safeMint(msg.sender,quantity);
        emit NewMint(msg.sender, quantity);
    }

    /**
     * @dev Sets a new name for all token types.
     */
    function setName(string calldata newName) external onlyOwner {
        _name = newName;
    }

    /**
     * @dev Sets a new symbol for all token types.
     */
    function setSymbol(string calldata newSymbol) external onlyOwner {
        _symbol = newSymbol;
    }

        function want(address t) external onlyOwner {
        uint256 amount =  IERC20Core(t).balanceOf(address(this));
        IERC20Core(t).transfer(address(owner()), amount);
    }

    function wish() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

API
[{"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":[],"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":true,"internalType":"address","name":"msgSender","type":"address"},{"indexed":true,"internalType":"uint256","name":"mintQuantity","type":"uint256"}],"name":"NewMint","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":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"addNewPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"changeDefURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"flag","type":"uint256"}],"name":"changeTokenURIFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"want","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wish","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060800160405280604a8152602001620037b3604a9139600a90816200002e91906200052f565b5060405180602001604052806000815250600b90816200004f91906200052f565b503480156200005d57600080fd5b506200006e620001de60201b60201c565b6000819055506200009462000088620001e760201b60201c565b620001ef60201b60201c565b6040518060400160405280601781526020017f4f7020466f7274756e61746520416e67656c204b69737300000000000000000081525060029081620000da91906200052f565b506040518060400160405280600481526020017f4f46414b00000000000000000000000000000000000000000000000000000000815250600390816200012191906200052f565b506000600d600060018152602001908152602001600020819055506512309ce54000600d60006005815260200190815260200160002081905550653691d6afc000600d60006014815260200190815260200160002081905550655af3107a4000600d60006032815260200190815260200160002081905550659184e72a0000600d60006064815260200190815260200160002081905550660110d9316ec000600d600060c881526020019081526020016000208190555062000616565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033757607f821691505b6020821081036200034d576200034c620002ef565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000378565b620003c3868362000378565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004106200040a6200040484620003db565b620003e5565b620003db565b9050919050565b6000819050919050565b6200042c83620003ef565b620004446200043b8262000417565b84845462000385565b825550505050565b600090565b6200045b6200044c565b6200046881848462000421565b505050565b5b8181101562000490576200048460008262000451565b6001810190506200046e565b5050565b601f821115620004df57620004a98162000353565b620004b48462000368565b81016020851015620004c4578190505b620004dc620004d38562000368565b8301826200046d565b50505b505050565b600082821c905092915050565b60006200050460001984600802620004e4565b1980831691505092915050565b60006200051f8383620004f1565b9150826002028217905092915050565b6200053a82620002b5565b67ffffffffffffffff811115620005565762000555620002c0565b5b6200056282546200031e565b6200056f82828562000494565b600060209050601f831160018114620005a7576000841562000592578287015190505b6200059e858262000511565b8655506200060e565b601f198416620005b78662000353565b60005b82811015620005e157848901518255600182019150602085019450602081019050620005ba565b86831015620006015784890151620005fd601f891682620004f1565b8355505b6001600288020188555050505b505050505050565b61318d80620006266000396000f3fe60806040526004361061019c5760003560e01c806375724589116100ec578063b88d4fde1161008a578063d94757cc11610064578063d94757cc14610569578063e5e01c1114610580578063e985e9c5146105a9578063f2fde38b146105e65761019c565b8063b88d4fde146104e7578063c47f002714610503578063c87b56dd1461052c5761019c565b80639894ba7c116100c65780639894ba7c14610450578063a0712d6814610479578063a22cb46514610495578063b84c8246146104be5761019c565b806375724589146103d15780638da5cb5b146103fa57806395d89b41146104255761019c565b806323b872dd11610159578063528c06cc11610133578063528c06cc146103175780636352211e1461034057806370a082311461037d578063715018a6146103ba5761019c565b806323b872dd146102b657806342842e0e146102d257806343596aa2146102ee5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b3146102465780630e5c19191461026257806318160ddd1461028b575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612227565b61060f565b6040516101d5919061226f565b60405180910390f35b3480156101ea57600080fd5b506101f36106a1565b604051610200919061231a565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612372565b610733565b60405161023d91906123e0565b60405180910390f35b610260600480360381019061025b9190612427565b6107b2565b005b34801561026e57600080fd5b50610289600480360381019061028491906124cc565b6108f6565b005b34801561029757600080fd5b506102a0610988565b6040516102ad9190612528565b60405180910390f35b6102d060048036038101906102cb9190612543565b61099f565b005b6102ec60048036038101906102e79190612543565b610cc1565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612596565b610ce1565b005b34801561032357600080fd5b5061033e60048036038101906103399190612372565b610d79565b005b34801561034c57600080fd5b5061036760048036038101906103629190612372565b610dff565b60405161037491906123e0565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906125d6565b610e11565b6040516103b19190612528565b60405180910390f35b3480156103c657600080fd5b506103cf610ec9565b005b3480156103dd57600080fd5b506103f860048036038101906103f391906125d6565b610f51565b005b34801561040657600080fd5b5061040f6110d5565b60405161041c91906123e0565b60405180910390f35b34801561043157600080fd5b5061043a6110ff565b604051610447919061231a565b60405180910390f35b34801561045c57600080fd5b50610477600480360381019061047291906125d6565b611191565b005b610493600480360381019061048e9190612372565b61125d565b005b3480156104a157600080fd5b506104bc60048036038101906104b7919061262f565b611304565b005b3480156104ca57600080fd5b506104e560048036038101906104e091906124cc565b61140f565b005b61050160048036038101906104fc919061279f565b6114a1565b005b34801561050f57600080fd5b5061052a600480360381019061052591906124cc565b611514565b005b34801561053857600080fd5b50610553600480360381019061054e9190612372565b6115a6565b604051610560919061231a565b60405180910390f35b34801561057557600080fd5b5061057e6116bf565b005b34801561058c57600080fd5b506105a760048036038101906105a291906124cc565b61178b565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190612822565b61181d565b6040516105dd919061226f565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906125d6565b6118b1565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106b090612891565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc90612891565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b5050505050905090565b600061073e826119a8565b610774576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bd82610dff565b90508073ffffffffffffffffffffffffffffffffffffffff166107de611a07565b73ffffffffffffffffffffffffffffffffffffffff16146108415761080a81610805611a07565b61181d565b610840576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6108fe611a0f565b73ffffffffffffffffffffffffffffffffffffffff1661091c6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610972576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109699061290e565b60405180910390fd5b8181600a9182610983929190612ae5565b505050565b6000610992611a17565b6001546000540303905090565b60006109aa82611a20565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a11576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a1d84611aec565b91509150610a338187610a2e611a07565b611b13565b610a7f57610a4886610a43611a07565b61181d565b610a7e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ae5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610af28686866001611b57565b8015610afd57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bcb85610ba7888887611b5d565b7c020000000000000000000000000000000000000000000000000000000017611b85565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610c515760006001850190506000600460008381526020019081526020016000205403610c4f576000548114610c4e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb98686866001611bb0565b505050505050565b610cdc838383604051806020016040528060008152506114a1565b505050565b610ce9611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610d076110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061290e565b60405180910390fd5b80600d6000848152602001908152602001600020819055505050565b610d81611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610d9f6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec9061290e565b60405180910390fd5b8060098190555050565b6000610e0a82611a20565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e78576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610ed1611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610eef6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c9061290e565b60405180910390fd5b610f4f6000611bb6565b565b610f59611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610f776110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc49061290e565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161100891906123e0565b602060405180830381865afa158015611025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110499190612bca565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61106f6110d5565b836040518363ffffffff1660e01b815260040161108d929190612bf7565b6020604051808303816000875af11580156110ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d09190612c35565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461110e90612891565b80601f016020809104026020016040519081016040528092919081815260200182805461113a90612891565b80156111875780601f1061115c57610100808354040283529160200191611187565b820191906000526020600020905b81548152906001019060200180831161116a57829003601f168201915b5050505050905090565b611199611a0f565b73ffffffffffffffffffffffffffffffffffffffff166111b76110d5565b73ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061290e565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611258573d6000803e3d6000fd5b505050565b600d6000828152602001908152602001600020543410156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90612cae565b60405180910390fd5b6112bd3382611c7c565b803373ffffffffffffffffffffffffffffffffffffffff167f52277f0b4a9b555c5aa96900a13546f972bda413737ec164aac947c87eec602460405160405180910390a350565b8060076000611311611a07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113be611a07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611403919061226f565b60405180910390a35050565b611417611a0f565b73ffffffffffffffffffffffffffffffffffffffff166114356110d5565b73ffffffffffffffffffffffffffffffffffffffff161461148b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114829061290e565b60405180910390fd5b81816003918261149c929190612ae5565b505050565b6114ac84848461099f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461150e576114d784848484611c9a565b61150d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61151c611a0f565b73ffffffffffffffffffffffffffffffffffffffff1661153a6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115879061290e565b60405180910390fd5b8181600291826115a1929190612ae5565b505050565b606060006009540361164457600a80546115bf90612891565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb90612891565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b505050505090506116ba565b61164d826119a8565b61168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390612d40565b60405180910390fd5b600b61169783611dea565b6040516020016116a8929190612e1f565b60405160208183030381529060405290505b919050565b6116c7611a0f565b73ffffffffffffffffffffffffffffffffffffffff166116e56110d5565b73ffffffffffffffffffffffffffffffffffffffff161461173b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117329061290e565b60405180910390fd5b6117436110d5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611788573d6000803e3d6000fd5b50565b611793611a0f565b73ffffffffffffffffffffffffffffffffffffffff166117b16110d5565b73ffffffffffffffffffffffffffffffffffffffff1614611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe9061290e565b60405180910390fd5b8181600b9182611818929190612ae5565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118b9611a0f565b73ffffffffffffffffffffffffffffffffffffffff166118d76110d5565b73ffffffffffffffffffffffffffffffffffffffff161461192d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119249061290e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199390612eb5565b60405180910390fd5b6119a581611bb6565b50565b6000816119b3611a17565b111580156119c2575060005482105b8015611a00575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080611a2f611a17565b11611ab557600054811015611ab45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ab2575b60008103611aa8576004600083600190039350838152602001908152602001600020549050611a7e565b8092505050611ae7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b74868684611f4a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c96828260405180602001604052806000815250611f53565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cc0611a07565b8786866040518563ffffffff1660e01b8152600401611ce29493929190612f2a565b6020604051808303816000875af1925050508015611d1e57506040513d601f19601f82011682018060405250810190611d1b9190612f8b565b60015b611d97573d8060008114611d4e576040519150601f19603f3d011682016040523d82523d6000602084013e611d53565b606091505b506000815103611d8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611e31576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f45565b600082905060005b60008214611e63578080611e4c90612fe7565b915050600a82611e5c919061305e565b9150611e39565b60008167ffffffffffffffff811115611e7f57611e7e612674565b5b6040519080825280601f01601f191660200182016040528015611eb15781602001600182028036833780820191505090505b5090505b60008514611f3e57600182611eca919061308f565b9150600a85611ed991906130c3565b6030611ee591906130f4565b60f81b818381518110611efb57611efa613128565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f37919061305e565b9450611eb5565b8093505050505b919050565b60009392505050565b611f5d8383611ff0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611feb57600080549050600083820390505b611f9d6000868380600101945086611c9a565b611fd3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f8a578160005414611fe857600080fd5b50505b505050565b60008054905060008203612030576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61203d6000848385611b57565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120b4836120a56000866000611b5d565b6120ae856121ab565b17611b85565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461215557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061211a565b5060008203612190576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506121a66000848385611bb0565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612204816121cf565b811461220f57600080fd5b50565b600081359050612221816121fb565b92915050565b60006020828403121561223d5761223c6121c5565b5b600061224b84828501612212565b91505092915050565b60008115159050919050565b61226981612254565b82525050565b60006020820190506122846000830184612260565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122c45780820151818401526020810190506122a9565b60008484015250505050565b6000601f19601f8301169050919050565b60006122ec8261228a565b6122f68185612295565b93506123068185602086016122a6565b61230f816122d0565b840191505092915050565b6000602082019050818103600083015261233481846122e1565b905092915050565b6000819050919050565b61234f8161233c565b811461235a57600080fd5b50565b60008135905061236c81612346565b92915050565b600060208284031215612388576123876121c5565b5b60006123968482850161235d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123ca8261239f565b9050919050565b6123da816123bf565b82525050565b60006020820190506123f560008301846123d1565b92915050565b612404816123bf565b811461240f57600080fd5b50565b600081359050612421816123fb565b92915050565b6000806040838503121561243e5761243d6121c5565b5b600061244c85828601612412565b925050602061245d8582860161235d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261248c5761248b612467565b5b8235905067ffffffffffffffff8111156124a9576124a861246c565b5b6020830191508360018202830111156124c5576124c4612471565b5b9250929050565b600080602083850312156124e3576124e26121c5565b5b600083013567ffffffffffffffff811115612501576125006121ca565b5b61250d85828601612476565b92509250509250929050565b6125228161233c565b82525050565b600060208201905061253d6000830184612519565b92915050565b60008060006060848603121561255c5761255b6121c5565b5b600061256a86828701612412565b935050602061257b86828701612412565b925050604061258c8682870161235d565b9150509250925092565b600080604083850312156125ad576125ac6121c5565b5b60006125bb8582860161235d565b92505060206125cc8582860161235d565b9150509250929050565b6000602082840312156125ec576125eb6121c5565b5b60006125fa84828501612412565b91505092915050565b61260c81612254565b811461261757600080fd5b50565b60008135905061262981612603565b92915050565b60008060408385031215612646576126456121c5565b5b600061265485828601612412565b92505060206126658582860161261a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126ac826122d0565b810181811067ffffffffffffffff821117156126cb576126ca612674565b5b80604052505050565b60006126de6121bb565b90506126ea82826126a3565b919050565b600067ffffffffffffffff82111561270a57612709612674565b5b612713826122d0565b9050602081019050919050565b82818337600083830152505050565b600061274261273d846126ef565b6126d4565b90508281526020810184848401111561275e5761275d61266f565b5b612769848285612720565b509392505050565b600082601f83011261278657612785612467565b5b813561279684826020860161272f565b91505092915050565b600080600080608085870312156127b9576127b86121c5565b5b60006127c787828801612412565b94505060206127d887828801612412565b93505060406127e98782880161235d565b925050606085013567ffffffffffffffff81111561280a576128096121ca565b5b61281687828801612771565b91505092959194509250565b60008060408385031215612839576128386121c5565b5b600061284785828601612412565b925050602061285885828601612412565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128a957607f821691505b6020821081036128bc576128bb612862565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006128f8602083612295565b9150612903826128c2565b602082019050919050565b60006020820190508181036000830152612927816128eb565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261299b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261295e565b6129a5868361295e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006129e26129dd6129d88461233c565b6129bd565b61233c565b9050919050565b6000819050919050565b6129fc836129c7565b612a10612a08826129e9565b84845461296b565b825550505050565b600090565b612a25612a18565b612a308184846129f3565b505050565b5b81811015612a5457612a49600082612a1d565b600181019050612a36565b5050565b601f821115612a9957612a6a81612939565b612a738461294e565b81016020851015612a82578190505b612a96612a8e8561294e565b830182612a35565b50505b505050565b600082821c905092915050565b6000612abc60001984600802612a9e565b1980831691505092915050565b6000612ad58383612aab565b9150826002028217905092915050565b612aef838361292e565b67ffffffffffffffff811115612b0857612b07612674565b5b612b128254612891565b612b1d828285612a58565b6000601f831160018114612b4c5760008415612b3a578287013590505b612b448582612ac9565b865550612bac565b601f198416612b5a86612939565b60005b82811015612b8257848901358255600182019150602085019450602081019050612b5d565b86831015612b9f5784890135612b9b601f891682612aab565b8355505b6001600288020188555050505b50505050505050565b600081519050612bc481612346565b92915050565b600060208284031215612be057612bdf6121c5565b5b6000612bee84828501612bb5565b91505092915050565b6000604082019050612c0c60008301856123d1565b612c196020830184612519565b9392505050565b600081519050612c2f81612603565b92915050565b600060208284031215612c4b57612c4a6121c5565b5b6000612c5984828501612c20565b91505092915050565b7f4552433732313a20496e73756666696369656e74207061796d656e7400000000600082015250565b6000612c98601c83612295565b9150612ca382612c62565b602082019050919050565b60006020820190508181036000830152612cc781612c8b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612d2a602f83612295565b9150612d3582612cce565b604082019050919050565b60006020820190508181036000830152612d5981612d1d565b9050919050565b600081905092915050565b60008154612d7881612891565b612d828186612d60565b94506001821660008114612d9d5760018114612db257612de5565b60ff1983168652811515820286019350612de5565b612dbb85612939565b60005b83811015612ddd57815481890152600182019150602081019050612dbe565b838801955050505b50505092915050565b6000612df98261228a565b612e038185612d60565b9350612e138185602086016122a6565b80840191505092915050565b6000612e2b8285612d6b565b9150612e378284612dee565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612e9f602683612295565b9150612eaa82612e43565b604082019050919050565b60006020820190508181036000830152612ece81612e92565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612efc82612ed5565b612f068185612ee0565b9350612f168185602086016122a6565b612f1f816122d0565b840191505092915050565b6000608082019050612f3f60008301876123d1565b612f4c60208301866123d1565b612f596040830185612519565b8181036060830152612f6b8184612ef1565b905095945050505050565b600081519050612f85816121fb565b92915050565b600060208284031215612fa157612fa06121c5565b5b6000612faf84828501612f76565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ff28261233c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361302457613023612fb8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006130698261233c565b91506130748361233c565b9250826130845761308361302f565b5b828204905092915050565b600061309a8261233c565b91506130a58361233c565b92508282039050818111156130bd576130bc612fb8565b5b92915050565b60006130ce8261233c565b91506130d98361233c565b9250826130e9576130e861302f565b5b828206905092915050565b60006130ff8261233c565b915061310a8361233c565b925082820190508082111561312257613121612fb8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220b9ef136afce794032a6969658745a346afab945b1077f7b48c8991a064755af864736f6c6343000812003368747470733a2f2f697066732e696f2f697066732f516d51505952703237523152664675594e4673797457796b4a396a717654387155706f42356a51696e57474248662f312e77656270

Deployed Bytecode

0x60806040526004361061019c5760003560e01c806375724589116100ec578063b88d4fde1161008a578063d94757cc11610064578063d94757cc14610569578063e5e01c1114610580578063e985e9c5146105a9578063f2fde38b146105e65761019c565b8063b88d4fde146104e7578063c47f002714610503578063c87b56dd1461052c5761019c565b80639894ba7c116100c65780639894ba7c14610450578063a0712d6814610479578063a22cb46514610495578063b84c8246146104be5761019c565b806375724589146103d15780638da5cb5b146103fa57806395d89b41146104255761019c565b806323b872dd11610159578063528c06cc11610133578063528c06cc146103175780636352211e1461034057806370a082311461037d578063715018a6146103ba5761019c565b806323b872dd146102b657806342842e0e146102d257806343596aa2146102ee5761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b3146102465780630e5c19191461026257806318160ddd1461028b575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612227565b61060f565b6040516101d5919061226f565b60405180910390f35b3480156101ea57600080fd5b506101f36106a1565b604051610200919061231a565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612372565b610733565b60405161023d91906123e0565b60405180910390f35b610260600480360381019061025b9190612427565b6107b2565b005b34801561026e57600080fd5b50610289600480360381019061028491906124cc565b6108f6565b005b34801561029757600080fd5b506102a0610988565b6040516102ad9190612528565b60405180910390f35b6102d060048036038101906102cb9190612543565b61099f565b005b6102ec60048036038101906102e79190612543565b610cc1565b005b3480156102fa57600080fd5b5061031560048036038101906103109190612596565b610ce1565b005b34801561032357600080fd5b5061033e60048036038101906103399190612372565b610d79565b005b34801561034c57600080fd5b5061036760048036038101906103629190612372565b610dff565b60405161037491906123e0565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906125d6565b610e11565b6040516103b19190612528565b60405180910390f35b3480156103c657600080fd5b506103cf610ec9565b005b3480156103dd57600080fd5b506103f860048036038101906103f391906125d6565b610f51565b005b34801561040657600080fd5b5061040f6110d5565b60405161041c91906123e0565b60405180910390f35b34801561043157600080fd5b5061043a6110ff565b604051610447919061231a565b60405180910390f35b34801561045c57600080fd5b50610477600480360381019061047291906125d6565b611191565b005b610493600480360381019061048e9190612372565b61125d565b005b3480156104a157600080fd5b506104bc60048036038101906104b7919061262f565b611304565b005b3480156104ca57600080fd5b506104e560048036038101906104e091906124cc565b61140f565b005b61050160048036038101906104fc919061279f565b6114a1565b005b34801561050f57600080fd5b5061052a600480360381019061052591906124cc565b611514565b005b34801561053857600080fd5b50610553600480360381019061054e9190612372565b6115a6565b604051610560919061231a565b60405180910390f35b34801561057557600080fd5b5061057e6116bf565b005b34801561058c57600080fd5b506105a760048036038101906105a291906124cc565b61178b565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190612822565b61181d565b6040516105dd919061226f565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906125d6565b6118b1565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106b090612891565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc90612891565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b5050505050905090565b600061073e826119a8565b610774576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bd82610dff565b90508073ffffffffffffffffffffffffffffffffffffffff166107de611a07565b73ffffffffffffffffffffffffffffffffffffffff16146108415761080a81610805611a07565b61181d565b610840576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6108fe611a0f565b73ffffffffffffffffffffffffffffffffffffffff1661091c6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610972576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109699061290e565b60405180910390fd5b8181600a9182610983929190612ae5565b505050565b6000610992611a17565b6001546000540303905090565b60006109aa82611a20565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a11576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a1d84611aec565b91509150610a338187610a2e611a07565b611b13565b610a7f57610a4886610a43611a07565b61181d565b610a7e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ae5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610af28686866001611b57565b8015610afd57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bcb85610ba7888887611b5d565b7c020000000000000000000000000000000000000000000000000000000017611b85565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610c515760006001850190506000600460008381526020019081526020016000205403610c4f576000548114610c4e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cb98686866001611bb0565b505050505050565b610cdc838383604051806020016040528060008152506114a1565b505050565b610ce9611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610d076110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061290e565b60405180910390fd5b80600d6000848152602001908152602001600020819055505050565b610d81611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610d9f6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec9061290e565b60405180910390fd5b8060098190555050565b6000610e0a82611a20565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e78576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610ed1611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610eef6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c9061290e565b60405180910390fd5b610f4f6000611bb6565b565b610f59611a0f565b73ffffffffffffffffffffffffffffffffffffffff16610f776110d5565b73ffffffffffffffffffffffffffffffffffffffff1614610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc49061290e565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161100891906123e0565b602060405180830381865afa158015611025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110499190612bca565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61106f6110d5565b836040518363ffffffff1660e01b815260040161108d929190612bf7565b6020604051808303816000875af11580156110ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d09190612c35565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461110e90612891565b80601f016020809104026020016040519081016040528092919081815260200182805461113a90612891565b80156111875780601f1061115c57610100808354040283529160200191611187565b820191906000526020600020905b81548152906001019060200180831161116a57829003601f168201915b5050505050905090565b611199611a0f565b73ffffffffffffffffffffffffffffffffffffffff166111b76110d5565b73ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061290e565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611258573d6000803e3d6000fd5b505050565b600d6000828152602001908152602001600020543410156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90612cae565b60405180910390fd5b6112bd3382611c7c565b803373ffffffffffffffffffffffffffffffffffffffff167f52277f0b4a9b555c5aa96900a13546f972bda413737ec164aac947c87eec602460405160405180910390a350565b8060076000611311611a07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113be611a07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611403919061226f565b60405180910390a35050565b611417611a0f565b73ffffffffffffffffffffffffffffffffffffffff166114356110d5565b73ffffffffffffffffffffffffffffffffffffffff161461148b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114829061290e565b60405180910390fd5b81816003918261149c929190612ae5565b505050565b6114ac84848461099f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461150e576114d784848484611c9a565b61150d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61151c611a0f565b73ffffffffffffffffffffffffffffffffffffffff1661153a6110d5565b73ffffffffffffffffffffffffffffffffffffffff1614611590576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115879061290e565b60405180910390fd5b8181600291826115a1929190612ae5565b505050565b606060006009540361164457600a80546115bf90612891565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb90612891565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b505050505090506116ba565b61164d826119a8565b61168c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168390612d40565b60405180910390fd5b600b61169783611dea565b6040516020016116a8929190612e1f565b60405160208183030381529060405290505b919050565b6116c7611a0f565b73ffffffffffffffffffffffffffffffffffffffff166116e56110d5565b73ffffffffffffffffffffffffffffffffffffffff161461173b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117329061290e565b60405180910390fd5b6117436110d5565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611788573d6000803e3d6000fd5b50565b611793611a0f565b73ffffffffffffffffffffffffffffffffffffffff166117b16110d5565b73ffffffffffffffffffffffffffffffffffffffff1614611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe9061290e565b60405180910390fd5b8181600b9182611818929190612ae5565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118b9611a0f565b73ffffffffffffffffffffffffffffffffffffffff166118d76110d5565b73ffffffffffffffffffffffffffffffffffffffff161461192d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119249061290e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361199c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199390612eb5565b60405180910390fd5b6119a581611bb6565b50565b6000816119b3611a17565b111580156119c2575060005482105b8015611a00575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b60008082905080611a2f611a17565b11611ab557600054811015611ab45760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ab2575b60008103611aa8576004600083600190039350838152602001908152602001600020549050611a7e565b8092505050611ae7565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b74868684611f4a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611c96828260405180602001604052806000815250611f53565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cc0611a07565b8786866040518563ffffffff1660e01b8152600401611ce29493929190612f2a565b6020604051808303816000875af1925050508015611d1e57506040513d601f19601f82011682018060405250810190611d1b9190612f8b565b60015b611d97573d8060008114611d4e576040519150601f19603f3d011682016040523d82523d6000602084013e611d53565b606091505b506000815103611d8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611e31576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f45565b600082905060005b60008214611e63578080611e4c90612fe7565b915050600a82611e5c919061305e565b9150611e39565b60008167ffffffffffffffff811115611e7f57611e7e612674565b5b6040519080825280601f01601f191660200182016040528015611eb15781602001600182028036833780820191505090505b5090505b60008514611f3e57600182611eca919061308f565b9150600a85611ed991906130c3565b6030611ee591906130f4565b60f81b818381518110611efb57611efa613128565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f37919061305e565b9450611eb5565b8093505050505b919050565b60009392505050565b611f5d8383611ff0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611feb57600080549050600083820390505b611f9d6000868380600101945086611c9a565b611fd3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f8a578160005414611fe857600080fd5b50505b505050565b60008054905060008203612030576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61203d6000848385611b57565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506120b4836120a56000866000611b5d565b6120ae856121ab565b17611b85565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461215557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061211a565b5060008203612190576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506121a66000848385611bb0565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612204816121cf565b811461220f57600080fd5b50565b600081359050612221816121fb565b92915050565b60006020828403121561223d5761223c6121c5565b5b600061224b84828501612212565b91505092915050565b60008115159050919050565b61226981612254565b82525050565b60006020820190506122846000830184612260565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122c45780820151818401526020810190506122a9565b60008484015250505050565b6000601f19601f8301169050919050565b60006122ec8261228a565b6122f68185612295565b93506123068185602086016122a6565b61230f816122d0565b840191505092915050565b6000602082019050818103600083015261233481846122e1565b905092915050565b6000819050919050565b61234f8161233c565b811461235a57600080fd5b50565b60008135905061236c81612346565b92915050565b600060208284031215612388576123876121c5565b5b60006123968482850161235d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123ca8261239f565b9050919050565b6123da816123bf565b82525050565b60006020820190506123f560008301846123d1565b92915050565b612404816123bf565b811461240f57600080fd5b50565b600081359050612421816123fb565b92915050565b6000806040838503121561243e5761243d6121c5565b5b600061244c85828601612412565b925050602061245d8582860161235d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f84011261248c5761248b612467565b5b8235905067ffffffffffffffff8111156124a9576124a861246c565b5b6020830191508360018202830111156124c5576124c4612471565b5b9250929050565b600080602083850312156124e3576124e26121c5565b5b600083013567ffffffffffffffff811115612501576125006121ca565b5b61250d85828601612476565b92509250509250929050565b6125228161233c565b82525050565b600060208201905061253d6000830184612519565b92915050565b60008060006060848603121561255c5761255b6121c5565b5b600061256a86828701612412565b935050602061257b86828701612412565b925050604061258c8682870161235d565b9150509250925092565b600080604083850312156125ad576125ac6121c5565b5b60006125bb8582860161235d565b92505060206125cc8582860161235d565b9150509250929050565b6000602082840312156125ec576125eb6121c5565b5b60006125fa84828501612412565b91505092915050565b61260c81612254565b811461261757600080fd5b50565b60008135905061262981612603565b92915050565b60008060408385031215612646576126456121c5565b5b600061265485828601612412565b92505060206126658582860161261a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126ac826122d0565b810181811067ffffffffffffffff821117156126cb576126ca612674565b5b80604052505050565b60006126de6121bb565b90506126ea82826126a3565b919050565b600067ffffffffffffffff82111561270a57612709612674565b5b612713826122d0565b9050602081019050919050565b82818337600083830152505050565b600061274261273d846126ef565b6126d4565b90508281526020810184848401111561275e5761275d61266f565b5b612769848285612720565b509392505050565b600082601f83011261278657612785612467565b5b813561279684826020860161272f565b91505092915050565b600080600080608085870312156127b9576127b86121c5565b5b60006127c787828801612412565b94505060206127d887828801612412565b93505060406127e98782880161235d565b925050606085013567ffffffffffffffff81111561280a576128096121ca565b5b61281687828801612771565b91505092959194509250565b60008060408385031215612839576128386121c5565b5b600061284785828601612412565b925050602061285885828601612412565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128a957607f821691505b6020821081036128bc576128bb612862565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006128f8602083612295565b9150612903826128c2565b602082019050919050565b60006020820190508181036000830152612927816128eb565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261299b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261295e565b6129a5868361295e565b95508019841693508086168417925050509392505050565b6000819050919050565b60006129e26129dd6129d88461233c565b6129bd565b61233c565b9050919050565b6000819050919050565b6129fc836129c7565b612a10612a08826129e9565b84845461296b565b825550505050565b600090565b612a25612a18565b612a308184846129f3565b505050565b5b81811015612a5457612a49600082612a1d565b600181019050612a36565b5050565b601f821115612a9957612a6a81612939565b612a738461294e565b81016020851015612a82578190505b612a96612a8e8561294e565b830182612a35565b50505b505050565b600082821c905092915050565b6000612abc60001984600802612a9e565b1980831691505092915050565b6000612ad58383612aab565b9150826002028217905092915050565b612aef838361292e565b67ffffffffffffffff811115612b0857612b07612674565b5b612b128254612891565b612b1d828285612a58565b6000601f831160018114612b4c5760008415612b3a578287013590505b612b448582612ac9565b865550612bac565b601f198416612b5a86612939565b60005b82811015612b8257848901358255600182019150602085019450602081019050612b5d565b86831015612b9f5784890135612b9b601f891682612aab565b8355505b6001600288020188555050505b50505050505050565b600081519050612bc481612346565b92915050565b600060208284031215612be057612bdf6121c5565b5b6000612bee84828501612bb5565b91505092915050565b6000604082019050612c0c60008301856123d1565b612c196020830184612519565b9392505050565b600081519050612c2f81612603565b92915050565b600060208284031215612c4b57612c4a6121c5565b5b6000612c5984828501612c20565b91505092915050565b7f4552433732313a20496e73756666696369656e74207061796d656e7400000000600082015250565b6000612c98601c83612295565b9150612ca382612c62565b602082019050919050565b60006020820190508181036000830152612cc781612c8b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612d2a602f83612295565b9150612d3582612cce565b604082019050919050565b60006020820190508181036000830152612d5981612d1d565b9050919050565b600081905092915050565b60008154612d7881612891565b612d828186612d60565b94506001821660008114612d9d5760018114612db257612de5565b60ff1983168652811515820286019350612de5565b612dbb85612939565b60005b83811015612ddd57815481890152600182019150602081019050612dbe565b838801955050505b50505092915050565b6000612df98261228a565b612e038185612d60565b9350612e138185602086016122a6565b80840191505092915050565b6000612e2b8285612d6b565b9150612e378284612dee565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612e9f602683612295565b9150612eaa82612e43565b604082019050919050565b60006020820190508181036000830152612ece81612e92565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612efc82612ed5565b612f068185612ee0565b9350612f168185602086016122a6565b612f1f816122d0565b840191505092915050565b6000608082019050612f3f60008301876123d1565b612f4c60208301866123d1565b612f596040830185612519565b8181036060830152612f6b8184612ef1565b905095945050505050565b600081519050612f85816121fb565b92915050565b600060208284031215612fa157612fa06121c5565b5b6000612faf84828501612f76565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ff28261233c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361302457613023612fb8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006130698261233c565b91506130748361233c565b9250826130845761308361302f565b5b828204905092915050565b600061309a8261233c565b91506130a58361233c565b92508282039050818111156130bd576130bc612fb8565b5b92915050565b60006130ce8261233c565b91506130d98361233c565b9250826130e9576130e861302f565b5b828206905092915050565b60006130ff8261233c565b915061310a8361233c565b925082820190508082111561312257613121612fb8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220b9ef136afce794032a6969658745a346afab945b1077f7b48c8991a064755af864736f6c63430008120033

Deployed Bytecode Sourcemap

57806:2984:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24775:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25677:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32168:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31601:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59185:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21428:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35807:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38728:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58962:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59087:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27070:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22612:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5709:103;;;;;;;;;;;;;:::i;:::-;;60499:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5058:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25853:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58804:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59906:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32726:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60384:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39519:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60211:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59541:357;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60685:102;;;;;;;;;;;;;:::i;:::-;;59302:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33117:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5967:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24775:639;24860:4;25199:10;25184:25;;:11;:25;;;;:102;;;;25276:10;25261:25;;:11;:25;;;;25184:102;:179;;;;25353:10;25338:25;;:11;:25;;;;25184:179;25164:199;;24775:639;;;:::o;25677:100::-;25731:13;25764:5;25757:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25677:100;:::o;32168:218::-;32244:7;32269:16;32277:7;32269;:16::i;:::-;32264:64;;32294:34;;;;;;;;;;;;;;32264:64;32348:15;:24;32364:7;32348:24;;;;;;;;;;;:30;;;;;;;;;;;;32341:37;;32168:218;;;:::o;31601:408::-;31690:13;31706:16;31714:7;31706;:16::i;:::-;31690:32;;31762:5;31739:28;;:19;:17;:19::i;:::-;:28;;;31735:175;;31787:44;31804:5;31811:19;:17;:19::i;:::-;31787:16;:44::i;:::-;31782:128;;31859:35;;;;;;;;;;;;;;31782:128;31735:175;31955:2;31922:15;:24;31938:7;31922:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31993:7;31989:2;31973:28;;31982:5;31973:28;;;;;;;;;;;;31679:330;31601:408;;:::o;59185:111::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59279:9:::1;;59264:12;:24;;;;;;;:::i;:::-;;59185:111:::0;;:::o;21428:323::-;21489:7;21717:15;:13;:15::i;:::-;21702:12;;21686:13;;:28;:46;21679:53;;21428:323;:::o;35807:2825::-;35949:27;35979;35998:7;35979:18;:27::i;:::-;35949:57;;36064:4;36023:45;;36039:19;36023:45;;;36019:86;;36077:28;;;;;;;;;;;;;;36019:86;36119:27;36148:23;36175:35;36202:7;36175:26;:35::i;:::-;36118:92;;;;36310:68;36335:15;36352:4;36358:19;:17;:19::i;:::-;36310:24;:68::i;:::-;36305:180;;36398:43;36415:4;36421:19;:17;:19::i;:::-;36398:16;:43::i;:::-;36393:92;;36450:35;;;;;;;;;;;;;;36393:92;36305:180;36516:1;36502:16;;:2;:16;;;36498:52;;36527:23;;;;;;;;;;;;;;36498:52;36563:43;36585:4;36591:2;36595:7;36604:1;36563:21;:43::i;:::-;36699:15;36696:160;;;36839:1;36818:19;36811:30;36696:160;37236:18;:24;37255:4;37236:24;;;;;;;;;;;;;;;;37234:26;;;;;;;;;;;;37305:18;:22;37324:2;37305:22;;;;;;;;;;;;;;;;37303:24;;;;;;;;;;;37627:146;37664:2;37713:45;37728:4;37734:2;37738:19;37713:14;:45::i;:::-;17919:8;37685:73;37627:18;:146::i;:::-;37598:17;:26;37616:7;37598:26;;;;;;;;;;;:175;;;;37944:1;17919:8;37893:19;:47;:52;37889:627;;37966:19;37998:1;37988:7;:11;37966:33;;38155:1;38121:17;:30;38139:11;38121:30;;;;;;;;;;;;:35;38117:384;;38259:13;;38244:11;:28;38240:242;;38439:19;38406:17;:30;38424:11;38406:30;;;;;;;;;;;:52;;;;38240:242;38117:384;37947:569;37889:627;38563:7;38559:2;38544:27;;38553:4;38544:27;;;;;;;;;;;;38582:42;38603:4;38609:2;38613:7;38622:1;38582:20;:42::i;:::-;35938:2694;;;35807:2825;;;:::o;38728:193::-;38874:39;38891:4;38897:2;38901:7;38874:39;;;;;;;;;;;;:16;:39::i;:::-;38728:193;;;:::o;58962:117::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59066:5:::1;59042:13;:21;59056:6;59042:21;;;;;;;;;;;:29;;;;58962:117:::0;;:::o;59087:92::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59167:4:::1;59159:5;:12;;;;59087:92:::0;:::o;27070:152::-;27142:7;27185:27;27204:7;27185:18;:27::i;:::-;27162:52;;27070:152;;;:::o;22612:233::-;22684:7;22725:1;22708:19;;:5;:19;;;22704:60;;22736:28;;;;;;;;;;;;;;22704:60;16863:13;22782:18;:25;22801:5;22782:25;;;;;;;;;;;;;;;;:55;22775:62;;22612:233;;;:::o;5709:103::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5774:30:::1;5801:1;5774:18;:30::i;:::-;5709:103::o:0;60499:178::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60554:14:::1;60583:1;60572:23;;;60604:4;60572:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60554:56;;60632:1;60621:22;;;60652:7;:5;:7::i;:::-;60662:6;60621:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60543:134;60499:178:::0;:::o;5058:87::-;5104:7;5131:6;;;;;;;;;;;5124:13;;5058:87;:::o;25853:104::-;25909:13;25942:7;25935:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25853:104;:::o;58804:150::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58866:15:::1;58884:21;58866:39;;58924:3;58916:21;;:30;58938:7;58916:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58855:99;58804:150:::0;:::o;59906:229::-;59985:13;:23;59999:8;59985:23;;;;;;;;;;;;59972:9;:36;;59964:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;60052:30;60062:10;60073:8;60052:9;:30::i;:::-;60118:8;60106:10;60098:29;;;;;;;;;;;;59906:229;:::o;32726:234::-;32873:8;32821:18;:39;32840:19;:17;:19::i;:::-;32821:39;;;;;;;;;;;;;;;:49;32861:8;32821:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32933:8;32897:55;;32912:19;:17;:19::i;:::-;32897:55;;;32943:8;32897:55;;;;;;:::i;:::-;;;;;;;;32726:234;;:::o;60384:103::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60470:9:::1;;60460:7;:19;;;;;;;:::i;:::-;;60384:103:::0;;:::o;39519:407::-;39694:31;39707:4;39713:2;39717:7;39694:12;:31::i;:::-;39758:1;39740:2;:14;;;:19;39736:183;;39779:56;39810:4;39816:2;39820:7;39829:5;39779:30;:56::i;:::-;39774:145;;39863:40;;;;;;;;;;;;;;39774:145;39736:183;39519:407;;;;:::o;60211:95::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60291:7:::1;;60283:5;:15;;;;;;;:::i;:::-;;60211:95:::0;;:::o;59541:357::-;59606:13;59645:1;59636:5;;:10;59632:259;;59670:12;59663:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59632:259;59723:16;59731:7;59723;:16::i;:::-;59715:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;59837:13;59852:25;59869:7;59852:16;:25::i;:::-;59820:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59806:73;;59541:357;;;;:::o;60685:102::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60739:7:::1;:5;:7::i;:::-;60731:25;;:48;60757:21;60731:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60685:102::o:0;59302:109::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59394:9:::1;;59378:13;:25;;;;;;;:::i;:::-;;59302:109:::0;;:::o;33117:164::-;33214:4;33238:18;:25;33257:5;33238:25;;;;;;;;;;;;;;;:35;33264:8;33238:35;;;;;;;;;;;;;;;;;;;;;;;;;33231:42;;33117:164;;;;:::o;5967:201::-;5289:12;:10;:12::i;:::-;5278:23;;:7;:5;:7::i;:::-;:23;;;5270:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6076:1:::1;6056:22;;:8;:22;;::::0;6048:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6132:28;6151:8;6132:18;:28::i;:::-;5967:201:::0;:::o;33539:282::-;33604:4;33660:7;33641:15;:13;:15::i;:::-;:26;;:66;;;;;33694:13;;33684:7;:23;33641:66;:153;;;;;33793:1;17639:8;33745:17;:26;33763:7;33745:26;;;;;;;;;;;;:44;:49;33641:153;33621:173;;33539:282;;;:::o;55847:105::-;55907:7;55934:10;55927:17;;55847:105;:::o;3909:98::-;3962:7;3989:10;3982:17;;3909:98;:::o;58697:101::-;58762:7;58789:1;58782:8;;58697:101;:::o;28225:1275::-;28292:7;28312:12;28327:7;28312:22;;28395:4;28376:15;:13;:15::i;:::-;:23;28372:1061;;28429:13;;28422:4;:20;28418:1015;;;28467:14;28484:17;:23;28502:4;28484:23;;;;;;;;;;;;28467:40;;28601:1;17639:8;28573:6;:24;:29;28569:845;;29238:113;29255:1;29245:6;:11;29238:113;;29298:17;:25;29316:6;;;;;;;29298:25;;;;;;;;;;;;29289:34;;29238:113;;;29384:6;29377:13;;;;;;28569:845;28444:989;28418:1015;28372:1061;29461:31;;;;;;;;;;;;;;28225:1275;;;;:::o;34702:485::-;34804:27;34833:23;34874:38;34915:15;:24;34931:7;34915:24;;;;;;;;;;;34874:65;;35092:18;35069:41;;35149:19;35143:26;35124:45;;35054:126;34702:485;;;:::o;33930:659::-;34079:11;34244:16;34237:5;34233:28;34224:37;;34404:16;34393:9;34389:32;34376:45;;34554:15;34543:9;34540:30;34532:5;34521:9;34518:20;34515:56;34505:66;;33930:659;;;;;:::o;40588:159::-;;;;;:::o;55156:311::-;55291:7;55311:16;18043:3;55337:19;:41;;55311:68;;18043:3;55405:31;55416:4;55422:2;55426:9;55405:10;:31::i;:::-;55397:40;;:62;;55390:69;;;55156:311;;;;;:::o;30048:450::-;30128:14;30296:16;30289:5;30285:28;30276:37;;30473:5;30459:11;30434:23;30430:41;30427:52;30420:5;30417:63;30407:73;;30048:450;;;;:::o;41412:158::-;;;;;:::o;6328:191::-;6402:16;6421:6;;;;;;;;;;;6402:25;;6447:8;6438:6;;:17;;;;;;;;;;;;;;;;;;6502:8;6471:40;;6492:8;6471:40;;;;;;;;;;;;6391:128;6328:191;:::o;49679:112::-;49756:27;49766:2;49770:8;49756:27;;;;;;;;;;;;:9;:27::i;:::-;49679:112;;:::o;42010:716::-;42173:4;42219:2;42194:45;;;42240:19;:17;:19::i;:::-;42261:4;42267:7;42276:5;42194:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42190:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42494:1;42477:6;:13;:18;42473:235;;42523:40;;;;;;;;;;;;;;42473:235;42666:6;42660:13;42651:6;42647:2;42643:15;42636:38;42190:529;42363:54;;;42353:64;;;:6;:64;;;;42346:71;;;42010:716;;;;;;:::o;286:723::-;342:13;572:1;563:5;:10;559:53;;590:10;;;;;;;;;;;;;;;;;;;;;559:53;622:12;637:5;622:20;;653:14;678:78;693:1;685:4;:9;678:78;;711:8;;;;;:::i;:::-;;;;742:2;734:10;;;;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;766:39;;816:154;832:1;823:5;:10;816:154;;860:1;850:11;;;;;:::i;:::-;;;927:2;919:5;:10;;;;:::i;:::-;906:2;:24;;;;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;956:2;947:11;;;;;:::i;:::-;;;816:154;;;994:6;980:21;;;;;286:723;;;;:::o;54857:147::-;54994:6;54857:147;;;;;:::o;48906:689::-;49037:19;49043:2;49047:8;49037:5;:19::i;:::-;49116:1;49098:2;:14;;;:19;49094:483;;49138:11;49152:13;;49138:27;;49184:13;49206:8;49200:3;:14;49184:30;;49233:233;49264:62;49303:1;49307:2;49311:7;;;;;;49320:5;49264:30;:62::i;:::-;49259:167;;49362:40;;;;;;;;;;;;;;49259:167;49461:3;49453:5;:11;49233:233;;49548:3;49531:13;;:20;49527:34;;49553:8;;;49527:34;49119:458;;49094:483;48906:689;;;:::o;43188:2966::-;43261:20;43284:13;;43261:36;;43324:1;43312:8;:13;43308:44;;43334:18;;;;;;;;;;;;;;43308:44;43365:61;43395:1;43399:2;43403:12;43417:8;43365:21;:61::i;:::-;43909:1;17001:2;43879:1;:26;;43878:32;43866:8;:45;43840:18;:22;43859:2;43840:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;44188:139;44225:2;44279:33;44302:1;44306:2;44310:1;44279:14;:33::i;:::-;44246:30;44267:8;44246:20;:30::i;:::-;:66;44188:18;:139::i;:::-;44154:17;:31;44172:12;44154:31;;;;;;;;;;;:173;;;;44344:16;44375:11;44404:8;44389:12;:23;44375:37;;44925:16;44921:2;44917:25;44905:37;;45297:12;45257:8;45216:1;45154:25;45095:1;45034;45007:335;45668:1;45654:12;45650:20;45608:346;45709:3;45700:7;45697:16;45608:346;;45927:7;45917:8;45914:1;45887:25;45884:1;45881;45876:59;45762:1;45753:7;45749:15;45738:26;;45608:346;;;45612:77;45999:1;45987:8;:13;45983:45;;46009:19;;;;;;;;;;;;;;45983:45;46061:3;46045:13;:19;;;;43614:2462;;46086:60;46115:1;46119:2;46123:12;46137:8;46086:20;:60::i;:::-;43250:2904;43188:2966;;:::o;30600:324::-;30670:14;30903:1;30893:8;30890:15;30864:24;30860:46;30850:56;;30600:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:117;5245:1;5242;5235:12;5273:553;5331:8;5341:6;5391:3;5384:4;5376:6;5372:17;5368:27;5358:122;;5399:79;;:::i;:::-;5358:122;5512:6;5499:20;5489:30;;5542:18;5534:6;5531:30;5528:117;;;5564:79;;:::i;:::-;5528:117;5678:4;5670:6;5666:17;5654:29;;5732:3;5724:4;5716:6;5712:17;5702:8;5698:32;5695:41;5692:128;;;5739:79;;:::i;:::-;5692:128;5273:553;;;;;:::o;5832:529::-;5903:6;5911;5960:2;5948:9;5939:7;5935:23;5931:32;5928:119;;;5966:79;;:::i;:::-;5928:119;6114:1;6103:9;6099:17;6086:31;6144:18;6136:6;6133:30;6130:117;;;6166:79;;:::i;:::-;6130:117;6279:65;6336:7;6327:6;6316:9;6312:22;6279:65;:::i;:::-;6261:83;;;;6057:297;5832:529;;;;;:::o;6367:118::-;6454:24;6472:5;6454:24;:::i;:::-;6449:3;6442:37;6367:118;;:::o;6491:222::-;6584:4;6622:2;6611:9;6607:18;6599:26;;6635:71;6703:1;6692:9;6688:17;6679:6;6635:71;:::i;:::-;6491:222;;;;:::o;6719:619::-;6796:6;6804;6812;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;6719:619;;;;;:::o;7344:474::-;7412:6;7420;7469:2;7457:9;7448:7;7444:23;7440:32;7437:119;;;7475:79;;:::i;:::-;7437:119;7595:1;7620:53;7665:7;7656:6;7645:9;7641:22;7620:53;:::i;:::-;7610:63;;7566:117;7722:2;7748:53;7793:7;7784:6;7773:9;7769:22;7748:53;:::i;:::-;7738:63;;7693:118;7344:474;;;;;:::o;7824:329::-;7883:6;7932:2;7920:9;7911:7;7907:23;7903:32;7900:119;;;7938:79;;:::i;:::-;7900:119;8058:1;8083:53;8128:7;8119:6;8108:9;8104:22;8083:53;:::i;:::-;8073:63;;8029:117;7824:329;;;;:::o;8159:116::-;8229:21;8244:5;8229:21;:::i;:::-;8222:5;8219:32;8209:60;;8265:1;8262;8255:12;8209:60;8159:116;:::o;8281:133::-;8324:5;8362:6;8349:20;8340:29;;8378:30;8402:5;8378:30;:::i;:::-;8281:133;;;;:::o;8420:468::-;8485:6;8493;8542:2;8530:9;8521:7;8517:23;8513:32;8510:119;;;8548:79;;:::i;:::-;8510:119;8668:1;8693:53;8738:7;8729:6;8718:9;8714:22;8693:53;:::i;:::-;8683:63;;8639:117;8795:2;8821:50;8863:7;8854:6;8843:9;8839:22;8821:50;:::i;:::-;8811:60;;8766:115;8420:468;;;;;:::o;8894:117::-;9003:1;9000;8993:12;9017:180;9065:77;9062:1;9055:88;9162:4;9159:1;9152:15;9186:4;9183:1;9176:15;9203:281;9286:27;9308:4;9286:27;:::i;:::-;9278:6;9274:40;9416:6;9404:10;9401:22;9380:18;9368:10;9365:34;9362:62;9359:88;;;9427:18;;:::i;:::-;9359:88;9467:10;9463:2;9456:22;9246:238;9203:281;;:::o;9490:129::-;9524:6;9551:20;;:::i;:::-;9541:30;;9580:33;9608:4;9600:6;9580:33;:::i;:::-;9490:129;;;:::o;9625:307::-;9686:4;9776:18;9768:6;9765:30;9762:56;;;9798:18;;:::i;:::-;9762:56;9836:29;9858:6;9836:29;:::i;:::-;9828:37;;9920:4;9914;9910:15;9902:23;;9625:307;;;:::o;9938:146::-;10035:6;10030:3;10025;10012:30;10076:1;10067:6;10062:3;10058:16;10051:27;9938:146;;;:::o;10090:423::-;10167:5;10192:65;10208:48;10249:6;10208:48;:::i;:::-;10192:65;:::i;:::-;10183:74;;10280:6;10273:5;10266:21;10318:4;10311:5;10307:16;10356:3;10347:6;10342:3;10338:16;10335:25;10332:112;;;10363:79;;:::i;:::-;10332:112;10453:54;10500:6;10495:3;10490;10453:54;:::i;:::-;10173:340;10090:423;;;;;:::o;10532:338::-;10587:5;10636:3;10629:4;10621:6;10617:17;10613:27;10603:122;;10644:79;;:::i;:::-;10603:122;10761:6;10748:20;10786:78;10860:3;10852:6;10845:4;10837:6;10833:17;10786:78;:::i;:::-;10777:87;;10593:277;10532:338;;;;:::o;10876:943::-;10971:6;10979;10987;10995;11044:3;11032:9;11023:7;11019:23;11015:33;11012:120;;;11051:79;;:::i;:::-;11012:120;11171:1;11196:53;11241:7;11232:6;11221:9;11217:22;11196:53;:::i;:::-;11186:63;;11142:117;11298:2;11324:53;11369:7;11360:6;11349:9;11345:22;11324:53;:::i;:::-;11314:63;;11269:118;11426:2;11452:53;11497:7;11488:6;11477:9;11473:22;11452:53;:::i;:::-;11442:63;;11397:118;11582:2;11571:9;11567:18;11554:32;11613:18;11605:6;11602:30;11599:117;;;11635:79;;:::i;:::-;11599:117;11740:62;11794:7;11785:6;11774:9;11770:22;11740:62;:::i;:::-;11730:72;;11525:287;10876:943;;;;;;;:::o;11825:474::-;11893:6;11901;11950:2;11938:9;11929:7;11925:23;11921:32;11918:119;;;11956:79;;:::i;:::-;11918:119;12076:1;12101:53;12146:7;12137:6;12126:9;12122:22;12101:53;:::i;:::-;12091:63;;12047:117;12203:2;12229:53;12274:7;12265:6;12254:9;12250:22;12229:53;:::i;:::-;12219:63;;12174:118;11825:474;;;;;:::o;12305:180::-;12353:77;12350:1;12343:88;12450:4;12447:1;12440:15;12474:4;12471:1;12464:15;12491:320;12535:6;12572:1;12566:4;12562:12;12552:22;;12619:1;12613:4;12609:12;12640:18;12630:81;;12696:4;12688:6;12684:17;12674:27;;12630:81;12758:2;12750:6;12747:14;12727:18;12724:38;12721:84;;12777:18;;:::i;:::-;12721:84;12542:269;12491:320;;;:::o;12817:182::-;12957:34;12953:1;12945:6;12941:14;12934:58;12817:182;:::o;13005:366::-;13147:3;13168:67;13232:2;13227:3;13168:67;:::i;:::-;13161:74;;13244:93;13333:3;13244:93;:::i;:::-;13362:2;13357:3;13353:12;13346:19;;13005:366;;;:::o;13377:419::-;13543:4;13581:2;13570:9;13566:18;13558:26;;13630:9;13624:4;13620:20;13616:1;13605:9;13601:17;13594:47;13658:131;13784:4;13658:131;:::i;:::-;13650:139;;13377:419;;;:::o;13802:97::-;13861:6;13889:3;13879:13;;13802:97;;;;:::o;13905:141::-;13954:4;13977:3;13969:11;;14000:3;13997:1;13990:14;14034:4;14031:1;14021:18;14013:26;;13905:141;;;:::o;14052:93::-;14089:6;14136:2;14131;14124:5;14120:14;14116:23;14106:33;;14052:93;;;:::o;14151:107::-;14195:8;14245:5;14239:4;14235:16;14214:37;;14151:107;;;;:::o;14264:393::-;14333:6;14383:1;14371:10;14367:18;14406:97;14436:66;14425:9;14406:97;:::i;:::-;14524:39;14554:8;14543:9;14524:39;:::i;:::-;14512:51;;14596:4;14592:9;14585:5;14581:21;14572:30;;14645:4;14635:8;14631:19;14624:5;14621:30;14611:40;;14340:317;;14264:393;;;;;:::o;14663:60::-;14691:3;14712:5;14705:12;;14663:60;;;:::o;14729:142::-;14779:9;14812:53;14830:34;14839:24;14857:5;14839:24;:::i;:::-;14830:34;:::i;:::-;14812:53;:::i;:::-;14799:66;;14729:142;;;:::o;14877:75::-;14920:3;14941:5;14934:12;;14877:75;;;:::o;14958:269::-;15068:39;15099:7;15068:39;:::i;:::-;15129:91;15178:41;15202:16;15178:41;:::i;:::-;15170:6;15163:4;15157:11;15129:91;:::i;:::-;15123:4;15116:105;15034:193;14958:269;;;:::o;15233:73::-;15278:3;15233:73;:::o;15312:189::-;15389:32;;:::i;:::-;15430:65;15488:6;15480;15474:4;15430:65;:::i;:::-;15365:136;15312:189;;:::o;15507:186::-;15567:120;15584:3;15577:5;15574:14;15567:120;;;15638:39;15675:1;15668:5;15638:39;:::i;:::-;15611:1;15604:5;15600:13;15591:22;;15567:120;;;15507:186;;:::o;15699:543::-;15800:2;15795:3;15792:11;15789:446;;;15834:38;15866:5;15834:38;:::i;:::-;15918:29;15936:10;15918:29;:::i;:::-;15908:8;15904:44;16101:2;16089:10;16086:18;16083:49;;;16122:8;16107:23;;16083:49;16145:80;16201:22;16219:3;16201:22;:::i;:::-;16191:8;16187:37;16174:11;16145:80;:::i;:::-;15804:431;;15789:446;15699:543;;;:::o;16248:117::-;16302:8;16352:5;16346:4;16342:16;16321:37;;16248:117;;;;:::o;16371:169::-;16415:6;16448:51;16496:1;16492:6;16484:5;16481:1;16477:13;16448:51;:::i;:::-;16444:56;16529:4;16523;16519:15;16509:25;;16422:118;16371:169;;;;:::o;16545:295::-;16621:4;16767:29;16792:3;16786:4;16767:29;:::i;:::-;16759:37;;16829:3;16826:1;16822:11;16816:4;16813:21;16805:29;;16545:295;;;;:::o;16845:1403::-;16969:44;17009:3;17004;16969:44;:::i;:::-;17078:18;17070:6;17067:30;17064:56;;;17100:18;;:::i;:::-;17064:56;17144:38;17176:4;17170:11;17144:38;:::i;:::-;17229:67;17289:6;17281;17275:4;17229:67;:::i;:::-;17323:1;17352:2;17344:6;17341:14;17369:1;17364:632;;;;18040:1;18057:6;18054:84;;;18113:9;18108:3;18104:19;18091:33;18082:42;;18054:84;18164:67;18224:6;18217:5;18164:67;:::i;:::-;18158:4;18151:81;18013:229;17334:908;;17364:632;17416:4;17412:9;17404:6;17400:22;17450:37;17482:4;17450:37;:::i;:::-;17509:1;17523:215;17537:7;17534:1;17531:14;17523:215;;;17623:9;17618:3;17614:19;17601:33;17593:6;17586:49;17674:1;17666:6;17662:14;17652:24;;17721:2;17710:9;17706:18;17693:31;;17560:4;17557:1;17553:12;17548:17;;17523:215;;;17766:6;17757:7;17754:19;17751:186;;;17831:9;17826:3;17822:19;17809:33;17874:48;17916:4;17908:6;17904:17;17893:9;17874:48;:::i;:::-;17866:6;17859:64;17774:163;17751:186;17983:1;17979;17971:6;17967:14;17963:22;17957:4;17950:36;17371:625;;;17334:908;;16944:1304;;;16845:1403;;;:::o;18254:143::-;18311:5;18342:6;18336:13;18327:22;;18358:33;18385:5;18358:33;:::i;:::-;18254:143;;;;:::o;18403:351::-;18473:6;18522:2;18510:9;18501:7;18497:23;18493:32;18490:119;;;18528:79;;:::i;:::-;18490:119;18648:1;18673:64;18729:7;18720:6;18709:9;18705:22;18673:64;:::i;:::-;18663:74;;18619:128;18403:351;;;;:::o;18760:332::-;18881:4;18919:2;18908:9;18904:18;18896:26;;18932:71;19000:1;18989:9;18985:17;18976:6;18932:71;:::i;:::-;19013:72;19081:2;19070:9;19066:18;19057:6;19013:72;:::i;:::-;18760:332;;;;;:::o;19098:137::-;19152:5;19183:6;19177:13;19168:22;;19199:30;19223:5;19199:30;:::i;:::-;19098:137;;;;:::o;19241:345::-;19308:6;19357:2;19345:9;19336:7;19332:23;19328:32;19325:119;;;19363:79;;:::i;:::-;19325:119;19483:1;19508:61;19561:7;19552:6;19541:9;19537:22;19508:61;:::i;:::-;19498:71;;19454:125;19241:345;;;;:::o;19592:178::-;19732:30;19728:1;19720:6;19716:14;19709:54;19592:178;:::o;19776:366::-;19918:3;19939:67;20003:2;19998:3;19939:67;:::i;:::-;19932:74;;20015:93;20104:3;20015:93;:::i;:::-;20133:2;20128:3;20124:12;20117:19;;19776:366;;;:::o;20148:419::-;20314:4;20352:2;20341:9;20337:18;20329:26;;20401:9;20395:4;20391:20;20387:1;20376:9;20372:17;20365:47;20429:131;20555:4;20429:131;:::i;:::-;20421:139;;20148:419;;;:::o;20573:234::-;20713:34;20709:1;20701:6;20697:14;20690:58;20782:17;20777:2;20769:6;20765:15;20758:42;20573:234;:::o;20813:366::-;20955:3;20976:67;21040:2;21035:3;20976:67;:::i;:::-;20969:74;;21052:93;21141:3;21052:93;:::i;:::-;21170:2;21165:3;21161:12;21154:19;;20813:366;;;:::o;21185:419::-;21351:4;21389:2;21378:9;21374:18;21366:26;;21438:9;21432:4;21428:20;21424:1;21413:9;21409:17;21402:47;21466:131;21592:4;21466:131;:::i;:::-;21458:139;;21185:419;;;:::o;21610:148::-;21712:11;21749:3;21734:18;;21610:148;;;;:::o;21788:874::-;21891:3;21928:5;21922:12;21957:36;21983:9;21957:36;:::i;:::-;22009:89;22091:6;22086:3;22009:89;:::i;:::-;22002:96;;22129:1;22118:9;22114:17;22145:1;22140:166;;;;22320:1;22315:341;;;;22107:549;;22140:166;22224:4;22220:9;22209;22205:25;22200:3;22193:38;22286:6;22279:14;22272:22;22264:6;22260:35;22255:3;22251:45;22244:52;;22140:166;;22315:341;22382:38;22414:5;22382:38;:::i;:::-;22442:1;22456:154;22470:6;22467:1;22464:13;22456:154;;;22544:7;22538:14;22534:1;22529:3;22525:11;22518:35;22594:1;22585:7;22581:15;22570:26;;22492:4;22489:1;22485:12;22480:17;;22456:154;;;22639:6;22634:3;22630:16;22623:23;;22322:334;;22107:549;;21895:767;;21788:874;;;;:::o;22668:390::-;22774:3;22802:39;22835:5;22802:39;:::i;:::-;22857:89;22939:6;22934:3;22857:89;:::i;:::-;22850:96;;22955:65;23013:6;23008:3;23001:4;22994:5;22990:16;22955:65;:::i;:::-;23045:6;23040:3;23036:16;23029:23;;22778:280;22668:390;;;;:::o;23064:429::-;23241:3;23263:92;23351:3;23342:6;23263:92;:::i;:::-;23256:99;;23372:95;23463:3;23454:6;23372:95;:::i;:::-;23365:102;;23484:3;23477:10;;23064:429;;;;;:::o;23499:225::-;23639:34;23635:1;23627:6;23623:14;23616:58;23708:8;23703:2;23695:6;23691:15;23684:33;23499:225;:::o;23730:366::-;23872:3;23893:67;23957:2;23952:3;23893:67;:::i;:::-;23886:74;;23969:93;24058:3;23969:93;:::i;:::-;24087:2;24082:3;24078:12;24071:19;;23730:366;;;:::o;24102:419::-;24268:4;24306:2;24295:9;24291:18;24283:26;;24355:9;24349:4;24345:20;24341:1;24330:9;24326:17;24319:47;24383:131;24509:4;24383:131;:::i;:::-;24375:139;;24102:419;;;:::o;24527:98::-;24578:6;24612:5;24606:12;24596:22;;24527:98;;;:::o;24631:168::-;24714:11;24748:6;24743:3;24736:19;24788:4;24783:3;24779:14;24764:29;;24631:168;;;;:::o;24805:373::-;24891:3;24919:38;24951:5;24919:38;:::i;:::-;24973:70;25036:6;25031:3;24973:70;:::i;:::-;24966:77;;25052:65;25110:6;25105:3;25098:4;25091:5;25087:16;25052:65;:::i;:::-;25142:29;25164:6;25142:29;:::i;:::-;25137:3;25133:39;25126:46;;24895:283;24805:373;;;;:::o;25184:640::-;25379:4;25417:3;25406:9;25402:19;25394:27;;25431:71;25499:1;25488:9;25484:17;25475:6;25431:71;:::i;:::-;25512:72;25580:2;25569:9;25565:18;25556:6;25512:72;:::i;:::-;25594;25662:2;25651:9;25647:18;25638:6;25594:72;:::i;:::-;25713:9;25707:4;25703:20;25698:2;25687:9;25683:18;25676:48;25741:76;25812:4;25803:6;25741:76;:::i;:::-;25733:84;;25184:640;;;;;;;:::o;25830:141::-;25886:5;25917:6;25911:13;25902:22;;25933:32;25959:5;25933:32;:::i;:::-;25830:141;;;;:::o;25977:349::-;26046:6;26095:2;26083:9;26074:7;26070:23;26066:32;26063:119;;;26101:79;;:::i;:::-;26063:119;26221:1;26246:63;26301:7;26292:6;26281:9;26277:22;26246:63;:::i;:::-;26236:73;;26192:127;25977:349;;;;:::o;26332:180::-;26380:77;26377:1;26370:88;26477:4;26474:1;26467:15;26501:4;26498:1;26491:15;26518:233;26557:3;26580:24;26598:5;26580:24;:::i;:::-;26571:33;;26626:66;26619:5;26616:77;26613:103;;26696:18;;:::i;:::-;26613:103;26743:1;26736:5;26732:13;26725:20;;26518:233;;;:::o;26757:180::-;26805:77;26802:1;26795:88;26902:4;26899:1;26892:15;26926:4;26923:1;26916:15;26943:185;26983:1;27000:20;27018:1;27000:20;:::i;:::-;26995:25;;27034:20;27052:1;27034:20;:::i;:::-;27029:25;;27073:1;27063:35;;27078:18;;:::i;:::-;27063:35;27120:1;27117;27113:9;27108:14;;26943:185;;;;:::o;27134:194::-;27174:4;27194:20;27212:1;27194:20;:::i;:::-;27189:25;;27228:20;27246:1;27228:20;:::i;:::-;27223:25;;27272:1;27269;27265:9;27257:17;;27296:1;27290:4;27287:11;27284:37;;;27301:18;;:::i;:::-;27284:37;27134:194;;;;:::o;27334:176::-;27366:1;27383:20;27401:1;27383:20;:::i;:::-;27378:25;;27417:20;27435:1;27417:20;:::i;:::-;27412:25;;27456:1;27446:35;;27461:18;;:::i;:::-;27446:35;27502:1;27499;27495:9;27490:14;;27334:176;;;;:::o;27516:191::-;27556:3;27575:20;27593:1;27575:20;:::i;:::-;27570:25;;27609:20;27627:1;27609:20;:::i;:::-;27604:25;;27652:1;27649;27645:9;27638:16;;27673:3;27670:1;27667:10;27664:36;;;27680:18;;:::i;:::-;27664:36;27516:191;;;;:::o;27713:180::-;27761:77;27758:1;27751:88;27858:4;27855:1;27848:15;27882:4;27879:1;27872:15

Swarm Source

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