ETH Price: $2,631.45 (-1.00%)

Token

Seamore (Seamore)
 

Overview

Max Total Supply

444 Seamore

Holders

349

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Seamore
0x7de08daa364e286935998deefcb22ab5f7f5a92f
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:
Seamore

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-26
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.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();

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

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

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

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

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

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

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

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

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

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

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

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.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 bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

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

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

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

    // The 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`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

    // Mapping from token ID to approved address.
    mapping(uint256 => 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 auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

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

    /**
     * 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;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

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

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

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

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

        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-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 {
        transferFrom(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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        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` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

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

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

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

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

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

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

    /**
     * @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 Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

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

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

    /**
     * @dev 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: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/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/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: contracts/seamore.sol



pragma solidity ^0.8.4;





contract Seamore is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;
    // Addresses
    address public signerRole;
    address[] private addressWithdraw;
    // Sales configs
    uint256 public maxPerAddressLaunch = 1;
    uint256 public maxPerAddress = 3;
    uint256 public maxSupply = 3999;
    // Timeframes
    uint256 public windowOpens = 1689888918;
    uint256 public presaleWindowOpens = 1657133162;
    uint256 public presaleWindowCloses = 1659811562;
    uint256 public preLaunchWindowCloses = 1659811562;
    // Metadata URI
    string public baseURI;

    // Amount minted at phases
    mapping(address => uint256) public prelaunchMintedBalance;
    mapping(address => uint256) public mintedBalance;
    
    constructor(
    string memory _baseURI,
    address _signerRole,
    address[] memory _addressWithdraw
    ) ERC721A("Seamore", "Seamore") {
        baseURI = _baseURI;
        signerRole = _signerRole;
        addressWithdraw = _addressWithdraw;
    }

    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require(isValidAccessMessage(_v, _r, _s), "Invalid singature for address calling the function, account not in presale.");
        _;
    }

    modifier mintConditions(uint256 quantity) {
        require(_totalMinted() + quantity <= maxSupply, "This amount of tokens would surpass the max supply.");
        _;
    }

    function mintPreLaunch(uint8 _v, bytes32 _r, bytes32 _s) external payable mintConditions(1) onlyValidAccess(_v, _r, _s) {
        require(block.timestamp <= preLaunchWindowCloses, "Prelaunch: purchase window closed.");
        require(prelaunchMintedBalance[msg.sender] < 1, "You already minted max allowed per wallet.");
       
        _mint(msg.sender, 1);
        prelaunchMintedBalance[msg.sender] = 1;
    }

    function mintLaunch(uint256 quantity, uint8 _v, bytes32 _r, bytes32 _s) external payable mintConditions(quantity) onlyValidAccess(_v, _r, _s) {
        require(block.timestamp >= presaleWindowOpens && block.timestamp <= presaleWindowCloses, "Launch: purchase window closed.");
        require(mintedBalance[msg.sender] + quantity <= maxPerAddressLaunch, "You already minted max allowed per wallet.");
       
        _mint(msg.sender, quantity);
        mintedBalance[msg.sender] += quantity;
    }

    function mint(uint256 quantity, uint8 _v, bytes32 _r, bytes32 _s) external payable mintConditions(quantity) onlyValidAccess(_v, _r, _s)  {
        require(block.timestamp >= windowOpens, "Purchase window closed.");
        require(_numberMinted(msg.sender) + quantity <= maxPerAddress, "You already minted max allowed per wallet.");
        
        _mint(msg.sender, quantity);
    }

    function giveaway(address to, uint256 quantity) external onlyOwner {
        require(_totalMinted() + quantity <= maxSupply, "This amount of tokens would surpass the max supply.");

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

        if(tokenId < 1000) {
            return string(abi.encodePacked(baseURI, "0", ".json"));
        }
        else{
            return string(abi.encodePacked(baseURI, "1", ".json"));
        }
    }

    function setBaseURI(string calldata _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setMaxSupply( uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }
    
    function setWindows(uint256 _windowOpens, uint256 _presaleWindowOpens, uint256 _presaleWindowCloses, uint256 _preLaunchWindowCloses)  external onlyOwner {
        windowOpens = _windowOpens;
        presaleWindowOpens = _presaleWindowOpens;
        presaleWindowCloses = _presaleWindowCloses;
        preLaunchWindowCloses = _preLaunchWindowCloses;
    }

    function setMaxAddress(uint256 _maxPerAddress) external onlyOwner {
        maxPerAddress = _maxPerAddress;
    }

    function setMaxLaunch(uint256 _maxPerAddress) external onlyOwner {
        maxPerAddressLaunch = _maxPerAddress;
    }

    function isValidAccessMessage(uint8 _v, bytes32 _r, bytes32 _s) view internal returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(this, msg.sender, msg.value));
        return signerRole == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        uint256 amount1 = address(this).balance / 100 * 20;

        (bool success, ) = addressWithdraw[0].call{value: amount1}("");
        require(success, "Transfer failed.");
        
        (success, ) = addressWithdraw[1].call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_signerRole","type":"address"},{"internalType":"address[]","name":"_addressWithdraw","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressLaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mintLaunch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mintPreLaunch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preLaunchWindowCloses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"prelaunchMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleWindowCloses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleWindowOpens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerAddress","type":"uint256"}],"name":"setMaxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerAddress","type":"uint256"}],"name":"setMaxLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_windowOpens","type":"uint256"},{"internalType":"uint256","name":"_presaleWindowOpens","type":"uint256"},{"internalType":"uint256","name":"_presaleWindowCloses","type":"uint256"},{"internalType":"uint256","name":"_preLaunchWindowCloses","type":"uint256"}],"name":"setWindows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerRole","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"windowOpens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600c556003600d55610f9f600e556364b9a896600f556362c5d86a6010556362eeb6ea6011556362eeb6ea6012553480156200004157600080fd5b506040516200434e3803806200434e833981810160405281019062000067919062000514565b6040518060400160405280600781526020017f5365616d6f7265000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f5365616d6f726500000000000000000000000000000000000000000000000000815250620000f3620000e7620001c160201b60201c565b620001c960201b60201c565b81600390805190602001906200010b92919062000292565b5080600490805190602001906200012492919062000292565b50620001356200028d60201b60201c565b6001819055505050600160098190555082601390805190602001906200015d92919062000292565b5081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b9080519060200190620001b792919062000323565b50505050620007b4565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002a090620006a6565b90600052602060002090601f016020900481019282620002c4576000855562000310565b82601f10620002df57805160ff191683800117855562000310565b8280016001018555821562000310579182015b828111156200030f578251825591602001919060010190620002f2565b5b5090506200031f9190620003b2565b5090565b8280548282559060005260206000209081019282156200039f579160200282015b828111156200039e5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000344565b5b509050620003ae9190620003b2565b5090565b5b80821115620003cd576000816000905550600101620003b3565b5090565b6000620003e8620003e284620005d7565b620005ae565b905080838252602082019050828560208602820111156200040e576200040d62000775565b5b60005b8581101562000442578162000427888262000497565b84526020840193506020830192505060018101905062000411565b5050509392505050565b6000620004636200045d8462000606565b620005ae565b9050828152602081018484840111156200048257620004816200077a565b5b6200048f84828562000670565b509392505050565b600081519050620004a8816200079a565b92915050565b600082601f830112620004c657620004c562000770565b5b8151620004d8848260208601620003d1565b91505092915050565b600082601f830112620004f957620004f862000770565b5b81516200050b8482602086016200044c565b91505092915050565b60008060006060848603121562000530576200052f62000784565b5b600084015167ffffffffffffffff8111156200055157620005506200077f565b5b6200055f86828701620004e1565b9350506020620005728682870162000497565b925050604084015167ffffffffffffffff8111156200059657620005956200077f565b5b620005a486828701620004ae565b9150509250925092565b6000620005ba620005cd565b9050620005c88282620006dc565b919050565b6000604051905090565b600067ffffffffffffffff821115620005f557620005f462000741565b5b602082029050602081019050919050565b600067ffffffffffffffff82111562000624576200062362000741565b5b6200062f8262000789565b9050602081019050919050565b6000620006498262000650565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200069057808201518184015260208101905062000673565b83811115620006a0576000848401525b50505050565b60006002820490506001821680620006bf57607f821691505b60208210811415620006d657620006d562000712565b5b50919050565b620006e78262000789565b810181811067ffffffffffffffff8211171562000709576200070862000741565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007a5816200063c565b8114620007b157600080fd5b50565b613b8a80620007c46000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063afd9400e116100ab578063d5abeb011161006f578063d5abeb01146107b8578063e051b416146107e3578063e985e9c514610820578063f2fde38b1461085d578063f6de979d1461088657610225565b8063afd9400e146106c1578063b88d4fde146106ec578063bed2171714610715578063c4e163781461073e578063c87b56dd1461077b57610225565b806392e04494116100f257806392e044941461060057806395d89b411461062b578063a22cb46514610656578063ac4460021461067f578063ae05093b1461069657610225565b806370a0823114610556578063715018a6146105935780638da5cb5b146105aa57806390f0a3dd146105d557610225565b806327a81180116101b15780636352211e116101755780636352211e1461046f578063639814e0146104ac5780636c0360eb146104d75780636c2d481f146105025780636f8b44b01461052d57610225565b806327a81180146103ad578063387fb164146103d657806342842e0e14610401578063441888031461042a57806355f804b31461044657610225565b8063095ea7b3116101f8578063095ea7b3146102f857806310aec4a61461032157806318160ddd1461033d5780631b2725231461036857806323b872dd1461038457610225565b806301ffc9a71461022a578063050225ea1461026757806306fdde0314610290578063081812fc146102bb575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612a04565b6108af565b60405161025e91906130fa565b60405180910390f35b34801561027357600080fd5b5061028e600480360381019061028991906129c4565b610941565b005b34801561029c57600080fd5b506102a56109ae565b6040516102b2919061315a565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd9190612aab565b610a40565b6040516102ef9190613093565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a91906129c4565b610abc565b005b61033b60048036038101906103369190612b3f565b610bfd565b005b34801561034957600080fd5b50610352610d53565b60405161035f91906132dc565b60405180910390f35b610382600480360381019061037d9190612b3f565b610d6a565b005b34801561039057600080fd5b506103ab60048036038101906103a691906128ae565b610f5b565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190612ad8565b611280565b005b3480156103e257600080fd5b506103eb6112aa565b6040516103f891906132dc565b60405180910390f35b34801561040d57600080fd5b50610428600480360381019061042391906128ae565b6112b0565b005b610444600480360381019061043f9190612ba6565b6112d0565b005b34801561045257600080fd5b5061046d60048036038101906104689190612a5e565b611496565b005b34801561047b57600080fd5b5061049660048036038101906104919190612aab565b6114b4565b6040516104a39190613093565b60405180910390f35b3480156104b857600080fd5b506104c16114c6565b6040516104ce91906132dc565b60405180910390f35b3480156104e357600080fd5b506104ec6114cc565b6040516104f9919061315a565b60405180910390f35b34801561050e57600080fd5b5061051761155a565b6040516105249190613093565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612aab565b611580565b005b34801561056257600080fd5b5061057d60048036038101906105789190612841565b611592565b60405161058a91906132dc565b60405180910390f35b34801561059f57600080fd5b506105a861164b565b005b3480156105b657600080fd5b506105bf61165f565b6040516105cc9190613093565b60405180910390f35b3480156105e157600080fd5b506105ea611688565b6040516105f791906132dc565b60405180910390f35b34801561060c57600080fd5b5061061561168e565b60405161062291906132dc565b60405180910390f35b34801561063757600080fd5b50610640611694565b60405161064d919061315a565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190612984565b611726565b005b34801561068b57600080fd5b5061069461189e565b005b3480156106a257600080fd5b506106ab611af3565b6040516106b891906132dc565b60405180910390f35b3480156106cd57600080fd5b506106d6611af9565b6040516106e391906132dc565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612901565b611aff565b005b34801561072157600080fd5b5061073c60048036038101906107379190612aab565b611b72565b005b34801561074a57600080fd5b5061076560048036038101906107609190612841565b611b84565b60405161077291906132dc565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190612aab565b611b9c565b6040516107af919061315a565b60405180910390f35b3480156107c457600080fd5b506107cd611c41565b6040516107da91906132dc565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190612841565b611c47565b60405161081791906132dc565b60405180910390f35b34801561082c57600080fd5b506108476004803603810190610842919061286e565b611c5f565b60405161085491906130fa565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190612841565b611cf3565b005b34801561089257600080fd5b506108ad60048036038101906108a89190612aab565b611d77565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610949611d89565b600e5481610955611e07565b61095f91906133b0565b11156109a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610997906131dc565b60405180910390fd5b6109aa8282611e1a565b5050565b6060600380546109bd90613594565b80601f01602080910402602001604051908101604052809291908181526020018280546109e990613594565b8015610a365780601f10610a0b57610100808354040283529160200191610a36565b820191906000526020600020905b815481529060010190602001808311610a1957829003601f168201915b5050505050905090565b6000610a4b82611e38565b610a81576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac7826114b4565b90508073ffffffffffffffffffffffffffffffffffffffff16610ae8611e97565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b57610b1481610b0f611e97565b611c5f565b610b4a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b83600e5481610c0a611e07565b610c1491906133b0565b1115610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c906131dc565b60405180910390fd5b838383610c63838383611e9f565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c999061321c565b60405180910390fd5b600f54421015610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde9061319c565b60405180910390fd5b600d5488610cf433611f9e565b610cfe91906133b0565b1115610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061325c565b60405180910390fd5b610d493389611ff5565b5050505050505050565b6000610d5d6121ca565b6002546001540303905090565b83600e5481610d77611e07565b610d8191906133b0565b1115610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db9906131dc565b60405180910390fd5b838383610dd0838383611e9f565b610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e069061321c565b60405180910390fd5b6010544210158015610e2357506011544211155b610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906131fc565b60405180910390fd5b600c5488601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eb091906133b0565b1115610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee89061325c565b60405180910390fd5b610efb3389611ff5565b87601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f4a91906133b0565b925050819055505050505050505050565b6000610f66826121cf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fcd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fd98461229d565b91509150610fef8187610fea611e97565b6122bf565b61103b5761100486610fff611e97565b611c5f565b61103a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156110a2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af8686866001612303565b80156110ba57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061118885611164888887612309565b7c020000000000000000000000000000000000000000000000000000000017612331565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561121057600060018501905060006005600083815260200190815260200160002054141561120e57600154811461120d578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611278868686600161235c565b505050505050565b611288611d89565b83600f8190555082601081905550816011819055508060128190555050505050565b60125481565b6112cb83838360405180602001604052806000815250611aff565b505050565b6001600e54816112de611e07565b6112e891906133b0565b1115611329576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611320906131dc565b60405180910390fd5b838383611337838383611e9f565b611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d9061321c565b60405180910390fd5b6012544211156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b29061327c565b60405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061143d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114349061325c565b60405180910390fd5b611448336001611ff5565b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050565b61149e611d89565b8181601391906114af929190612645565b505050565b60006114bf826121cf565b9050919050565b600d5481565b601380546114d990613594565b80601f016020809104026020016040519081016040528092919081815260200182805461150590613594565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611588611d89565b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115fa576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611653611d89565b61165d6000612362565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b600f5481565b6060600480546116a390613594565b80601f01602080910402602001604051908101604052809291908181526020018280546116cf90613594565b801561171c5780601f106116f15761010080835404028352916020019161171c565b820191906000526020600020905b8154815290600101906020018083116116ff57829003601f168201915b5050505050905090565b61172e611e97565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611793576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006117a0611e97565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184d611e97565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189291906130fa565b60405180910390a35050565b6118a6611d89565b600260095414156118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e39061329c565b60405180910390fd5b6002600981905550600060146064476119059190613406565b61190f9190613437565b90506000600b600081548110611928576119276136bc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516119769061307e565b60006040518083038185875af1925050503d80600081146119b3576040519150601f19603f3d011682016040523d82523d6000602084013e6119b8565b606091505b50509050806119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f39061323c565b60405180910390fd5b600b600181548110611a1157611a106136bc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611a5f9061307e565b60006040518083038185875af1925050503d8060008114611a9c576040519150601f19603f3d011682016040523d82523d6000602084013e611aa1565b606091505b50508091505080611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade9061323c565b60405180910390fd5b50506001600981905550565b600c5481565b60115481565b611b0a848484610f5b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b6c57611b3584848484612426565b611b6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b7a611d89565b80600c8190555050565b60146020528060005260406000206000915090505481565b6060611ba782611e38565b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906132bc565b60405180910390fd5b6103e8821015611c18576013604051602001611c029190612ffe565b6040516020818303038152906040529050611c3c565b6013604051602001611c2a919061302b565b60405160208183030381529060405290505b919050565b600e5481565b60156020528060005260406000206000915090505481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cfb611d89565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061317c565b60405180910390fd5b611d7481612362565b50565b611d7f611d89565b80600d8190555050565b611d91612586565b73ffffffffffffffffffffffffffffffffffffffff16611daf61165f565b73ffffffffffffffffffffffffffffffffffffffff1614611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc906131bc565b60405180910390fd5b565b6000611e116121ca565b60015403905090565b611e3482826040518060200160405280600081525061258e565b5050565b600081611e436121ca565b11158015611e52575060015482105b8015611e90575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600080303334604051602001611eb793929190612fc1565b604051602081830303815290604052805190602001209050600181604051602001611ee29190613058565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051611f189493929190613115565b6020604051602081039080840390855afa158015611f3a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149150509392505050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612063576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561209e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120ab6000848385612303565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612122836121136000866000612309565b61211c8561262c565b17612331565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612146578060018190555050506121c5600084838561235c565b505050565b600090565b600080829050806121de6121ca565b11612266576001548110156122655760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612263575b600081141561225957600560008360019003935083815260200190815260200160002054905061222e565b8092505050612298565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861232086868461263c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261244c611e97565b8786866040518563ffffffff1660e01b815260040161246e94939291906130ae565b602060405180830381600087803b15801561248857600080fd5b505af19250505080156124b957506040513d601f19601f820116820180604052508101906124b69190612a31565b60015b612533573d80600081146124e9576040519150601f19603f3d011682016040523d82523d6000602084013e6124ee565b606091505b5060008151141561252b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b6125988383611ff5565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126275760006001549050600083820390505b6125d96000868380600101945086612426565b61260f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106125c657816001541461262457600080fd5b50505b505050565b60006001821460e11b9050919050565b60009392505050565b82805461265190613594565b90600052602060002090601f01602090048101928261267357600085556126ba565b82601f1061268c57803560ff19168380011785556126ba565b828001600101855582156126ba579182015b828111156126b957823582559160200191906001019061269e565b5b5090506126c791906126cb565b5090565b5b808211156126e45760008160009055506001016126cc565b5090565b60006126fb6126f68461331c565b6132f7565b90508281526020810184848401111561271757612716613729565b5b612722848285613552565b509392505050565b60008135905061273981613aca565b92915050565b60008135905061274e81613ae1565b92915050565b60008135905061276381613af8565b92915050565b60008135905061277881613b0f565b92915050565b60008151905061278d81613b0f565b92915050565b600082601f8301126127a8576127a761371f565b5b81356127b88482602086016126e8565b91505092915050565b60008083601f8401126127d7576127d661371f565b5b8235905067ffffffffffffffff8111156127f4576127f361371a565b5b6020830191508360018202830111156128105761280f613724565b5b9250929050565b60008135905061282681613b26565b92915050565b60008135905061283b81613b3d565b92915050565b60006020828403121561285757612856613733565b5b60006128658482850161272a565b91505092915050565b6000806040838503121561288557612884613733565b5b60006128938582860161272a565b92505060206128a48582860161272a565b9150509250929050565b6000806000606084860312156128c7576128c6613733565b5b60006128d58682870161272a565b93505060206128e68682870161272a565b92505060406128f786828701612817565b9150509250925092565b6000806000806080858703121561291b5761291a613733565b5b60006129298782880161272a565b945050602061293a8782880161272a565b935050604061294b87828801612817565b925050606085013567ffffffffffffffff81111561296c5761296b61372e565b5b61297887828801612793565b91505092959194509250565b6000806040838503121561299b5761299a613733565b5b60006129a98582860161272a565b92505060206129ba8582860161273f565b9150509250929050565b600080604083850312156129db576129da613733565b5b60006129e98582860161272a565b92505060206129fa85828601612817565b9150509250929050565b600060208284031215612a1a57612a19613733565b5b6000612a2884828501612769565b91505092915050565b600060208284031215612a4757612a46613733565b5b6000612a558482850161277e565b91505092915050565b60008060208385031215612a7557612a74613733565b5b600083013567ffffffffffffffff811115612a9357612a9261372e565b5b612a9f858286016127c1565b92509250509250929050565b600060208284031215612ac157612ac0613733565b5b6000612acf84828501612817565b91505092915050565b60008060008060808587031215612af257612af1613733565b5b6000612b0087828801612817565b9450506020612b1187828801612817565b9350506040612b2287828801612817565b9250506060612b3387828801612817565b91505092959194509250565b60008060008060808587031215612b5957612b58613733565b5b6000612b6787828801612817565b9450506020612b788782880161282c565b9350506040612b8987828801612754565b9250506060612b9a87828801612754565b91505092959194509250565b600080600060608486031215612bbf57612bbe613733565b5b6000612bcd8682870161282c565b9350506020612bde86828701612754565b9250506040612bef86828701612754565b9150509250925092565b612c0281613491565b82525050565b612c19612c1482613491565b6135f7565b82525050565b612c28816134a3565b82525050565b612c37816134af565b82525050565b612c4e612c49826134af565b613609565b82525050565b6000612c5f82613362565b612c698185613378565b9350612c79818560208601613561565b612c8281613738565b840191505092915050565b612c9e612c998261351c565b6135f7565b82525050565b6000612caf8261336d565b612cb98185613394565b9350612cc9818560208601613561565b612cd281613738565b840191505092915050565b60008154612cea81613594565b612cf481866133a5565b94506001821660008114612d0f5760018114612d2057612d53565b60ff19831686528186019350612d53565b612d298561334d565b60005b83811015612d4b57815481890152600182019150602081019050612d2c565b838801955050505b50505092915050565b6000612d696001836133a5565b9150612d7482613756565b600182019050919050565b6000612d8c601c836133a5565b9150612d978261377f565b601c82019050919050565b6000612daf602683613394565b9150612dba826137a8565b604082019050919050565b6000612dd2601783613394565b9150612ddd826137f7565b602082019050919050565b6000612df56005836133a5565b9150612e0082613820565b600582019050919050565b6000612e18602083613394565b9150612e2382613849565b602082019050919050565b6000612e3b603383613394565b9150612e4682613872565b604082019050919050565b6000612e5e601f83613394565b9150612e69826138c1565b602082019050919050565b6000612e81604b83613394565b9150612e8c826138ea565b606082019050919050565b6000612ea4600083613389565b9150612eaf8261395f565b600082019050919050565b6000612ec7601083613394565b9150612ed282613962565b602082019050919050565b6000612eea6001836133a5565b9150612ef58261398b565b600182019050919050565b6000612f0d602a83613394565b9150612f18826139b4565b604082019050919050565b6000612f30602283613394565b9150612f3b82613a03565b604082019050919050565b6000612f53601f83613394565b9150612f5e82613a52565b602082019050919050565b6000612f76603083613394565b9150612f8182613a7b565b604082019050919050565b612f9581613505565b82525050565b612fac612fa782613505565b613625565b82525050565b612fbb8161350f565b82525050565b6000612fcd8286612c8d565b601482019150612fdd8285612c08565b601482019150612fed8284612f9b565b602082019150819050949350505050565b600061300a8284612cdd565b915061301582612d5c565b915061302082612de8565b915081905092915050565b60006130378284612cdd565b915061304282612edd565b915061304d82612de8565b915081905092915050565b600061306382612d7f565b915061306f8284612c3d565b60208201915081905092915050565b600061308982612e97565b9150819050919050565b60006020820190506130a86000830184612bf9565b92915050565b60006080820190506130c36000830187612bf9565b6130d06020830186612bf9565b6130dd6040830185612f8c565b81810360608301526130ef8184612c54565b905095945050505050565b600060208201905061310f6000830184612c1f565b92915050565b600060808201905061312a6000830187612c2e565b6131376020830186612fb2565b6131446040830185612c2e565b6131516060830184612c2e565b95945050505050565b600060208201905081810360008301526131748184612ca4565b905092915050565b6000602082019050818103600083015261319581612da2565b9050919050565b600060208201905081810360008301526131b581612dc5565b9050919050565b600060208201905081810360008301526131d581612e0b565b9050919050565b600060208201905081810360008301526131f581612e2e565b9050919050565b6000602082019050818103600083015261321581612e51565b9050919050565b6000602082019050818103600083015261323581612e74565b9050919050565b6000602082019050818103600083015261325581612eba565b9050919050565b6000602082019050818103600083015261327581612f00565b9050919050565b6000602082019050818103600083015261329581612f23565b9050919050565b600060208201905081810360008301526132b581612f46565b9050919050565b600060208201905081810360008301526132d581612f69565b9050919050565b60006020820190506132f16000830184612f8c565b92915050565b6000613301613312565b905061330d82826135c6565b919050565b6000604051905090565b600067ffffffffffffffff821115613337576133366136eb565b5b61334082613738565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006133bb82613505565b91506133c683613505565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133fb576133fa61362f565b5b828201905092915050565b600061341182613505565b915061341c83613505565b92508261342c5761342b61365e565b5b828204905092915050565b600061344282613505565b915061344d83613505565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134865761348561362f565b5b828202905092915050565b600061349c826134e5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006135278261352e565b9050919050565b600061353982613540565b9050919050565b600061354b826134e5565b9050919050565b82818337600083830152505050565b60005b8381101561357f578082015181840152602081019050613564565b8381111561358e576000848401525b50505050565b600060028204905060018216806135ac57607f821691505b602082108114156135c0576135bf61368d565b5b50919050565b6135cf82613738565b810181811067ffffffffffffffff821117156135ee576135ed6136eb565b5b80604052505050565b600061360282613613565b9050919050565b6000819050919050565b600061361e82613749565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50757263686173652077696e646f7720636c6f7365642e000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5468697320616d6f756e74206f6620746f6b656e7320776f756c64207375727060008201527f61737320746865206d617820737570706c792e00000000000000000000000000602082015250565b7f4c61756e63683a2070757263686173652077696e646f7720636c6f7365642e00600082015250565b7f496e76616c69642073696e67617475726520666f72206164647265737320636160008201527f6c6c696e67207468652066756e6374696f6e2c206163636f756e74206e6f742060208201527f696e2070726573616c652e000000000000000000000000000000000000000000604082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f596f7520616c7265616479206d696e746564206d617820616c6c6f776564207060008201527f65722077616c6c65742e00000000000000000000000000000000000000000000602082015250565b7f5072656c61756e63683a2070757263686173652077696e646f7720636c6f736560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b613ad381613491565b8114613ade57600080fd5b50565b613aea816134a3565b8114613af557600080fd5b50565b613b01816134af565b8114613b0c57600080fd5b50565b613b18816134b9565b8114613b2357600080fd5b50565b613b2f81613505565b8114613b3a57600080fd5b50565b613b468161350f565b8114613b5157600080fd5b5056fea26469706673582212200b5ec16490dfe9c2dbb044203fdb8202844bcac08e1786f3d7a80e6d8c84324464736f6c634300080700330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d53554a7575576935504b75347231597859624d6978676b7a515646457539756a61486250376a5735665944502f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000026ac68037c202b8ac2d1cfcc487651dad41b68e00000000000000000000000004e3c4cb1c2ecc0005c5980a5c09ac5146529ccb2

Deployed Bytecode

0x6080604052600436106102255760003560e01c806370a0823111610123578063afd9400e116100ab578063d5abeb011161006f578063d5abeb01146107b8578063e051b416146107e3578063e985e9c514610820578063f2fde38b1461085d578063f6de979d1461088657610225565b8063afd9400e146106c1578063b88d4fde146106ec578063bed2171714610715578063c4e163781461073e578063c87b56dd1461077b57610225565b806392e04494116100f257806392e044941461060057806395d89b411461062b578063a22cb46514610656578063ac4460021461067f578063ae05093b1461069657610225565b806370a0823114610556578063715018a6146105935780638da5cb5b146105aa57806390f0a3dd146105d557610225565b806327a81180116101b15780636352211e116101755780636352211e1461046f578063639814e0146104ac5780636c0360eb146104d75780636c2d481f146105025780636f8b44b01461052d57610225565b806327a81180146103ad578063387fb164146103d657806342842e0e14610401578063441888031461042a57806355f804b31461044657610225565b8063095ea7b3116101f8578063095ea7b3146102f857806310aec4a61461032157806318160ddd1461033d5780631b2725231461036857806323b872dd1461038457610225565b806301ffc9a71461022a578063050225ea1461026757806306fdde0314610290578063081812fc146102bb575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612a04565b6108af565b60405161025e91906130fa565b60405180910390f35b34801561027357600080fd5b5061028e600480360381019061028991906129c4565b610941565b005b34801561029c57600080fd5b506102a56109ae565b6040516102b2919061315a565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd9190612aab565b610a40565b6040516102ef9190613093565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a91906129c4565b610abc565b005b61033b60048036038101906103369190612b3f565b610bfd565b005b34801561034957600080fd5b50610352610d53565b60405161035f91906132dc565b60405180910390f35b610382600480360381019061037d9190612b3f565b610d6a565b005b34801561039057600080fd5b506103ab60048036038101906103a691906128ae565b610f5b565b005b3480156103b957600080fd5b506103d460048036038101906103cf9190612ad8565b611280565b005b3480156103e257600080fd5b506103eb6112aa565b6040516103f891906132dc565b60405180910390f35b34801561040d57600080fd5b50610428600480360381019061042391906128ae565b6112b0565b005b610444600480360381019061043f9190612ba6565b6112d0565b005b34801561045257600080fd5b5061046d60048036038101906104689190612a5e565b611496565b005b34801561047b57600080fd5b5061049660048036038101906104919190612aab565b6114b4565b6040516104a39190613093565b60405180910390f35b3480156104b857600080fd5b506104c16114c6565b6040516104ce91906132dc565b60405180910390f35b3480156104e357600080fd5b506104ec6114cc565b6040516104f9919061315a565b60405180910390f35b34801561050e57600080fd5b5061051761155a565b6040516105249190613093565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190612aab565b611580565b005b34801561056257600080fd5b5061057d60048036038101906105789190612841565b611592565b60405161058a91906132dc565b60405180910390f35b34801561059f57600080fd5b506105a861164b565b005b3480156105b657600080fd5b506105bf61165f565b6040516105cc9190613093565b60405180910390f35b3480156105e157600080fd5b506105ea611688565b6040516105f791906132dc565b60405180910390f35b34801561060c57600080fd5b5061061561168e565b60405161062291906132dc565b60405180910390f35b34801561063757600080fd5b50610640611694565b60405161064d919061315a565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190612984565b611726565b005b34801561068b57600080fd5b5061069461189e565b005b3480156106a257600080fd5b506106ab611af3565b6040516106b891906132dc565b60405180910390f35b3480156106cd57600080fd5b506106d6611af9565b6040516106e391906132dc565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612901565b611aff565b005b34801561072157600080fd5b5061073c60048036038101906107379190612aab565b611b72565b005b34801561074a57600080fd5b5061076560048036038101906107609190612841565b611b84565b60405161077291906132dc565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190612aab565b611b9c565b6040516107af919061315a565b60405180910390f35b3480156107c457600080fd5b506107cd611c41565b6040516107da91906132dc565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190612841565b611c47565b60405161081791906132dc565b60405180910390f35b34801561082c57600080fd5b506108476004803603810190610842919061286e565b611c5f565b60405161085491906130fa565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190612841565b611cf3565b005b34801561089257600080fd5b506108ad60048036038101906108a89190612aab565b611d77565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061093a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610949611d89565b600e5481610955611e07565b61095f91906133b0565b11156109a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610997906131dc565b60405180910390fd5b6109aa8282611e1a565b5050565b6060600380546109bd90613594565b80601f01602080910402602001604051908101604052809291908181526020018280546109e990613594565b8015610a365780601f10610a0b57610100808354040283529160200191610a36565b820191906000526020600020905b815481529060010190602001808311610a1957829003601f168201915b5050505050905090565b6000610a4b82611e38565b610a81576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac7826114b4565b90508073ffffffffffffffffffffffffffffffffffffffff16610ae8611e97565b73ffffffffffffffffffffffffffffffffffffffff1614610b4b57610b1481610b0f611e97565b611c5f565b610b4a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b83600e5481610c0a611e07565b610c1491906133b0565b1115610c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4c906131dc565b60405180910390fd5b838383610c63838383611e9f565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c999061321c565b60405180910390fd5b600f54421015610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde9061319c565b60405180910390fd5b600d5488610cf433611f9e565b610cfe91906133b0565b1115610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d369061325c565b60405180910390fd5b610d493389611ff5565b5050505050505050565b6000610d5d6121ca565b6002546001540303905090565b83600e5481610d77611e07565b610d8191906133b0565b1115610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db9906131dc565b60405180910390fd5b838383610dd0838383611e9f565b610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e069061321c565b60405180910390fd5b6010544210158015610e2357506011544211155b610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e59906131fc565b60405180910390fd5b600c5488601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610eb091906133b0565b1115610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee89061325c565b60405180910390fd5b610efb3389611ff5565b87601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f4a91906133b0565b925050819055505050505050505050565b6000610f66826121cf565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fcd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fd98461229d565b91509150610fef8187610fea611e97565b6122bf565b61103b5761100486610fff611e97565b611c5f565b61103a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156110a2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110af8686866001612303565b80156110ba57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061118885611164888887612309565b7c020000000000000000000000000000000000000000000000000000000017612331565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561121057600060018501905060006005600083815260200190815260200160002054141561120e57600154811461120d578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611278868686600161235c565b505050505050565b611288611d89565b83600f8190555082601081905550816011819055508060128190555050505050565b60125481565b6112cb83838360405180602001604052806000815250611aff565b505050565b6001600e54816112de611e07565b6112e891906133b0565b1115611329576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611320906131dc565b60405180910390fd5b838383611337838383611e9f565b611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d9061321c565b60405180910390fd5b6012544211156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b29061327c565b60405180910390fd5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061143d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114349061325c565b60405180910390fd5b611448336001611ff5565b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050565b61149e611d89565b8181601391906114af929190612645565b505050565b60006114bf826121cf565b9050919050565b600d5481565b601380546114d990613594565b80601f016020809104026020016040519081016040528092919081815260200182805461150590613594565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611588611d89565b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115fa576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611653611d89565b61165d6000612362565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b600f5481565b6060600480546116a390613594565b80601f01602080910402602001604051908101604052809291908181526020018280546116cf90613594565b801561171c5780601f106116f15761010080835404028352916020019161171c565b820191906000526020600020905b8154815290600101906020018083116116ff57829003601f168201915b5050505050905090565b61172e611e97565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611793576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006117a0611e97565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184d611e97565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189291906130fa565b60405180910390a35050565b6118a6611d89565b600260095414156118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e39061329c565b60405180910390fd5b6002600981905550600060146064476119059190613406565b61190f9190613437565b90506000600b600081548110611928576119276136bc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516119769061307e565b60006040518083038185875af1925050503d80600081146119b3576040519150601f19603f3d011682016040523d82523d6000602084013e6119b8565b606091505b50509050806119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f39061323c565b60405180910390fd5b600b600181548110611a1157611a106136bc565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611a5f9061307e565b60006040518083038185875af1925050503d8060008114611a9c576040519150601f19603f3d011682016040523d82523d6000602084013e611aa1565b606091505b50508091505080611ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ade9061323c565b60405180910390fd5b50506001600981905550565b600c5481565b60115481565b611b0a848484610f5b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b6c57611b3584848484612426565b611b6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b7a611d89565b80600c8190555050565b60146020528060005260406000206000915090505481565b6060611ba782611e38565b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906132bc565b60405180910390fd5b6103e8821015611c18576013604051602001611c029190612ffe565b6040516020818303038152906040529050611c3c565b6013604051602001611c2a919061302b565b60405160208183030381529060405290505b919050565b600e5481565b60156020528060005260406000206000915090505481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cfb611d89565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d629061317c565b60405180910390fd5b611d7481612362565b50565b611d7f611d89565b80600d8190555050565b611d91612586565b73ffffffffffffffffffffffffffffffffffffffff16611daf61165f565b73ffffffffffffffffffffffffffffffffffffffff1614611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc906131bc565b60405180910390fd5b565b6000611e116121ca565b60015403905090565b611e3482826040518060200160405280600081525061258e565b5050565b600081611e436121ca565b11158015611e52575060015482105b8015611e90575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600080303334604051602001611eb793929190612fc1565b604051602081830303815290604052805190602001209050600181604051602001611ee29190613058565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051611f189493929190613115565b6020604051602081039080840390855afa158015611f3a573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149150509392505050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612063576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561209e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120ab6000848385612303565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612122836121136000866000612309565b61211c8561262c565b17612331565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612146578060018190555050506121c5600084838561235c565b505050565b600090565b600080829050806121de6121ca565b11612266576001548110156122655760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612263575b600081141561225957600560008360019003935083815260200190815260200160002054905061222e565b8092505050612298565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861232086868461263c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261244c611e97565b8786866040518563ffffffff1660e01b815260040161246e94939291906130ae565b602060405180830381600087803b15801561248857600080fd5b505af19250505080156124b957506040513d601f19601f820116820180604052508101906124b69190612a31565b60015b612533573d80600081146124e9576040519150601f19603f3d011682016040523d82523d6000602084013e6124ee565b606091505b5060008151141561252b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b6125988383611ff5565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126275760006001549050600083820390505b6125d96000868380600101945086612426565b61260f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106125c657816001541461262457600080fd5b50505b505050565b60006001821460e11b9050919050565b60009392505050565b82805461265190613594565b90600052602060002090601f01602090048101928261267357600085556126ba565b82601f1061268c57803560ff19168380011785556126ba565b828001600101855582156126ba579182015b828111156126b957823582559160200191906001019061269e565b5b5090506126c791906126cb565b5090565b5b808211156126e45760008160009055506001016126cc565b5090565b60006126fb6126f68461331c565b6132f7565b90508281526020810184848401111561271757612716613729565b5b612722848285613552565b509392505050565b60008135905061273981613aca565b92915050565b60008135905061274e81613ae1565b92915050565b60008135905061276381613af8565b92915050565b60008135905061277881613b0f565b92915050565b60008151905061278d81613b0f565b92915050565b600082601f8301126127a8576127a761371f565b5b81356127b88482602086016126e8565b91505092915050565b60008083601f8401126127d7576127d661371f565b5b8235905067ffffffffffffffff8111156127f4576127f361371a565b5b6020830191508360018202830111156128105761280f613724565b5b9250929050565b60008135905061282681613b26565b92915050565b60008135905061283b81613b3d565b92915050565b60006020828403121561285757612856613733565b5b60006128658482850161272a565b91505092915050565b6000806040838503121561288557612884613733565b5b60006128938582860161272a565b92505060206128a48582860161272a565b9150509250929050565b6000806000606084860312156128c7576128c6613733565b5b60006128d58682870161272a565b93505060206128e68682870161272a565b92505060406128f786828701612817565b9150509250925092565b6000806000806080858703121561291b5761291a613733565b5b60006129298782880161272a565b945050602061293a8782880161272a565b935050604061294b87828801612817565b925050606085013567ffffffffffffffff81111561296c5761296b61372e565b5b61297887828801612793565b91505092959194509250565b6000806040838503121561299b5761299a613733565b5b60006129a98582860161272a565b92505060206129ba8582860161273f565b9150509250929050565b600080604083850312156129db576129da613733565b5b60006129e98582860161272a565b92505060206129fa85828601612817565b9150509250929050565b600060208284031215612a1a57612a19613733565b5b6000612a2884828501612769565b91505092915050565b600060208284031215612a4757612a46613733565b5b6000612a558482850161277e565b91505092915050565b60008060208385031215612a7557612a74613733565b5b600083013567ffffffffffffffff811115612a9357612a9261372e565b5b612a9f858286016127c1565b92509250509250929050565b600060208284031215612ac157612ac0613733565b5b6000612acf84828501612817565b91505092915050565b60008060008060808587031215612af257612af1613733565b5b6000612b0087828801612817565b9450506020612b1187828801612817565b9350506040612b2287828801612817565b9250506060612b3387828801612817565b91505092959194509250565b60008060008060808587031215612b5957612b58613733565b5b6000612b6787828801612817565b9450506020612b788782880161282c565b9350506040612b8987828801612754565b9250506060612b9a87828801612754565b91505092959194509250565b600080600060608486031215612bbf57612bbe613733565b5b6000612bcd8682870161282c565b9350506020612bde86828701612754565b9250506040612bef86828701612754565b9150509250925092565b612c0281613491565b82525050565b612c19612c1482613491565b6135f7565b82525050565b612c28816134a3565b82525050565b612c37816134af565b82525050565b612c4e612c49826134af565b613609565b82525050565b6000612c5f82613362565b612c698185613378565b9350612c79818560208601613561565b612c8281613738565b840191505092915050565b612c9e612c998261351c565b6135f7565b82525050565b6000612caf8261336d565b612cb98185613394565b9350612cc9818560208601613561565b612cd281613738565b840191505092915050565b60008154612cea81613594565b612cf481866133a5565b94506001821660008114612d0f5760018114612d2057612d53565b60ff19831686528186019350612d53565b612d298561334d565b60005b83811015612d4b57815481890152600182019150602081019050612d2c565b838801955050505b50505092915050565b6000612d696001836133a5565b9150612d7482613756565b600182019050919050565b6000612d8c601c836133a5565b9150612d978261377f565b601c82019050919050565b6000612daf602683613394565b9150612dba826137a8565b604082019050919050565b6000612dd2601783613394565b9150612ddd826137f7565b602082019050919050565b6000612df56005836133a5565b9150612e0082613820565b600582019050919050565b6000612e18602083613394565b9150612e2382613849565b602082019050919050565b6000612e3b603383613394565b9150612e4682613872565b604082019050919050565b6000612e5e601f83613394565b9150612e69826138c1565b602082019050919050565b6000612e81604b83613394565b9150612e8c826138ea565b606082019050919050565b6000612ea4600083613389565b9150612eaf8261395f565b600082019050919050565b6000612ec7601083613394565b9150612ed282613962565b602082019050919050565b6000612eea6001836133a5565b9150612ef58261398b565b600182019050919050565b6000612f0d602a83613394565b9150612f18826139b4565b604082019050919050565b6000612f30602283613394565b9150612f3b82613a03565b604082019050919050565b6000612f53601f83613394565b9150612f5e82613a52565b602082019050919050565b6000612f76603083613394565b9150612f8182613a7b565b604082019050919050565b612f9581613505565b82525050565b612fac612fa782613505565b613625565b82525050565b612fbb8161350f565b82525050565b6000612fcd8286612c8d565b601482019150612fdd8285612c08565b601482019150612fed8284612f9b565b602082019150819050949350505050565b600061300a8284612cdd565b915061301582612d5c565b915061302082612de8565b915081905092915050565b60006130378284612cdd565b915061304282612edd565b915061304d82612de8565b915081905092915050565b600061306382612d7f565b915061306f8284612c3d565b60208201915081905092915050565b600061308982612e97565b9150819050919050565b60006020820190506130a86000830184612bf9565b92915050565b60006080820190506130c36000830187612bf9565b6130d06020830186612bf9565b6130dd6040830185612f8c565b81810360608301526130ef8184612c54565b905095945050505050565b600060208201905061310f6000830184612c1f565b92915050565b600060808201905061312a6000830187612c2e565b6131376020830186612fb2565b6131446040830185612c2e565b6131516060830184612c2e565b95945050505050565b600060208201905081810360008301526131748184612ca4565b905092915050565b6000602082019050818103600083015261319581612da2565b9050919050565b600060208201905081810360008301526131b581612dc5565b9050919050565b600060208201905081810360008301526131d581612e0b565b9050919050565b600060208201905081810360008301526131f581612e2e565b9050919050565b6000602082019050818103600083015261321581612e51565b9050919050565b6000602082019050818103600083015261323581612e74565b9050919050565b6000602082019050818103600083015261325581612eba565b9050919050565b6000602082019050818103600083015261327581612f00565b9050919050565b6000602082019050818103600083015261329581612f23565b9050919050565b600060208201905081810360008301526132b581612f46565b9050919050565b600060208201905081810360008301526132d581612f69565b9050919050565b60006020820190506132f16000830184612f8c565b92915050565b6000613301613312565b905061330d82826135c6565b919050565b6000604051905090565b600067ffffffffffffffff821115613337576133366136eb565b5b61334082613738565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006133bb82613505565b91506133c683613505565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133fb576133fa61362f565b5b828201905092915050565b600061341182613505565b915061341c83613505565b92508261342c5761342b61365e565b5b828204905092915050565b600061344282613505565b915061344d83613505565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156134865761348561362f565b5b828202905092915050565b600061349c826134e5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006135278261352e565b9050919050565b600061353982613540565b9050919050565b600061354b826134e5565b9050919050565b82818337600083830152505050565b60005b8381101561357f578082015181840152602081019050613564565b8381111561358e576000848401525b50505050565b600060028204905060018216806135ac57607f821691505b602082108114156135c0576135bf61368d565b5b50919050565b6135cf82613738565b810181811067ffffffffffffffff821117156135ee576135ed6136eb565b5b80604052505050565b600061360282613613565b9050919050565b6000819050919050565b600061361e82613749565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3000000000000000000000000000000000000000000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50757263686173652077696e646f7720636c6f7365642e000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5468697320616d6f756e74206f6620746f6b656e7320776f756c64207375727060008201527f61737320746865206d617820737570706c792e00000000000000000000000000602082015250565b7f4c61756e63683a2070757263686173652077696e646f7720636c6f7365642e00600082015250565b7f496e76616c69642073696e67617475726520666f72206164647265737320636160008201527f6c6c696e67207468652066756e6374696f6e2c206163636f756e74206e6f742060208201527f696e2070726573616c652e000000000000000000000000000000000000000000604082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f596f7520616c7265616479206d696e746564206d617820616c6c6f776564207060008201527f65722077616c6c65742e00000000000000000000000000000000000000000000602082015250565b7f5072656c61756e63683a2070757263686173652077696e646f7720636c6f736560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b613ad381613491565b8114613ade57600080fd5b50565b613aea816134a3565b8114613af557600080fd5b50565b613b01816134af565b8114613b0c57600080fd5b50565b613b18816134b9565b8114613b2357600080fd5b50565b613b2f81613505565b8114613b3a57600080fd5b50565b613b468161350f565b8114613b5157600080fd5b5056fea26469706673582212200b5ec16490dfe9c2dbb044203fdb8202844bcac08e1786f3d7a80e6d8c84324464736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d53554a7575576935504b75347231597859624d6978676b7a515646457539756a61486250376a5735665944502f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000026ac68037c202b8ac2d1cfcc487651dad41b68e00000000000000000000000004e3c4cb1c2ecc0005c5980a5c09ac5146529ccb2

-----Decoded View---------------
Arg [0] : _baseURI (string): https://gateway.pinata.cloud/ipfs/QmSUJuuWi5PKu4r1YxYbMixgkzQVFEu9ujaHbP7jW5fYDP/
Arg [1] : _signerRole (address): 0xA65aae78EdEF916d4102BA7b5672068C0D35fbff
Arg [2] : _addressWithdraw (address[]): 0x26ac68037C202B8AC2D1CFcc487651daD41B68E0,0x4E3c4cB1c2ecc0005C5980A5C09Ac5146529Ccb2

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [4] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [5] : 732f516d53554a7575576935504b75347231597859624d6978676b7a51564645
Arg [6] : 7539756a61486250376a5735665944502f000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [8] : 00000000000000000000000026ac68037c202b8ac2d1cfcc487651dad41b68e0
Arg [9] : 0000000000000000000000004e3c4cb1c2ecc0005c5980a5c09ac5146529ccb2


Deployed Bytecode Sourcemap

53646:4952:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56415:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22736:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24682:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24230:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56018:389;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16143:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55506:504;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33947:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57275:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54145:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25572:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55079:419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57050:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22525:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53896:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54222:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53757:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57160:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17768:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52756:103;;;;;;;;;;;;;:::i;:::-;;52108:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54038:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53992:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22905:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24958:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58208:387;;;;;;;;;;;;;:::i;:::-;;53851:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54091:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25828:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57765:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54284:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56651:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53935:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54348:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25337:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53014:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57642:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17089:615;17174:4;17489:10;17474:25;;:11;:25;;;;:102;;;;17566:10;17551:25;;:11;:25;;;;17474:102;:179;;;;17643:10;17628:25;;:11;:25;;;;17474:179;17454:199;;17089:615;;;:::o;56415:224::-;51994:13;:11;:13::i;:::-;56530:9:::1;;56518:8;56501:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;56493:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56608:23;56618:2;56622:8;56608:9;:23::i;:::-;56415:224:::0;;:::o;22736:100::-;22790:13;22823:5;22816:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22736:100;:::o;24682:204::-;24750:7;24775:16;24783:7;24775;:16::i;:::-;24770:64;;24800:34;;;;;;;;;;;;;;24770:64;24854:15;:24;24870:7;24854:24;;;;;;;;;;;;;;;;;;;;;24847:31;;24682:204;;;:::o;24230:386::-;24303:13;24319:16;24327:7;24319;:16::i;:::-;24303:32;;24375:5;24352:28;;:19;:17;:19::i;:::-;:28;;;24348:175;;24400:44;24417:5;24424:19;:17;:19::i;:::-;24400:16;:44::i;:::-;24395:128;;24472:35;;;;;;;;;;;;;;24395:128;24348:175;24562:2;24535:15;:24;24551:7;24535:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24600:7;24596:2;24580:28;;24589:5;24580:28;;;;;;;;;;;;24292:324;24230:386;;:::o;56018:389::-;56116:8;54986:9;;54974:8;54957:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;54949:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;56142:2:::1;56146;56150;54756:32;54777:2;54781;54785;54756:20;:32::i;:::-;54748:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;56193:11:::2;;56174:15;:30;;56166:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;56291:13;;56279:8;56251:25;56265:10;56251:13;:25::i;:::-;:36;;;;:::i;:::-;:53;;56243:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;56372:27;56378:10;56390:8;56372:5;:27::i;:::-;55062:1:::1;;;56018:389:::0;;;;;:::o;16143:315::-;16196:7;16424:15;:13;:15::i;:::-;16409:12;;16393:13;;:28;:46;16386:53;;16143:315;:::o;55506:504::-;55610:8;54986:9;;54974:8;54957:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;54949:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;55636:2:::1;55640;55644;54756:32;54777:2;54781;54785;54756:20;:32::i;:::-;54748:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;55686:18:::2;;55667:15;:37;;:79;;;;;55727:19;;55708:15;:38;;55667:79;55659:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;55841:19;;55829:8;55801:13;:25;55815:10;55801:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:59;;55793:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;55927:27;55933:10;55945:8;55927:5;:27::i;:::-;55994:8;55965:13;:25;55979:10;55965:25;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;55062:1:::1;;;55506:504:::0;;;;;:::o;33947:2800::-;34081:27;34111;34130:7;34111:18;:27::i;:::-;34081:57;;34196:4;34155:45;;34171:19;34155:45;;;34151:86;;34209:28;;;;;;;;;;;;;;34151:86;34251:27;34280:23;34307:28;34327:7;34307:19;:28::i;:::-;34250:85;;;;34435:62;34454:15;34471:4;34477:19;:17;:19::i;:::-;34435:18;:62::i;:::-;34430:174;;34517:43;34534:4;34540:19;:17;:19::i;:::-;34517:16;:43::i;:::-;34512:92;;34569:35;;;;;;;;;;;;;;34512:92;34430:174;34635:1;34621:16;;:2;:16;;;34617:52;;;34646:23;;;;;;;;;;;;;;34617:52;34682:43;34704:4;34710:2;34714:7;34723:1;34682:21;:43::i;:::-;34818:15;34815:160;;;34958:1;34937:19;34930:30;34815:160;35353:18;:24;35372:4;35353:24;;;;;;;;;;;;;;;;35351:26;;;;;;;;;;;;35422:18;:22;35441:2;35422:22;;;;;;;;;;;;;;;;35420:24;;;;;;;;;;;35744:145;35781:2;35829:45;35844:4;35850:2;35854:19;35829:14;:45::i;:::-;13371:8;35802:72;35744:18;:145::i;:::-;35715:17;:26;35733:7;35715:26;;;;;;;;;;;:174;;;;36059:1;13371:8;36009:19;:46;:51;36005:626;;;36081:19;36113:1;36103:7;:11;36081:33;;36270:1;36236:17;:30;36254:11;36236:30;;;;;;;;;;;;:35;36232:384;;;36374:13;;36359:11;:28;36355:242;;36554:19;36521:17;:30;36539:11;36521:30;;;;;;;;;;;:52;;;;36355:242;36232:384;36062:569;36005:626;36678:7;36674:2;36659:27;;36668:4;36659:27;;;;;;;;;;;;36697:42;36718:4;36724:2;36728:7;36737:1;36697:20;:42::i;:::-;34070:2677;;;33947:2800;;;:::o;57275:359::-;51994:13;:11;:13::i;:::-;57453:12:::1;57439:11;:26;;;;57497:19;57476:18;:40;;;;57549:20;57527:19;:42;;;;57604:22;57580:21;:46;;;;57275:359:::0;;;;:::o;54145:49::-;;;;:::o;25572:185::-;25710:39;25727:4;25733:2;25737:7;25710:39;;;;;;;;;;;;:16;:39::i;:::-;25572:185;;;:::o;55079:419::-;55168:1;54986:9;;54974:8;54957:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;54949:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;55187:2:::1;55191;55195;54756:32;54777:2;54781;54785;54756:20;:32::i;:::-;54748:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;55237:21:::2;;55218:15;:40;;55210:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;55353:1;55316:22;:34;55339:10;55316:34;;;;;;;;;;;;;;;;:38;55308:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;55421:20;55427:10;55439:1;55421:5;:20::i;:::-;55489:1;55452:22;:34;55475:10;55452:34;;;;;;;;;;;;;;;:38;;;;55062:1:::1;;;55079:419:::0;;;;:::o;57050:102::-;51994:13;:11;:13::i;:::-;57136:8:::1;;57126:7;:18;;;;;;;:::i;:::-;;57050:102:::0;;:::o;22525:144::-;22589:7;22632:27;22651:7;22632:18;:27::i;:::-;22609:52;;22525:144;;;:::o;53896:32::-;;;;:::o;54222:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53757:25::-;;;;;;;;;;;;;:::o;57160:103::-;51994:13;:11;:13::i;:::-;57245:10:::1;57233:9;:22;;;;57160:103:::0;:::o;17768:224::-;17832:7;17873:1;17856:19;;:5;:19;;;17852:60;;;17884:28;;;;;;;;;;;;;;17852:60;12323:13;17930:18;:25;17949:5;17930:25;;;;;;;;;;;;;;;;:54;17923:61;;17768:224;;;:::o;52756:103::-;51994:13;:11;:13::i;:::-;52821:30:::1;52848:1;52821:18;:30::i;:::-;52756:103::o:0;52108:87::-;52154:7;52181:6;;;;;;;;;;;52174:13;;52108:87;:::o;54038:46::-;;;;:::o;53992:39::-;;;;:::o;22905:104::-;22961:13;22994:7;22987:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22905:104;:::o;24958:308::-;25069:19;:17;:19::i;:::-;25057:31;;:8;:31;;;25053:61;;;25097:17;;;;;;;;;;;;;;25053:61;25179:8;25127:18;:39;25146:19;:17;:19::i;:::-;25127:39;;;;;;;;;;;;;;;:49;25167:8;25127:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25239:8;25203:55;;25218:19;:17;:19::i;:::-;25203:55;;;25249:8;25203:55;;;;;;:::i;:::-;;;;;;;;24958:308;;:::o;58208:387::-;51994:13;:11;:13::i;:::-;49033:1:::1;49631:7;;:19;;49623:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49033:1;49764:7;:18;;;;58276:15:::2;58324:2;58318:3;58294:21;:27;;;;:::i;:::-;:32;;;;:::i;:::-;58276:50;;58340:12;58358:15;58374:1;58358:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:23;;58389:7;58358:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58339:62;;;58420:7;58412:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58483:15;58499:1;58483:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:23;;58514:21;58483:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58469:71;;;;;58559:7;58551:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58265:330;;48989:1:::1;49943:7;:22;;;;58208:387::o:0;53851:38::-;;;;:::o;54091:47::-;;;;:::o;25828:399::-;25995:31;26008:4;26014:2;26018:7;25995:12;:31::i;:::-;26059:1;26041:2;:14;;;:19;26037:183;;26080:56;26111:4;26117:2;26121:7;26130:5;26080:30;:56::i;:::-;26075:145;;26164:40;;;;;;;;;;;;;;26075:145;26037:183;25828:399;;;;:::o;57765:120::-;51994:13;:11;:13::i;:::-;57863:14:::1;57841:19;:36;;;;57765:120:::0;:::o;54284:57::-;;;;;;;;;;;;;;;;;:::o;56651:391::-;56724:13;56758:16;56766:7;56758;:16::i;:::-;56750:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56853:4;56843:7;:14;56840:195;;;56905:7;56888:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;56874:54;;;;56840:195;57000:7;56983:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;56969:54;;56651:391;;;;:::o;53935:31::-;;;;:::o;54348:48::-;;;;;;;;;;;;;;;;;:::o;25337:164::-;25434:4;25458:18;:25;25477:5;25458:25;;;;;;;;;;;;;;;:35;25484:8;25458:35;;;;;;;;;;;;;;;;;;;;;;;;;25451:42;;25337:164;;;;:::o;53014:201::-;51994:13;:11;:13::i;:::-;53123:1:::1;53103:22;;:8;:22;;;;53095:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53179:28;53198:8;53179:18;:28::i;:::-;53014:201:::0;:::o;57642:115::-;51994:13;:11;:13::i;:::-;57735:14:::1;57719:13;:30;;;;57642:115:::0;:::o;52273:132::-;52348:12;:10;:12::i;:::-;52337:23;;:7;:5;:7::i;:::-;:23;;;52329:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52273:132::o;16556:285::-;16603:7;16807:15;:13;:15::i;:::-;16791:13;;:31;16784:38;;16556:285;:::o;26839:104::-;26908:27;26918:2;26922:8;26908:27;;;;;;;;;;;;:9;:27::i;:::-;26839:104;;:::o;26482:273::-;26539:4;26595:7;26576:15;:13;:15::i;:::-;:26;;:66;;;;;26629:13;;26619:7;:23;26576:66;:152;;;;;26727:1;13093:8;26680:17;:26;26698:7;26680:26;;;;;;;;;;;;:43;:48;26576:152;26556:172;;26482:273;;;:::o;45043:105::-;45103:7;45130:10;45123:17;;45043:105;:::o;57893:307::-;57980:4;57997:12;58039:4;58045:10;58057:9;58022:45;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58012:56;;;;;;57997:71;;58100:92;58173:4;58120:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;58110:69;;;;;;58181:2;58185;58189;58100:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58086:106;;:10;;;;;;;;;;;:106;;;58079:113;;;57893:307;;;;;:::o;18074:176::-;18135:7;12323:13;12460:2;18163:18;:25;18182:5;18163:25;;;;;;;;;;;;;;;;:49;;18162:80;18155:87;;18074:176;;;:::o;28313:1529::-;28378:20;28401:13;;28378:36;;28443:1;28429:16;;:2;:16;;;28425:48;;;28454:19;;;;;;;;;;;;;;28425:48;28500:1;28488:8;:13;28484:44;;;28510:18;;;;;;;;;;;;;;28484:44;28541:61;28571:1;28575:2;28579:12;28593:8;28541:21;:61::i;:::-;29084:1;12460:2;29055:1;:25;;29054:31;29042:8;:44;29016:18;:22;29035:2;29016:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;29363:139;29400:2;29454:33;29477:1;29481:2;29485:1;29454:14;:33::i;:::-;29421:30;29442:8;29421:20;:30::i;:::-;:66;29363:18;:139::i;:::-;29329:17;:31;29347:12;29329:31;;;;;;;;;;;:173;;;;29519:15;29537:12;29519:30;;29564:11;29593:8;29578:12;:23;29564:37;;29616:101;29668:9;;;;;;29664:2;29643:35;;29660:1;29643:35;;;;;;;;;;;;29712:3;29702:7;:13;29616:101;;29749:3;29733:13;:19;;;;28790:974;;29774:60;29803:1;29807:2;29811:12;29825:8;29774:20;:60::i;:::-;28367:1475;28313:1529;;:::o;15667:92::-;15723:7;15667:92;:::o;19442:1129::-;19509:7;19529:12;19544:7;19529:22;;19612:4;19593:15;:13;:15::i;:::-;:23;19589:915;;19646:13;;19639:4;:20;19635:869;;;19684:14;19701:17;:23;19719:4;19701:23;;;;;;;;;;;;19684:40;;19817:1;13093:8;19790:6;:23;:28;19786:699;;;20309:113;20326:1;20316:6;:11;20309:113;;;20369:17;:25;20387:6;;;;;;;20369:25;;;;;;;;;;;;20360:34;;20309:113;;;20455:6;20448:13;;;;;;19786:699;19661:843;19635:869;19589:915;20532:31;;;;;;;;;;;;;;19442:1129;;;;:::o;32283:652::-;32378:27;32407:23;32448:53;32504:15;32448:71;;32690:7;32684:4;32677:21;32725:22;32719:4;32712:36;32801:4;32795;32785:21;32762:44;;32897:19;32891:26;32872:45;;32628:300;32283:652;;;:::o;33048:645::-;33190:11;33352:15;33346:4;33342:26;33334:34;;33511:15;33500:9;33496:31;33483:44;;33658:15;33647:9;33644:30;33637:4;33626:9;33623:19;33620:55;33610:65;;33048:645;;;;;:::o;43876:159::-;;;;;:::o;42188:309::-;42323:7;42343:16;13494:3;42369:19;:40;;42343:67;;13494:3;42436:31;42447:4;42453:2;42457:9;42436:10;:31::i;:::-;42428:40;;:61;;42421:68;;;42188:309;;;;;:::o;22016:447::-;22096:14;22264:15;22257:5;22253:27;22244:36;;22438:5;22424:11;22400:22;22396:40;22393:51;22386:5;22383:62;22373:72;;22016:447;;;;:::o;44694:158::-;;;;;:::o;53375:191::-;53449:16;53468:6;;;;;;;;;;;53449:25;;53494:8;53485:6;;:17;;;;;;;;;;;;;;;;;;53549:8;53518:40;;53539:8;53518:40;;;;;;;;;;;;53438:128;53375:191;:::o;40698:716::-;40861:4;40907:2;40882:45;;;40928:19;:17;:19::i;:::-;40949:4;40955:7;40964:5;40882:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40878:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41182:1;41165:6;:13;:18;41161:235;;;41211:40;;;;;;;;;;;;;;41161:235;41354:6;41348:13;41339:6;41335:2;41331:15;41324:38;40878:529;41051:54;;;41041:64;;;:6;:64;;;;41034:71;;;40698:716;;;;;;:::o;50659:98::-;50712:7;50739:10;50732:17;;50659:98;:::o;27359:681::-;27482:19;27488:2;27492:8;27482:5;:19::i;:::-;27561:1;27543:2;:14;;;:19;27539:483;;27583:11;27597:13;;27583:27;;27629:13;27651:8;27645:3;:14;27629:30;;27678:233;27709:62;27748:1;27752:2;27756:7;;;;;;27765:5;27709:30;:62::i;:::-;27704:167;;27807:40;;;;;;;;;;;;;;27704:167;27906:3;27898:5;:11;27678:233;;27993:3;27976:13;;:20;27972:34;;27998:8;;;27972:34;27564:458;;27539:483;27359:681;;;:::o;23846:322::-;23916:14;24147:1;24137:8;24134:15;24109:23;24105:45;24095:55;;23846:322;;;:::o;43073:147::-;43210:6;43073:147;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;707:139;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;852:137;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;995:141;;;;:::o;1155:338::-;1210:5;1259:3;1252:4;1244:6;1240:17;1236:27;1226:122;;1267:79;;:::i;:::-;1226:122;1384:6;1371:20;1409:78;1483:3;1475:6;1468:4;1460:6;1456:17;1409:78;:::i;:::-;1400:87;;1216:277;1155:338;;;;:::o;1513:553::-;1571:8;1581:6;1631:3;1624:4;1616:6;1612:17;1608:27;1598:122;;1639:79;;:::i;:::-;1598:122;1752:6;1739:20;1729:30;;1782:18;1774:6;1771:30;1768:117;;;1804:79;;:::i;:::-;1768:117;1918:4;1910:6;1906:17;1894:29;;1972:3;1964:4;1956:6;1952:17;1942:8;1938:32;1935:41;1932:128;;;1979:79;;:::i;:::-;1932:128;1513:553;;;;;:::o;2072:139::-;2118:5;2156:6;2143:20;2134:29;;2172:33;2199:5;2172:33;:::i;:::-;2072:139;;;;:::o;2217:135::-;2261:5;2299:6;2286:20;2277:29;;2315:31;2340:5;2315:31;:::i;:::-;2217:135;;;;:::o;2358:329::-;2417:6;2466:2;2454:9;2445:7;2441:23;2437:32;2434:119;;;2472:79;;:::i;:::-;2434:119;2592:1;2617:53;2662:7;2653:6;2642:9;2638:22;2617:53;:::i;:::-;2607:63;;2563:117;2358:329;;;;:::o;2693:474::-;2761:6;2769;2818:2;2806:9;2797:7;2793:23;2789:32;2786:119;;;2824:79;;:::i;:::-;2786:119;2944:1;2969:53;3014:7;3005:6;2994:9;2990:22;2969:53;:::i;:::-;2959:63;;2915:117;3071:2;3097:53;3142:7;3133:6;3122:9;3118:22;3097:53;:::i;:::-;3087:63;;3042:118;2693:474;;;;;:::o;3173:619::-;3250:6;3258;3266;3315:2;3303:9;3294:7;3290:23;3286:32;3283:119;;;3321:79;;:::i;:::-;3283:119;3441:1;3466:53;3511:7;3502:6;3491:9;3487:22;3466:53;:::i;:::-;3456:63;;3412:117;3568:2;3594:53;3639:7;3630:6;3619:9;3615:22;3594:53;:::i;:::-;3584:63;;3539:118;3696:2;3722:53;3767:7;3758:6;3747:9;3743:22;3722:53;:::i;:::-;3712:63;;3667:118;3173:619;;;;;:::o;3798:943::-;3893:6;3901;3909;3917;3966:3;3954:9;3945:7;3941:23;3937:33;3934:120;;;3973:79;;:::i;:::-;3934:120;4093:1;4118:53;4163:7;4154:6;4143:9;4139:22;4118:53;:::i;:::-;4108:63;;4064:117;4220:2;4246:53;4291:7;4282:6;4271:9;4267:22;4246:53;:::i;:::-;4236:63;;4191:118;4348:2;4374:53;4419:7;4410:6;4399:9;4395:22;4374:53;:::i;:::-;4364:63;;4319:118;4504:2;4493:9;4489:18;4476:32;4535:18;4527:6;4524:30;4521:117;;;4557:79;;:::i;:::-;4521:117;4662:62;4716:7;4707:6;4696:9;4692:22;4662:62;:::i;:::-;4652:72;;4447:287;3798:943;;;;;;;:::o;4747:468::-;4812:6;4820;4869:2;4857:9;4848:7;4844:23;4840:32;4837:119;;;4875:79;;:::i;:::-;4837:119;4995:1;5020:53;5065:7;5056:6;5045:9;5041:22;5020:53;:::i;:::-;5010:63;;4966:117;5122:2;5148:50;5190:7;5181:6;5170:9;5166:22;5148:50;:::i;:::-;5138:60;;5093:115;4747:468;;;;;:::o;5221:474::-;5289:6;5297;5346:2;5334:9;5325:7;5321:23;5317:32;5314:119;;;5352:79;;:::i;:::-;5314:119;5472:1;5497:53;5542:7;5533:6;5522:9;5518:22;5497:53;:::i;:::-;5487:63;;5443:117;5599:2;5625:53;5670:7;5661:6;5650:9;5646:22;5625:53;:::i;:::-;5615:63;;5570:118;5221:474;;;;;:::o;5701:327::-;5759:6;5808:2;5796:9;5787:7;5783:23;5779:32;5776:119;;;5814:79;;:::i;:::-;5776:119;5934:1;5959:52;6003:7;5994:6;5983:9;5979:22;5959:52;:::i;:::-;5949:62;;5905:116;5701:327;;;;:::o;6034:349::-;6103:6;6152:2;6140:9;6131:7;6127:23;6123:32;6120:119;;;6158:79;;:::i;:::-;6120:119;6278:1;6303:63;6358:7;6349:6;6338:9;6334:22;6303:63;:::i;:::-;6293:73;;6249:127;6034:349;;;;:::o;6389:529::-;6460:6;6468;6517:2;6505:9;6496:7;6492:23;6488:32;6485:119;;;6523:79;;:::i;:::-;6485:119;6671:1;6660:9;6656:17;6643:31;6701:18;6693:6;6690:30;6687:117;;;6723:79;;:::i;:::-;6687:117;6836:65;6893:7;6884:6;6873:9;6869:22;6836:65;:::i;:::-;6818:83;;;;6614:297;6389:529;;;;;:::o;6924:329::-;6983:6;7032:2;7020:9;7011:7;7007:23;7003:32;7000:119;;;7038:79;;:::i;:::-;7000:119;7158:1;7183:53;7228:7;7219:6;7208:9;7204:22;7183:53;:::i;:::-;7173:63;;7129:117;6924:329;;;;:::o;7259:765::-;7345:6;7353;7361;7369;7418:3;7406:9;7397:7;7393:23;7389:33;7386:120;;;7425:79;;:::i;:::-;7386:120;7545:1;7570:53;7615:7;7606:6;7595:9;7591:22;7570:53;:::i;:::-;7560:63;;7516:117;7672:2;7698:53;7743:7;7734:6;7723:9;7719:22;7698:53;:::i;:::-;7688:63;;7643:118;7800:2;7826:53;7871:7;7862:6;7851:9;7847:22;7826:53;:::i;:::-;7816:63;;7771:118;7928:2;7954:53;7999:7;7990:6;7979:9;7975:22;7954:53;:::i;:::-;7944:63;;7899:118;7259:765;;;;;;;:::o;8030:761::-;8114:6;8122;8130;8138;8187:3;8175:9;8166:7;8162:23;8158:33;8155:120;;;8194:79;;:::i;:::-;8155:120;8314:1;8339:53;8384:7;8375:6;8364:9;8360:22;8339:53;:::i;:::-;8329:63;;8285:117;8441:2;8467:51;8510:7;8501:6;8490:9;8486:22;8467:51;:::i;:::-;8457:61;;8412:116;8567:2;8593:53;8638:7;8629:6;8618:9;8614:22;8593:53;:::i;:::-;8583:63;;8538:118;8695:2;8721:53;8766:7;8757:6;8746:9;8742:22;8721:53;:::i;:::-;8711:63;;8666:118;8030:761;;;;;;;:::o;8797:615::-;8872:6;8880;8888;8937:2;8925:9;8916:7;8912:23;8908:32;8905:119;;;8943:79;;:::i;:::-;8905:119;9063:1;9088:51;9131:7;9122:6;9111:9;9107:22;9088:51;:::i;:::-;9078:61;;9034:115;9188:2;9214:53;9259:7;9250:6;9239:9;9235:22;9214:53;:::i;:::-;9204:63;;9159:118;9316:2;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9287:118;8797:615;;;;;:::o;9418:118::-;9505:24;9523:5;9505:24;:::i;:::-;9500:3;9493:37;9418:118;;:::o;9542:157::-;9647:45;9667:24;9685:5;9667:24;:::i;:::-;9647:45;:::i;:::-;9642:3;9635:58;9542:157;;:::o;9705:109::-;9786:21;9801:5;9786:21;:::i;:::-;9781:3;9774:34;9705:109;;:::o;9820:118::-;9907:24;9925:5;9907:24;:::i;:::-;9902:3;9895:37;9820:118;;:::o;9944:157::-;10049:45;10069:24;10087:5;10069:24;:::i;:::-;10049:45;:::i;:::-;10044:3;10037:58;9944:157;;:::o;10107:360::-;10193:3;10221:38;10253:5;10221:38;:::i;:::-;10275:70;10338:6;10333:3;10275:70;:::i;:::-;10268:77;;10354:52;10399:6;10394:3;10387:4;10380:5;10376:16;10354:52;:::i;:::-;10431:29;10453:6;10431:29;:::i;:::-;10426:3;10422:39;10415:46;;10197:270;10107:360;;;;:::o;10473:202::-;10594:74;10614:53;10661:5;10614:53;:::i;:::-;10594:74;:::i;:::-;10589:3;10582:87;10473:202;;:::o;10681:364::-;10769:3;10797:39;10830:5;10797:39;:::i;:::-;10852:71;10916:6;10911:3;10852:71;:::i;:::-;10845:78;;10932:52;10977:6;10972:3;10965:4;10958:5;10954:16;10932:52;:::i;:::-;11009:29;11031:6;11009:29;:::i;:::-;11004:3;11000:39;10993:46;;10773:272;10681:364;;;;:::o;11075:845::-;11178:3;11215:5;11209:12;11244:36;11270:9;11244:36;:::i;:::-;11296:89;11378:6;11373:3;11296:89;:::i;:::-;11289:96;;11416:1;11405:9;11401:17;11432:1;11427:137;;;;11578:1;11573:341;;;;11394:520;;11427:137;11511:4;11507:9;11496;11492:25;11487:3;11480:38;11547:6;11542:3;11538:16;11531:23;;11427:137;;11573:341;11640:38;11672:5;11640:38;:::i;:::-;11700:1;11714:154;11728:6;11725:1;11722:13;11714:154;;;11802:7;11796:14;11792:1;11787:3;11783:11;11776:35;11852:1;11843:7;11839:15;11828:26;;11750:4;11747:1;11743:12;11738:17;;11714:154;;;11897:6;11892:3;11888:16;11881:23;;11580:334;;11394:520;;11182:738;;11075:845;;;;:::o;11926:400::-;12086:3;12107:84;12189:1;12184:3;12107:84;:::i;:::-;12100:91;;12200:93;12289:3;12200:93;:::i;:::-;12318:1;12313:3;12309:11;12302:18;;11926:400;;;:::o;12332:402::-;12492:3;12513:85;12595:2;12590:3;12513:85;:::i;:::-;12506:92;;12607:93;12696:3;12607:93;:::i;:::-;12725:2;12720:3;12716:12;12709:19;;12332:402;;;:::o;12740:366::-;12882:3;12903:67;12967:2;12962:3;12903:67;:::i;:::-;12896:74;;12979:93;13068:3;12979:93;:::i;:::-;13097:2;13092:3;13088:12;13081:19;;12740:366;;;:::o;13112:::-;13254:3;13275:67;13339:2;13334:3;13275:67;:::i;:::-;13268:74;;13351:93;13440:3;13351:93;:::i;:::-;13469:2;13464:3;13460:12;13453:19;;13112:366;;;:::o;13484:400::-;13644:3;13665:84;13747:1;13742:3;13665:84;:::i;:::-;13658:91;;13758:93;13847:3;13758:93;:::i;:::-;13876:1;13871:3;13867:11;13860:18;;13484:400;;;:::o;13890:366::-;14032:3;14053:67;14117:2;14112:3;14053:67;:::i;:::-;14046:74;;14129:93;14218:3;14129:93;:::i;:::-;14247:2;14242:3;14238:12;14231:19;;13890:366;;;:::o;14262:::-;14404:3;14425:67;14489:2;14484:3;14425:67;:::i;:::-;14418:74;;14501:93;14590:3;14501:93;:::i;:::-;14619:2;14614:3;14610:12;14603:19;;14262:366;;;:::o;14634:::-;14776:3;14797:67;14861:2;14856:3;14797:67;:::i;:::-;14790:74;;14873:93;14962:3;14873:93;:::i;:::-;14991:2;14986:3;14982:12;14975:19;;14634:366;;;:::o;15006:::-;15148:3;15169:67;15233:2;15228:3;15169:67;:::i;:::-;15162:74;;15245:93;15334:3;15245:93;:::i;:::-;15363:2;15358:3;15354:12;15347:19;;15006:366;;;:::o;15378:398::-;15537:3;15558:83;15639:1;15634:3;15558:83;:::i;:::-;15551:90;;15650:93;15739:3;15650:93;:::i;:::-;15768:1;15763:3;15759:11;15752:18;;15378:398;;;:::o;15782:366::-;15924:3;15945:67;16009:2;16004:3;15945:67;:::i;:::-;15938:74;;16021:93;16110:3;16021:93;:::i;:::-;16139:2;16134:3;16130:12;16123:19;;15782:366;;;:::o;16154:400::-;16314:3;16335:84;16417:1;16412:3;16335:84;:::i;:::-;16328:91;;16428:93;16517:3;16428:93;:::i;:::-;16546:1;16541:3;16537:11;16530:18;;16154:400;;;:::o;16560:366::-;16702:3;16723:67;16787:2;16782:3;16723:67;:::i;:::-;16716:74;;16799:93;16888:3;16799:93;:::i;:::-;16917:2;16912:3;16908:12;16901:19;;16560:366;;;:::o;16932:::-;17074:3;17095:67;17159:2;17154:3;17095:67;:::i;:::-;17088:74;;17171:93;17260:3;17171:93;:::i;:::-;17289:2;17284:3;17280:12;17273:19;;16932:366;;;:::o;17304:::-;17446:3;17467:67;17531:2;17526:3;17467:67;:::i;:::-;17460:74;;17543:93;17632:3;17543:93;:::i;:::-;17661:2;17656:3;17652:12;17645:19;;17304:366;;;:::o;17676:::-;17818:3;17839:67;17903:2;17898:3;17839:67;:::i;:::-;17832:74;;17915:93;18004:3;17915:93;:::i;:::-;18033:2;18028:3;18024:12;18017:19;;17676:366;;;:::o;18048:118::-;18135:24;18153:5;18135:24;:::i;:::-;18130:3;18123:37;18048:118;;:::o;18172:157::-;18277:45;18297:24;18315:5;18297:24;:::i;:::-;18277:45;:::i;:::-;18272:3;18265:58;18172:157;;:::o;18335:112::-;18418:22;18434:5;18418:22;:::i;:::-;18413:3;18406:35;18335:112;;:::o;18453:570::-;18637:3;18652:91;18739:3;18730:6;18652:91;:::i;:::-;18768:2;18763:3;18759:12;18752:19;;18781:75;18852:3;18843:6;18781:75;:::i;:::-;18881:2;18876:3;18872:12;18865:19;;18894:75;18965:3;18956:6;18894:75;:::i;:::-;18994:2;18989:3;18985:12;18978:19;;19014:3;19007:10;;18453:570;;;;;;:::o;19029:801::-;19360:3;19382:92;19470:3;19461:6;19382:92;:::i;:::-;19375:99;;19491:148;19635:3;19491:148;:::i;:::-;19484:155;;19656:148;19800:3;19656:148;:::i;:::-;19649:155;;19821:3;19814:10;;19029:801;;;;:::o;19836:::-;20167:3;20189:92;20277:3;20268:6;20189:92;:::i;:::-;20182:99;;20298:148;20442:3;20298:148;:::i;:::-;20291:155;;20463:148;20607:3;20463:148;:::i;:::-;20456:155;;20628:3;20621:10;;19836:801;;;;:::o;20643:522::-;20856:3;20878:148;21022:3;20878:148;:::i;:::-;20871:155;;21036:75;21107:3;21098:6;21036:75;:::i;:::-;21136:2;21131:3;21127:12;21120:19;;21156:3;21149:10;;20643:522;;;;:::o;21171:379::-;21355:3;21377:147;21520:3;21377:147;:::i;:::-;21370:154;;21541:3;21534:10;;21171:379;;;:::o;21556:222::-;21649:4;21687:2;21676:9;21672:18;21664:26;;21700:71;21768:1;21757:9;21753:17;21744:6;21700:71;:::i;:::-;21556:222;;;;:::o;21784:640::-;21979:4;22017:3;22006:9;22002:19;21994:27;;22031:71;22099:1;22088:9;22084:17;22075:6;22031:71;:::i;:::-;22112:72;22180:2;22169:9;22165:18;22156:6;22112:72;:::i;:::-;22194;22262:2;22251:9;22247:18;22238:6;22194:72;:::i;:::-;22313:9;22307:4;22303:20;22298:2;22287:9;22283:18;22276:48;22341:76;22412:4;22403:6;22341:76;:::i;:::-;22333:84;;21784:640;;;;;;;:::o;22430:210::-;22517:4;22555:2;22544:9;22540:18;22532:26;;22568:65;22630:1;22619:9;22615:17;22606:6;22568:65;:::i;:::-;22430:210;;;;:::o;22646:545::-;22819:4;22857:3;22846:9;22842:19;22834:27;;22871:71;22939:1;22928:9;22924:17;22915:6;22871:71;:::i;:::-;22952:68;23016:2;23005:9;23001:18;22992:6;22952:68;:::i;:::-;23030:72;23098:2;23087:9;23083:18;23074:6;23030:72;:::i;:::-;23112;23180:2;23169:9;23165:18;23156:6;23112:72;:::i;:::-;22646:545;;;;;;;:::o;23197:313::-;23310:4;23348:2;23337:9;23333:18;23325:26;;23397:9;23391:4;23387:20;23383:1;23372:9;23368:17;23361:47;23425:78;23498:4;23489:6;23425:78;:::i;:::-;23417:86;;23197:313;;;;:::o;23516:419::-;23682:4;23720:2;23709:9;23705:18;23697:26;;23769:9;23763:4;23759:20;23755:1;23744:9;23740:17;23733:47;23797:131;23923:4;23797:131;:::i;:::-;23789:139;;23516:419;;;:::o;23941:::-;24107:4;24145:2;24134:9;24130:18;24122:26;;24194:9;24188:4;24184:20;24180:1;24169:9;24165:17;24158:47;24222:131;24348:4;24222:131;:::i;:::-;24214:139;;23941:419;;;:::o;24366:::-;24532:4;24570:2;24559:9;24555:18;24547:26;;24619:9;24613:4;24609:20;24605:1;24594:9;24590:17;24583:47;24647:131;24773:4;24647:131;:::i;:::-;24639:139;;24366:419;;;:::o;24791:::-;24957:4;24995:2;24984:9;24980:18;24972:26;;25044:9;25038:4;25034:20;25030:1;25019:9;25015:17;25008:47;25072:131;25198:4;25072:131;:::i;:::-;25064:139;;24791:419;;;:::o;25216:::-;25382:4;25420:2;25409:9;25405:18;25397:26;;25469:9;25463:4;25459:20;25455:1;25444:9;25440:17;25433:47;25497:131;25623:4;25497:131;:::i;:::-;25489:139;;25216:419;;;:::o;25641:::-;25807:4;25845:2;25834:9;25830:18;25822:26;;25894:9;25888:4;25884:20;25880:1;25869:9;25865:17;25858:47;25922:131;26048:4;25922:131;:::i;:::-;25914:139;;25641:419;;;:::o;26066:::-;26232:4;26270:2;26259:9;26255:18;26247:26;;26319:9;26313:4;26309:20;26305:1;26294:9;26290:17;26283:47;26347:131;26473:4;26347:131;:::i;:::-;26339:139;;26066:419;;;:::o;26491:::-;26657:4;26695:2;26684:9;26680:18;26672:26;;26744:9;26738:4;26734:20;26730:1;26719:9;26715:17;26708:47;26772:131;26898:4;26772:131;:::i;:::-;26764:139;;26491:419;;;:::o;26916:::-;27082:4;27120:2;27109:9;27105:18;27097:26;;27169:9;27163:4;27159:20;27155:1;27144:9;27140:17;27133:47;27197:131;27323:4;27197:131;:::i;:::-;27189:139;;26916:419;;;:::o;27341:::-;27507:4;27545:2;27534:9;27530:18;27522:26;;27594:9;27588:4;27584:20;27580:1;27569:9;27565:17;27558:47;27622:131;27748:4;27622:131;:::i;:::-;27614:139;;27341:419;;;:::o;27766:::-;27932:4;27970:2;27959:9;27955:18;27947:26;;28019:9;28013:4;28009:20;28005:1;27994:9;27990:17;27983:47;28047:131;28173:4;28047:131;:::i;:::-;28039:139;;27766:419;;;:::o;28191:222::-;28284:4;28322:2;28311:9;28307:18;28299:26;;28335:71;28403:1;28392:9;28388:17;28379:6;28335:71;:::i;:::-;28191:222;;;;:::o;28419:129::-;28453:6;28480:20;;:::i;:::-;28470:30;;28509:33;28537:4;28529:6;28509:33;:::i;:::-;28419:129;;;:::o;28554:75::-;28587:6;28620:2;28614:9;28604:19;;28554:75;:::o;28635:307::-;28696:4;28786:18;28778:6;28775:30;28772:56;;;28808:18;;:::i;:::-;28772:56;28846:29;28868:6;28846:29;:::i;:::-;28838:37;;28930:4;28924;28920:15;28912:23;;28635:307;;;:::o;28948:141::-;28997:4;29020:3;29012:11;;29043:3;29040:1;29033:14;29077:4;29074:1;29064:18;29056:26;;28948:141;;;:::o;29095:98::-;29146:6;29180:5;29174:12;29164:22;;29095:98;;;:::o;29199:99::-;29251:6;29285:5;29279:12;29269:22;;29199:99;;;:::o;29304:168::-;29387:11;29421:6;29416:3;29409:19;29461:4;29456:3;29452:14;29437:29;;29304:168;;;;:::o;29478:147::-;29579:11;29616:3;29601:18;;29478:147;;;;:::o;29631:169::-;29715:11;29749:6;29744:3;29737:19;29789:4;29784:3;29780:14;29765:29;;29631:169;;;;:::o;29806:148::-;29908:11;29945:3;29930:18;;29806:148;;;;:::o;29960:305::-;30000:3;30019:20;30037:1;30019:20;:::i;:::-;30014:25;;30053:20;30071:1;30053:20;:::i;:::-;30048:25;;30207:1;30139:66;30135:74;30132:1;30129:81;30126:107;;;30213:18;;:::i;:::-;30126:107;30257:1;30254;30250:9;30243:16;;29960:305;;;;:::o;30271:185::-;30311:1;30328:20;30346:1;30328:20;:::i;:::-;30323:25;;30362:20;30380:1;30362:20;:::i;:::-;30357:25;;30401:1;30391:35;;30406:18;;:::i;:::-;30391:35;30448:1;30445;30441:9;30436:14;;30271:185;;;;:::o;30462:348::-;30502:7;30525:20;30543:1;30525:20;:::i;:::-;30520:25;;30559:20;30577:1;30559:20;:::i;:::-;30554:25;;30747:1;30679:66;30675:74;30672:1;30669:81;30664:1;30657:9;30650:17;30646:105;30643:131;;;30754:18;;:::i;:::-;30643:131;30802:1;30799;30795:9;30784:20;;30462:348;;;;:::o;30816:96::-;30853:7;30882:24;30900:5;30882:24;:::i;:::-;30871:35;;30816:96;;;:::o;30918:90::-;30952:7;30995:5;30988:13;30981:21;30970:32;;30918:90;;;:::o;31014:77::-;31051:7;31080:5;31069:16;;31014:77;;;:::o;31097:149::-;31133:7;31173:66;31166:5;31162:78;31151:89;;31097:149;;;:::o;31252:126::-;31289:7;31329:42;31322:5;31318:54;31307:65;;31252:126;;;:::o;31384:77::-;31421:7;31450:5;31439:16;;31384:77;;;:::o;31467:86::-;31502:7;31542:4;31535:5;31531:16;31520:27;;31467:86;;;:::o;31559:142::-;31625:9;31658:37;31689:5;31658:37;:::i;:::-;31645:50;;31559:142;;;:::o;31707:126::-;31757:9;31790:37;31821:5;31790:37;:::i;:::-;31777:50;;31707:126;;;:::o;31839:113::-;31889:9;31922:24;31940:5;31922:24;:::i;:::-;31909:37;;31839:113;;;:::o;31958:154::-;32042:6;32037:3;32032;32019:30;32104:1;32095:6;32090:3;32086:16;32079:27;31958:154;;;:::o;32118:307::-;32186:1;32196:113;32210:6;32207:1;32204:13;32196:113;;;32295:1;32290:3;32286:11;32280:18;32276:1;32271:3;32267:11;32260:39;32232:2;32229:1;32225:10;32220:15;;32196:113;;;32327:6;32324:1;32321:13;32318:101;;;32407:1;32398:6;32393:3;32389:16;32382:27;32318:101;32167:258;32118:307;;;:::o;32431:320::-;32475:6;32512:1;32506:4;32502:12;32492:22;;32559:1;32553:4;32549:12;32580:18;32570:81;;32636:4;32628:6;32624:17;32614:27;;32570:81;32698:2;32690:6;32687:14;32667:18;32664:38;32661:84;;;32717:18;;:::i;:::-;32661:84;32482:269;32431:320;;;:::o;32757:281::-;32840:27;32862:4;32840:27;:::i;:::-;32832:6;32828:40;32970:6;32958:10;32955:22;32934:18;32922:10;32919:34;32916:62;32913:88;;;32981:18;;:::i;:::-;32913:88;33021:10;33017:2;33010:22;32800:238;32757:281;;:::o;33044:100::-;33083:7;33112:26;33132:5;33112:26;:::i;:::-;33101:37;;33044:100;;;:::o;33150:79::-;33189:7;33218:5;33207:16;;33150:79;;;:::o;33235:94::-;33274:7;33303:20;33317:5;33303:20;:::i;:::-;33292:31;;33235:94;;;:::o;33335:79::-;33374:7;33403:5;33392:16;;33335:79;;;:::o;33420:180::-;33468:77;33465:1;33458:88;33565:4;33562:1;33555:15;33589:4;33586:1;33579:15;33606:180;33654:77;33651:1;33644:88;33751:4;33748:1;33741:15;33775:4;33772:1;33765:15;33792:180;33840:77;33837:1;33830:88;33937:4;33934:1;33927:15;33961:4;33958:1;33951:15;33978:180;34026:77;34023:1;34016:88;34123:4;34120:1;34113:15;34147:4;34144:1;34137:15;34164:180;34212:77;34209:1;34202:88;34309:4;34306:1;34299:15;34333:4;34330:1;34323:15;34350:117;34459:1;34456;34449:12;34473:117;34582:1;34579;34572:12;34596:117;34705:1;34702;34695:12;34719:117;34828:1;34825;34818:12;34842:117;34951:1;34948;34941:12;34965:117;35074:1;35071;35064:12;35088:102;35129:6;35180:2;35176:7;35171:2;35164:5;35160:14;35156:28;35146:38;;35088:102;;;:::o;35196:94::-;35229:8;35277:5;35273:2;35269:14;35248:35;;35196:94;;;:::o;35296:151::-;35436:3;35432:1;35424:6;35420:14;35413:27;35296:151;:::o;35453:214::-;35593:66;35589:1;35581:6;35577:14;35570:90;35453:214;:::o;35673:225::-;35813:34;35809:1;35801:6;35797:14;35790:58;35882:8;35877:2;35869:6;35865:15;35858:33;35673:225;:::o;35904:173::-;36044:25;36040:1;36032:6;36028:14;36021:49;35904:173;:::o;36083:155::-;36223:7;36219:1;36211:6;36207:14;36200:31;36083:155;:::o;36244:182::-;36384:34;36380:1;36372:6;36368:14;36361:58;36244:182;:::o;36432:238::-;36572:34;36568:1;36560:6;36556:14;36549:58;36641:21;36636:2;36628:6;36624:15;36617:46;36432:238;:::o;36676:181::-;36816:33;36812:1;36804:6;36800:14;36793:57;36676:181;:::o;36863:299::-;37003:34;36999:1;36991:6;36987:14;36980:58;37072:34;37067:2;37059:6;37055:15;37048:59;37141:13;37136:2;37128:6;37124:15;37117:38;36863:299;:::o;37168:114::-;;:::o;37288:166::-;37428:18;37424:1;37416:6;37412:14;37405:42;37288:166;:::o;37460:151::-;37600:3;37596:1;37588:6;37584:14;37577:27;37460:151;:::o;37617:229::-;37757:34;37753:1;37745:6;37741:14;37734:58;37826:12;37821:2;37813:6;37809:15;37802:37;37617:229;:::o;37852:221::-;37992:34;37988:1;37980:6;37976:14;37969:58;38061:4;38056:2;38048:6;38044:15;38037:29;37852:221;:::o;38079:181::-;38219:33;38215:1;38207:6;38203:14;38196:57;38079:181;:::o;38266:235::-;38406:34;38402:1;38394:6;38390:14;38383:58;38475:18;38470:2;38462:6;38458:15;38451:43;38266:235;:::o;38507:122::-;38580:24;38598:5;38580:24;:::i;:::-;38573:5;38570:35;38560:63;;38619:1;38616;38609:12;38560:63;38507:122;:::o;38635:116::-;38705:21;38720:5;38705:21;:::i;:::-;38698:5;38695:32;38685:60;;38741:1;38738;38731:12;38685:60;38635:116;:::o;38757:122::-;38830:24;38848:5;38830:24;:::i;:::-;38823:5;38820:35;38810:63;;38869:1;38866;38859:12;38810:63;38757:122;:::o;38885:120::-;38957:23;38974:5;38957:23;:::i;:::-;38950:5;38947:34;38937:62;;38995:1;38992;38985:12;38937:62;38885:120;:::o;39011:122::-;39084:24;39102:5;39084:24;:::i;:::-;39077:5;39074:35;39064:63;;39123:1;39120;39113:12;39064:63;39011:122;:::o;39139:118::-;39210:22;39226:5;39210:22;:::i;:::-;39203:5;39200:33;39190:61;;39247:1;39244;39237:12;39190:61;39139:118;:::o

Swarm Source

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