ETH Price: $3,808.00 (+4.91%)

Token

Woodlanderz (WDLZ)
 

Overview

Max Total Supply

600 WDLZ

Holders

154

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
ashem.eth
Balance
4 WDLZ
0xeeed4f0c2156b14a2c17c156432ecaeed72d8ada
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Woodlanderz_SmartContract

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 500 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-11
*/

// Sources flattened with hardhat v2.11.2 https://hardhat.org

// File @openzeppelin/contracts/security/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// File erc721a/contracts/[email protected]


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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


// File erc721a/contracts/[email protected]


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 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)
        }
    }
}


// File erc721a/contracts/extensions/[email protected]


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}


// File erc721a/contracts/extensions/[email protected]


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File contracts/TestMarketplace1.sol


pragma solidity ^0.8.0;
contract Woodlanderz_SmartContract is ERC721A, ERC721AQueryable, Ownable, ReentrancyGuard {
	
	using ECDSA for bytes32;
	
	/*
	 * Variables 
	 */
	struct Settings {
		uint256 whitelist1Price;
		uint256 whitelist2Price;
		uint256 whitelist3Price;
		
		uint256 whitelist1MaxCount;
		uint256 whitelist2MaxCount;
		uint256 whitelist3MaxCount;
		
		uint256 publicPrice;
		uint256 publicMaxCount;
		
		uint256 holderRatio;
	}
	
	struct Signers {
		address signerAddress1;
		address signerAddress2;
		address signerAddress3;
		address signerAddress4;
	}
	
	Settings public settings;
	
	Signers public signers;
	
	string public unrevealedTokenURI;

    string public baseTokenURI;
	
	uint256 public constant MAX_SUPPLY = 7777;
	
	uint256 public constant MAX_VAULT_MINT = 77;
	
	uint256 public vaultMinted;
	
	mapping(address => bool) public freeHolderAddresses;
	
	bool public isRevealed;
	bool public isPresaled;
	bool public isPaused;
	bool public isPublicMint;
	bool public isHolderFreeMint;
	
	/*
	 * Modiefiers
	 */
	modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }
	
    constructor() ERC721A("Woodlanderz", "WDLZ") {

	}

    function whitelist1Mint(uint256 quantity, bytes memory signature) external payable callerIsUser {
        
		require(!isPaused, "Not Yet Active.");
		require(isPresaled, "Presaled mint is disabled.");
		require(recoverSigner(signature) == signers.signerAddress1, "Address is not allowlisted");
		require(((_numberMinted(msg.sender) + quantity) <= settings.whitelist1MaxCount), "Illegal count NFTs");
		require((totalSupply() + quantity) <= MAX_SUPPLY, "Total supply exceeded!");
		require(msg.value >= (settings.whitelist1Price * quantity), "Payment is below the price");
		
        _safeMint(msg.sender, quantity);
    }
	
	function whitelist2Mint(uint256 quantity, bytes memory signature) external payable callerIsUser {
        
		require(!isPaused, "Not Yet Active.");
		require(isPresaled, "Presaled mint is disabled.");
		require(recoverSigner(signature) == signers.signerAddress2, "Address is not allowlisted");
		require(((_numberMinted(msg.sender) + quantity) <= settings.whitelist2MaxCount), "Illegal count NFTs");
		require((totalSupply() + quantity) <= MAX_SUPPLY, "Total supply exceeded!");
		require(msg.value >= (settings.whitelist2Price * quantity), "Payment is below the price");
		
        _safeMint(msg.sender, quantity);
    }
	
	function whitelist3Mint(uint256 quantity, bytes memory signature) external payable callerIsUser {
        
		require(!isPaused, "Not Yet Active.");
		require(recoverSigner(signature) == signers.signerAddress3, "Address is not allowlisted");
		require(((_numberMinted(msg.sender) + quantity) <= settings.whitelist3MaxCount), "Illegal count NFTs");
		require((totalSupply() + quantity) <= MAX_SUPPLY, "Total supply exceeded!");
		require(msg.value >= (settings.whitelist3Price * quantity), "Payment is below the price");
		
        _safeMint(msg.sender, quantity);
    }
	
	function holderMint(bytes memory signature) external callerIsUser {
        
		require(!isPaused, "Not Yet Active.");
		require(isHolderFreeMint, "Holder free mint is disabled.");
		require(!freeHolderAddresses[msg.sender], "Free Holder mint has been used");
		require(recoverSigner(signature) == signers.signerAddress4, "Address is not allowlisted");
		
		uint256 availableNewNFT = settings.holderRatio * balanceOf(msg.sender);
		
		require((availableNewNFT > 0), "Incorrect number of NFTs");
		require((totalSupply() + availableNewNFT) <= MAX_SUPPLY, "Total supply exceeded!");
		
		for(uint i = 0; i < availableNewNFT; i = i + 10) {
			if((i + 10) >= availableNewNFT) {
				_safeMint(msg.sender, (availableNewNFT - i));
			} else {
				_safeMint(msg.sender, 10);
			}
		}
		
		freeHolderAddresses[msg.sender] = true;
    }
	
	function publicMint(uint256 quantity) external payable callerIsUser {
		
		require(!isPaused, "Not Yet Active.");
		require(isPublicMint, "Public mint is disabled.");
		require((quantity <= settings.publicMaxCount), "Illegal count NFTs");
		require((totalSupply() + quantity) <= MAX_SUPPLY, "Total supply exceeded!");
		require(msg.value >= (settings.publicPrice * quantity), "Payment is below the price");
		
		_safeMint(msg.sender, quantity);
	}
	
	function numberMinted(address owner) public view returns (uint256) {
		
		return _numberMinted(owner);
	}
	
	function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
		
        require(_exists(tokenId), "URI query for nonexistent token");

        if(!isRevealed){
			return bytes(unrevealedTokenURI).length > 0 ? string(abi.encodePacked(unrevealedTokenURI, _toString(tokenId), ".json")) : "";
        } else {
			return bytes(baseTokenURI).length > 0 ? string(abi.encodePacked(baseTokenURI, _toString(tokenId), ".json")) : "";
		}
    }
	
	function _baseURI() internal view virtual override returns (string memory) {
		
		return baseTokenURI;
	}
	
	function setBaseTokenUri(string memory baseURI) external onlyOwner {
		
		baseTokenURI = baseURI;
	}
	
	function setPlaceholderTokenUri(string memory unrevealedURI) external onlyOwner {
		
		unrevealedTokenURI = unrevealedURI;
	}
	
	function setRevealed() external onlyOwner {
		
		isRevealed = true;
	}
	
	function togglePresale() external onlyOwner {
		
		isPresaled = !isPresaled;
	}
	
	function togglePause() external onlyOwner {
		
		isPaused = !isPaused;
	}
	
	function togglePublicMint() external onlyOwner {
		
		isPublicMint = !isPublicMint;
	}
	
	function toggleHolderFreeMint() external onlyOwner {
		
		isHolderFreeMint = !isHolderFreeMint;
	}

	function recoverSigner(bytes memory signature)
        private
        view
        returns (address)
    {
        bytes32 messageDigest = keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(msg.sender))
            )
        );
        return messageDigest.recover(signature);
    }
	
	function setSettings(uint256 _whitelist1Price, 
						 uint256 _whitelist2Price, 
						 uint256 _whitelist3Price, 
						 uint256 _whitelist1MaxCount, 
						 uint256 _whitelist2MaxCount, 
						 uint256 _whitelist3MaxCount, 
						 uint256 _publicPrice, 
						 uint256 _publicMaxCount, 
						 uint256 _holderRatio
						 ) external onlyOwner {
	
		settings.whitelist1Price = _whitelist1Price;
		settings.whitelist2Price = _whitelist2Price;
		settings.whitelist3Price = _whitelist3Price;
	
		settings.whitelist1MaxCount = _whitelist1MaxCount;
		settings.whitelist2MaxCount = _whitelist2MaxCount;
		settings.whitelist3MaxCount = _whitelist3MaxCount;
	
		settings.publicPrice = _publicPrice;
		settings.publicMaxCount = _publicMaxCount;
		
		settings.holderRatio = _holderRatio;
	}
	
	function setSigners(address _signerAddress1, address _signerAddress2, address _signerAddress3, address _signerAddress4) external onlyOwner {
		
		signers.signerAddress1 = _signerAddress1;
		signers.signerAddress2 = _signerAddress2;
		signers.signerAddress3 = _signerAddress3;
		signers.signerAddress4 = _signerAddress4;
	}

	function vaultMint(uint256 quantity, address receiver) external onlyOwner {
		
		require((totalSupply() + quantity) <= MAX_SUPPLY, "Total supply exceeded!");
		require((vaultMinted + quantity) <= MAX_VAULT_MINT , "Max vault minted exceeded!");
		
		for(uint i = 0; i < quantity; i = i + 10) {
			if((i + 10) >= quantity) {
				_safeMint(receiver, (quantity - i));
			} else {
				_safeMint(receiver, 10);
			}
		}
		
		vaultMinted += quantity;
	}
	
	function withdraw(uint256 amountPercent, address receiver) external onlyOwner nonReentrant {
		
		require((amountPercent <= 100), "The maximum value is 100 percent");
		
        uint256 withdrawAmount = address(this).balance * amountPercent / 100;
		
		(bool succ1, ) = payable(receiver).call{value: withdrawAmount}("");
        require(succ1, "Transfer receiver failed");
		
		(bool succ2, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(succ2, "Transfer market failed");
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VAULT_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeHolderAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"holderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHolderFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"baseURI","type":"string"}],"name":"setBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI","type":"string"}],"name":"setPlaceholderTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelist1Price","type":"uint256"},{"internalType":"uint256","name":"_whitelist2Price","type":"uint256"},{"internalType":"uint256","name":"_whitelist3Price","type":"uint256"},{"internalType":"uint256","name":"_whitelist1MaxCount","type":"uint256"},{"internalType":"uint256","name":"_whitelist2MaxCount","type":"uint256"},{"internalType":"uint256","name":"_whitelist3MaxCount","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"},{"internalType":"uint256","name":"_publicMaxCount","type":"uint256"},{"internalType":"uint256","name":"_holderRatio","type":"uint256"}],"name":"setSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress1","type":"address"},{"internalType":"address","name":"_signerAddress2","type":"address"},{"internalType":"address","name":"_signerAddress3","type":"address"},{"internalType":"address","name":"_signerAddress4","type":"address"}],"name":"setSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"internalType":"uint256","name":"whitelist1Price","type":"uint256"},{"internalType":"uint256","name":"whitelist2Price","type":"uint256"},{"internalType":"uint256","name":"whitelist3Price","type":"uint256"},{"internalType":"uint256","name":"whitelist1MaxCount","type":"uint256"},{"internalType":"uint256","name":"whitelist2MaxCount","type":"uint256"},{"internalType":"uint256","name":"whitelist3MaxCount","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"uint256","name":"publicMaxCount","type":"uint256"},{"internalType":"uint256","name":"holderRatio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signers","outputs":[{"internalType":"address","name":"signerAddress1","type":"address"},{"internalType":"address","name":"signerAddress2","type":"address"},{"internalType":"address","name":"signerAddress3","type":"address"},{"internalType":"address","name":"signerAddress4","type":"address"}],"stateMutability":"view","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":[],"name":"toggleHolderFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"vaultMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelist1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelist2Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelist3Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600b81526a2bb7b7b23630b73232b93d60a91b6020808301918252835180850190945260048452632ba2262d60e11b9084015281519192916200006191600291620000e6565b50805162000077906003906020840190620000e6565b50506000805550620000893362000094565b6001600955620001c9565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000f4906200018c565b90600052602060002090601f01602090048101928262000118576000855562000163565b82601f106200013357805160ff191683800117855562000163565b8280016001018555821562000163579182015b828111156200016357825182559160200191906001019062000146565b506200017192915062000175565b5090565b5b8082111562000171576000815560010162000176565b600181811c90821680620001a157607f821691505b60208210811415620001c357634e487b7160e01b600052602260045260246000fd5b50919050565b6136ea80620001d96000396000f3fe6080604052600436106103335760003560e01c8063715018a6116101b0578063be5a6ea3116100ec578063d547cfb711610095578063e7c32e091161006f578063e7c32e0914610933578063e985e9c514610948578063f28df3d414610991578063f2fde38b146109c157600080fd5b8063d547cfb714610883578063dc33e68114610898578063e06174e4146108b857600080fd5b8063c4ae3168116100c6578063c4ae31681461083b578063c87b56dd14610850578063d086a65e1461087057600080fd5b8063be5a6ea3146107dc578063c0f9c0a4146107ef578063c23dc68f1461080e57600080fd5b806395d89b4111610159578063a636514a11610133578063a636514a14610774578063b187bd2614610794578063b2873d5c146107b4578063b88d4fde146107c957600080fd5b806395d89b411461071f57806399a2557a14610734578063a22cb4651461075457600080fd5b80638da5cb5b1161018a5780638da5cb5b146106bf5780638f8cadc9146106dd57806395652cfa146106ff57600080fd5b8063715018a61461065d5780638462151c1461067257806385e0debb1461069f57600080fd5b80633057931f1161027f57806346f0975a1161022857806356faa0231161020257806356faa023146105d05780635bbb2177146105f05780636352211e1461061d57806370a082311461063d57600080fd5b806346f0975a146105305780634fbc9b571461059657806354214f69146105b657600080fd5b80633bd64968116102595780633bd64968146104f35780634047638d1461050857806342842e0e1461051d57600080fd5b80633057931f146104a757806332cb6b0c146104c857806334393743146104de57600080fd5b806317fc5d51116102e157806323b872dd116102bb57806323b872dd1461046e57806327f4451e146104815780632db115441461049457600080fd5b806317fc5d511461041f57806318160ddd146104355780632251cbe71461044e57600080fd5b8063081812fc11610312578063081812fc146103b1578063095ea7b3146103e9578063110c7121146103fc57600080fd5b8062f714ce1461033857806301ffc9a71461035a57806306fdde031461038f575b600080fd5b34801561034457600080fd5b5061035861035336600461328d565b6109e1565b005b34801561036657600080fd5b5061037a6103753660046131c4565b610bf8565b60405190151581526020015b60405180910390f35b34801561039b57600080fd5b506103a4610c4a565b6040516103869190613545565b3480156103bd57600080fd5b506103d16103cc366004613275565b610cdc565b6040516001600160a01b039091168152602001610386565b6103586103f73660046130f9565b610d20565b34801561040857600080fd5b50610411604d81565b604051908152602001610386565b34801561042b57600080fd5b5061041160195481565b34801561044157600080fd5b5060015460005403610411565b34801561045a57600080fd5b50610358610469366004612fcb565b610dc0565b61035861047c36600461301e565b610e18565b61035861048f3660046132af565b610fa9565b6103586104a2366004613275565b611241565b3480156104b357600080fd5b50601b5461037a906301000000900460ff1681565b3480156104d457600080fd5b50610411611e6181565b3480156104ea57600080fd5b50610358611447565b3480156104ff57600080fd5b5061035861146c565b34801561051457600080fd5b50610358611483565b61035861052b36600461301e565b6114ac565b34801561053c57600080fd5b50601354601454601554601654610563936001600160a01b03908116938116928116911684565b604080516001600160a01b0395861681529385166020850152918416918301919091529091166060820152608001610386565b3480156105a257600080fd5b506103586105b13660046131fc565b6114cc565b3480156105c257600080fd5b50601b5461037a9060ff1681565b3480156105dc57600080fd5b506103586105eb36600461322f565b6117c7565b3480156105fc57600080fd5b5061061061060b366004613154565b6117e2565b6040516103869190613490565b34801561062957600080fd5b506103d1610638366004613275565b6118d8565b34801561064957600080fd5b50610411610658366004612f7f565b6118e3565b34801561066957600080fd5b50610358611932565b34801561067e57600080fd5b5061069261068d366004612f7f565b611946565b604051610386919061350d565b3480156106ab57600080fd5b506103586106ba3660046132f4565b611a72565b3480156106cb57600080fd5b506008546001600160a01b03166103d1565b3480156106e957600080fd5b50601b5461037a90640100000000900460ff1681565b34801561070b57600080fd5b5061035861071a36600461322f565b611aa3565b34801561072b57600080fd5b506103a4611abe565b34801561074057600080fd5b5061069261074f366004613122565b611acd565b34801561076057600080fd5b5061035861076f3660046130bf565b611c67565b34801561078057600080fd5b5061035861078f36600461328d565b611cd3565b3480156107a057600080fd5b50601b5461037a9062010000900460ff1681565b3480156107c057600080fd5b506103a4611e03565b6103586107d7366004613059565b611e91565b6103586107ea3660046132af565b611edb565b3480156107fb57600080fd5b50601b5461037a90610100900460ff1681565b34801561081a57600080fd5b5061082e610829366004613275565b6120bf565b6040516103869190613558565b34801561084757600080fd5b50610358612137565b34801561085c57600080fd5b506103a461086b366004613275565b61215e565b61035861087e3660046132af565b612256565b34801561088f57600080fd5b506103a4612491565b3480156108a457600080fd5b506104116108b3366004612f7f565b61249e565b3480156108c457600080fd5b50600a54600b54600c54600d54600e54600f546010546011546012546108ef98979695949392919089565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610386565b34801561093f57600080fd5b506103586124c9565b34801561095457600080fd5b5061037a610963366004612f99565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561099d57600080fd5b5061037a6109ac366004612f7f565b601a6020526000908152604090205460ff1681565b3480156109cd57600080fd5b506103586109dc366004612f7f565b6124f4565b6109e961256a565b60026009541415610a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026009556064821115610a975760405162461bcd60e51b815260206004820181905260248201527f546865206d6178696d756d2076616c7565206973203130302070657263656e746044820152606401610a38565b60006064610aa584476135d5565b610aaf91906135b5565b90506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b5050905080610b545760405162461bcd60e51b815260206004820152601860248201527f5472616e73666572207265636569766572206661696c656400000000000000006044820152606401610a38565b604051600090339047908381818185875af1925050503d8060008114610b96576040519150601f19603f3d011682016040523d82523d6000602084013e610b9b565b606091505b5050905080610bec5760405162461bcd60e51b815260206004820152601660248201527f5472616e73666572206d61726b6574206661696c6564000000000000000000006044820152606401610a38565b50506001600955505050565b60006301ffc9a760e01b6001600160e01b031983161480610c2957506380ac58cd60e01b6001600160e01b03198316145b80610c445750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610c5990613637565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8590613637565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050905090565b6000610ce7826125c4565b610d04576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d2b826118d8565b9050336001600160a01b03821614610d6457610d478133610963565b610d64576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610dc861256a565b601380546001600160a01b039586166001600160a01b0319918216179091556014805494861694821694909417909355601580549285169284169290921790915560168054919093169116179055565b6000610e23826125eb565b9050836001600160a01b0316816001600160a01b031614610e565760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ea357610e868633610963565b610ea357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610eca57604051633a954ecd60e21b815260040160405180910390fd5b8015610ed557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610f605760018401600081815260046020526040902054610f5e576000548114610f5e5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b323314610ff85760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156110435760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b54610100900460ff1661109a5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6564206d696e742069732064697361626c65642e0000000000006044820152606401610a38565b6013546001600160a01b03166110af8261264c565b6001600160a01b0316146111055760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b600d5433600090815260056020526040908190205484911c67ffffffffffffffff16611131919061359d565b11156111745760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e61826111856001546000540390565b61118f919061359d565b11156111d65760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b600a546111e49083906135d5565b3410156112335760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e742069732062656c6f77207468652070726963650000000000006044820152606401610a38565b61123d33836126d5565b5050565b3233146112905760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156112db5760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b546301000000900460ff166113345760405162461bcd60e51b815260206004820152601860248201527f5075626c6963206d696e742069732064697361626c65642e00000000000000006044820152606401610a38565b60115481111561137b5760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e618161138c6001546000540390565b611396919061359d565b11156113dd5760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b6010546113eb9082906135d5565b34101561143a5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e742069732062656c6f77207468652070726963650000000000006044820152606401610a38565b61144433826126d5565b50565b61144f61256a565b601b805461ff001981166101009182900460ff1615909102179055565b61147461256a565b601b805460ff19166001179055565b61148b61256a565b601b805463ff00000019811663010000009182900460ff1615909102179055565b6114c783838360405180602001604052806000815250611e91565b505050565b32331461151b5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156115665760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b54640100000000900460ff166115c05760405162461bcd60e51b815260206004820152601d60248201527f486f6c6465722066726565206d696e742069732064697361626c65642e0000006044820152606401610a38565b336000908152601a602052604090205460ff16156116205760405162461bcd60e51b815260206004820152601e60248201527f4672656520486f6c646572206d696e7420686173206265656e207573656400006044820152606401610a38565b6016546001600160a01b03166116358261264c565b6001600160a01b03161461168b5760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b6000611696336118e3565b6012546116a391906135d5565b9050600081116116f55760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374206e756d626572206f66204e46547300000000000000006044820152606401610a38565b611e61816117066001546000540390565b611710919061359d565b11156117575760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b60005b818110156117a8578161176e82600a61359d565b1061178b576117863361178183856135f4565b6126d5565b611796565b61179633600a6126d5565b6117a181600a61359d565b905061175a565b5050336000908152601a60205260409020805460ff1916600117905550565b6117cf61256a565b805161123d906017906020840190612e3a565b60608160008167ffffffffffffffff81111561180e57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561186057816020015b60408051608081018252600080825260208083018290529282018190526060820152825260001990920191018161182c5790505b50905060005b8281146118cf5761189c86868381811061189057634e487b7160e01b600052603260045260246000fd5b905060200201356120bf565b8282815181106118bc57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600101611866565b50949350505050565b6000610c44826125eb565b60006001600160a01b03821661190c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b61193a61256a565b61194460006126ef565b565b60606000806000611956856118e3565b905060008167ffffffffffffffff81111561198157634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119aa578160200160208202803683370190505b5090506119d760408051608081018252600080825260208201819052918101829052606081019190915290565b60005b838614611a66576119ea81612741565b91508160400151156119fb57611a5e565b81516001600160a01b031615611a1057815194505b876001600160a01b0316856001600160a01b03161415611a5e5780838780600101985081518110611a5157634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b6001016119da565b50909695505050505050565b611a7a61256a565b600a98909855600b96909655600c94909455600d92909255600e55600f55601055601155601255565b611aab61256a565b805161123d906018906020840190612e3a565b606060038054610c5990613637565b6060818310611aef57604051631960ccad60e11b815260040160405180910390fd5b600080611afb60005490565b905080841115611b09578093505b6000611b14876118e3565b905084861015611b335785850381811015611b2d578091505b50611b37565b5060005b60008167ffffffffffffffff811115611b6057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b89578160200160208202803683370190505b50905081611b9c579350611c6092505050565b6000611ba7886120bf565b905060008160400151611bb8575080515b885b888114158015611bca5750848714155b15611c5457611bd881612741565b9250826040015115611be957611c4c565b82516001600160a01b031615611bfe57825191505b8a6001600160a01b0316826001600160a01b03161415611c4c5780848880600101995081518110611c3f57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611bba565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611cdb61256a565b611e6182611cec6001546000540390565b611cf6919061359d565b1115611d3d5760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b604d82601954611d4d919061359d565b1115611d9b5760405162461bcd60e51b815260206004820152601a60248201527f4d6178207661756c74206d696e746564206578636565646564210000000000006044820152606401610a38565b60005b82811015611de75782611db282600a61359d565b10611dca57611dc58261178183866135f4565b611dd5565b611dd582600a6126d5565b611de081600a61359d565b9050611d9e565b508160196000828254611dfa919061359d565b90915550505050565b60178054611e1090613637565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3c90613637565b8015611e895780601f10611e5e57610100808354040283529160200191611e89565b820191906000526020600020905b815481529060010190602001808311611e6c57829003601f168201915b505050505081565b611e9c848484610e18565b6001600160a01b0383163b15611ed557611eb8848484846127c0565b611ed5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b323314611f2a5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff1615611f755760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b6015546001600160a01b0316611f8a8261264c565b6001600160a01b031614611fe05760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b600f5433600090815260056020526040908190205484911c67ffffffffffffffff1661200c919061359d565b111561204f5760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e61826120606001546000540390565b61206a919061359d565b11156120b15760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b600c546111e49083906135d5565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106121135792915050565b61211c83612741565b905080604001511561212e5792915050565b611c60836128b8565b61213f61256a565b601b805462ff0000198116620100009182900460ff1615909102179055565b6060612169826125c4565b6121b55760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610a38565b601b5460ff1661221b576000601780546121ce90613637565b9050116121ea5760405180602001604052806000815250610c44565b60176121f583612930565b60405160200161220692919061339a565b60405160208183030381529060405292915050565b60006018805461222a90613637565b9050116122465760405180602001604052806000815250610c44565b60186121f583612930565b919050565b3233146122a55760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156122f05760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b54610100900460ff166123475760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6564206d696e742069732064697361626c65642e0000000000006044820152606401610a38565b6014546001600160a01b031661235c8261264c565b6001600160a01b0316146123b25760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b600e5433600090815260056020526040908190205484911c67ffffffffffffffff166123de919061359d565b11156124215760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e61826124326001546000540390565b61243c919061359d565b11156124835760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b600b546111e49083906135d5565b60188054611e1090613637565b6001600160a01b0381166000908152600560205260408082205467ffffffffffffffff911c16610c44565b6124d161256a565b601b805464ff000000001981166401000000009182900460ff1615909102179055565b6124fc61256a565b6001600160a01b0381166125615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a38565b611444816126ef565b6008546001600160a01b031633146119445760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a38565b6000805482108015610c44575050600090815260046020526040902054600160e01b161590565b60008160005481101561263357600081815260046020526040902054600160e01b8116612631575b80611c60575060001901600081815260046020526040902054612613565b505b604051636f96cda160e11b815260040160405180910390fd5b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401919091528351808403909101815260909092019092528051910120600090611c60818461297e565b61123d8282604051806020016040528060008152506129a2565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610c4490604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906127f5903390899088908890600401613454565b602060405180830381600087803b15801561280f57600080fd5b505af192505050801561283f575060408051601f3d908101601f1916820190925261283c918101906131e0565b60015b61289a573d80801561286d576040519150601f19603f3d011682016040523d82523d6000602084013e612872565b606091505b508051612892576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152610c446128e8836125eb565b604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806129675761296c565b61294a565b50819003601f19909101908152919050565b600080600061298d8585612a0f565b9150915061299a81612a55565b509392505050565b6129ac8383612c56565b6001600160a01b0383163b156114c7576000548281035b6129d660008683806001019450866127c0565b6129f3576040516368d2bf6b60e11b815260040160405180910390fd5b8181106129c3578160005414612a0857600080fd5b5050505050565b600080825160411415612a465760208301516040840151606085015160001a612a3a87828585612d4d565b94509450505050612a4e565b506000905060025b9250929050565b6000816004811115612a7757634e487b7160e01b600052602160045260246000fd5b1415612a805750565b6001816004811115612aa257634e487b7160e01b600052602160045260246000fd5b1415612af05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a38565b6002816004811115612b1257634e487b7160e01b600052602160045260246000fd5b1415612b605760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a38565b6003816004811115612b8257634e487b7160e01b600052602160045260246000fd5b1415612bdb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a38565b6004816004811115612bfd57634e487b7160e01b600052602160045260246000fd5b14156114445760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a38565b60005481612c775760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114612d2657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612cee565b5081612d4457604051622e076360e81b815260040160405180910390fd5b60005550505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612d845750600090506003612e31565b8460ff16601b14158015612d9c57508460ff16601c14155b15612dad5750600090506004612e31565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612e01573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612e2a57600060019250925050612e31565b9150600090505b94509492505050565b828054612e4690613637565b90600052602060002090601f016020900481019282612e685760008555612eae565b82601f10612e8157805160ff1916838001178555612eae565b82800160010185558215612eae579182015b82811115612eae578251825591602001919060010190612e93565b50612eba929150612ebe565b5090565b5b80821115612eba5760008155600101612ebf565b600067ffffffffffffffff80841115612eee57612eee613688565b604051601f8501601f19908116603f01168101908282118183101715612f1657612f16613688565b81604052809350858152868686011115612f2f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461225157600080fd5b600082601f830112612f70578081fd5b611c6083833560208501612ed3565b600060208284031215612f90578081fd5b611c6082612f49565b60008060408385031215612fab578081fd5b612fb483612f49565b9150612fc260208401612f49565b90509250929050565b60008060008060808587031215612fe0578182fd5b612fe985612f49565b9350612ff760208601612f49565b925061300560408601612f49565b915061301360608601612f49565b905092959194509250565b600080600060608486031215613032578283fd5b61303b84612f49565b925061304960208501612f49565b9150604084013590509250925092565b6000806000806080858703121561306e578384fd5b61307785612f49565b935061308560208601612f49565b925060408501359150606085013567ffffffffffffffff8111156130a7578182fd5b6130b387828801612f60565b91505092959194509250565b600080604083850312156130d1578182fd5b6130da83612f49565b9150602083013580151581146130ee578182fd5b809150509250929050565b6000806040838503121561310b578182fd5b61311483612f49565b946020939093013593505050565b600080600060608486031215613136578283fd5b61313f84612f49565b95602085013595506040909401359392505050565b60008060208385031215613166578182fd5b823567ffffffffffffffff8082111561317d578384fd5b818501915085601f830112613190578384fd5b81358181111561319e578485fd5b8660208260051b85010111156131b2578485fd5b60209290920196919550909350505050565b6000602082840312156131d5578081fd5b8135611c608161369e565b6000602082840312156131f1578081fd5b8151611c608161369e565b60006020828403121561320d578081fd5b813567ffffffffffffffff811115613223578182fd5b6128b084828501612f60565b600060208284031215613240578081fd5b813567ffffffffffffffff811115613256578182fd5b8201601f81018413613266578182fd5b6128b084823560208401612ed3565b600060208284031215613286578081fd5b5035919050565b6000806040838503121561329f578182fd5b82359150612fc260208401612f49565b600080604083850312156132c1578182fd5b82359150602083013567ffffffffffffffff8111156132de578182fd5b6132ea85828601612f60565b9150509250929050565b60008060008060008060008060006101208a8c031215613312578687fd5b505087359960208901359950604089013598606081013598506080810135975060a0810135965060c0810135955060e08101359450610100013592509050565b6000815180845261336a81602086016020860161360b565b601f01601f19169290920160200192915050565b6000815161339081856020860161360b565b9290920192915050565b600080845482600182811c9150808316806133b657607f831692505b60208084108214156133d657634e487b7160e01b87526022600452602487fd5b8180156133ea57600181146133fb57613427565b60ff19861689528489019650613427565b60008b815260209020885b8681101561341f5781548b820152908501908301613406565b505084890196505b50505050505061344b61343a828661337e565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526134866080830184613352565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611a66576134fa8385516001600160a01b03815116825267ffffffffffffffff602082015116602083015260408101511515604083015262ffffff60608201511660608301525050565b92840192608092909201916001016134ac565b6020808252825182820181905260009190848201906040850190845b81811015611a6657835183529284019291840191600101613529565b602081526000611c606020830184613352565b81516001600160a01b0316815260208083015167ffffffffffffffff169082015260408083015115159082015260608083015162ffffff169082015260808101610c44565b600082198211156135b0576135b0613672565b500190565b6000826135d057634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156135ef576135ef613672565b500290565b60008282101561360657613606613672565b500390565b60005b8381101561362657818101518382015260200161360e565b83811115611ed55750506000910152565b600181811c9082168061364b57607f821691505b6020821081141561366c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461144457600080fdfea2646970667358221220cf07ec70361a3f263a7585cf21333bb1a88e3326d28f649f056cade70c651d3264736f6c63430008040033

Deployed Bytecode

0x6080604052600436106103335760003560e01c8063715018a6116101b0578063be5a6ea3116100ec578063d547cfb711610095578063e7c32e091161006f578063e7c32e0914610933578063e985e9c514610948578063f28df3d414610991578063f2fde38b146109c157600080fd5b8063d547cfb714610883578063dc33e68114610898578063e06174e4146108b857600080fd5b8063c4ae3168116100c6578063c4ae31681461083b578063c87b56dd14610850578063d086a65e1461087057600080fd5b8063be5a6ea3146107dc578063c0f9c0a4146107ef578063c23dc68f1461080e57600080fd5b806395d89b4111610159578063a636514a11610133578063a636514a14610774578063b187bd2614610794578063b2873d5c146107b4578063b88d4fde146107c957600080fd5b806395d89b411461071f57806399a2557a14610734578063a22cb4651461075457600080fd5b80638da5cb5b1161018a5780638da5cb5b146106bf5780638f8cadc9146106dd57806395652cfa146106ff57600080fd5b8063715018a61461065d5780638462151c1461067257806385e0debb1461069f57600080fd5b80633057931f1161027f57806346f0975a1161022857806356faa0231161020257806356faa023146105d05780635bbb2177146105f05780636352211e1461061d57806370a082311461063d57600080fd5b806346f0975a146105305780634fbc9b571461059657806354214f69146105b657600080fd5b80633bd64968116102595780633bd64968146104f35780634047638d1461050857806342842e0e1461051d57600080fd5b80633057931f146104a757806332cb6b0c146104c857806334393743146104de57600080fd5b806317fc5d51116102e157806323b872dd116102bb57806323b872dd1461046e57806327f4451e146104815780632db115441461049457600080fd5b806317fc5d511461041f57806318160ddd146104355780632251cbe71461044e57600080fd5b8063081812fc11610312578063081812fc146103b1578063095ea7b3146103e9578063110c7121146103fc57600080fd5b8062f714ce1461033857806301ffc9a71461035a57806306fdde031461038f575b600080fd5b34801561034457600080fd5b5061035861035336600461328d565b6109e1565b005b34801561036657600080fd5b5061037a6103753660046131c4565b610bf8565b60405190151581526020015b60405180910390f35b34801561039b57600080fd5b506103a4610c4a565b6040516103869190613545565b3480156103bd57600080fd5b506103d16103cc366004613275565b610cdc565b6040516001600160a01b039091168152602001610386565b6103586103f73660046130f9565b610d20565b34801561040857600080fd5b50610411604d81565b604051908152602001610386565b34801561042b57600080fd5b5061041160195481565b34801561044157600080fd5b5060015460005403610411565b34801561045a57600080fd5b50610358610469366004612fcb565b610dc0565b61035861047c36600461301e565b610e18565b61035861048f3660046132af565b610fa9565b6103586104a2366004613275565b611241565b3480156104b357600080fd5b50601b5461037a906301000000900460ff1681565b3480156104d457600080fd5b50610411611e6181565b3480156104ea57600080fd5b50610358611447565b3480156104ff57600080fd5b5061035861146c565b34801561051457600080fd5b50610358611483565b61035861052b36600461301e565b6114ac565b34801561053c57600080fd5b50601354601454601554601654610563936001600160a01b03908116938116928116911684565b604080516001600160a01b0395861681529385166020850152918416918301919091529091166060820152608001610386565b3480156105a257600080fd5b506103586105b13660046131fc565b6114cc565b3480156105c257600080fd5b50601b5461037a9060ff1681565b3480156105dc57600080fd5b506103586105eb36600461322f565b6117c7565b3480156105fc57600080fd5b5061061061060b366004613154565b6117e2565b6040516103869190613490565b34801561062957600080fd5b506103d1610638366004613275565b6118d8565b34801561064957600080fd5b50610411610658366004612f7f565b6118e3565b34801561066957600080fd5b50610358611932565b34801561067e57600080fd5b5061069261068d366004612f7f565b611946565b604051610386919061350d565b3480156106ab57600080fd5b506103586106ba3660046132f4565b611a72565b3480156106cb57600080fd5b506008546001600160a01b03166103d1565b3480156106e957600080fd5b50601b5461037a90640100000000900460ff1681565b34801561070b57600080fd5b5061035861071a36600461322f565b611aa3565b34801561072b57600080fd5b506103a4611abe565b34801561074057600080fd5b5061069261074f366004613122565b611acd565b34801561076057600080fd5b5061035861076f3660046130bf565b611c67565b34801561078057600080fd5b5061035861078f36600461328d565b611cd3565b3480156107a057600080fd5b50601b5461037a9062010000900460ff1681565b3480156107c057600080fd5b506103a4611e03565b6103586107d7366004613059565b611e91565b6103586107ea3660046132af565b611edb565b3480156107fb57600080fd5b50601b5461037a90610100900460ff1681565b34801561081a57600080fd5b5061082e610829366004613275565b6120bf565b6040516103869190613558565b34801561084757600080fd5b50610358612137565b34801561085c57600080fd5b506103a461086b366004613275565b61215e565b61035861087e3660046132af565b612256565b34801561088f57600080fd5b506103a4612491565b3480156108a457600080fd5b506104116108b3366004612f7f565b61249e565b3480156108c457600080fd5b50600a54600b54600c54600d54600e54600f546010546011546012546108ef98979695949392919089565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610386565b34801561093f57600080fd5b506103586124c9565b34801561095457600080fd5b5061037a610963366004612f99565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561099d57600080fd5b5061037a6109ac366004612f7f565b601a6020526000908152604090205460ff1681565b3480156109cd57600080fd5b506103586109dc366004612f7f565b6124f4565b6109e961256a565b60026009541415610a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026009556064821115610a975760405162461bcd60e51b815260206004820181905260248201527f546865206d6178696d756d2076616c7565206973203130302070657263656e746044820152606401610a38565b60006064610aa584476135d5565b610aaf91906135b5565b90506000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610afe576040519150601f19603f3d011682016040523d82523d6000602084013e610b03565b606091505b5050905080610b545760405162461bcd60e51b815260206004820152601860248201527f5472616e73666572207265636569766572206661696c656400000000000000006044820152606401610a38565b604051600090339047908381818185875af1925050503d8060008114610b96576040519150601f19603f3d011682016040523d82523d6000602084013e610b9b565b606091505b5050905080610bec5760405162461bcd60e51b815260206004820152601660248201527f5472616e73666572206d61726b6574206661696c6564000000000000000000006044820152606401610a38565b50506001600955505050565b60006301ffc9a760e01b6001600160e01b031983161480610c2957506380ac58cd60e01b6001600160e01b03198316145b80610c445750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610c5990613637565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8590613637565b8015610cd25780601f10610ca757610100808354040283529160200191610cd2565b820191906000526020600020905b815481529060010190602001808311610cb557829003601f168201915b5050505050905090565b6000610ce7826125c4565b610d04576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d2b826118d8565b9050336001600160a01b03821614610d6457610d478133610963565b610d64576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610dc861256a565b601380546001600160a01b039586166001600160a01b0319918216179091556014805494861694821694909417909355601580549285169284169290921790915560168054919093169116179055565b6000610e23826125eb565b9050836001600160a01b0316816001600160a01b031614610e565760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ea357610e868633610963565b610ea357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610eca57604051633a954ecd60e21b815260040160405180910390fd5b8015610ed557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610f605760018401600081815260046020526040902054610f5e576000548114610f5e5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b323314610ff85760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156110435760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b54610100900460ff1661109a5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6564206d696e742069732064697361626c65642e0000000000006044820152606401610a38565b6013546001600160a01b03166110af8261264c565b6001600160a01b0316146111055760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b600d5433600090815260056020526040908190205484911c67ffffffffffffffff16611131919061359d565b11156111745760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e61826111856001546000540390565b61118f919061359d565b11156111d65760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b600a546111e49083906135d5565b3410156112335760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e742069732062656c6f77207468652070726963650000000000006044820152606401610a38565b61123d33836126d5565b5050565b3233146112905760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156112db5760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b546301000000900460ff166113345760405162461bcd60e51b815260206004820152601860248201527f5075626c6963206d696e742069732064697361626c65642e00000000000000006044820152606401610a38565b60115481111561137b5760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e618161138c6001546000540390565b611396919061359d565b11156113dd5760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b6010546113eb9082906135d5565b34101561143a5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e742069732062656c6f77207468652070726963650000000000006044820152606401610a38565b61144433826126d5565b50565b61144f61256a565b601b805461ff001981166101009182900460ff1615909102179055565b61147461256a565b601b805460ff19166001179055565b61148b61256a565b601b805463ff00000019811663010000009182900460ff1615909102179055565b6114c783838360405180602001604052806000815250611e91565b505050565b32331461151b5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156115665760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b54640100000000900460ff166115c05760405162461bcd60e51b815260206004820152601d60248201527f486f6c6465722066726565206d696e742069732064697361626c65642e0000006044820152606401610a38565b336000908152601a602052604090205460ff16156116205760405162461bcd60e51b815260206004820152601e60248201527f4672656520486f6c646572206d696e7420686173206265656e207573656400006044820152606401610a38565b6016546001600160a01b03166116358261264c565b6001600160a01b03161461168b5760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b6000611696336118e3565b6012546116a391906135d5565b9050600081116116f55760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374206e756d626572206f66204e46547300000000000000006044820152606401610a38565b611e61816117066001546000540390565b611710919061359d565b11156117575760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b60005b818110156117a8578161176e82600a61359d565b1061178b576117863361178183856135f4565b6126d5565b611796565b61179633600a6126d5565b6117a181600a61359d565b905061175a565b5050336000908152601a60205260409020805460ff1916600117905550565b6117cf61256a565b805161123d906017906020840190612e3a565b60608160008167ffffffffffffffff81111561180e57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561186057816020015b60408051608081018252600080825260208083018290529282018190526060820152825260001990920191018161182c5790505b50905060005b8281146118cf5761189c86868381811061189057634e487b7160e01b600052603260045260246000fd5b905060200201356120bf565b8282815181106118bc57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600101611866565b50949350505050565b6000610c44826125eb565b60006001600160a01b03821661190c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b61193a61256a565b61194460006126ef565b565b60606000806000611956856118e3565b905060008167ffffffffffffffff81111561198157634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156119aa578160200160208202803683370190505b5090506119d760408051608081018252600080825260208201819052918101829052606081019190915290565b60005b838614611a66576119ea81612741565b91508160400151156119fb57611a5e565b81516001600160a01b031615611a1057815194505b876001600160a01b0316856001600160a01b03161415611a5e5780838780600101985081518110611a5157634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b6001016119da565b50909695505050505050565b611a7a61256a565b600a98909855600b96909655600c94909455600d92909255600e55600f55601055601155601255565b611aab61256a565b805161123d906018906020840190612e3a565b606060038054610c5990613637565b6060818310611aef57604051631960ccad60e11b815260040160405180910390fd5b600080611afb60005490565b905080841115611b09578093505b6000611b14876118e3565b905084861015611b335785850381811015611b2d578091505b50611b37565b5060005b60008167ffffffffffffffff811115611b6057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b89578160200160208202803683370190505b50905081611b9c579350611c6092505050565b6000611ba7886120bf565b905060008160400151611bb8575080515b885b888114158015611bca5750848714155b15611c5457611bd881612741565b9250826040015115611be957611c4c565b82516001600160a01b031615611bfe57825191505b8a6001600160a01b0316826001600160a01b03161415611c4c5780848880600101995081518110611c3f57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611bba565b50505092835250909150505b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611cdb61256a565b611e6182611cec6001546000540390565b611cf6919061359d565b1115611d3d5760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b604d82601954611d4d919061359d565b1115611d9b5760405162461bcd60e51b815260206004820152601a60248201527f4d6178207661756c74206d696e746564206578636565646564210000000000006044820152606401610a38565b60005b82811015611de75782611db282600a61359d565b10611dca57611dc58261178183866135f4565b611dd5565b611dd582600a6126d5565b611de081600a61359d565b9050611d9e565b508160196000828254611dfa919061359d565b90915550505050565b60178054611e1090613637565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3c90613637565b8015611e895780601f10611e5e57610100808354040283529160200191611e89565b820191906000526020600020905b815481529060010190602001808311611e6c57829003601f168201915b505050505081565b611e9c848484610e18565b6001600160a01b0383163b15611ed557611eb8848484846127c0565b611ed5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b323314611f2a5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff1615611f755760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b6015546001600160a01b0316611f8a8261264c565b6001600160a01b031614611fe05760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b600f5433600090815260056020526040908190205484911c67ffffffffffffffff1661200c919061359d565b111561204f5760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e61826120606001546000540390565b61206a919061359d565b11156120b15760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b600c546111e49083906135d5565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106121135792915050565b61211c83612741565b905080604001511561212e5792915050565b611c60836128b8565b61213f61256a565b601b805462ff0000198116620100009182900460ff1615909102179055565b6060612169826125c4565b6121b55760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610a38565b601b5460ff1661221b576000601780546121ce90613637565b9050116121ea5760405180602001604052806000815250610c44565b60176121f583612930565b60405160200161220692919061339a565b60405160208183030381529060405292915050565b60006018805461222a90613637565b9050116122465760405180602001604052806000815250610c44565b60186121f583612930565b919050565b3233146122a55760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a38565b601b5462010000900460ff16156122f05760405162461bcd60e51b815260206004820152600f60248201526e2737ba102cb2ba1020b1ba34bb329760891b6044820152606401610a38565b601b54610100900460ff166123475760405162461bcd60e51b815260206004820152601a60248201527f50726573616c6564206d696e742069732064697361626c65642e0000000000006044820152606401610a38565b6014546001600160a01b031661235c8261264c565b6001600160a01b0316146123b25760405162461bcd60e51b815260206004820152601a60248201527f41646472657373206973206e6f7420616c6c6f776c69737465640000000000006044820152606401610a38565b600e5433600090815260056020526040908190205484911c67ffffffffffffffff166123de919061359d565b11156124215760405162461bcd60e51b8152602060048201526012602482015271496c6c6567616c20636f756e74204e46547360701b6044820152606401610a38565b611e61826124326001546000540390565b61243c919061359d565b11156124835760405162461bcd60e51b8152602060048201526016602482015275546f74616c20737570706c792065786365656465642160501b6044820152606401610a38565b600b546111e49083906135d5565b60188054611e1090613637565b6001600160a01b0381166000908152600560205260408082205467ffffffffffffffff911c16610c44565b6124d161256a565b601b805464ff000000001981166401000000009182900460ff1615909102179055565b6124fc61256a565b6001600160a01b0381166125615760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a38565b611444816126ef565b6008546001600160a01b031633146119445760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a38565b6000805482108015610c44575050600090815260046020526040902054600160e01b161590565b60008160005481101561263357600081815260046020526040902054600160e01b8116612631575b80611c60575060001901600081815260046020526040902054612613565b505b604051636f96cda160e11b815260040160405180910390fd5b604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401919091528351808403909101815260909092019092528051910120600090611c60818461297e565b61123d8282604051806020016040528060008152506129a2565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610c4490604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906127f5903390899088908890600401613454565b602060405180830381600087803b15801561280f57600080fd5b505af192505050801561283f575060408051601f3d908101601f1916820190925261283c918101906131e0565b60015b61289a573d80801561286d576040519150601f19603f3d011682016040523d82523d6000602084013e612872565b606091505b508051612892576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152610c446128e8836125eb565b604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806129675761296c565b61294a565b50819003601f19909101908152919050565b600080600061298d8585612a0f565b9150915061299a81612a55565b509392505050565b6129ac8383612c56565b6001600160a01b0383163b156114c7576000548281035b6129d660008683806001019450866127c0565b6129f3576040516368d2bf6b60e11b815260040160405180910390fd5b8181106129c3578160005414612a0857600080fd5b5050505050565b600080825160411415612a465760208301516040840151606085015160001a612a3a87828585612d4d565b94509450505050612a4e565b506000905060025b9250929050565b6000816004811115612a7757634e487b7160e01b600052602160045260246000fd5b1415612a805750565b6001816004811115612aa257634e487b7160e01b600052602160045260246000fd5b1415612af05760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610a38565b6002816004811115612b1257634e487b7160e01b600052602160045260246000fd5b1415612b605760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a38565b6003816004811115612b8257634e487b7160e01b600052602160045260246000fd5b1415612bdb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a38565b6004816004811115612bfd57634e487b7160e01b600052602160045260246000fd5b14156114445760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610a38565b60005481612c775760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114612d2657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612cee565b5081612d4457604051622e076360e81b815260040160405180910390fd5b60005550505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612d845750600090506003612e31565b8460ff16601b14158015612d9c57508460ff16601c14155b15612dad5750600090506004612e31565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612e01573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612e2a57600060019250925050612e31565b9150600090505b94509492505050565b828054612e4690613637565b90600052602060002090601f016020900481019282612e685760008555612eae565b82601f10612e8157805160ff1916838001178555612eae565b82800160010185558215612eae579182015b82811115612eae578251825591602001919060010190612e93565b50612eba929150612ebe565b5090565b5b80821115612eba5760008155600101612ebf565b600067ffffffffffffffff80841115612eee57612eee613688565b604051601f8501601f19908116603f01168101908282118183101715612f1657612f16613688565b81604052809350858152868686011115612f2f57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461225157600080fd5b600082601f830112612f70578081fd5b611c6083833560208501612ed3565b600060208284031215612f90578081fd5b611c6082612f49565b60008060408385031215612fab578081fd5b612fb483612f49565b9150612fc260208401612f49565b90509250929050565b60008060008060808587031215612fe0578182fd5b612fe985612f49565b9350612ff760208601612f49565b925061300560408601612f49565b915061301360608601612f49565b905092959194509250565b600080600060608486031215613032578283fd5b61303b84612f49565b925061304960208501612f49565b9150604084013590509250925092565b6000806000806080858703121561306e578384fd5b61307785612f49565b935061308560208601612f49565b925060408501359150606085013567ffffffffffffffff8111156130a7578182fd5b6130b387828801612f60565b91505092959194509250565b600080604083850312156130d1578182fd5b6130da83612f49565b9150602083013580151581146130ee578182fd5b809150509250929050565b6000806040838503121561310b578182fd5b61311483612f49565b946020939093013593505050565b600080600060608486031215613136578283fd5b61313f84612f49565b95602085013595506040909401359392505050565b60008060208385031215613166578182fd5b823567ffffffffffffffff8082111561317d578384fd5b818501915085601f830112613190578384fd5b81358181111561319e578485fd5b8660208260051b85010111156131b2578485fd5b60209290920196919550909350505050565b6000602082840312156131d5578081fd5b8135611c608161369e565b6000602082840312156131f1578081fd5b8151611c608161369e565b60006020828403121561320d578081fd5b813567ffffffffffffffff811115613223578182fd5b6128b084828501612f60565b600060208284031215613240578081fd5b813567ffffffffffffffff811115613256578182fd5b8201601f81018413613266578182fd5b6128b084823560208401612ed3565b600060208284031215613286578081fd5b5035919050565b6000806040838503121561329f578182fd5b82359150612fc260208401612f49565b600080604083850312156132c1578182fd5b82359150602083013567ffffffffffffffff8111156132de578182fd5b6132ea85828601612f60565b9150509250929050565b60008060008060008060008060006101208a8c031215613312578687fd5b505087359960208901359950604089013598606081013598506080810135975060a0810135965060c0810135955060e08101359450610100013592509050565b6000815180845261336a81602086016020860161360b565b601f01601f19169290920160200192915050565b6000815161339081856020860161360b565b9290920192915050565b600080845482600182811c9150808316806133b657607f831692505b60208084108214156133d657634e487b7160e01b87526022600452602487fd5b8180156133ea57600181146133fb57613427565b60ff19861689528489019650613427565b60008b815260209020885b8681101561341f5781548b820152908501908301613406565b505084890196505b50505050505061344b61343a828661337e565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526134866080830184613352565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611a66576134fa8385516001600160a01b03815116825267ffffffffffffffff602082015116602083015260408101511515604083015262ffffff60608201511660608301525050565b92840192608092909201916001016134ac565b6020808252825182820181905260009190848201906040850190845b81811015611a6657835183529284019291840191600101613529565b602081526000611c606020830184613352565b81516001600160a01b0316815260208083015167ffffffffffffffff169082015260408083015115159082015260608083015162ffffff169082015260808101610c44565b600082198211156135b0576135b0613672565b500190565b6000826135d057634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156135ef576135ef613672565b500290565b60008282101561360657613606613672565b500390565b60005b8381101561362657818101518382015260200161360e565b83811115611ed55750506000910152565b600181811c9082168061364b57607f821691505b6020821081141561366c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461144457600080fdfea2646970667358221220cf07ec70361a3f263a7585cf21333bb1a88e3326d28f649f056cade70c651d3264736f6c63430008040033

Deployed Bytecode Sourcemap

78459:8343:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86281:518;;;;;;;;;;-1:-1:-1;86281:518:0;;;;;:::i;:::-;;:::i;:::-;;24886:639;;;;;;;;;;-1:-1:-1;24886:639:0;;;;;:::i;:::-;;:::i;:::-;;;13374:14:1;;13367:22;13349:41;;13337:2;13322:18;24886:639:0;;;;;;;;25788:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32279:218::-;;;;;;;;;;-1:-1:-1;32279:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10763:55:1;;;10745:74;;10733:2;10718:18;32279:218:0;10700:125:1;31712:408:0;;;;;;:::i;:::-;;:::i;79220:43::-;;;;;;;;;;;;79261:2;79220:43;;;;;22761:25:1;;;22749:2;22734:18;79220:43:0;22716:76:1;79270:26:0;;;;;;;;;;;;;;;;21539:323;;;;;;;;;;-1:-1:-1;21813:12:0;;21600:7;21797:13;:28;21539:323;;85482:328;;;;;;;;;;-1:-1:-1;85482:328:0;;;;;:::i;:::-;;:::i;35918:2825::-;;;;;;:::i;:::-;;:::i;79717:631::-;;;;;;:::i;:::-;;:::i;82426:456::-;;;;;;:::i;:::-;;:::i;79437:24::-;;;;;;;;;;-1:-1:-1;79437:24:0;;;;;;;;;;;79172:41;;;;;;;;;;;;79209:4;79172:41;;83914:82;;;;;;;;;;;;;:::i;83835:73::-;;;;;;;;;;;;;:::i;84084:89::-;;;;;;;;;;;;;:::i;38839:193::-;;;;;;:::i;:::-;;:::i;79069:22::-;;;;;;;;;;-1:-1:-1;79069:22:0;;;;;;;;;;-1:-1:-1;;;;;79069:22:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11140:15:1;;;11122:34;;11192:15;;;11187:2;11172:18;;11165:43;11244:15;;;11224:18;;;11217:43;;;;11296:15;;;11291:2;11276:18;;11269:43;11048:3;11033:19;79069:22:0;11015:303:1;81574:846:0;;;;;;;;;;-1:-1:-1;81574:846:0;;;;;:::i;:::-;;:::i;79361:22::-;;;;;;;;;;-1:-1:-1;79361:22:0;;;;;;;;83701:128;;;;;;;;;;-1:-1:-1;83701:128:0;;;;;:::i;:::-;;:::i;62121:528::-;;;;;;;;;;-1:-1:-1;62121:528:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27181:152::-;;;;;;;;;;-1:-1:-1;27181:152:0;;;;;:::i;:::-;;:::i;22723:233::-;;;;;;;;;;-1:-1:-1;22723:233:0;;;;;:::i;:::-;;:::i;5651:103::-;;;;;;;;;;;;;:::i;65997:900::-;;;;;;;;;;-1:-1:-1;65997:900:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;84671:805::-;;;;;;;;;;-1:-1:-1;84671:805:0;;;;;:::i;:::-;;:::i;5003:87::-;;;;;;;;;;-1:-1:-1;5076:6:0;;-1:-1:-1;;;;;5076:6:0;5003:87;;79465:28;;;;;;;;;;-1:-1:-1;79465:28:0;;;;;;;;;;;83592:103;;;;;;;;;;-1:-1:-1;83592:103:0;;;;;:::i;:::-;;:::i;25964:104::-;;;;;;;;;;;;;:::i;63037:2513::-;;;;;;;;;;-1:-1:-1;63037:2513:0;;;;;:::i;:::-;;:::i;32837:234::-;;;;;;;;;;-1:-1:-1;32837:234:0;;;;;:::i;:::-;;:::i;85815:460::-;;;;;;;;;;-1:-1:-1;85815:460:0;;;;;:::i;:::-;;:::i;79413:20::-;;;;;;;;;;-1:-1:-1;79413:20:0;;;;;;;;;;;79098:32;;;;;;;;;;;;;:::i;39630:407::-;;;;;;:::i;:::-;;:::i;80991:577::-;;;;;;:::i;:::-;;:::i;79387:22::-;;;;;;;;;;-1:-1:-1;79387:22:0;;;;;;;;;;;61534:428;;;;;;;;;;-1:-1:-1;61534:428:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;84002:76::-;;;;;;;;;;;;;:::i;83002:470::-;;;;;;;;;;-1:-1:-1;83002:470:0;;;;;:::i;:::-;;:::i;80354:631::-;;;;;;:::i;:::-;;:::i;79139:26::-;;;;;;;;;;;;;:::i;82888:108::-;;;;;;;;;;-1:-1:-1;82888:108:0;;;;;:::i;:::-;;:::i;79038:24::-;;;;;;;;;;-1:-1:-1;79038:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23168:25:1;;;23224:2;23209:18;;23202:34;;;;23252:18;;;23245:34;;;;23310:2;23295:18;;23288:34;;;;23353:3;23338:19;;23331:35;;;;23397:3;23382:19;;23375:35;23441:3;23426:19;;23419:35;23485:3;23470:19;;23463:35;23529:3;23514:19;;23507:35;23155:3;23140:19;79038:24:0;23122:426:1;84179:101:0;;;;;;;;;;;;;:::i;33228:164::-;;;;;;;;;;-1:-1:-1;33228:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33349:25:0;;;33325:4;33349:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33228:164;79303:51;;;;;;;;;;-1:-1:-1;79303:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;5909:201;;;;;;;;;;-1:-1:-1;5909:201:0;;;;;:::i;:::-;;:::i;86281:518::-;4889:13;:11;:13::i;:::-;1914:1:::1;2512:7;;:19;;2504:63;;;::::0;-1:-1:-1;;;2504:63:0;;21835:2:1;2504:63:0::1;::::0;::::1;21817:21:1::0;21874:2;21854:18;;;21847:30;21913:33;21893:18;;;21886:61;21964:18;;2504:63:0::1;;;;;;;;;1914:1;2645:7;:18:::0;86407:3:::2;86390:20:::0;::::2;;86381:67;;;::::0;-1:-1:-1;;;86381:67:0;;18231:2:1;86381:67:0::2;::::0;::::2;18213:21:1::0;;;18250:18;;;18243:30;18309:34;18289:18;;;18282:62;18361:18;;86381:67:0::2;18203:182:1::0;86381:67:0::2;86463:22;86528:3;86488:37;86512:13:::0;86488:21:::2;:37;:::i;:::-;:43;;;;:::i;:::-;86463:68;;86541:10;86565:8;-1:-1:-1::0;;;;;86557:22:0::2;86587:14;86557:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86540:66;;;86625:5;86617:42;;;::::0;-1:-1:-1;;;86617:42:0;;14583:2:1;86617:42:0::2;::::0;::::2;14565:21:1::0;14622:2;14602:18;;;14595:30;14661:26;14641:18;;;14634:54;14705:18;;86617:42:0::2;14555:174:1::0;86617:42:0::2;86685:58;::::0;86669:10:::2;::::0;86693::::2;::::0;86717:21:::2;::::0;86669:10;86685:58;86669:10;86685:58;86717:21;86693:10;86685:58:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86668:75;;;86762:5;86754:40;;;::::0;-1:-1:-1;;;86754:40:0;;18947:2:1;86754:40:0::2;::::0;::::2;18929:21:1::0;18986:2;18966:18;;;18959:30;19025:24;19005:18;;;18998:52;19067:18;;86754:40:0::2;18919:172:1::0;86754:40:0::2;-1:-1:-1::0;;1870:1:0::1;2824:7;:22:::0;-1:-1:-1;;;86281:518:0:o;24886:639::-;24971:4;-1:-1:-1;;;;;;;;;25295:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;25372:25:0;;;25295:102;:179;;;-1:-1:-1;;;;;;;;;;25449:25:0;;;25295:179;25275:199;24886:639;-1:-1:-1;;24886:639:0:o;25788:100::-;25842:13;25875:5;25868:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25788:100;:::o;32279:218::-;32355:7;32380:16;32388:7;32380;:16::i;:::-;32375:64;;32405:34;;-1:-1:-1;;;32405:34:0;;;;;;;;;;;32375:64;-1:-1:-1;32459:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;32459:30:0;;32279:218::o;31712:408::-;31801:13;31817:16;31825:7;31817;:16::i;:::-;31801:32;-1:-1:-1;56045:10:0;-1:-1:-1;;;;;31850:28:0;;;31846:175;;31898:44;31915:5;56045:10;33228:164;:::i;31898:44::-;31893:128;;31970:35;;-1:-1:-1;;;31970:35:0;;;;;;;;;;;31893:128;32033:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;32033:35:0;-1:-1:-1;;;;;32033:35:0;;;;;;;;;32084:28;;32033:24;;32084:28;;;;;;;31712:408;;;:::o;85482:328::-;4889:13;:11;:13::i;:::-;85630:7:::1;:40:::0;;-1:-1:-1;;;;;85630:40:0;;::::1;-1:-1:-1::0;;;;;;85630:40:0;;::::1;;::::0;;;85675:22;:40;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;85720:22;:40;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;85765:22;:40;;;;;::::1;::::0;::::1;;::::0;;85482:328::o;35918:2825::-;36060:27;36090;36109:7;36090:18;:27::i;:::-;36060:57;;36175:4;-1:-1:-1;;;;;36134:45:0;36150:19;-1:-1:-1;;;;;36134:45:0;;36130:86;;36188:28;;-1:-1:-1;;;36188:28:0;;;;;;;;;;;36130:86;36230:27;35026:24;;;:15;:24;;;;;35254:26;;56045:10;34651:30;;;-1:-1:-1;;;;;34344:28:0;;34629:20;;;34626:56;36416:180;;36509:43;36526:4;56045:10;33228:164;:::i;36509:43::-;36504:92;;36561:35;;-1:-1:-1;;;36561:35:0;;;;;;;;;;;36504:92;-1:-1:-1;;;;;36613:16:0;;36609:52;;36638:23;;-1:-1:-1;;;36638:23:0;;;;;;;;;;;36609:52;36810:15;36807:2;;;36950:1;36929:19;36922:30;36807:2;-1:-1:-1;;;;;37347:24:0;;;;;;;:18;:24;;;;;;37345:26;;-1:-1:-1;;37345:26:0;;;37416:22;;;;;;;;;37414:24;;-1:-1:-1;37414:24:0;;;30570:11;30545:23;30541:41;30528:63;-1:-1:-1;;;30528:63:0;37709:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;38004:47:0;;38000:627;;38109:1;38099:11;;38077:19;38232:30;;;:17;:30;;;;;;38228:384;;38370:13;;38355:11;:28;38351:242;;38517:30;;;;:17;:30;;;;;:52;;;38351:242;38000:627;;38674:7;38670:2;-1:-1:-1;;;;;38655:27:0;38664:4;-1:-1:-1;;;;;38655:27:0;;;;;;;;;;;35918:2825;;;;;;:::o;79717:631::-;79570:9;79583:10;79570:23;79562:66;;;;-1:-1:-1;;;79562:66:0;;19298:2:1;79562:66:0;;;19280:21:1;19337:2;19317:18;;;19310:30;19376:32;19356:18;;;19349:60;19426:18;;79562:66:0;19270:180:1;79562:66:0;79837:8:::1;::::0;;;::::1;;;79836:9;79828:37;;;::::0;-1:-1:-1;;;79828:37:0;;17484:2:1;79828:37:0::1;::::0;::::1;17466:21:1::0;17523:2;17503:18;;;17496:30;-1:-1:-1;;;17542:18:1;;;17535:45;17597:18;;79828:37:0::1;17456:165:1::0;79828:37:0::1;79878:10;::::0;::::1;::::0;::::1;;;79870:49;;;::::0;-1:-1:-1;;;79870:49:0;;18592:2:1;79870:49:0::1;::::0;::::1;18574:21:1::0;18631:2;18611:18;;;18604:30;18670:28;18650:18;;;18643:56;18716:18;;79870:49:0::1;18564:176:1::0;79870:49:0::1;79960:7;:22:::0;-1:-1:-1;;;;;79960:22:0::1;79932:24;79946:9:::0;79932:13:::1;:24::i;:::-;-1:-1:-1::0;;;;;79932:50:0::1;;79924:89;;;::::0;-1:-1:-1;;;79924:89:0;;19657:2:1;79924:89:0::1;::::0;::::1;19639:21:1::0;19696:2;19676:18;;;19669:30;19735:28;19715:18;;;19708:56;19781:18;;79924:89:0::1;19629:176:1::0;79924:89:0::1;80069:27:::0;;80042:10:::1;23099:7:::0;23127:25;;;:18;:25;;17020:2;23127:25;;;;;80056:8;;23127:50;16882:13;23126:82;80028:36:::1;;;;:::i;:::-;80027:69;;80018:102;;;::::0;-1:-1:-1;;;80018:102:0;;21135:2:1;80018:102:0::1;::::0;::::1;21117:21:1::0;21174:2;21154:18;;;21147:30;-1:-1:-1;;;21193:18:1;;;21186:48;21251:18;;80018:102:0::1;21107:168:1::0;80018:102:0::1;79209:4;80150:8;80134:13;21813:12:::0;;21600:7;21797:13;:28;;21539:323;80134:13:::1;:24;;;;:::i;:::-;80133:40;;80125:75;;;::::0;-1:-1:-1;;;80125:75:0;;22195:2:1;80125:75:0::1;::::0;::::1;22177:21:1::0;22234:2;22214:18;;;22207:30;-1:-1:-1;;;22253:18:1;;;22246:52;22315:18;;80125:75:0::1;22167:172:1::0;80125:75:0::1;80227:8;:24:::0;:35:::1;::::0;80254:8;;80227:35:::1;:::i;:::-;80213:9;:50;;80205:89;;;::::0;-1:-1:-1;;;80205:89:0;;17129:2:1;80205:89:0::1;::::0;::::1;17111:21:1::0;17168:2;17148:18;;;17141:30;17207:28;17187:18;;;17180:56;17253:18;;80205:89:0::1;17101:176:1::0;80205:89:0::1;80309:31;80319:10;80331:8;80309:9;:31::i;:::-;79717:631:::0;;:::o;82426:456::-;79570:9;79583:10;79570:23;79562:66;;;;-1:-1:-1;;;79562:66:0;;19298:2:1;79562:66:0;;;19280:21:1;19337:2;19317:18;;;19310:30;19376:32;19356:18;;;19349:60;19426:18;;79562:66:0;19270:180:1;79562:66:0;82512:8:::1;::::0;;;::::1;;;82511:9;82503:37;;;::::0;-1:-1:-1;;;82503:37:0;;17484:2:1;82503:37:0::1;::::0;::::1;17466:21:1::0;17523:2;17503:18;;;17496:30;-1:-1:-1;;;17542:18:1;;;17535:45;17597:18;;82503:37:0::1;17456:165:1::0;82503:37:0::1;82553:12;::::0;;;::::1;;;82545:49;;;::::0;-1:-1:-1;;;82545:49:0;;14936:2:1;82545:49:0::1;::::0;::::1;14918:21:1::0;14975:2;14955:18;;;14948:30;15014:26;14994:18;;;14987:54;15058:18;;82545:49:0::1;14908:174:1::0;82545:49:0::1;82620:23:::0;;82608:35;::::1;;82599:68;;;::::0;-1:-1:-1;;;82599:68:0;;21135:2:1;82599:68:0::1;::::0;::::1;21117:21:1::0;21174:2;21154:18;;;21147:30;-1:-1:-1;;;21193:18:1;;;21186:48;21251:18;;82599:68:0::1;21107:168:1::0;82599:68:0::1;79209:4;82697:8;82681:13;21813:12:::0;;21600:7;21797:13;:28;;21539:323;82681:13:::1;:24;;;;:::i;:::-;82680:40;;82672:75;;;::::0;-1:-1:-1;;;82672:75:0;;22195:2:1;82672:75:0::1;::::0;::::1;22177:21:1::0;22234:2;22214:18;;;22207:30;-1:-1:-1;;;22253:18:1;;;22246:52;22315:18;;82672:75:0::1;22167:172:1::0;82672:75:0::1;82774:20:::0;;:31:::1;::::0;82797:8;;82774:31:::1;:::i;:::-;82760:9;:46;;82752:85;;;::::0;-1:-1:-1;;;82752:85:0;;17129:2:1;82752:85:0::1;::::0;::::1;17111:21:1::0;17168:2;17148:18;;;17141:30;17207:28;17187:18;;;17180:56;17253:18;;82752:85:0::1;17101:176:1::0;82752:85:0::1;82846:31;82856:10;82868:8;82846:9;:31::i;:::-;82426:456:::0;:::o;83914:82::-;4889:13;:11;:13::i;:::-;83981:10:::1;::::0;;-1:-1:-1;;83967:24:0;::::1;83981:10;::::0;;;::::1;;;83980:11;83967:24:::0;;::::1;;::::0;;83914:82::o;83835:73::-;4889:13;:11;:13::i;:::-;83886:10:::1;:17:::0;;-1:-1:-1;;83886:17:0::1;83899:4;83886:17;::::0;;83835:73::o;84084:89::-;4889:13;:11;:13::i;:::-;84156:12:::1;::::0;;-1:-1:-1;;84140:28:0;::::1;84156:12:::0;;;;::::1;;;84155:13;84140:28:::0;;::::1;;::::0;;84084:89::o;38839:193::-;38985:39;39002:4;39008:2;39012:7;38985:39;;;;;;;;;;;;:16;:39::i;:::-;38839:193;;;:::o;81574:846::-;79570:9;79583:10;79570:23;79562:66;;;;-1:-1:-1;;;79562:66:0;;19298:2:1;79562:66:0;;;19280:21:1;19337:2;19317:18;;;19310:30;19376:32;19356:18;;;19349:60;19426:18;;79562:66:0;19270:180:1;79562:66:0;81664:8:::1;::::0;;;::::1;;;81663:9;81655:37;;;::::0;-1:-1:-1;;;81655:37:0;;17484:2:1;81655:37:0::1;::::0;::::1;17466:21:1::0;17523:2;17503:18;;;17496:30;-1:-1:-1;;;17542:18:1;;;17535:45;17597:18;;81655:37:0::1;17456:165:1::0;81655:37:0::1;81705:16;::::0;;;::::1;;;81697:58;;;::::0;-1:-1:-1;;;81697:58:0;;16364:2:1;81697:58:0::1;::::0;::::1;16346:21:1::0;16403:2;16383:18;;;16376:30;16442:31;16422:18;;;16415:59;16491:18;;81697:58:0::1;16336:179:1::0;81697:58:0::1;81789:10;81769:31;::::0;;;:19:::1;:31;::::0;;;;;::::1;;81768:32;81760:75;;;::::0;-1:-1:-1;;;81760:75:0;;20012:2:1;81760:75:0::1;::::0;::::1;19994:21:1::0;20051:2;20031:18;;;20024:30;20090:32;20070:18;;;20063:60;20140:18;;81760:75:0::1;19984:180:1::0;81760:75:0::1;81876:22:::0;;-1:-1:-1;;;;;81876:22:0::1;81848:24;81862:9:::0;81848:13:::1;:24::i;:::-;-1:-1:-1::0;;;;;81848:50:0::1;;81840:89;;;::::0;-1:-1:-1;;;81840:89:0;;19657:2:1;81840:89:0::1;::::0;::::1;19639:21:1::0;19696:2;19676:18;;;19669:30;19735:28;19715:18;;;19708:56;19781:18;;81840:89:0::1;19629:176:1::0;81840:89:0::1;81938:23;81987:21;81997:10;81987:9;:21::i;:::-;81964:20:::0;;:44:::1;::::0;;::::1;:::i;:::-;81938:70;;82044:1;82026:15;:19;82017:58;;;::::0;-1:-1:-1;;;82017:58:0;;21482:2:1;82017:58:0::1;::::0;::::1;21464:21:1::0;21521:2;21501:18;;;21494:30;21560:26;21540:18;;;21533:54;21604:18;;82017:58:0::1;21454:174:1::0;82017:58:0::1;79209:4;82105:15;82089:13;21813:12:::0;;21600:7;21797:13;:28;;21539:323;82089:13:::1;:31;;;;:::i;:::-;82088:47;;82080:82;;;::::0;-1:-1:-1;;;82080:82:0;;22195:2:1;82080:82:0::1;::::0;::::1;22177:21:1::0;22234:2;22214:18;;;22207:30;-1:-1:-1;;;22253:18:1;;;22246:52;22315:18;;82080:82:0::1;22167:172:1::0;82080:82:0::1;82175:6;82171:195;82191:15;82187:1;:19;82171:195;;;82241:15:::0;82230:6:::1;:1:::0;82234:2:::1;82230:6;:::i;:::-;82229:27;82226:135;;82265:44;82275:10;82288:19;82306:1:::0;82288:15;:19:::1;:::i;:::-;82265:9;:44::i;:::-;82226:135;;;82329:25;82339:10;82351:2;82329:9;:25::i;:::-;82212:6;:1:::0;82216:2:::1;82212:6;:::i;:::-;82208:10;;82171:195;;;-1:-1:-1::0;;82394:10:0::1;82374:31;::::0;;;:19:::1;:31;::::0;;;;:38;;-1:-1:-1;;82374:38:0::1;82408:4;82374:38;::::0;;-1:-1:-1;81574:846:0:o;83701:128::-;4889:13;:11;:13::i;:::-;83790:34;;::::1;::::0;:18:::1;::::0;:34:::1;::::0;::::1;::::0;::::1;:::i;62121:528::-:0;62265:23;62356:8;62331:22;62356:8;62423:36;;;;;;-1:-1:-1;;;62423:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62423:36:0;;-1:-1:-1;;62423:36:0;;;;;;;;;;;;62386:73;;62479:9;62474:125;62495:14;62490:1;:19;62474:125;;62551:32;62571:8;;62580:1;62571:11;;;;;-1:-1:-1;;;62571:11:0;;;;;;;;;;;;;;;62551:19;:32::i;:::-;62535:10;62546:1;62535:13;;;;;;-1:-1:-1;;;62535:13:0;;;;;;;;;;;;;;;;;;:48;62511:3;;62474:125;;;-1:-1:-1;62620:10:0;62121:528;-1:-1:-1;;;;62121:528:0:o;27181:152::-;27253:7;27296:27;27315:7;27296:18;:27::i;22723:233::-;22795:7;-1:-1:-1;;;;;22819:19:0;;22815:60;;22847:28;;-1:-1:-1;;;22847:28:0;;;;;;;;;;;22815:60;-1:-1:-1;;;;;;22893:25:0;;;;;:18;:25;;;;;;16882:13;22893:55;;22723:233::o;5651:103::-;4889:13;:11;:13::i;:::-;5716:30:::1;5743:1;5716:18;:30::i;:::-;5651:103::o:0;65997:900::-;66075:16;66129:19;66163:25;66203:22;66228:16;66238:5;66228:9;:16::i;:::-;66203:41;;66259:25;66301:14;66287:29;;;;;;-1:-1:-1;;;66287:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66287:29:0;;66259:57;;66331:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66331:31:0;66382:9;66377:472;66426:14;66411:11;:29;66377:472;;66478:15;66491:1;66478:12;:15::i;:::-;66466:27;;66516:9;:16;;;66512:73;;;66557:8;;66512:73;66607:14;;-1:-1:-1;;;;;66607:28:0;;66603:111;;66680:14;;;-1:-1:-1;66603:111:0;66757:5;-1:-1:-1;;;;;66736:26:0;:17;-1:-1:-1;;;;;66736:26:0;;66732:102;;;66813:1;66787:8;66796:13;;;;;;66787:23;;;;;;-1:-1:-1;;;66787:23:0;;;;;;;;;;;;;;:27;;;;;66732:102;66442:3;;66377:472;;;-1:-1:-1;66870:8:0;;65997:900;-1:-1:-1;;;;;;65997:900:0:o;84671:805::-;4889:13;:11;:13::i;:::-;85034:8:::1;:43:::0;;;;85082:24;:43;;;;85130:24;:43;;;;85181:27;:49;;;;85235:27;:49;85289:27;:49;85346:20;:35;85386:23;:41;85436:20;:35;84671:805::o;83592:103::-;4889:13;:11;:13::i;:::-;83668:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;25964:104::-:0;26020:13;26053:7;26046:14;;;;;:::i;63037:2513::-;63180:16;63247:4;63238:5;:13;63234:45;;63260:19;;-1:-1:-1;;;63260:19:0;;;;;;;;;;;63234:45;63294:19;63328:17;63348:14;21281:7;21308:13;;21226:103;63348:14;63328:34;-1:-1:-1;63599:9:0;63592:4;:16;63588:73;;;63636:9;63629:16;;63588:73;63675:25;63703:16;63713:5;63703:9;:16::i;:::-;63675:44;;63897:4;63889:5;:12;63885:278;;;63944:12;;;63979:31;;;63975:111;;;64055:11;64035:31;;63975:111;63885:278;;;;-1:-1:-1;64146:1:0;63885:278;64177:25;64219:17;64205:32;;;;;;-1:-1:-1;;;64205:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64205:32:0;-1:-1:-1;64177:60:0;-1:-1:-1;64256:22:0;64252:78;;64306:8;-1:-1:-1;64299:15:0;;-1:-1:-1;;;64299:15:0;64252:78;64474:31;64508:26;64528:5;64508:19;:26::i;:::-;64474:60;;64549:25;64794:9;:16;;;64789:92;;-1:-1:-1;64851:14:0;;64789:92;64912:5;64895:478;64924:4;64919:1;:9;;:45;;;;;64947:17;64932:11;:32;;64919:45;64895:478;;;65002:15;65015:1;65002:12;:15::i;:::-;64990:27;;65040:9;:16;;;65036:73;;;65081:8;;65036:73;65131:14;;-1:-1:-1;;;;;65131:28:0;;65127:111;;65204:14;;;-1:-1:-1;65127:111:0;65281:5;-1:-1:-1;;;;;65260:26:0;:17;-1:-1:-1;;;;;65260:26:0;;65256:102;;;65337:1;65311:8;65320:13;;;;;;65311:23;;;;;;-1:-1:-1;;;65311:23:0;;;;;;;;;;;;;;:27;;;;;65256:102;64966:3;;64895:478;;;-1:-1:-1;;;65458:29:0;;;-1:-1:-1;65465:8:0;;-1:-1:-1;;63037:2513:0;;;;;;:::o;32837:234::-;56045:10;32932:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;32932:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;32932:60:0;;;;;;;;;;33008:55;;13349:41:1;;;32932:49:0;;56045:10;33008:55;;13322:18:1;33008:55:0;;;;;;;32837:234;;:::o;85815:460::-;4889:13;:11;:13::i;:::-;79209:4:::1;85923:8;85907:13;21813:12:::0;;21600:7;21797:13;:28;;21539:323;85907:13:::1;:24;;;;:::i;:::-;85906:40;;85898:75;;;::::0;-1:-1:-1;;;85898:75:0;;22195:2:1;85898:75:0::1;::::0;::::1;22177:21:1::0;22234:2;22214:18;;;22207:30;-1:-1:-1;;;22253:18:1;;;22246:52;22315:18;;85898:75:0::1;22167:172:1::0;85898:75:0::1;79261:2;86001:8;85987:11;;:22;;;;:::i;:::-;85986:42;;85978:82;;;::::0;-1:-1:-1;;;85978:82:0;;15289:2:1;85978:82:0::1;::::0;::::1;15271:21:1::0;15328:2;15308:18;;;15301:30;15367:28;15347:18;;;15340:56;15413:18;;85978:82:0::1;15261:176:1::0;85978:82:0::1;86073:6;86069:170;86089:8;86085:1;:12;86069:170;;;86132:8:::0;86121:6:::1;:1:::0;86125:2:::1;86121:6;:::i;:::-;86120:20;86117:117;;86149:35;86159:8:::0;86170:12:::1;86181:1:::0;86170:8;:12:::1;:::i;86149:35::-;86117:117;;;86204:23;86214:8;86224:2;86204:9;:23::i;:::-;86103:6;:1:::0;86107:2:::1;86103:6;:::i;:::-;86099:10;;86069:170;;;;86262:8;86247:11;;:23;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;85815:460:0:o;79098:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39630:407::-;39805:31;39818:4;39824:2;39828:7;39805:12;:31::i;:::-;-1:-1:-1;;;;;39851:14:0;;;:19;39847:183;;39890:56;39921:4;39927:2;39931:7;39940:5;39890:30;:56::i;:::-;39885:145;;39974:40;;-1:-1:-1;;;39974:40:0;;;;;;;;;;;39885:145;39630:407;;;;:::o;80991:577::-;79570:9;79583:10;79570:23;79562:66;;;;-1:-1:-1;;;79562:66:0;;19298:2:1;79562:66:0;;;19280:21:1;19337:2;19317:18;;;19310:30;19376:32;19356:18;;;19349:60;19426:18;;79562:66:0;19270:180:1;79562:66:0;81111:8:::1;::::0;;;::::1;;;81110:9;81102:37;;;::::0;-1:-1:-1;;;81102:37:0;;17484:2:1;81102:37:0::1;::::0;::::1;17466:21:1::0;17523:2;17503:18;;;17496:30;-1:-1:-1;;;17542:18:1;;;17535:45;17597:18;;81102:37:0::1;17456:165:1::0;81102:37:0::1;81180:22:::0;;-1:-1:-1;;;;;81180:22:0::1;81152:24;81166:9:::0;81152:13:::1;:24::i;:::-;-1:-1:-1::0;;;;;81152:50:0::1;;81144:89;;;::::0;-1:-1:-1;;;81144:89:0;;19657:2:1;81144:89:0::1;::::0;::::1;19639:21:1::0;19696:2;19676:18;;;19669:30;19735:28;19715:18;;;19708:56;19781:18;;81144:89:0::1;19629:176:1::0;81144:89:0::1;81289:27:::0;;81262:10:::1;23099:7:::0;23127:25;;;:18;:25;;17020:2;23127:25;;;;;81276:8;;23127:50;16882:13;23126:82;81248:36:::1;;;;:::i;:::-;81247:69;;81238:102;;;::::0;-1:-1:-1;;;81238:102:0;;21135:2:1;81238:102:0::1;::::0;::::1;21117:21:1::0;21174:2;21154:18;;;21147:30;-1:-1:-1;;;21193:18:1;;;21186:48;21251:18;;81238:102:0::1;21107:168:1::0;81238:102:0::1;79209:4;81370:8;81354:13;21813:12:::0;;21600:7;21797:13;:28;;21539:323;81354:13:::1;:24;;;;:::i;:::-;81353:40;;81345:75;;;::::0;-1:-1:-1;;;81345:75:0;;22195:2:1;81345:75:0::1;::::0;::::1;22177:21:1::0;22234:2;22214:18;;;22207:30;-1:-1:-1;;;22253:18:1;;;22246:52;22315:18;;81345:75:0::1;22167:172:1::0;81345:75:0::1;81447:24:::0;;:35:::1;::::0;81474:8;;81447:35:::1;:::i;61534:428::-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21281:7:0;21308:13;61727:7;:25;61694:103;;61776:9;61534:428;-1:-1:-1;;61534:428:0:o;61694:103::-;61819:21;61832:7;61819:12;:21::i;:::-;61807:33;;61855:9;:16;;;61851:65;;;61895:9;61534:428;-1:-1:-1;;61534:428:0:o;61851:65::-;61933:21;61946:7;61933:12;:21::i;84002:76::-;4889:13;:11;:13::i;:::-;84065:8:::1;::::0;;-1:-1:-1;;84053:20:0;::::1;84065:8:::0;;;;::::1;;;84064:9;84053:20:::0;;::::1;;::::0;;84002:76::o;83002:470::-;83075:13;83113:16;83121:7;83113;:16::i;:::-;83105:60;;;;-1:-1:-1;;;83105:60:0;;16004:2:1;83105:60:0;;;15986:21:1;16043:2;16023:18;;;16016:30;16082:33;16062:18;;;16055:61;16133:18;;83105:60:0;15976:181:1;83105:60:0;83182:10;;;;83178:287;;83241:1;83212:18;83206:32;;;;;:::i;:::-;;;:36;:117;;;;;;;;;;;;;;;;;83269:18;83289;83299:7;83289:9;:18::i;:::-;83252:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83199:124;83002:470;-1:-1:-1;;83002:470:0:o;83178:287::-;83383:1;83360:12;83354:26;;;;;:::i;:::-;;;:30;:105;;;;;;;;;;;;;;;;;83411:12;83425:18;83435:7;83425:9;:18::i;83178:287::-;83002:470;;;:::o;80354:631::-;79570:9;79583:10;79570:23;79562:66;;;;-1:-1:-1;;;79562:66:0;;19298:2:1;79562:66:0;;;19280:21:1;19337:2;19317:18;;;19310:30;19376:32;19356:18;;;19349:60;19426:18;;79562:66:0;19270:180:1;79562:66:0;80474:8:::1;::::0;;;::::1;;;80473:9;80465:37;;;::::0;-1:-1:-1;;;80465:37:0;;17484:2:1;80465:37:0::1;::::0;::::1;17466:21:1::0;17523:2;17503:18;;;17496:30;-1:-1:-1;;;17542:18:1;;;17535:45;17597:18;;80465:37:0::1;17456:165:1::0;80465:37:0::1;80515:10;::::0;::::1;::::0;::::1;;;80507:49;;;::::0;-1:-1:-1;;;80507:49:0;;18592:2:1;80507:49:0::1;::::0;::::1;18574:21:1::0;18631:2;18611:18;;;18604:30;18670:28;18650:18;;;18643:56;18716:18;;80507:49:0::1;18564:176:1::0;80507:49:0::1;80597:22:::0;;-1:-1:-1;;;;;80597:22:0::1;80569:24;80583:9:::0;80569:13:::1;:24::i;:::-;-1:-1:-1::0;;;;;80569:50:0::1;;80561:89;;;::::0;-1:-1:-1;;;80561:89:0;;19657:2:1;80561:89:0::1;::::0;::::1;19639:21:1::0;19696:2;19676:18;;;19669:30;19735:28;19715:18;;;19708:56;19781:18;;80561:89:0::1;19629:176:1::0;80561:89:0::1;80706:27:::0;;80679:10:::1;23099:7:::0;23127:25;;;:18;:25;;17020:2;23127:25;;;;;80693:8;;23127:50;16882:13;23126:82;80665:36:::1;;;;:::i;:::-;80664:69;;80655:102;;;::::0;-1:-1:-1;;;80655:102:0;;21135:2:1;80655:102:0::1;::::0;::::1;21117:21:1::0;21174:2;21154:18;;;21147:30;-1:-1:-1;;;21193:18:1;;;21186:48;21251:18;;80655:102:0::1;21107:168:1::0;80655:102:0::1;79209:4;80787:8;80771:13;21813:12:::0;;21600:7;21797:13;:28;;21539:323;80771:13:::1;:24;;;;:::i;:::-;80770:40;;80762:75;;;::::0;-1:-1:-1;;;80762:75:0;;22195:2:1;80762:75:0::1;::::0;::::1;22177:21:1::0;22234:2;22214:18;;;22207:30;-1:-1:-1;;;22253:18:1;;;22246:52;22315:18;;80762:75:0::1;22167:172:1::0;80762:75:0::1;80864:24:::0;;:35:::1;::::0;80891:8;;80864:35:::1;:::i;79139:26::-:0;;;;;;;:::i;82888:108::-;-1:-1:-1;;;;;23127:25:0;;82946:7;23127:25;;;:18;:25;;17020:2;23127:25;;;;16882:13;23127:50;;23126:82;82971:20;23038:178;84179:101;4889:13;:11;:13::i;:::-;84259:16:::1;::::0;;-1:-1:-1;;84239:36:0;::::1;84259:16:::0;;;;::::1;;;84258:17;84239:36:::0;;::::1;;::::0;;84179:101::o;5909:201::-;4889:13;:11;:13::i;:::-;-1:-1:-1;;;;;5998:22:0;::::1;5990:73;;;::::0;-1:-1:-1;;;5990:73:0;;16722:2:1;5990:73:0::1;::::0;::::1;16704:21:1::0;16761:2;16741:18;;;16734:30;16800:34;16780:18;;;16773:62;-1:-1:-1;;;16851:18:1;;;16844:36;16897:19;;5990:73:0::1;16694:228:1::0;5990:73:0::1;6074:28;6093:8;6074:18;:28::i;5168:132::-:0;5076:6;;-1:-1:-1;;;;;5076:6:0;56045:10;5232:23;5224:68;;;;-1:-1:-1;;;5224:68:0;;20774:2:1;5224:68:0;;;20756:21:1;;;20793:18;;;20786:30;20852:34;20832:18;;;20825:62;20904:18;;5224:68:0;20746:182:1;33650:282:0;33715:4;33805:13;;33795:7;:23;33752:153;;;;-1:-1:-1;;33856:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;33856:44:0;:49;;33650:282::o;28336:1275::-;28403:7;28438;28540:13;;28533:4;:20;28529:1015;;;28578:14;28595:23;;;:17;:23;;;;;;-1:-1:-1;;;28684:24:0;;28680:845;;29349:113;29356:11;29349:113;;-1:-1:-1;;;29427:6:0;29409:25;;;;:17;:25;;;;;;29349:113;;28680:845;28529:1015;;29572:31;;-1:-1:-1;;;29572:31:0;;;;;;;;;;;84285:380;84552:28;;;84569:10;8609:2:1;8605:15;-1:-1:-1;;8601:53:1;84552:28:0;;;;8589:66:1;;;;84552:28:0;;;;;;;;;8671:12:1;;;84552:28:0;;84542:39;;;;;;10246:66:1;84454:142:0;;;10234:79:1;10329:12;;;;10322:28;;;;84454:142:0;;;;;;;;;;10366:12:1;;;;84454:142:0;;;84430:177;;;;;84381:7;;84625:32;84430:177;84647:9;84625:21;:32::i;49790:112::-;49867:27;49877:2;49881:8;49867:27;;;;;;;;;;;;:9;:27::i;6270:191::-;6363:6;;;-1:-1:-1;;;;;6380:17:0;;;-1:-1:-1;;;;;;6380:17:0;;;;;;;6413:40;;6363:6;;;6380:17;6363:6;;6413:40;;6344:16;;6413:40;6270:191;;:::o;27784:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27912:24:0;;;;:17;:24;;;;;;27893:44;;-1:-1:-1;;;;;;;;;;;;;29820:41:0;;;;17541:3;29906:33;;;29872:68;;-1:-1:-1;;;29872:68:0;-1:-1:-1;;;29970:24:0;;:29;;-1:-1:-1;;;29951:48:0;;;;18062:3;30039:28;;;;-1:-1:-1;;;30010:58:0;-1:-1:-1;29710:366:0;42121:716;42305:88;;-1:-1:-1;;;42305:88:0;;42284:4;;-1:-1:-1;;;;;42305:45:0;;;;;:88;;56045:10;;42372:4;;42378:7;;42387:5;;42305:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42305:88:0;;;;;;;;-1:-1:-1;;42305:88:0;;;;;;;;;;;;:::i;:::-;;;42301:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42588:13:0;;42584:235;;42634:40;;-1:-1:-1;;;42634:40:0;;;;;;;;;;;42584:235;42777:6;42771:13;42762:6;42758:2;42754:15;42747:38;42301:529;-1:-1:-1;;;;;;42464:64:0;-1:-1:-1;;;42464:64:0;;-1:-1:-1;42301:529:0;42121:716;;;;;;:::o;27522:166::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27633:47:0;27652:27;27671:7;27652:18;:27::i;:::-;-1:-1:-1;;;;;;;;;;;;;29820:41:0;;;;17541:3;29906:33;;;29872:68;;-1:-1:-1;;;29872:68:0;-1:-1:-1;;;29970:24:0;;:29;;-1:-1:-1;;;29951:48:0;;;;18062:3;30039:28;;;;-1:-1:-1;;;30010:58:0;-1:-1:-1;29710:366:0;56165:1745;56230:17;56664:4;56657;56651:11;56647:22;56756:1;56750:4;56743:15;56831:4;56828:1;56824:12;56817:19;;;56913:1;56908:3;56901:14;57017:3;57256:5;57238:428;57304:1;57299:3;57295:11;57288:18;;57475:2;57469:4;57465:13;57461:2;57457:22;57452:3;57444:36;57569:2;57559:13;;;57626:2;;57644:5;;57626:2;57238:428;;;-1:-1:-1;57696:13:0;;;-1:-1:-1;;57811:14:0;;;57873:19;;;57811:14;56269:1634;-1:-1:-1;56269:1634:0:o;73271:231::-;73349:7;73370:17;73389:18;73411:27;73422:4;73428:9;73411:10;:27::i;:::-;73369:69;;;;73449:18;73461:5;73449:11;:18::i;:::-;-1:-1:-1;73485:9:0;73271:231;-1:-1:-1;;;73271:231:0:o;49017:689::-;49148:19;49154:2;49158:8;49148:5;:19::i;:::-;-1:-1:-1;;;;;49209:14:0;;;:19;49205:483;;49249:11;49263:13;49311:14;;;49344:233;49375:62;49414:1;49418:2;49422:7;;;;;;49431:5;49375:30;:62::i;:::-;49370:167;;49473:40;;-1:-1:-1;;;49473:40:0;;;;;;;;;;;49370:167;49572:3;49564:5;:11;49344:233;;49659:3;49642:13;;:20;49638:34;;49664:8;;;49638:34;49205:483;;49017:689;;;:::o;71722:747::-;71803:7;71812:12;71841:9;:16;71861:2;71841:22;71837:625;;;72185:4;72170:20;;72164:27;72235:4;72220:20;;72214:27;72293:4;72278:20;;72272:27;71880:9;72264:36;72336:25;72347:4;72264:36;72164:27;72214;72336:10;:25::i;:::-;72329:32;;;;;;;;;71837:625;-1:-1:-1;72410:1:0;;-1:-1:-1;72414:35:0;71837:625;71722:747;;;;;:::o;69993:643::-;70071:20;70062:5;:29;;;;;;-1:-1:-1;;;70062:29:0;;;;;;;;;;70058:571;;;69993:643;:::o;70058:571::-;70169:29;70160:5;:38;;;;;;-1:-1:-1;;;70160:38:0;;;;;;;;;;70156:473;;;70215:34;;-1:-1:-1;;;70215:34:0;;14230:2:1;70215:34:0;;;14212:21:1;14269:2;14249:18;;;14242:30;14308:26;14288:18;;;14281:54;14352:18;;70215:34:0;14202:174:1;70156:473:0;70280:35;70271:5;:44;;;;;;-1:-1:-1;;;70271:44:0;;;;;;;;;;70267:362;;;70332:41;;-1:-1:-1;;;70332:41:0;;15644:2:1;70332:41:0;;;15626:21:1;15683:2;15663:18;;;15656:30;15722:33;15702:18;;;15695:61;15773:18;;70332:41:0;15616:181:1;70267:362:0;70404:30;70395:5;:39;;;;;;-1:-1:-1;;;70395:39:0;;;;;;;;;;70391:238;;;70451:44;;-1:-1:-1;;;70451:44:0;;17828:2:1;70451:44:0;;;17810:21:1;17867:2;17847:18;;;17840:30;17906:34;17886:18;;;17879:62;-1:-1:-1;;;17957:18:1;;;17950:32;17999:19;;70451:44:0;17800:224:1;70391:238:0;70526:30;70517:5;:39;;;;;;-1:-1:-1;;;70517:39:0;;;;;;;;;;70513:116;;;70573:44;;-1:-1:-1;;;70573:44:0;;20371:2:1;70573:44:0;;;20353:21:1;20410:2;20390:18;;;20383:30;20449:34;20429:18;;;20422:62;-1:-1:-1;;;20500:18:1;;;20493:32;20542:19;;70573:44:0;20343:224:1;43299:2966:0;43372:20;43395:13;43423;43419:44;;43445:18;;-1:-1:-1;;;43445:18:0;;;;;;;;;;;43419:44;-1:-1:-1;;;;;43951:22:0;;;;;;:18;:22;;;;17020:2;43951:22;;;:71;;43989:32;43977:45;;43951:71;;;44265:31;;;:17;:31;;;;;-1:-1:-1;31001:15:0;;30975:24;30971:46;30570:11;30545:23;30541:41;30538:52;30528:63;;44265:173;;44500:23;;;;44265:31;;43951:22;;45265:25;43951:22;;45118:335;45779:1;45765:12;45761:20;45719:346;45820:3;45811:7;45808:16;45719:346;;46038:7;46028:8;46025:1;45998:25;45995:1;45992;45987:59;45873:1;45860:15;45719:346;;;-1:-1:-1;46098:13:0;46094:45;;46120:19;;-1:-1:-1;;;46120:19:0;;;;;;;;;;;46094:45;46156:13;:19;-1:-1:-1;38839:193:0;;;:::o;74723:1632::-;74854:7;;75788:66;75775:79;;75771:163;;;-1:-1:-1;75887:1:0;;-1:-1:-1;75891:30:0;75871:51;;75771:163;75948:1;:7;;75953:2;75948:7;;:18;;;;;75959:1;:7;;75964:2;75959:7;;75948:18;75944:102;;;-1:-1:-1;75999:1:0;;-1:-1:-1;76003:30:0;75983:51;;75944:102;76160:24;;;76143:14;76160:24;;;;;;;;;13628:25:1;;;13701:4;13689:17;;13669:18;;;13662:45;;;;13723:18;;;13716:34;;;13766:18;;;13759:34;;;76160:24:0;;13600:19:1;;76160:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;76160:24:0;;-1:-1:-1;;76160:24:0;;;-1:-1:-1;;;;;;;76199:20:0;;76195:103;;76252:1;76256:29;76236:50;;;;;;;76195:103;76318:6;-1:-1:-1;76326:20:0;;-1:-1:-1;74723:1632:0;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:196::-;718:20;;-1:-1:-1;;;;;767:54:1;;757:65;;747:2;;836:1;833;826:12;851:228;893:5;946:3;939:4;931:6;927:17;923:27;913:2;;968:5;961;954:20;913:2;994:79;1069:3;1060:6;1047:20;1040:4;1032:6;1028:17;994:79;:::i;1084:196::-;1143:6;1196:2;1184:9;1175:7;1171:23;1167:32;1164:2;;;1217:6;1209;1202:22;1164:2;1245:29;1264:9;1245:29;:::i;1285:270::-;1353:6;1361;1414:2;1402:9;1393:7;1389:23;1385:32;1382:2;;;1435:6;1427;1420:22;1382:2;1463:29;1482:9;1463:29;:::i;:::-;1453:39;;1511:38;1545:2;1534:9;1530:18;1511:38;:::i;:::-;1501:48;;1372:183;;;;;:::o;1560:419::-;1646:6;1654;1662;1670;1723:3;1711:9;1702:7;1698:23;1694:33;1691:2;;;1745:6;1737;1730:22;1691:2;1773:29;1792:9;1773:29;:::i;:::-;1763:39;;1821:38;1855:2;1844:9;1840:18;1821:38;:::i;:::-;1811:48;;1878:38;1912:2;1901:9;1897:18;1878:38;:::i;:::-;1868:48;;1935:38;1969:2;1958:9;1954:18;1935:38;:::i;:::-;1925:48;;1681:298;;;;;;;:::o;1984:338::-;2061:6;2069;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:2;;;2151:6;2143;2136:22;2098:2;2179:29;2198:9;2179:29;:::i;:::-;2169:39;;2227:38;2261:2;2250:9;2246:18;2227:38;:::i;:::-;2217:48;;2312:2;2301:9;2297:18;2284:32;2274:42;;2088:234;;;;;:::o;2327:557::-;2422:6;2430;2438;2446;2499:3;2487:9;2478:7;2474:23;2470:33;2467:2;;;2521:6;2513;2506:22;2467:2;2549:29;2568:9;2549:29;:::i;:::-;2539:39;;2597:38;2631:2;2620:9;2616:18;2597:38;:::i;:::-;2587:48;;2682:2;2671:9;2667:18;2654:32;2644:42;;2737:2;2726:9;2722:18;2709:32;2764:18;2756:6;2753:30;2750:2;;;2801:6;2793;2786:22;2750:2;2829:49;2870:7;2861:6;2850:9;2846:22;2829:49;:::i;:::-;2819:59;;;2457:427;;;;;;;:::o;2889:367::-;2954:6;2962;3015:2;3003:9;2994:7;2990:23;2986:32;2983:2;;;3036:6;3028;3021:22;2983:2;3064:29;3083:9;3064:29;:::i;:::-;3054:39;;3143:2;3132:9;3128:18;3115:32;3190:5;3183:13;3176:21;3169:5;3166:32;3156:2;;3217:6;3209;3202:22;3156:2;3245:5;3235:15;;;2973:283;;;;;:::o;3261:264::-;3329:6;3337;3390:2;3378:9;3369:7;3365:23;3361:32;3358:2;;;3411:6;3403;3396:22;3358:2;3439:29;3458:9;3439:29;:::i;:::-;3429:39;3515:2;3500:18;;;;3487:32;;-1:-1:-1;;;3348:177:1:o;3530:332::-;3607:6;3615;3623;3676:2;3664:9;3655:7;3651:23;3647:32;3644:2;;;3697:6;3689;3682:22;3644:2;3725:29;3744:9;3725:29;:::i;:::-;3715:39;3801:2;3786:18;;3773:32;;-1:-1:-1;3852:2:1;3837:18;;;3824:32;;3634:228;-1:-1:-1;;;3634:228:1:o;3867:665::-;3953:6;3961;4014:2;4002:9;3993:7;3989:23;3985:32;3982:2;;;4035:6;4027;4020:22;3982:2;4080:9;4067:23;4109:18;4150:2;4142:6;4139:14;4136:2;;;4171:6;4163;4156:22;4136:2;4214:6;4203:9;4199:22;4189:32;;4259:7;4252:4;4248:2;4244:13;4240:27;4230:2;;4286:6;4278;4271:22;4230:2;4331;4318:16;4357:2;4349:6;4346:14;4343:2;;;4378:6;4370;4363:22;4343:2;4436:7;4431:2;4421:6;4418:1;4414:14;4410:2;4406:23;4402:32;4399:45;4396:2;;;4462:6;4454;4447:22;4396:2;4498;4490:11;;;;;4520:6;;-1:-1:-1;3972:560:1;;-1:-1:-1;;;;3972:560:1:o;4537:255::-;4595:6;4648:2;4636:9;4627:7;4623:23;4619:32;4616:2;;;4669:6;4661;4654:22;4616:2;4713:9;4700:23;4732:30;4756:5;4732:30;:::i;4797:259::-;4866:6;4919:2;4907:9;4898:7;4894:23;4890:32;4887:2;;;4940:6;4932;4925:22;4887:2;4977:9;4971:16;4996:30;5020:5;4996:30;:::i;5061:340::-;5129:6;5182:2;5170:9;5161:7;5157:23;5153:32;5150:2;;;5203:6;5195;5188:22;5150:2;5248:9;5235:23;5281:18;5273:6;5270:30;5267:2;;;5318:6;5310;5303:22;5267:2;5346:49;5387:7;5378:6;5367:9;5363:22;5346:49;:::i;5406:480::-;5475:6;5528:2;5516:9;5507:7;5503:23;5499:32;5496:2;;;5549:6;5541;5534:22;5496:2;5594:9;5581:23;5627:18;5619:6;5616:30;5613:2;;;5664:6;5656;5649:22;5613:2;5692:22;;5745:4;5737:13;;5733:27;-1:-1:-1;5723:2:1;;5779:6;5771;5764:22;5723:2;5807:73;5872:7;5867:2;5854:16;5849:2;5845;5841:11;5807:73;:::i;5891:190::-;5950:6;6003:2;5991:9;5982:7;5978:23;5974:32;5971:2;;;6024:6;6016;6009:22;5971:2;-1:-1:-1;6052:23:1;;5961:120;-1:-1:-1;5961:120:1:o;6086:264::-;6154:6;6162;6215:2;6203:9;6194:7;6190:23;6186:32;6183:2;;;6236:6;6228;6221:22;6183:2;6277:9;6264:23;6254:33;;6306:38;6340:2;6329:9;6325:18;6306:38;:::i;6355:408::-;6432:6;6440;6493:2;6481:9;6472:7;6468:23;6464:32;6461:2;;;6514:6;6506;6499:22;6461:2;6555:9;6542:23;6532:33;;6616:2;6605:9;6601:18;6588:32;6643:18;6635:6;6632:30;6629:2;;;6680:6;6672;6665:22;6629:2;6708:49;6749:7;6740:6;6729:9;6725:22;6708:49;:::i;:::-;6698:59;;;6451:312;;;;;:::o;6768:740::-;6899:6;6907;6915;6923;6931;6939;6947;6955;6963;7016:3;7004:9;6995:7;6991:23;6987:33;6984:2;;;7038:6;7030;7023:22;6984:2;-1:-1:-1;;7066:23:1;;;7136:2;7121:18;;7108:32;;-1:-1:-1;7187:2:1;7172:18;;7159:32;;7238:2;7223:18;;7210:32;;-1:-1:-1;7289:3:1;7274:19;;7261:33;;-1:-1:-1;7341:3:1;7326:19;;7313:33;;-1:-1:-1;7393:3:1;7378:19;;7365:33;;-1:-1:-1;7445:3:1;7430:19;;7417:33;;-1:-1:-1;7497:3:1;7482:19;7469:33;;-1:-1:-1;6974:534:1;-1:-1:-1;6974:534:1:o;7513:257::-;7554:3;7592:5;7586:12;7619:6;7614:3;7607:19;7635:63;7691:6;7684:4;7679:3;7675:14;7668:4;7661:5;7657:16;7635:63;:::i;:::-;7752:2;7731:15;-1:-1:-1;;7727:29:1;7718:39;;;;7759:4;7714:50;;7562:208;-1:-1:-1;;7562:208:1:o;7775:185::-;7817:3;7855:5;7849:12;7870:52;7915:6;7910:3;7903:4;7896:5;7892:16;7870:52;:::i;:::-;7938:16;;;;;7825:135;-1:-1:-1;;7825:135:1:o;8694:1305::-;8971:3;9000;9035:6;9029:13;9065:3;9087:1;9115:9;9111:2;9107:18;9097:28;;9175:2;9164:9;9160:18;9197;9187:2;;9241:4;9233:6;9229:17;9219:27;;9187:2;9267;9315;9307:6;9304:14;9284:18;9281:38;9278:2;;;-1:-1:-1;;;9342:33:1;;9398:4;9395:1;9388:15;9428:4;9349:3;9416:17;9278:2;9459:18;9486:104;;;;9604:1;9599:322;;;;9452:469;;9486:104;-1:-1:-1;;9519:24:1;;9507:37;;9564:16;;;;-1:-1:-1;9486:104:1;;9599:322;23600:4;23619:17;;;23669:4;23653:21;;9694:3;9710:165;9724:6;9721:1;9718:13;9710:165;;;9802:14;;9789:11;;;9782:35;9845:16;;;;9739:10;;9710:165;;;9714:3;;9904:6;9899:3;9895:16;9888:23;;9452:469;;;;;;;9937:56;9962:30;9988:3;9980:6;9962:30;:::i;:::-;-1:-1:-1;;;8025:20:1;;8070:1;8061:11;;8015:63;9937:56;9930:63;8979:1020;-1:-1:-1;;;;;8979:1020:1:o;11323:511::-;11517:4;-1:-1:-1;;;;;11627:2:1;11619:6;11615:15;11604:9;11597:34;11679:2;11671:6;11667:15;11662:2;11651:9;11647:18;11640:43;;11719:6;11714:2;11703:9;11699:18;11692:34;11762:3;11757:2;11746:9;11742:18;11735:31;11783:45;11823:3;11812:9;11808:19;11800:6;11783:45;:::i;:::-;11775:53;11526:308;-1:-1:-1;;;;;;11526:308:1:o;11839:725::-;12072:2;12124:21;;;12194:13;;12097:18;;;12216:22;;;12043:4;;12072:2;12295:15;;;;12269:2;12254:18;;;12043:4;12341:197;12355:6;12352:1;12349:13;12341:197;;;12404:52;12452:3;12443:6;12437:13;-1:-1:-1;;;;;8173:5:1;8167:12;8163:61;8158:3;8151:74;8286:18;8278:4;8271:5;8267:16;8261:23;8257:48;8250:4;8245:3;8241:14;8234:72;8369:4;8362:5;8358:16;8352:23;8345:31;8338:39;8331:4;8326:3;8322:14;8315:63;8439:8;8431:4;8424:5;8420:16;8414:23;8410:38;8403:4;8398:3;8394:14;8387:62;8141:314;;;12404:52;12513:15;;;;12485:4;12476:14;;;;;12377:1;12370:9;12341:197;;12569:635;12740:2;12792:21;;;12862:13;;12765:18;;;12884:22;;;12711:4;;12740:2;12963:15;;;;12937:2;12922:18;;;12711:4;13009:169;13023:6;13020:1;13017:13;13009:169;;;13084:13;;13072:26;;13153:15;;;;13118:12;;;;13045:1;13038:9;13009:169;;13804:219;13953:2;13942:9;13935:21;13916:4;13973:44;14013:2;14002:9;13998:18;13990:6;13973:44;:::i;22344:266::-;8167:12;;-1:-1:-1;;;;;8163:61:1;8151:74;;8278:4;8267:16;;;8261:23;8286:18;8257:48;8241:14;;;8234:72;8369:4;8358:16;;;8352:23;8345:31;8338:39;8322:14;;;8315:63;8431:4;8420:16;;;8414:23;8439:8;8410:38;8394:14;;;8387:62;22540:3;22525:19;;22553:51;8141:314;23685:128;23725:3;23756:1;23752:6;23749:1;23746:13;23743:2;;;23762:18;;:::i;:::-;-1:-1:-1;23798:9:1;;23733:80::o;23818:217::-;23858:1;23884;23874:2;;-1:-1:-1;;;23909:31:1;;23963:4;23960:1;23953:15;23991:4;23916:1;23981:15;23874:2;-1:-1:-1;24020:9:1;;23864:171::o;24040:168::-;24080:7;24146:1;24142;24138:6;24134:14;24131:1;24128:21;24123:1;24116:9;24109:17;24105:45;24102:2;;;24153:18;;:::i;:::-;-1:-1:-1;24193:9:1;;24092:116::o;24213:125::-;24253:4;24281:1;24278;24275:8;24272:2;;;24286:18;;:::i;:::-;-1:-1:-1;24323:9:1;;24262:76::o;24343:258::-;24415:1;24425:113;24439:6;24436:1;24433:13;24425:113;;;24515:11;;;24509:18;24496:11;;;24489:39;24461:2;24454:10;24425:113;;;24556:6;24553:1;24550:13;24547:2;;;-1:-1:-1;;24591:1:1;24573:16;;24566:27;24396:205::o;24606:380::-;24685:1;24681:12;;;;24728;;;24749:2;;24803:4;24795:6;24791:17;24781:27;;24749:2;24856;24848:6;24845:14;24825:18;24822:38;24819:2;;;24902:10;24897:3;24893:20;24890:1;24883:31;24937:4;24934:1;24927:15;24965:4;24962:1;24955:15;24819:2;;24661:325;;;:::o;24991:127::-;25052:10;25047:3;25043:20;25040:1;25033:31;25083:4;25080:1;25073:15;25107:4;25104:1;25097:15;25123:127;25184:10;25179:3;25175:20;25172:1;25165:31;25215:4;25212:1;25205:15;25239:4;25236:1;25229:15;25255:131;-1:-1:-1;;;;;;25329:32:1;;25319:43;;25309:2;;25376:1;25373;25366:12

Swarm Source

ipfs://cf07ec70361a3f263a7585cf21333bb1a88e3326d28f649f056cade70c651d32
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.