ETH Price: $2,301.99 (-4.89%)

Token

Shadow Descendants 2.0 (SHD2)
 

Overview

Max Total Supply

8,888 SHD2

Holders

122

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
15 SHD2
0x61EcBaFEB82B778592a6f8c6eC6B6F5b39FbCbd7
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:
ShadowDescendants2

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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`
    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 => address) private _tokenApprovals;

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 auxillary 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 auxillary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // 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 `_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));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // 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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _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))
                }
            }
        }
    }

    /**
     * @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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/WoFERC721A.sol

pragma solidity ^0.8.4;

contract ShadowDescendants2 is ERC721A, Ownable, Pausable {
    using Strings for uint256; 

    string public baseURI =
        "https://crimson-managing-cow-793.mypinata.cloud/ipfs/QmfKdAK6Jnz9crZGuUYQmU2gbCQ36YcWPCS8Fb4yJ6LbJH/";
    string public revealURI = "https://crimson-managing-cow-793.mypinata.cloud/ipfs/QmNuHx8TagzvtAnED1qHRjEwD4JcC5Wnvqie1VmnSSFAon";
    string public baseExtension = ".json";
    uint256 public cost = 0.07 ether;
    uint256 public presale_price = 0.05 ether;
    uint256 public maxSupply = 8888;
    uint8 public maxMintPerTransaction = 15;

    bool public reveal = false;
    bool public presale = true;

    address[] public whitelistedUsers = [0xE4f3aae8eb3Ebe3AAEF5149923f39A73806846BA, 0xcb1de9459670F9F0e59D21ef03c2b1074c81Bb21, 0x0ea1e75581A77B3A340aC9974bEfda27cfFFD919, 0xD0103F400BCD2A479121EaEb727EB4aCD868f9E2, 0x0359A4e95E8dC2E4b339A01d5cFd069cd20C6d6A, 0x04071eB17E0Fe8ccB0A983D0512D1136EFD4c283, 0x2Fe3a5Ba42c3dAd794c5dCc8C0c1B040948a83B7, 0x7b719f9518F4DDCd341D28838a06A78395A7d5fC, 0x539118962Fc4dF077D41c1817A34cbebfB9d5c1f, 0x5412BDf6320743D8b7947f29b7D345EF49f7895D, 0xd8C57a571964792130d8F6D49b5858CD9608c65c, 0x25074DF7e8350e19550106b5eb9D6baCC15f4231, 0x80e1980DeA1955Ad6cF7be35a757C9906C6Fe8fd, 0xf3498469C50bB31f0009e79106F0Cce08F98438a, 0x56886698844feE080A1564043982a7e7e4e79636, 0xa75fF87Cdd93172c84eC20A7e2c4d7568821De7e, 0x234FC221ca597621faCC18dcc730E2903ed4Ae32, 0x8190fA7c68321b2cb1d4539FeF61Fd92CCFcE1E3, 0xE588E86442fb06E3234810fCE0E1e385307d06e1, 0x34979D41e36d55dDfbBCe66efCc4F0f6dc4B9Ac9, 0xc5bA28f05c52563dC8293bA6CD7f7f1520ca0DeD, 0xC7300878a4b0459b686AA8e91155BDD93C3998d3, 0x6004442B3807b07b7901A2e25AcBc08710284886, 0xdEf82f6F50ca2334542ffa4028db809F9bC7A17f, 0xbC409FAf353AB0549Ea0F842dEA111A7C6c1043B];

    constructor() ERC721A("Shadow Descendants 2.0", "SHD2") {
        _safeMint(msg.sender, 300);
    }

    function _startTokenId() internal override view virtual returns (uint256) {
        return 1;
    }

    fallback() external payable {}

    receive() external payable {}

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

    function setBaseURI(string memory _baseuri) external onlyOwner {
        baseURI = _baseuri;
    }

    function setRevealURI(string memory _uri) external onlyOwner {
        revealURI = _uri;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if(!reveal) {
            return revealURI;
        }

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }

    function setNFTPrice(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setPresalePrice(uint256 _newPresalePrice) external onlyOwner {
        presale_price = _newPresalePrice;
    }

    function setMaxMintPerTransaction(uint8 _newMaxMint) external onlyOwner {
        maxMintPerTransaction = _newMaxMint;
    }

    function setReveal(bool _reveal) external onlyOwner {
        reveal = _reveal;
    }

    function presaleOn() external onlyOwner {
        presale = true;
    }

    function presaleOff() external onlyOwner {
        presale = false;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function addWhitelistUsers(address[] memory _addresses) external onlyOwner {
        whitelistedUsers = _addresses;
    }

    function removeWhitelistUser(address _address) external onlyOwner {
        (bool _isWhitelistedUser, uint256 s) = isWhitelistedUser(_address);
        if(_isWhitelistedUser){
            whitelistedUsers[s] = whitelistedUsers[whitelistedUsers.length - 1];
            whitelistedUsers.pop();
        } 
    }

    function isWhitelistedUser(address _address) public view returns(bool, uint256) {
        for(uint256 i=0; i < whitelistedUsers.length; i++) {
            if(_address == whitelistedUsers[i]) {
                return (true, i);
            }
        }
        return (false, 0);
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function withdraw() external onlyOwner whenNotPaused {
        uint balance = address(this).balance;
        require(balance > 0, "NFT: No ether left to withdraw");

        (bool success, ) = payable(owner()).call{ value: balance } ("");
        require(success, "NFT: Transfer failed.");
    }

    function lastTokenID() external view returns(uint256) {
        return totalSupply();
    }

    function mint(uint256 _mintAmount) public payable whenNotPaused {
        uint256 supply = totalSupply();
        require(_mintAmount > 0);
        require(supply + _mintAmount <= maxSupply);
        (bool isWhiteList, ) = isWhitelistedUser(msg.sender);
        if(presale) {
            require(isWhiteList, "Shadow Descendants 2.0: Caller is not whitelisted");
            require(msg.value >= presale_price * _mintAmount, "Shadow Descendants 2.0: insufficient funds");
        } else {
            require(msg.value >= cost * _mintAmount, "insufficient funds");
        }

        _safeMint(msg.sender, _mintAmount);
    }

    function _maxSupply() external view returns(uint256) {
        return maxSupply;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelistedUser","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presale_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseuri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newMaxMint","type":"uint8"}],"name":"setMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setNFTPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPresalePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610120604052606460808181529062002f2160a03960099062000023908262000811565b506040518060a001604052806063815260200162002ebe60639139600a906200004d908262000811565b50604080518082019091526005815264173539b7b760d91b6020820152600b9062000079908262000811565b5066f8b0a10e470000600c5566b1a2bc2ec50000600d556122b8600e55600f805462ffffff19166201000f179055604080516103208101825273e4f3aae8eb3ebe3aaef5149923f39a73806846ba815273cb1de9459670f9f0e59d21ef03c2b1074c81bb216020820152730ea1e75581a77b3a340ac9974befda27cfffd9199181019190915273d0103f400bcd2a479121eaeb727eb4acd868f9e26060820152730359a4e95e8dc2e4b339a01d5cfd069cd20c6d6a60808201527304071eb17e0fe8ccb0a983d0512d1136efd4c28360a0820152732fe3a5ba42c3dad794c5dcc8c0c1b040948a83b760c0820152737b719f9518f4ddcd341d28838a06a78395a7d5fc60e082015273539118962fc4df077d41c1817a34cbebfb9d5c1f610100820152735412bdf6320743d8b7947f29b7d345ef49f7895d61012082015273d8c57a571964792130d8f6d49b5858cd9608c65c6101408201527325074df7e8350e19550106b5eb9d6bacc15f42316101608201527380e1980dea1955ad6cf7be35a757c9906c6fe8fd61018082015273f3498469c50bb31f0009e79106f0cce08f98438a6101a08201527356886698844fee080a1564043982a7e7e4e796366101c082015273a75ff87cdd93172c84ec20a7e2c4d7568821de7e6101e082015273234fc221ca597621facc18dcc730e2903ed4ae32610200820152738190fa7c68321b2cb1d4539fef61fd92ccfce1e361022082015273e588e86442fb06e3234810fce0e1e385307d06e16102408201527334979d41e36d55ddfbbce66efcc4f0f6dc4b9ac961026082015273c5ba28f05c52563dc8293ba6cd7f7f1520ca0ded61028082015273c7300878a4b0459b686aa8e91155bdd93c3998d36102a0820152736004442b3807b07b7901a2e25acbc087102848866102c082015273def82f6f50ca2334542ffa4028db809f9bc7a17f6102e082015273bc409faf353ab0549ea0f842dea111a7c6c1043b6103008201526200035c906010906019620006eb565b503480156200036a57600080fd5b506040518060400160405280601681526020017f536861646f772044657363656e64616e747320322e30000000000000000000008152506040518060400160405280600481526020016329a4221960e11b8152508160029081620003cf919062000811565b506003620003de828262000811565b5050600160005550620003f13362000412565b6008805460ff60a01b191690556200040c3361012c62000464565b62000983565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620004868282604051806020016040528060008152506200048a60201b60201c565b5050565b6000546001600160a01b038416620004b457604051622e076360e81b815260040160405180910390fd5b82600003620004d65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15620005a2575b60405182906001600160a01b0388169060009060008051602062002e9e833981519152908290a460018201916200056790600090889087620005f7565b62000585576040516368d2bf6b60e11b815260040160405180910390fd5b8082106200052a5782600054146200059c57600080fd5b620005d7565b5b6040516001830192906001600160a01b0388169060009060008051602062002e9e833981519152908290a4808210620005a3575b506000908155620005f1908583866001600160e01b038516565b50505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200062e903390899088908890600401620008dd565b6020604051808303816000875af19250505080156200066c575060408051601f3d908101601f19168201909252620006699181019062000950565b60015b620006ce573d8080156200069d576040519150601f19603f3d011682016040523d82523d6000602084013e620006a2565b606091505b508051600003620006c6576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b82805482825590600052602060002090810192821562000743579160200282015b828111156200074357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200070c565b506200075192915062000755565b5090565b5b8082111562000751576000815560010162000756565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200079757607f821691505b602082108103620007b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200080c57600081815260208120601f850160051c81016020861015620007e75750805b601f850160051c820191505b818110156200080857828155600101620007f3565b5050505b505050565b81516001600160401b038111156200082d576200082d6200076c565b62000845816200083e845462000782565b84620007be565b602080601f8311600181146200087d5760008415620008645750858301515b600019600386901b1c1916600185901b17855562000808565b600085815260208120601f198616915b82811015620008ae578886015182559484019460019091019084016200088d565b5085821015620008cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b828110156200092c5785810182015185820160a0015281016200090e565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b6000602082840312156200096357600080fd5b81516001600160e01b0319811681146200097c57600080fd5b9392505050565b61250b80620009936000396000f3fe6080604052600436106102695760003560e01c806370a0823111610143578063a475b5dd116100bb578063d5abeb0111610077578063d5abeb011461070f578063d88c271e14610725578063da3ef23f1461075c578063e985e9c51461077c578063f2fde38b1461079c578063fdea8e0b146107bc57005b8063a475b5dd1461065b578063a811a37b1461067a578063b27867bf1461069a578063b88d4fde146106ba578063c6682862146106da578063c87b56dd146106ef57005b80638da5cb5b1161010a5780638da5cb5b146105ca57806395d89b41146105e8578063969745e8146105fd5780639a380b1614610613578063a0712d6814610628578063a22cb4651461063b57005b806370a0823114610540578063715018a61461056057806381530b68146105755780638456cb591461059557806385668275146105aa57005b80632a3f300c116101e157806342842e0e1161019d57806342842e0e1461048c57806355f804b3146104ac5780635c975abb146104cc5780636352211e146104eb578063686b28121461050b5780636c0360eb1461052b57005b80632a3f300c146103ed57806330cc7ae01461040d5780633521bd7e1461042d5780633549345e146104425780633ccfd60b146104625780633f4ba83a1461047757005b806313faede61161023057806313faede61461034d578063160fba561461037157806318160ddd146103865780631ad874b4146103a357806322f4596f146103b857806323b872dd146103cd57005b806301f569971461027257806301ffc9a7146102a357806306fdde03146102d3578063081812fc146102f5578063095ea7b31461032d57005b3661027057005b005b34801561027e57600080fd5b50600f5461028c9060ff1681565b60405160ff90911681526020015b60405180910390f35b3480156102af57600080fd5b506102c36102be366004611d6c565b6107dc565b604051901515815260200161029a565b3480156102df57600080fd5b506102e861082e565b60405161029a9190611dd9565b34801561030157600080fd5b50610315610310366004611dec565b6108c0565b6040516001600160a01b03909116815260200161029a565b34801561033957600080fd5b50610270610348366004611e21565b610904565b34801561035957600080fd5b50610363600c5481565b60405190815260200161029a565b34801561037d57600080fd5b506102e86109d6565b34801561039257600080fd5b506001546000540360001901610363565b3480156103af57600080fd5b50610270610a64565b3480156103c457600080fd5b50600e54610363565b3480156103d957600080fd5b506102706103e8366004611e4b565b610aaa565b3480156103f957600080fd5b50610270610408366004611e97565b610aba565b34801561041957600080fd5b50610270610428366004611eb2565b610afe565b34801561043957600080fd5b50610363610bf0565b34801561044e57600080fd5b5061027061045d366004611dec565b610c0a565b34801561046e57600080fd5b50610270610c39565b34801561048357600080fd5b50610270610d8b565b34801561049857600080fd5b506102706104a7366004611e4b565b610dbf565b3480156104b857600080fd5b506102706104c7366004611f6c565b610dda565b3480156104d857600080fd5b50600854600160a01b900460ff166102c3565b3480156104f757600080fd5b50610315610506366004611dec565b610e10565b34801561051757600080fd5b50610270610526366004611fb5565b610e1b565b34801561053757600080fd5b506102e8610e58565b34801561054c57600080fd5b5061036361055b366004611eb2565b610e65565b34801561056c57600080fd5b50610270610eb4565b34801561058157600080fd5b50610270610590366004611dec565b610ee8565b3480156105a157600080fd5b50610270610f17565b3480156105b657600080fd5b506103156105c5366004611dec565b610f49565b3480156105d657600080fd5b506008546001600160a01b0316610315565b3480156105f457600080fd5b506102e8610f73565b34801561060957600080fd5b50610363600d5481565b34801561061f57600080fd5b50610270610f82565b610270610636366004611dec565b610fba565b34801561064757600080fd5b50610270610656366004612062565b611178565b34801561066757600080fd5b50600f546102c390610100900460ff1681565b34801561068657600080fd5b50610270610695366004611f6c565b61120d565b3480156106a657600080fd5b506102706106b5366004612095565b611243565b3480156106c657600080fd5b506102706106d53660046120b8565b611283565b3480156106e657600080fd5b506102e86112cd565b3480156106fb57600080fd5b506102e861070a366004611dec565b6112da565b34801561071b57600080fd5b50610363600e5481565b34801561073157600080fd5b50610745610740366004611eb2565b611449565b60408051921515835260208301919091520161029a565b34801561076857600080fd5b50610270610777366004611f6c565b6114b4565b34801561078857600080fd5b506102c3610797366004612134565b6114ea565b3480156107a857600080fd5b506102706107b7366004611eb2565b611518565b3480156107c857600080fd5b50600f546102c39062010000900460ff1681565b60006301ffc9a760e01b6001600160e01b03198316148061080d57506380ac58cd60e01b6001600160e01b03198316145b806108285750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461083d9061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546108699061215e565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050905090565b60006108cb826115b3565b6108e8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061090f826115e8565b9050806001600160a01b0316836001600160a01b0316036109435760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461097a5761095d81336114ea565b61097a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600a80546109e39061215e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f9061215e565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b505050505081565b6008546001600160a01b03163314610a975760405162461bcd60e51b8152600401610a8e90612198565b60405180910390fd5b600f805462ff0000191662010000179055565b610ab5838383611657565b505050565b6008546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610a8e90612198565b600f80549115156101000261ff0019909216919091179055565b6008546001600160a01b03163314610b285760405162461bcd60e51b8152600401610a8e90612198565b600080610b3483611449565b915091508115610ab55760108054610b4e906001906121e3565b81548110610b5e57610b5e6121f6565b600091825260209091200154601080546001600160a01b039092169183908110610b8a57610b8a6121f6565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506010805480610bc957610bc961220c565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b6000610c056001546000546000199190030190565b905090565b6008546001600160a01b03163314610c345760405162461bcd60e51b8152600401610a8e90612198565b600d55565b6008546001600160a01b03163314610c635760405162461bcd60e51b8152600401610a8e90612198565b600854600160a01b900460ff1615610c8d5760405162461bcd60e51b8152600401610a8e90612222565b4780610cdb5760405162461bcd60e51b815260206004820152601e60248201527f4e46543a204e6f206574686572206c65667420746f20776974686472617700006044820152606401610a8e565b6000610cef6008546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d39576040519150601f19603f3d011682016040523d82523d6000602084013e610d3e565b606091505b5050905080610d875760405162461bcd60e51b815260206004820152601560248201527427232a1d102a3930b739b332b9103330b4b632b21760591b6044820152606401610a8e565b5050565b6008546001600160a01b03163314610db55760405162461bcd60e51b8152600401610a8e90612198565b610dbd6117fe565b565b610ab583838360405180602001604052806000815250611283565b6008546001600160a01b03163314610e045760405162461bcd60e51b8152600401610a8e90612198565b6009610d87828261229a565b6000610828826115e8565b6008546001600160a01b03163314610e455760405162461bcd60e51b8152600401610a8e90612198565b8051610d87906010906020840190611cdc565b600980546109e39061215e565b60006001600160a01b038216610e8e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ede5760405162461bcd60e51b8152600401610a8e90612198565b610dbd600061189b565b6008546001600160a01b03163314610f125760405162461bcd60e51b8152600401610a8e90612198565b600c55565b6008546001600160a01b03163314610f415760405162461bcd60e51b8152600401610a8e90612198565b610dbd6118ed565b60108181548110610f5957600080fd5b6000918252602090912001546001600160a01b0316905081565b60606003805461083d9061215e565b6008546001600160a01b03163314610fac5760405162461bcd60e51b8152600401610a8e90612198565b600f805462ff000019169055565b600854600160a01b900460ff1615610fe45760405162461bcd60e51b8152600401610a8e90612222565b6000610ff96001546000546000199190030190565b90506000821161100857600080fd5b600e54611015838361235a565b111561102057600080fd5b600061102b33611449565b50600f5490915062010000900460ff161561111c57806110a75760405162461bcd60e51b815260206004820152603160248201527f536861646f772044657363656e64616e747320322e303a2043616c6c657220696044820152701cc81b9bdd081dda1a5d195b1a5cdd1959607a1b6064820152608401610a8e565b82600d546110b5919061236d565b3410156111175760405162461bcd60e51b815260206004820152602a60248201527f536861646f772044657363656e64616e747320322e303a20696e73756666696360448201526969656e742066756e647360b01b6064820152608401610a8e565b61116e565b82600c5461112a919061236d565b34101561116e5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a8e565b610ab53384611952565b336001600160a01b038316036111a15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146112375760405162461bcd60e51b8152600401610a8e90612198565b600a610d87828261229a565b6008546001600160a01b0316331461126d5760405162461bcd60e51b8152600401610a8e90612198565b600f805460ff191660ff92909216919091179055565b61128e848484611657565b6001600160a01b0383163b156112c7576112aa8484848461196c565b6112c7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546109e39061215e565b60606112e5826115b3565b6113495760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8e565b600f54610100900460ff166113ea57600a80546113659061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546113919061215e565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b50505050509050919050565b60006113f4611a58565b905060008151116114145760405180602001604052806000815250611442565b8061141e84611a67565b600b60405160200161143293929190612384565b6040516020818303038152906040525b9392505050565b60008060005b6010548110156114a8576010818154811061146c5761146c6121f6565b6000918252602090912001546001600160a01b039081169085160361149657600194909350915050565b806114a081612424565b91505061144f565b50600093849350915050565b6008546001600160a01b031633146114de5760405162461bcd60e51b8152600401610a8e90612198565b600b610d87828261229a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146115425760405162461bcd60e51b8152600401610a8e90612198565b6001600160a01b0381166115a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8e565b6115b08161189b565b50565b6000816001111580156115c7575060005482105b8015610828575050600090815260046020526040902054600160e01b161590565b6000818060011161163e5760005481101561163e5760008181526004602052604081205490600160e01b8216900361163c575b8060000361144257506000190160008181526004602052604090205461161b565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611662826115e8565b9050836001600160a01b0316816001600160a01b0316146116955760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116b357506116b385336114ea565b806116ce5750336116c3846108c0565b6001600160a01b0316145b9050806116ee57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661171557604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036117b6576001830160008181526004602052604081205490036117b45760005481146117b45760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600854600160a01b900460ff1661184e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a8e565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156119175760405162461bcd60e51b8152600401610a8e90612222565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861187e3390565b610d87828260405180602001604052806000815250611b68565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119a190339089908890889060040161243d565b6020604051808303816000875af19250505080156119dc575060408051601f3d908101601f191682019092526119d99181019061247a565b60015b611a3a573d808015611a0a576040519150601f19603f3d011682016040523d82523d6000602084013e611a0f565b606091505b508051600003611a32576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461083d9061215e565b606081600003611a8e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ab85780611aa281612424565b9150611ab19050600a836124ad565b9150611a92565b60008167ffffffffffffffff811115611ad357611ad3611ecd565b6040519080825280601f01601f191660200182016040528015611afd576020820181803683370190505b5090505b8415611a5057611b126001836121e3565b9150611b1f600a866124c1565b611b2a90603061235a565b60f81b818381518110611b3f57611b3f6121f6565b60200101906001600160f81b031916908160001a905350611b61600a866124ad565b9450611b01565b6000546001600160a01b038416611b9157604051622e076360e81b815260040160405180910390fd5b82600003611bb25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611c87575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c50600087848060010195508761196c565b611c6d576040516368d2bf6b60e11b815260040160405180910390fd5b808210611c05578260005414611c8257600080fd5b611ccc565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c88575b5060009081556112c79085838684565b828054828255906000526020600020908101928215611d31579160200282015b82811115611d3157825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cfc565b50611d3d929150611d41565b5090565b5b80821115611d3d5760008155600101611d42565b6001600160e01b0319811681146115b057600080fd5b600060208284031215611d7e57600080fd5b813561144281611d56565b60005b83811015611da4578181015183820152602001611d8c565b50506000910152565b60008151808452611dc5816020860160208601611d89565b601f01601f19169290920160200192915050565b6020815260006114426020830184611dad565b600060208284031215611dfe57600080fd5b5035919050565b80356001600160a01b0381168114611e1c57600080fd5b919050565b60008060408385031215611e3457600080fd5b611e3d83611e05565b946020939093013593505050565b600080600060608486031215611e6057600080fd5b611e6984611e05565b9250611e7760208501611e05565b9150604084013590509250925092565b80358015158114611e1c57600080fd5b600060208284031215611ea957600080fd5b61144282611e87565b600060208284031215611ec457600080fd5b61144282611e05565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f0c57611f0c611ecd565b604052919050565b600067ffffffffffffffff831115611f2e57611f2e611ecd565b611f41601f8401601f1916602001611ee3565b9050828152838383011115611f5557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611f7e57600080fd5b813567ffffffffffffffff811115611f9557600080fd5b8201601f81018413611fa657600080fd5b611a5084823560208401611f14565b60006020808385031215611fc857600080fd5b823567ffffffffffffffff80821115611fe057600080fd5b818501915085601f830112611ff457600080fd5b81358181111561200657612006611ecd565b8060051b9150612017848301611ee3565b818152918301840191848101908884111561203157600080fd5b938501935b838510156120565761204785611e05565b82529385019390850190612036565b98975050505050505050565b6000806040838503121561207557600080fd5b61207e83611e05565b915061208c60208401611e87565b90509250929050565b6000602082840312156120a757600080fd5b813560ff8116811461144257600080fd5b600080600080608085870312156120ce57600080fd5b6120d785611e05565b93506120e560208601611e05565b925060408501359150606085013567ffffffffffffffff81111561210857600080fd5b8501601f8101871361211957600080fd5b61212887823560208401611f14565b91505092959194509250565b6000806040838503121561214757600080fd5b61215083611e05565b915061208c60208401611e05565b600181811c9082168061217257607f821691505b60208210810361219257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610828576108286121cd565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b601f821115610ab557600081815260208120601f850160051c810160208610156122735750805b601f850160051c820191505b818110156122925782815560010161227f565b505050505050565b815167ffffffffffffffff8111156122b4576122b4611ecd565b6122c8816122c2845461215e565b8461224c565b602080601f8311600181146122fd57600084156122e55750858301515b600019600386901b1c1916600185901b178555612292565b600085815260208120601f198616915b8281101561232c5788860151825594840194600190910190840161230d565b508582101561234a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610828576108286121cd565b8082028115828204841417610828576108286121cd565b6000845160206123978285838a01611d89565b8551918401916123aa8184848a01611d89565b85549201916000906123bb8161215e565b600182811680156123d357600181146123e857612414565b60ff1984168752821515830287019450612414565b896000528560002060005b8481101561240c578154898201529083019087016123f3565b505082870194505b50929a9950505050505050505050565b600060018201612436576124366121cd565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061247090830184611dad565b9695505050505050565b60006020828403121561248c57600080fd5b815161144281611d56565b634e487b7160e01b600052601260045260246000fd5b6000826124bc576124bc612497565b500490565b6000826124d0576124d0612497565b50069056fea264697066735822122039cc657e0cbe88e661d2191465146c9eec4d8b015e42c3c393740c45109e57b864736f6c63430008110033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef68747470733a2f2f6372696d736f6e2d6d616e6167696e672d636f772d3739332e6d7970696e6174612e636c6f75642f697066732f516d4e754878385461677a7674416e4544317148526a457744344a634335576e7671696531566d6e535346416f6e68747470733a2f2f6372696d736f6e2d6d616e6167696e672d636f772d3739332e6d7970696e6174612e636c6f75642f697066732f516d664b64414b364a6e7a3963725a47755559516d553267624351333659635750435338466234794a364c624a482f

Deployed Bytecode

0x6080604052600436106102695760003560e01c806370a0823111610143578063a475b5dd116100bb578063d5abeb0111610077578063d5abeb011461070f578063d88c271e14610725578063da3ef23f1461075c578063e985e9c51461077c578063f2fde38b1461079c578063fdea8e0b146107bc57005b8063a475b5dd1461065b578063a811a37b1461067a578063b27867bf1461069a578063b88d4fde146106ba578063c6682862146106da578063c87b56dd146106ef57005b80638da5cb5b1161010a5780638da5cb5b146105ca57806395d89b41146105e8578063969745e8146105fd5780639a380b1614610613578063a0712d6814610628578063a22cb4651461063b57005b806370a0823114610540578063715018a61461056057806381530b68146105755780638456cb591461059557806385668275146105aa57005b80632a3f300c116101e157806342842e0e1161019d57806342842e0e1461048c57806355f804b3146104ac5780635c975abb146104cc5780636352211e146104eb578063686b28121461050b5780636c0360eb1461052b57005b80632a3f300c146103ed57806330cc7ae01461040d5780633521bd7e1461042d5780633549345e146104425780633ccfd60b146104625780633f4ba83a1461047757005b806313faede61161023057806313faede61461034d578063160fba561461037157806318160ddd146103865780631ad874b4146103a357806322f4596f146103b857806323b872dd146103cd57005b806301f569971461027257806301ffc9a7146102a357806306fdde03146102d3578063081812fc146102f5578063095ea7b31461032d57005b3661027057005b005b34801561027e57600080fd5b50600f5461028c9060ff1681565b60405160ff90911681526020015b60405180910390f35b3480156102af57600080fd5b506102c36102be366004611d6c565b6107dc565b604051901515815260200161029a565b3480156102df57600080fd5b506102e861082e565b60405161029a9190611dd9565b34801561030157600080fd5b50610315610310366004611dec565b6108c0565b6040516001600160a01b03909116815260200161029a565b34801561033957600080fd5b50610270610348366004611e21565b610904565b34801561035957600080fd5b50610363600c5481565b60405190815260200161029a565b34801561037d57600080fd5b506102e86109d6565b34801561039257600080fd5b506001546000540360001901610363565b3480156103af57600080fd5b50610270610a64565b3480156103c457600080fd5b50600e54610363565b3480156103d957600080fd5b506102706103e8366004611e4b565b610aaa565b3480156103f957600080fd5b50610270610408366004611e97565b610aba565b34801561041957600080fd5b50610270610428366004611eb2565b610afe565b34801561043957600080fd5b50610363610bf0565b34801561044e57600080fd5b5061027061045d366004611dec565b610c0a565b34801561046e57600080fd5b50610270610c39565b34801561048357600080fd5b50610270610d8b565b34801561049857600080fd5b506102706104a7366004611e4b565b610dbf565b3480156104b857600080fd5b506102706104c7366004611f6c565b610dda565b3480156104d857600080fd5b50600854600160a01b900460ff166102c3565b3480156104f757600080fd5b50610315610506366004611dec565b610e10565b34801561051757600080fd5b50610270610526366004611fb5565b610e1b565b34801561053757600080fd5b506102e8610e58565b34801561054c57600080fd5b5061036361055b366004611eb2565b610e65565b34801561056c57600080fd5b50610270610eb4565b34801561058157600080fd5b50610270610590366004611dec565b610ee8565b3480156105a157600080fd5b50610270610f17565b3480156105b657600080fd5b506103156105c5366004611dec565b610f49565b3480156105d657600080fd5b506008546001600160a01b0316610315565b3480156105f457600080fd5b506102e8610f73565b34801561060957600080fd5b50610363600d5481565b34801561061f57600080fd5b50610270610f82565b610270610636366004611dec565b610fba565b34801561064757600080fd5b50610270610656366004612062565b611178565b34801561066757600080fd5b50600f546102c390610100900460ff1681565b34801561068657600080fd5b50610270610695366004611f6c565b61120d565b3480156106a657600080fd5b506102706106b5366004612095565b611243565b3480156106c657600080fd5b506102706106d53660046120b8565b611283565b3480156106e657600080fd5b506102e86112cd565b3480156106fb57600080fd5b506102e861070a366004611dec565b6112da565b34801561071b57600080fd5b50610363600e5481565b34801561073157600080fd5b50610745610740366004611eb2565b611449565b60408051921515835260208301919091520161029a565b34801561076857600080fd5b50610270610777366004611f6c565b6114b4565b34801561078857600080fd5b506102c3610797366004612134565b6114ea565b3480156107a857600080fd5b506102706107b7366004611eb2565b611518565b3480156107c857600080fd5b50600f546102c39062010000900460ff1681565b60006301ffc9a760e01b6001600160e01b03198316148061080d57506380ac58cd60e01b6001600160e01b03198316145b806108285750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461083d9061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546108699061215e565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050905090565b60006108cb826115b3565b6108e8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061090f826115e8565b9050806001600160a01b0316836001600160a01b0316036109435760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461097a5761095d81336114ea565b61097a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600a80546109e39061215e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f9061215e565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b505050505081565b6008546001600160a01b03163314610a975760405162461bcd60e51b8152600401610a8e90612198565b60405180910390fd5b600f805462ff0000191662010000179055565b610ab5838383611657565b505050565b6008546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610a8e90612198565b600f80549115156101000261ff0019909216919091179055565b6008546001600160a01b03163314610b285760405162461bcd60e51b8152600401610a8e90612198565b600080610b3483611449565b915091508115610ab55760108054610b4e906001906121e3565b81548110610b5e57610b5e6121f6565b600091825260209091200154601080546001600160a01b039092169183908110610b8a57610b8a6121f6565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506010805480610bc957610bc961220c565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b6000610c056001546000546000199190030190565b905090565b6008546001600160a01b03163314610c345760405162461bcd60e51b8152600401610a8e90612198565b600d55565b6008546001600160a01b03163314610c635760405162461bcd60e51b8152600401610a8e90612198565b600854600160a01b900460ff1615610c8d5760405162461bcd60e51b8152600401610a8e90612222565b4780610cdb5760405162461bcd60e51b815260206004820152601e60248201527f4e46543a204e6f206574686572206c65667420746f20776974686472617700006044820152606401610a8e565b6000610cef6008546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d39576040519150601f19603f3d011682016040523d82523d6000602084013e610d3e565b606091505b5050905080610d875760405162461bcd60e51b815260206004820152601560248201527427232a1d102a3930b739b332b9103330b4b632b21760591b6044820152606401610a8e565b5050565b6008546001600160a01b03163314610db55760405162461bcd60e51b8152600401610a8e90612198565b610dbd6117fe565b565b610ab583838360405180602001604052806000815250611283565b6008546001600160a01b03163314610e045760405162461bcd60e51b8152600401610a8e90612198565b6009610d87828261229a565b6000610828826115e8565b6008546001600160a01b03163314610e455760405162461bcd60e51b8152600401610a8e90612198565b8051610d87906010906020840190611cdc565b600980546109e39061215e565b60006001600160a01b038216610e8e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ede5760405162461bcd60e51b8152600401610a8e90612198565b610dbd600061189b565b6008546001600160a01b03163314610f125760405162461bcd60e51b8152600401610a8e90612198565b600c55565b6008546001600160a01b03163314610f415760405162461bcd60e51b8152600401610a8e90612198565b610dbd6118ed565b60108181548110610f5957600080fd5b6000918252602090912001546001600160a01b0316905081565b60606003805461083d9061215e565b6008546001600160a01b03163314610fac5760405162461bcd60e51b8152600401610a8e90612198565b600f805462ff000019169055565b600854600160a01b900460ff1615610fe45760405162461bcd60e51b8152600401610a8e90612222565b6000610ff96001546000546000199190030190565b90506000821161100857600080fd5b600e54611015838361235a565b111561102057600080fd5b600061102b33611449565b50600f5490915062010000900460ff161561111c57806110a75760405162461bcd60e51b815260206004820152603160248201527f536861646f772044657363656e64616e747320322e303a2043616c6c657220696044820152701cc81b9bdd081dda1a5d195b1a5cdd1959607a1b6064820152608401610a8e565b82600d546110b5919061236d565b3410156111175760405162461bcd60e51b815260206004820152602a60248201527f536861646f772044657363656e64616e747320322e303a20696e73756666696360448201526969656e742066756e647360b01b6064820152608401610a8e565b61116e565b82600c5461112a919061236d565b34101561116e5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a8e565b610ab53384611952565b336001600160a01b038316036111a15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146112375760405162461bcd60e51b8152600401610a8e90612198565b600a610d87828261229a565b6008546001600160a01b0316331461126d5760405162461bcd60e51b8152600401610a8e90612198565b600f805460ff191660ff92909216919091179055565b61128e848484611657565b6001600160a01b0383163b156112c7576112aa8484848461196c565b6112c7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546109e39061215e565b60606112e5826115b3565b6113495760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8e565b600f54610100900460ff166113ea57600a80546113659061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546113919061215e565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b50505050509050919050565b60006113f4611a58565b905060008151116114145760405180602001604052806000815250611442565b8061141e84611a67565b600b60405160200161143293929190612384565b6040516020818303038152906040525b9392505050565b60008060005b6010548110156114a8576010818154811061146c5761146c6121f6565b6000918252602090912001546001600160a01b039081169085160361149657600194909350915050565b806114a081612424565b91505061144f565b50600093849350915050565b6008546001600160a01b031633146114de5760405162461bcd60e51b8152600401610a8e90612198565b600b610d87828261229a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146115425760405162461bcd60e51b8152600401610a8e90612198565b6001600160a01b0381166115a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8e565b6115b08161189b565b50565b6000816001111580156115c7575060005482105b8015610828575050600090815260046020526040902054600160e01b161590565b6000818060011161163e5760005481101561163e5760008181526004602052604081205490600160e01b8216900361163c575b8060000361144257506000190160008181526004602052604090205461161b565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611662826115e8565b9050836001600160a01b0316816001600160a01b0316146116955760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116b357506116b385336114ea565b806116ce5750336116c3846108c0565b6001600160a01b0316145b9050806116ee57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661171557604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036117b6576001830160008181526004602052604081205490036117b45760005481146117b45760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600854600160a01b900460ff1661184e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a8e565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156119175760405162461bcd60e51b8152600401610a8e90612222565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861187e3390565b610d87828260405180602001604052806000815250611b68565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119a190339089908890889060040161243d565b6020604051808303816000875af19250505080156119dc575060408051601f3d908101601f191682019092526119d99181019061247a565b60015b611a3a573d808015611a0a576040519150601f19603f3d011682016040523d82523d6000602084013e611a0f565b606091505b508051600003611a32576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461083d9061215e565b606081600003611a8e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ab85780611aa281612424565b9150611ab19050600a836124ad565b9150611a92565b60008167ffffffffffffffff811115611ad357611ad3611ecd565b6040519080825280601f01601f191660200182016040528015611afd576020820181803683370190505b5090505b8415611a5057611b126001836121e3565b9150611b1f600a866124c1565b611b2a90603061235a565b60f81b818381518110611b3f57611b3f6121f6565b60200101906001600160f81b031916908160001a905350611b61600a866124ad565b9450611b01565b6000546001600160a01b038416611b9157604051622e076360e81b815260040160405180910390fd5b82600003611bb25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611c87575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c50600087848060010195508761196c565b611c6d576040516368d2bf6b60e11b815260040160405180910390fd5b808210611c05578260005414611c8257600080fd5b611ccc565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c88575b5060009081556112c79085838684565b828054828255906000526020600020908101928215611d31579160200282015b82811115611d3157825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cfc565b50611d3d929150611d41565b5090565b5b80821115611d3d5760008155600101611d42565b6001600160e01b0319811681146115b057600080fd5b600060208284031215611d7e57600080fd5b813561144281611d56565b60005b83811015611da4578181015183820152602001611d8c565b50506000910152565b60008151808452611dc5816020860160208601611d89565b601f01601f19169290920160200192915050565b6020815260006114426020830184611dad565b600060208284031215611dfe57600080fd5b5035919050565b80356001600160a01b0381168114611e1c57600080fd5b919050565b60008060408385031215611e3457600080fd5b611e3d83611e05565b946020939093013593505050565b600080600060608486031215611e6057600080fd5b611e6984611e05565b9250611e7760208501611e05565b9150604084013590509250925092565b80358015158114611e1c57600080fd5b600060208284031215611ea957600080fd5b61144282611e87565b600060208284031215611ec457600080fd5b61144282611e05565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f0c57611f0c611ecd565b604052919050565b600067ffffffffffffffff831115611f2e57611f2e611ecd565b611f41601f8401601f1916602001611ee3565b9050828152838383011115611f5557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611f7e57600080fd5b813567ffffffffffffffff811115611f9557600080fd5b8201601f81018413611fa657600080fd5b611a5084823560208401611f14565b60006020808385031215611fc857600080fd5b823567ffffffffffffffff80821115611fe057600080fd5b818501915085601f830112611ff457600080fd5b81358181111561200657612006611ecd565b8060051b9150612017848301611ee3565b818152918301840191848101908884111561203157600080fd5b938501935b838510156120565761204785611e05565b82529385019390850190612036565b98975050505050505050565b6000806040838503121561207557600080fd5b61207e83611e05565b915061208c60208401611e87565b90509250929050565b6000602082840312156120a757600080fd5b813560ff8116811461144257600080fd5b600080600080608085870312156120ce57600080fd5b6120d785611e05565b93506120e560208601611e05565b925060408501359150606085013567ffffffffffffffff81111561210857600080fd5b8501601f8101871361211957600080fd5b61212887823560208401611f14565b91505092959194509250565b6000806040838503121561214757600080fd5b61215083611e05565b915061208c60208401611e05565b600181811c9082168061217257607f821691505b60208210810361219257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610828576108286121cd565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b601f821115610ab557600081815260208120601f850160051c810160208610156122735750805b601f850160051c820191505b818110156122925782815560010161227f565b505050505050565b815167ffffffffffffffff8111156122b4576122b4611ecd565b6122c8816122c2845461215e565b8461224c565b602080601f8311600181146122fd57600084156122e55750858301515b600019600386901b1c1916600185901b178555612292565b600085815260208120601f198616915b8281101561232c5788860151825594840194600190910190840161230d565b508582101561234a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610828576108286121cd565b8082028115828204841417610828576108286121cd565b6000845160206123978285838a01611d89565b8551918401916123aa8184848a01611d89565b85549201916000906123bb8161215e565b600182811680156123d357600181146123e857612414565b60ff1984168752821515830287019450612414565b896000528560002060005b8481101561240c578154898201529083019087016123f3565b505082870194505b50929a9950505050505050505050565b600060018201612436576124366121cd565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061247090830184611dad565b9695505050505050565b60006020828403121561248c57600080fd5b815161144281611d56565b634e487b7160e01b600052601260045260246000fd5b6000826124bc576124bc612497565b500490565b6000826124d0576124d0612497565b50069056fea264697066735822122039cc657e0cbe88e661d2191465146c9eec4d8b015e42c3c393740c45109e57b864736f6c63430008110033

Deployed Bytecode Sourcemap

46201:5943:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46746:39;;;;;;;;;;-1:-1:-1;46746:39:0;;;;;;;;;;;186:4:1;174:17;;;156:36;;144:2;129:18;46746:39:0;;;;;;;;20863:615;;;;;;;;;;-1:-1:-1;20863:615:0;;;;;:::i;:::-;;:::i;:::-;;;754:14:1;;747:22;729:41;;717:2;702:18;20863:615:0;589:187:1;25876:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27944:204::-;;;;;;;;;;-1:-1:-1;27944:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1886:32:1;;;1868:51;;1856:2;1841:18;27944:204:0;1722:203:1;27404:474:0;;;;;;;;;;-1:-1:-1;27404:474:0;;;;;:::i;:::-;;:::i;46621:32::-;;;;;;;;;;;;;;;;;;;2513:25:1;;;2501:2;2486:18;46621:32:0;2367:177:1;46443:127:0;;;;;;;;;;;;;:::i;19917:315::-;;;;;;;;;;-1:-1:-1;48208:1:0;20183:12;19970:7;20167:13;:28;-1:-1:-1;;20167:46:0;19917:315;;49801:73;;;;;;;;;;;;;:::i;52051:88::-;;;;;;;;;;-1:-1:-1;52122:9:0;;52051:88;;28830:170;;;;;;;;;;-1:-1:-1;28830:170:0;;;;;:::i;:::-;;:::i;49706:87::-;;;;;;;;;;-1:-1:-1;49706:87:0;;;;;:::i;:::-;;:::i;50232:315::-;;;;;;;;;;-1:-1:-1;50232:315:0;;;;;:::i;:::-;;:::i;51304:93::-;;;;;;;;;;;;;:::i;49443:121::-;;;;;;;;;;-1:-1:-1;49443:121:0;;;;;:::i;:::-;;:::i;50995:301::-;;;;;;;;;;;;;:::i;50922:65::-;;;;;;;;;;;;;:::i;29071:185::-;;;;;;;;;;-1:-1:-1;29071:185:0;;;;;:::i;:::-;;:::i;48416:100::-;;;;;;;;;;-1:-1:-1;48416:100:0;;;;;:::i;:::-;;:::i;4074:86::-;;;;;;;;;;-1:-1:-1;4145:7:0;;-1:-1:-1;;;4145:7:0;;;;4074:86;;25665:144;;;;;;;;;;-1:-1:-1;25665:144:0;;;;;:::i;:::-;;:::i;50101:123::-;;;;;;;;;;-1:-1:-1;50101:123:0;;;;;:::i;:::-;;:::i;46301:135::-;;;;;;;;;;;;;:::i;21542:224::-;;;;;;;;;;-1:-1:-1;21542:224:0;;;;;:::i;:::-;;:::i;6973:103::-;;;;;;;;;;;;;:::i;49345:90::-;;;;;;;;;;-1:-1:-1;49345:90:0;;;;;:::i;:::-;;:::i;50853:61::-;;;;;;;;;;;;;:::i;46862:1136::-;;;;;;;;;;-1:-1:-1;46862:1136:0;;;;;:::i;:::-;;:::i;6322:87::-;;;;;;;;;;-1:-1:-1;6395:6:0;;-1:-1:-1;;;;;6395:6:0;6322:87;;26045:104;;;;;;;;;;;;;:::i;46660:41::-;;;;;;;;;;;;;;;;49882:75;;;;;;;;;;;;;:::i;51405:638::-;;;;;;:::i;:::-;;:::i;28220:308::-;;;;;;;;;;-1:-1:-1;28220:308:0;;;;;:::i;:::-;;:::i;46794:26::-;;;;;;;;;;-1:-1:-1;46794:26:0;;;;;;;;;;;48524:96;;;;;;;;;;-1:-1:-1;48524:96:0;;;;;:::i;:::-;;:::i;49572:126::-;;;;;;;;;;-1:-1:-1;49572:126:0;;;;;:::i;:::-;;:::i;29327:396::-;;;;;;;;;;-1:-1:-1;29327:396:0;;;;;:::i;:::-;;:::i;46577:37::-;;;;;;;;;;;;;:::i;48628:709::-;;;;;;;;;;-1:-1:-1;48628:709:0;;;;;:::i;:::-;;:::i;46708:31::-;;;;;;;;;;;;;;;;50555:290;;;;;;;;;;-1:-1:-1;50555:290:0;;;;;:::i;:::-;;:::i;:::-;;;;7058:14:1;;7051:22;7033:41;;7105:2;7090:18;;7083:34;;;;7006:18;50555:290:0;6865:258:1;49965:128:0;;;;;;;;;;-1:-1:-1;49965:128:0;;;;;:::i;:::-;;:::i;28599:164::-;;;;;;;;;;-1:-1:-1;28599:164:0;;;;;:::i;:::-;;:::i;7231:201::-;;;;;;;;;;-1:-1:-1;7231:201:0;;;;;:::i;:::-;;:::i;46827:26::-;;;;;;;;;;-1:-1:-1;46827:26:0;;;;;;;;;;;20863:615;20948:4;-1:-1:-1;;;;;;;;;21248:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;21325:25:0;;;21248:102;:179;;;-1:-1:-1;;;;;;;;;;21402:25:0;;;21248:179;21228:199;20863:615;-1:-1:-1;;20863:615:0:o;25876:100::-;25930:13;25963:5;25956:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25876:100;:::o;27944:204::-;28012:7;28037:16;28045:7;28037;:16::i;:::-;28032:64;;28062:34;;-1:-1:-1;;;28062:34:0;;;;;;;;;;;28032:64;-1:-1:-1;28116:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28116:24:0;;27944:204::o;27404:474::-;27477:13;27509:27;27528:7;27509:18;:27::i;:::-;27477:61;;27559:5;-1:-1:-1;;;;;27553:11:0;:2;-1:-1:-1;;;;;27553:11:0;;27549:48;;27573:24;;-1:-1:-1;;;27573:24:0;;;;;;;;;;;27549:48;44047:10;-1:-1:-1;;;;;27614:28:0;;;27610:175;;27662:44;27679:5;44047:10;28599:164;:::i;27662:44::-;27657:128;;27734:35;;-1:-1:-1;;;27734:35:0;;;;;;;;;;;27657:128;27797:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;27797:29:0;-1:-1:-1;;;;;27797:29:0;;;;;;;;;27842:28;;27797:24;;27842:28;;;;;;;27466:412;27404:474;;:::o;46443:127::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49801:73::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;;;;;;;;;49852:7:::1;:14:::0;;-1:-1:-1;;49852:14:0::1;::::0;::::1;::::0;;49801:73::o;28830:170::-;28964:28;28974:4;28980:2;28984:7;28964:9;:28::i;:::-;28830:170;;;:::o;49706:87::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49769:6:::1;:16:::0;;;::::1;;;;-1:-1:-1::0;;49769:16:0;;::::1;::::0;;;::::1;::::0;;49706:87::o;50232:315::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50310:23:::1;50335:9:::0;50348:27:::1;50366:8;50348:17;:27::i;:::-;50309:66;;;;50389:18;50386:153;;;50445:16;50462:23:::0;;:27:::1;::::0;50488:1:::1;::::0;50462:27:::1;:::i;:::-;50445:45;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;50423:16:::1;:19:::0;;-1:-1:-1;;;;;50445:45:0;;::::1;::::0;50440:1;;50423:19;::::1;;;;;:::i;:::-;;;;;;;;;:67;;;;;-1:-1:-1::0;;;;;50423:67:0::1;;;;;-1:-1:-1::0;;;;;50423:67:0::1;;;;;;50505:16;:22;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;50505:22:0;;;;;-1:-1:-1;;;;;;50505:22:0::1;::::0;;;;;50298:249:::1;;50232:315:::0;:::o;51304:93::-;51349:7;51376:13;48208:1;20183:12;19970:7;20167:13;-1:-1:-1;;20167:28:0;;;:46;;19917:315;51376:13;51369:20;;51304:93;:::o;49443:121::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49524:13:::1;:32:::0;49443:121::o;50995:301::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4399:9:::1;4391:38;;;;-1:-1:-1::0;;;4391:38:0::1;;;;;;;:::i;:::-;51074:21:::2;51114:11:::0;51106:54:::2;;;::::0;-1:-1:-1;;;51106:54:0;;9215:2:1;51106:54:0::2;::::0;::::2;9197:21:1::0;9254:2;9234:18;;;9227:30;9293:32;9273:18;;;9266:60;9343:18;;51106:54:0::2;9013:354:1::0;51106:54:0::2;51174:12;51200:7;6395:6:::0;;-1:-1:-1;;;;;6395:6:0;;6322:87;51200:7:::2;-1:-1:-1::0;;;;;51192:21:0::2;51222:7;51192:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51173:63;;;51255:7;51247:41;;;::::0;-1:-1:-1;;;51247:41:0;;9784:2:1;51247:41:0::2;::::0;::::2;9766:21:1::0;9823:2;9803:18;;;9796:30;-1:-1:-1;;;9842:18:1;;;9835:51;9903:18;;51247:41:0::2;9582:345:1::0;51247:41:0::2;51048:248;;50995:301::o:0;50922:65::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50969:10:::1;:8;:10::i;:::-;50922:65::o:0;29071:185::-;29209:39;29226:4;29232:2;29236:7;29209:39;;;;;;;;;;;;:16;:39::i;48416:100::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;48490:7:::1;:18;48500:8:::0;48490:7;:18:::1;:::i;25665:144::-:0;25729:7;25772:27;25791:7;25772:18;:27::i;50101:123::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50187:29;;::::1;::::0;:16:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;46301:135::-:0;;;;;;;:::i;21542:224::-;21606:7;-1:-1:-1;;;;;21630:19:0;;21626:60;;21658:28;;-1:-1:-1;;;21658:28:0;;;;;;;;;;;21626:60;-1:-1:-1;;;;;;21704:25:0;;;;;:18;:25;;;;;;16881:13;21704:54;;21542:224::o;6973:103::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;7038:30:::1;7065:1;7038:18;:30::i;49345:90::-:0;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49412:4:::1;:15:::0;49345:90::o;50853:61::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50898:8:::1;:6;:8::i;46862:1136::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46862:1136:0;;-1:-1:-1;46862:1136:0;:::o;26045:104::-;26101:13;26134:7;26127:14;;;;;:::i;49882:75::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49934:7:::1;:15:::0;;-1:-1:-1;;49934:15:0::1;::::0;;49882:75::o;51405:638::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4399:9;4391:38;;;;-1:-1:-1;;;4391:38:0;;;;;;;:::i;:::-;51480:14:::1;51497:13;48208:1:::0;20183:12;19970:7;20167:13;-1:-1:-1;;20167:28:0;;;:46;;19917:315;51497:13:::1;51480:30;;51543:1;51529:11;:15;51521:24;;;::::0;::::1;;51588:9;::::0;51564:20:::1;51573:11:::0;51564:6;:20:::1;:::i;:::-;:33;;51556:42;;;::::0;::::1;;51610:16;51632:29;51650:10;51632:17;:29::i;:::-;-1:-1:-1::0;51675:7:0::1;::::0;51609:52;;-1:-1:-1;51675:7:0;;::::1;;;51672:317;;;51707:11;51699:73;;;::::0;-1:-1:-1;;;51699:73:0;;12468:2:1;51699:73:0::1;::::0;::::1;12450:21:1::0;12507:2;12487:18;;;12480:30;12546:34;12526:18;;;12519:62;-1:-1:-1;;;12597:18:1;;;12590:47;12654:19;;51699:73:0::1;12266:413:1::0;51699:73:0::1;51824:11;51808:13;;:27;;;;:::i;:::-;51795:9;:40;;51787:95;;;::::0;-1:-1:-1;;;51787:95:0;;13059:2:1;51787:95:0::1;::::0;::::1;13041:21:1::0;13098:2;13078:18;;;13071:30;13137:34;13117:18;;;13110:62;-1:-1:-1;;;13188:18:1;;;13181:40;13238:19;;51787:95:0::1;12857:406:1::0;51787:95:0::1;51672:317;;;51943:11;51936:4;;:18;;;;:::i;:::-;51923:9;:31;;51915:62;;;::::0;-1:-1:-1;;;51915:62:0;;13470:2:1;51915:62:0::1;::::0;::::1;13452:21:1::0;13509:2;13489:18;;;13482:30;-1:-1:-1;;;13528:18:1;;;13521:48;13586:18;;51915:62:0::1;13268:342:1::0;51915:62:0::1;52001:34;52011:10;52023:11;52001:9;:34::i;28220:308::-:0;44047:10;-1:-1:-1;;;;;28319:31:0;;;28315:61;;28359:17;;-1:-1:-1;;;28359:17:0;;;;;;;;;;;28315:61;44047:10;28389:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;28389:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;28389:60:0;;;;;;;;;;28465:55;;729:41:1;;;28389:49:0;;44047:10;28465:55;;702:18:1;28465:55:0;;;;;;;28220:308;;:::o;48524:96::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;48596:9:::1;:16;48608:4:::0;48596:9;:16:::1;:::i;49572:126::-:0;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49655:21:::1;:35:::0;;-1:-1:-1;;49655:35:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;49572:126::o;29327:396::-;29494:28;29504:4;29510:2;29514:7;29494:9;:28::i;:::-;-1:-1:-1;;;;;29537:14:0;;;:19;29533:183;;29576:56;29607:4;29613:2;29617:7;29626:5;29576:30;:56::i;:::-;29571:145;;29660:40;;-1:-1:-1;;;29660:40:0;;;;;;;;;;;29571:145;29327:396;;;;:::o;46577:37::-;;;;;;;:::i;48628:709::-;48746:13;48799:16;48807:7;48799;:16::i;:::-;48777:113;;;;-1:-1:-1;;;48777:113:0;;13817:2:1;48777:113:0;;;13799:21:1;13856:2;13836:18;;;13829:30;13895:34;13875:18;;;13868:62;-1:-1:-1;;;13946:18:1;;;13939:45;14001:19;;48777:113:0;13615:411:1;48777:113:0;48907:6;;;;;;;48903:55;;48937:9;48930:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48628:709;;;:::o;48903:55::-;48970:28;49001:10;:8;:10::i;:::-;48970:41;;49073:1;49048:14;49042:28;:32;:287;;;;;;;;;;;;;;;;;49166:14;49207:18;:7;:16;:18::i;:::-;49252:13;49123:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49042:287;49022:307;48628:709;-1:-1:-1;;;48628:709:0:o;50555:290::-;50620:4;50626:7;50650:9;50646:164;50667:16;:23;50663:27;;50646:164;;;50727:16;50744:1;50727:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;50727:19:0;;;50715:31;;;;50712:87;;50775:4;;50781:1;;-1:-1:-1;50555:290:0;-1:-1:-1;;50555:290:0:o;50712:87::-;50692:3;;;;:::i;:::-;;;;50646:164;;;-1:-1:-1;50828:5:0;;;;-1:-1:-1;50555:290:0;-1:-1:-1;;50555:290:0:o;49965:128::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50052:13:::1;:33;50068:17:::0;50052:13;:33:::1;:::i;28599:164::-:0;-1:-1:-1;;;;;28720:25:0;;;28696:4;28720:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28599:164::o;7231:201::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7320:22:0;::::1;7312:73;;;::::0;-1:-1:-1;;;7312:73:0;;15634:2:1;7312:73:0::1;::::0;::::1;15616:21:1::0;15673:2;15653:18;;;15646:30;15712:34;15692:18;;;15685:62;-1:-1:-1;;;15763:18:1;;;15756:36;15809:19;;7312:73:0::1;15432:402:1::0;7312:73:0::1;7396:28;7415:8;7396:18;:28::i;:::-;7231:201:::0;:::o;29978:273::-;30035:4;30091:7;48208:1;30072:26;;:66;;;;;30125:13;;30115:7;:23;30072:66;:152;;;;-1:-1:-1;;30176:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;30176:43:0;:48;;29978:273::o;23180:1129::-;23247:7;23282;;48208:1;23331:23;23327:915;;23384:13;;23377:4;:20;23373:869;;;23422:14;23439:23;;;:17;:23;;;;;;;-1:-1:-1;;;23528:23:0;;:28;;23524:699;;24047:113;24054:6;24064:1;24054:11;24047:113;;-1:-1:-1;;;24125:6:0;24107:25;;;;:17;:25;;;;;;24047:113;;23524:699;23399:843;23373:869;24270:31;;-1:-1:-1;;;24270:31:0;;;;;;;;;;;35217:2515;35332:27;35362;35381:7;35362:18;:27::i;:::-;35332:57;;35447:4;-1:-1:-1;;;;;35406:45:0;35422:19;-1:-1:-1;;;;;35406:45:0;;35402:86;;35460:28;;-1:-1:-1;;;35460:28:0;;;;;;;;;;;35402:86;35501:22;44047:10;-1:-1:-1;;;;;35527:27:0;;;;:87;;-1:-1:-1;35571:43:0;35588:4;44047:10;28599:164;:::i;35571:43::-;35527:147;;;-1:-1:-1;44047:10:0;35631:20;35643:7;35631:11;:20::i;:::-;-1:-1:-1;;;;;35631:43:0;;35527:147;35501:174;;35693:17;35688:66;;35719:35;;-1:-1:-1;;;35719:35:0;;;;;;;;;;;35688:66;-1:-1:-1;;;;;35769:16:0;;35765:52;;35794:23;;-1:-1:-1;;;35794:23:0;;;;;;;;;;;35765:52;35946:24;;;;:15;:24;;;;;;;;35939:31;;-1:-1:-1;;;;;;35939:31:0;;;-1:-1:-1;;;;;36338:24:0;;;;;:18;:24;;;;;36336:26;;-1:-1:-1;;36336:26:0;;;36407:22;;;;;;;36405:24;;-1:-1:-1;36405:24:0;;;36700:26;;;:17;:26;;;;;-1:-1:-1;;;36788:15:0;17535:3;36788:41;36746:84;;:128;;36700:174;;;36994:46;;:51;;36990:626;;37098:1;37088:11;;37066:19;37221:30;;;:17;:30;;;;;;:35;;37217:384;;37359:13;;37344:11;:28;37340:242;;37506:30;;;;:17;:30;;;;;:52;;;37340:242;37047:569;36990:626;37663:7;37659:2;-1:-1:-1;;;;;37644:27:0;37653:4;-1:-1:-1;;;;;37644:27:0;;;;;;;;;;;35321:2411;;35217:2515;;;:::o;5133:120::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4669:41;;;;-1:-1:-1;;;4669:41:0;;16041:2:1;4669:41:0;;;16023:21:1;16080:2;16060:18;;;16053:30;-1:-1:-1;;;16099:18:1;;;16092:50;16159:18;;4669:41:0;15839:344:1;4669:41:0;5192:7:::1;:15:::0;;-1:-1:-1;;;;5192:15:0::1;::::0;;5223:22:::1;44047:10:::0;5232:12:::1;5223:22;::::0;-1:-1:-1;;;;;1886:32:1;;;1868:51;;1856:2;1841:18;5223:22:0::1;;;;;;;5133:120::o:0;7592:191::-;7685:6;;;-1:-1:-1;;;;;7702:17:0;;;-1:-1:-1;;;;;;7702:17:0;;;;;;;7735:40;;7685:6;;;7702:17;7685:6;;7735:40;;7666:16;;7735:40;7655:128;7592:191;:::o;4874:118::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4399:9;4391:38;;;;-1:-1:-1;;;4391:38:0;;;;;;;:::i;:::-;4934:7:::1;:14:::0;;-1:-1:-1;;;;4934:14:0::1;-1:-1:-1::0;;;4934:14:0::1;::::0;;4964:20:::1;4971:12;44047:10:::0;;43960:105;30335:104;30404:27;30414:2;30418:8;30404:27;;;;;;;;;;;;:9;:27::i;41429:716::-;41613:88;;-1:-1:-1;;;41613:88:0;;41592:4;;-1:-1:-1;;;;;41613:45:0;;;;;:88;;44047:10;;41680:4;;41686:7;;41695:5;;41613:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41613:88:0;;;;;;;;-1:-1:-1;;41613:88:0;;;;;;;;;;;;:::i;:::-;;;41609:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41896:6;:13;41913:1;41896:18;41892:235;;41942:40;;-1:-1:-1;;;41942:40:0;;;;;;;;;;;41892:235;42085:6;42079:13;42070:6;42066:2;42062:15;42055:38;41609:529;-1:-1:-1;;;;;;41772:64:0;-1:-1:-1;;;41772:64:0;;-1:-1:-1;41609:529:0;41429:716;;;;;;:::o;48300:108::-;48360:13;48393:7;48386:14;;;;;:::i;288:723::-;344:13;565:5;574:1;565:10;561:53;;-1:-1:-1;;592:10:0;;;;;;;;;;;;-1:-1:-1;;;592:10:0;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:0;;-1:-1:-1;744:2:0;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:0;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:0;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;878:56:0;;;;;;;;-1:-1:-1;949:11:0;958:2;949:11;;:::i;:::-;;;818:154;;30812:2236;30935:20;30958:13;-1:-1:-1;;;;;30986:16:0;;30982:48;;31011:19;;-1:-1:-1;;;31011:19:0;;;;;;;;;;;30982:48;31045:8;31057:1;31045:13;31041:44;;31067:18;;-1:-1:-1;;;31067:18:0;;;;;;;;;;;31041:44;-1:-1:-1;;;;;31634:22:0;;;;;;:18;:22;;;;17018:2;31634:22;;;:70;;31672:31;31660:44;;31634:70;;;31947:31;;;:17;:31;;;;;32040:15;17535:3;32040:41;31998:84;;-1:-1:-1;32118:13:0;;17798:3;32103:56;31998:162;31947:213;;:31;;32241:23;;;;32285:14;:19;32281:635;;32325:313;32356:38;;32381:12;;-1:-1:-1;;;;;32356:38:0;;;32373:1;;32356:38;;32373:1;;32356:38;32422:69;32461:1;32465:2;32469:14;;;;;;32485:5;32422:30;:69::i;:::-;32417:174;;32527:40;;-1:-1:-1;;;32527:40:0;;;;;;;;;;;32417:174;32633:3;32618:12;:18;32325:313;;32719:12;32702:13;;:29;32698:43;;32733:8;;;32698:43;32281:635;;;32782:119;32813:40;;32838:14;;;;;-1:-1:-1;;;;;32813:40:0;;;32830:1;;32813:40;;32830:1;;32813:40;32896:3;32881:12;:18;32782:119;;32281:635;-1:-1:-1;32930:13:0;:28;;;32980:60;;33013:2;33017:12;33031:8;32980:60;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;203:131:1;-1:-1:-1;;;;;;277:32:1;;267:43;;257:71;;324:1;321;314:12;339:245;397:6;450:2;438:9;429:7;425:23;421:32;418:52;;;466:1;463;456:12;418:52;505:9;492:23;524:30;548:5;524:30;:::i;781:250::-;866:1;876:113;890:6;887:1;884:13;876:113;;;966:11;;;960:18;947:11;;;940:39;912:2;905:10;876:113;;;-1:-1:-1;;1023:1:1;1005:16;;998:27;781:250::o;1036:271::-;1078:3;1116:5;1110:12;1143:6;1138:3;1131:19;1159:76;1228:6;1221:4;1216:3;1212:14;1205:4;1198:5;1194:16;1159:76;:::i;:::-;1289:2;1268:15;-1:-1:-1;;1264:29:1;1255:39;;;;1296:4;1251:50;;1036:271;-1:-1:-1;;1036:271:1:o;1312:220::-;1461:2;1450:9;1443:21;1424:4;1481:45;1522:2;1511:9;1507:18;1499:6;1481:45;:::i;1537:180::-;1596:6;1649:2;1637:9;1628:7;1624:23;1620:32;1617:52;;;1665:1;1662;1655:12;1617:52;-1:-1:-1;1688:23:1;;1537:180;-1:-1:-1;1537:180:1:o;1930:173::-;1998:20;;-1:-1:-1;;;;;2047:31:1;;2037:42;;2027:70;;2093:1;2090;2083:12;2027:70;1930:173;;;:::o;2108:254::-;2176:6;2184;2237:2;2225:9;2216:7;2212:23;2208:32;2205:52;;;2253:1;2250;2243:12;2205:52;2276:29;2295:9;2276:29;:::i;:::-;2266:39;2352:2;2337:18;;;;2324:32;;-1:-1:-1;;;2108:254:1:o;2549:328::-;2626:6;2634;2642;2695:2;2683:9;2674:7;2670:23;2666:32;2663:52;;;2711:1;2708;2701:12;2663:52;2734:29;2753:9;2734:29;:::i;:::-;2724:39;;2782:38;2816:2;2805:9;2801:18;2782:38;:::i;:::-;2772:48;;2867:2;2856:9;2852:18;2839:32;2829:42;;2549:328;;;;;:::o;2882:160::-;2947:20;;3003:13;;2996:21;2986:32;;2976:60;;3032:1;3029;3022:12;3047:180;3103:6;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3195:26;3211:9;3195:26;:::i;3232:186::-;3291:6;3344:2;3332:9;3323:7;3319:23;3315:32;3312:52;;;3360:1;3357;3350:12;3312:52;3383:29;3402:9;3383:29;:::i;3423:127::-;3484:10;3479:3;3475:20;3472:1;3465:31;3515:4;3512:1;3505:15;3539:4;3536:1;3529:15;3555:275;3626:2;3620:9;3691:2;3672:13;;-1:-1:-1;;3668:27:1;3656:40;;3726:18;3711:34;;3747:22;;;3708:62;3705:88;;;3773:18;;:::i;:::-;3809:2;3802:22;3555:275;;-1:-1:-1;3555:275:1:o;3835:407::-;3900:5;3934:18;3926:6;3923:30;3920:56;;;3956:18;;:::i;:::-;3994:57;4039:2;4018:15;;-1:-1:-1;;4014:29:1;4045:4;4010:40;3994:57;:::i;:::-;3985:66;;4074:6;4067:5;4060:21;4114:3;4105:6;4100:3;4096:16;4093:25;4090:45;;;4131:1;4128;4121:12;4090:45;4180:6;4175:3;4168:4;4161:5;4157:16;4144:43;4234:1;4227:4;4218:6;4211:5;4207:18;4203:29;4196:40;3835:407;;;;;:::o;4247:451::-;4316:6;4369:2;4357:9;4348:7;4344:23;4340:32;4337:52;;;4385:1;4382;4375:12;4337:52;4425:9;4412:23;4458:18;4450:6;4447:30;4444:50;;;4490:1;4487;4480:12;4444:50;4513:22;;4566:4;4558:13;;4554:27;-1:-1:-1;4544:55:1;;4595:1;4592;4585:12;4544:55;4618:74;4684:7;4679:2;4666:16;4661:2;4657;4653:11;4618:74;:::i;4703:952::-;4787:6;4818:2;4861;4849:9;4840:7;4836:23;4832:32;4829:52;;;4877:1;4874;4867:12;4829:52;4917:9;4904:23;4946:18;4987:2;4979:6;4976:14;4973:34;;;5003:1;5000;4993:12;4973:34;5041:6;5030:9;5026:22;5016:32;;5086:7;5079:4;5075:2;5071:13;5067:27;5057:55;;5108:1;5105;5098:12;5057:55;5144:2;5131:16;5166:2;5162;5159:10;5156:36;;;5172:18;;:::i;:::-;5218:2;5215:1;5211:10;5201:20;;5241:28;5265:2;5261;5257:11;5241:28;:::i;:::-;5303:15;;;5373:11;;;5369:20;;;5334:12;;;;5401:19;;;5398:39;;;5433:1;5430;5423:12;5398:39;5457:11;;;;5477:148;5493:6;5488:3;5485:15;5477:148;;;5559:23;5578:3;5559:23;:::i;:::-;5547:36;;5510:12;;;;5603;;;;5477:148;;;5644:5;4703:952;-1:-1:-1;;;;;;;;4703:952:1:o;5660:254::-;5725:6;5733;5786:2;5774:9;5765:7;5761:23;5757:32;5754:52;;;5802:1;5799;5792:12;5754:52;5825:29;5844:9;5825:29;:::i;:::-;5815:39;;5873:35;5904:2;5893:9;5889:18;5873:35;:::i;:::-;5863:45;;5660:254;;;;;:::o;5919:269::-;5976:6;6029:2;6017:9;6008:7;6004:23;6000:32;5997:52;;;6045:1;6042;6035:12;5997:52;6084:9;6071:23;6134:4;6127:5;6123:16;6116:5;6113:27;6103:55;;6154:1;6151;6144:12;6193:667;6288:6;6296;6304;6312;6365:3;6353:9;6344:7;6340:23;6336:33;6333:53;;;6382:1;6379;6372:12;6333:53;6405:29;6424:9;6405:29;:::i;:::-;6395:39;;6453:38;6487:2;6476:9;6472:18;6453:38;:::i;:::-;6443:48;;6538:2;6527:9;6523:18;6510:32;6500:42;;6593:2;6582:9;6578:18;6565:32;6620:18;6612:6;6609:30;6606:50;;;6652:1;6649;6642:12;6606:50;6675:22;;6728:4;6720:13;;6716:27;-1:-1:-1;6706:55:1;;6757:1;6754;6747:12;6706:55;6780:74;6846:7;6841:2;6828:16;6823:2;6819;6815:11;6780:74;:::i;:::-;6770:84;;;6193:667;;;;;;;:::o;7128:260::-;7196:6;7204;7257:2;7245:9;7236:7;7232:23;7228:32;7225:52;;;7273:1;7270;7263:12;7225:52;7296:29;7315:9;7296:29;:::i;:::-;7286:39;;7344:38;7378:2;7367:9;7363:18;7344:38;:::i;7393:380::-;7472:1;7468:12;;;;7515;;;7536:61;;7590:4;7582:6;7578:17;7568:27;;7536:61;7643:2;7635:6;7632:14;7612:18;7609:38;7606:161;;7689:10;7684:3;7680:20;7677:1;7670:31;7724:4;7721:1;7714:15;7752:4;7749:1;7742:15;7606:161;;7393:380;;;:::o;7778:356::-;7980:2;7962:21;;;7999:18;;;7992:30;8058:34;8053:2;8038:18;;8031:62;8125:2;8110:18;;7778:356::o;8139:127::-;8200:10;8195:3;8191:20;8188:1;8181:31;8231:4;8228:1;8221:15;8255:4;8252:1;8245:15;8271:128;8338:9;;;8359:11;;;8356:37;;;8373:18;;:::i;8404:127::-;8465:10;8460:3;8456:20;8453:1;8446:31;8496:4;8493:1;8486:15;8520:4;8517:1;8510:15;8536:127;8597:10;8592:3;8588:20;8585:1;8578:31;8628:4;8625:1;8618:15;8652:4;8649:1;8642:15;8668:340;8870:2;8852:21;;;8909:2;8889:18;;;8882:30;-1:-1:-1;;;8943:2:1;8928:18;;8921:46;8999:2;8984:18;;8668:340::o;10058:545::-;10160:2;10155:3;10152:11;10149:448;;;10196:1;10221:5;10217:2;10210:17;10266:4;10262:2;10252:19;10336:2;10324:10;10320:19;10317:1;10313:27;10307:4;10303:38;10372:4;10360:10;10357:20;10354:47;;;-1:-1:-1;10395:4:1;10354:47;10450:2;10445:3;10441:12;10438:1;10434:20;10428:4;10424:31;10414:41;;10505:82;10523:2;10516:5;10513:13;10505:82;;;10568:17;;;10549:1;10538:13;10505:82;;;10509:3;;;10058:545;;;:::o;10779:1352::-;10905:3;10899:10;10932:18;10924:6;10921:30;10918:56;;;10954:18;;:::i;:::-;10983:97;11073:6;11033:38;11065:4;11059:11;11033:38;:::i;:::-;11027:4;10983:97;:::i;:::-;11135:4;;11199:2;11188:14;;11216:1;11211:663;;;;11918:1;11935:6;11932:89;;;-1:-1:-1;11987:19:1;;;11981:26;11932:89;-1:-1:-1;;10736:1:1;10732:11;;;10728:24;10724:29;10714:40;10760:1;10756:11;;;10711:57;12034:81;;11181:944;;11211:663;10005:1;9998:14;;;10042:4;10029:18;;-1:-1:-1;;11247:20:1;;;11365:236;11379:7;11376:1;11373:14;11365:236;;;11468:19;;;11462:26;11447:42;;11560:27;;;;11528:1;11516:14;;;;11395:19;;11365:236;;;11369:3;11629:6;11620:7;11617:19;11614:201;;;11690:19;;;11684:26;-1:-1:-1;;11773:1:1;11769:14;;;11785:3;11765:24;11761:37;11757:42;11742:58;11727:74;;11614:201;-1:-1:-1;;;;;11861:1:1;11845:14;;;11841:22;11828:36;;-1:-1:-1;10779:1352:1:o;12136:125::-;12201:9;;;12222:10;;;12219:36;;;12235:18;;:::i;12684:168::-;12757:9;;;12788;;12805:15;;;12799:22;;12785:37;12775:71;;12826:18;;:::i;14031:1256::-;14255:3;14293:6;14287:13;14319:4;14332:64;14389:6;14384:3;14379:2;14371:6;14367:15;14332:64;:::i;:::-;14459:13;;14418:16;;;;14481:68;14459:13;14418:16;14516:15;;;14481:68;:::i;:::-;14638:13;;14571:20;;;14611:1;;14676:36;14638:13;14676:36;:::i;:::-;14731:1;14748:18;;;14775:141;;;;14930:1;14925:337;;;;14741:521;;14775:141;-1:-1:-1;;14810:24:1;;14796:39;;14887:16;;14880:24;14866:39;;14855:51;;;-1:-1:-1;14775:141:1;;14925:337;14956:6;14953:1;14946:17;15004:2;15001:1;14991:16;15029:1;15043:169;15057:8;15054:1;15051:15;15043:169;;;15139:14;;15124:13;;;15117:37;15182:16;;;;15074:10;;15043:169;;;15047:3;;15243:8;15236:5;15232:20;15225:27;;14741:521;-1:-1:-1;15278:3:1;;14031:1256;-1:-1:-1;;;;;;;;;;14031:1256:1:o;15292:135::-;15331:3;15352:17;;;15349:43;;15372:18;;:::i;:::-;-1:-1:-1;15419:1:1;15408:13;;15292:135::o;16188:489::-;-1:-1:-1;;;;;16457:15:1;;;16439:34;;16509:15;;16504:2;16489:18;;16482:43;16556:2;16541:18;;16534:34;;;16604:3;16599:2;16584:18;;16577:31;;;16382:4;;16625:46;;16651:19;;16643:6;16625:46;:::i;:::-;16617:54;16188:489;-1:-1:-1;;;;;;16188:489:1:o;16682:249::-;16751:6;16804:2;16792:9;16783:7;16779:23;16775:32;16772:52;;;16820:1;16817;16810:12;16772:52;16852:9;16846:16;16871:30;16895:5;16871:30;:::i;16936:127::-;16997:10;16992:3;16988:20;16985:1;16978:31;17028:4;17025:1;17018:15;17052:4;17049:1;17042:15;17068:120;17108:1;17134;17124:35;;17139:18;;:::i;:::-;-1:-1:-1;17173:9:1;;17068:120::o;17193:112::-;17225:1;17251;17241:35;;17256:18;;:::i;:::-;-1:-1:-1;17290:9:1;;17193:112::o

Swarm Source

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