ETH Price: $2,571.23 (-1.31%)
Gas: 4 Gwei

Token

VEXPASS (VEXPASS)
 

Overview

Max Total Supply

224 VEXPASS

Holders

213

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
staketogheter.eth
Balance
1 VEXPASS
0x40a4fce89b26E924A3b5f13A91E78A5dc4944a45
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:
VEX

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

// 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/freemint_vex.sol



pragma solidity ^0.8.4;





contract VEX is Ownable, ERC721A, ReentrancyGuard{
    using Strings for uint256;
    // Addresses
    address public signerRole;
    address private addressWithdraw;
    // Sales configs
    uint256 public maxPerAddress = 1;
    uint256 public maxSupply = 224;
    // Timeframes
    uint256 public windowOpens = 1721215024;
    uint256 public presaleWindowOpens = 1658790000;
    uint256 public presaleWindowCloses = 1658833200;
    // Metadata uris
    string public baseURI = "https://gateway.pinata.cloud/ipfs/QmcbCy1bk2GHzRE2NrJj5aUFUFunZzXrddUdkMEANhs2dK";
    // State variables
    bool public paused = false;
    // Amount minted
    mapping(address => uint256) public mintedBalance;
    
    constructor(
    address _signerRole,
    address _addressWithdraw
    ) ERC721A("VEXPASS", "VEXPASS") {
        signerRole = _signerRole;
        addressWithdraw = _addressWithdraw;
    }

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

    modifier mintConditions() {
        require(!paused, "Minting not available, the contract is paused.");
        require(tx.origin == msg.sender, "No bots allowed.");
        require(totalSupply() + 1 <= maxSupply, "This amount of tokens would surpass the max supply.");
        require(mintedBalance[msg.sender] < 1, "You can only mint 1 token.");
        _;
    }

    // Mint functions ( Presale, public, giveaways)
    function mintPreSale(uint8 _v, bytes32 _r, bytes32 _s) external mintConditions onlyValidAccess(_v, _r, _s) {
        require(block.timestamp >= presaleWindowOpens && block.timestamp <= presaleWindowCloses, "Presale: purchase window closed.");
       
        _safeMint(msg.sender, 1);
        mintedBalance[msg.sender] = 1;
    }

    function mint() external mintConditions {
        require(block.timestamp >= windowOpens, "Purchase window closed.");
        
        _safeMint(msg.sender, 1);
        mintedBalance[msg.sender] = 1;
    }
    

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

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

        return string(baseURI);  
    }

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

    // Functions to change contract settings
    function setMaxSupply( uint256 _maxSupply) external onlyOwner {
        maxSupply = _maxSupply;
    }
    
    function pause(bool _state) external onlyOwner {
        paused = _state;
    }
    
    function setWindows(uint256 _windowOpens, uint256 _presaleWindowOpens, uint256 _presaleWindowCloses)  external onlyOwner {
        windowOpens = _windowOpens;
        presaleWindowOpens = _presaleWindowOpens;
        presaleWindowCloses = _presaleWindowCloses;
    }

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

    // WL signature, only users allowed.
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(this, _add));
        return signerRole == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        (bool success, ) = addressWithdraw.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"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":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mintPreSale","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"setMax","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"}],"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"}]

60806040526001600c5560e0600d55636697a830600e556362df2070600f556362dfc930601055604051806080016040528060508152602001620039e8605091396011908051906020019062000057929190620002df565b506000601260006101000a81548160ff0219169083151502179055503480156200008057600080fd5b5060405162003a3838038062003a388339818101604052810190620000a69190620003a6565b6040518060400160405280600781526020017f56455850415353000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f564558504153530000000000000000000000000000000000000000000000000081525062000132620001266200020e60201b60201c565b6200021660201b60201c565b81600390805190602001906200014a929190620002df565b50806004908051906020019062000163929190620002df565b5062000174620002da60201b60201c565b6001819055505050600160098190555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620004a5565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620002ed9062000421565b90600052602060002090601f0160209004810192826200031157600085556200035d565b82601f106200032c57805160ff19168380011785556200035d565b828001600101855582156200035d579182015b828111156200035c5782518255916020019190600101906200033f565b5b5090506200036c919062000370565b5090565b5b808211156200038b57600081600090555060010162000371565b5090565b600081519050620003a0816200048b565b92915050565b60008060408385031215620003c057620003bf62000486565b5b6000620003d0858286016200038f565b9250506020620003e3858286016200038f565b9150509250929050565b6000620003fa8262000401565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200043a57607f821691505b6020821081141562000451576200045062000457565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200049681620003ed565b8114620004a257600080fd5b50565b61353380620004b56000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80636c2d481f11610125578063ac446002116100ad578063d5abeb011161007c578063d5abeb01146105dd578063e051b416146105fb578063e8229fcd1461062b578063e985e9c514610647578063f2fde38b146106775761021c565b8063ac44600214610569578063afd9400e14610573578063b88d4fde14610591578063c87b56dd146105ad5761021c565b80638da5cb5b116100f45780638da5cb5b146104d557806390f0a3dd146104f357806392e044941461051157806395d89b411461052f578063a22cb4651461054d5761021c565b80636c2d481f146104615780636f8b44b01461047f57806370a082311461049b578063715018a6146104cb5761021c565b806323b872dd116101a857806355f804b31161017757806355f804b3146103bb5780635c975abb146103d75780636352211e146103f5578063639814e0146104255780636c0360eb146104435761021c565b806323b872dd14610337578063326241141461035357806342842e0e1461038357806342d592441461039f5761021c565b8063081812fc116101ef578063081812fc146102a7578063095ea7b3146102d75780631249c58b146102f357806318160ddd146102fd5780631fe9eabc1461031b5761021c565b806301ffc9a71461022157806302329a2914610251578063050225ea1461026d57806306fdde0314610289575b600080fd5b61023b600480360381019061023691906126cf565b610693565b6040516102489190612c03565b60405180910390f35b61026b600480360381019061026691906126a2565b610725565b005b610287600480360381019061028291906125fb565b61074a565b005b6102916107b7565b60405161029e9190612c63565b60405180910390f35b6102c160048036038101906102bc9190612776565b610849565b6040516102ce9190612b9c565b60405180910390f35b6102f160048036038101906102ec91906125fb565b6108c5565b005b6102fb610a06565b005b610305610c35565b6040516103129190612e05565b60405180910390f35b61033560048036038101906103309190612776565b610c4c565b005b610351600480360381019061034c91906124e5565b610c5e565b005b61036d6004803603810190610368919061263b565b610f83565b60405161037a9190612c03565b60405180910390f35b61039d600480360381019061039891906124e5565b611081565b005b6103b960048036038101906103b491906127a3565b6110a1565b005b6103d560048036038101906103d09190612729565b6110c3565b005b6103df6110e1565b6040516103ec9190612c03565b60405180910390f35b61040f600480360381019061040a9190612776565b6110f4565b60405161041c9190612b9c565b60405180910390f35b61042d611106565b60405161043a9190612e05565b60405180910390f35b61044b61110c565b6040516104589190612c63565b60405180910390f35b61046961119a565b6040516104769190612b9c565b60405180910390f35b61049960048036038101906104949190612776565b6111c0565b005b6104b560048036038101906104b09190612478565b6111d2565b6040516104c29190612e05565b60405180910390f35b6104d361128b565b005b6104dd61129f565b6040516104ea9190612b9c565b60405180910390f35b6104fb6112c8565b6040516105089190612e05565b60405180910390f35b6105196112ce565b6040516105269190612e05565b60405180910390f35b6105376112d4565b6040516105449190612c63565b60405180910390f35b610567600480360381019061056291906125bb565b611366565b005b6105716114de565b005b61057b61160d565b6040516105889190612e05565b60405180910390f35b6105ab60048036038101906105a69190612538565b611613565b005b6105c760048036038101906105c29190612776565b611686565b6040516105d49190612c63565b60405180910390f35b6105e5611762565b6040516105f29190612e05565b60405180910390f35b61061560048036038101906106109190612478565b611768565b6040516106229190612e05565b60405180910390f35b610645600480360381019061064091906127f6565b611780565b005b610661600480360381019061065c91906124a5565b611a11565b60405161066e9190612c03565b60405180910390f35b610691600480360381019061068c9190612478565b611aa5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ee57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061071e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b61072d611b29565b80601260006101000a81548160ff02191690831515021790555050565b610752611b29565b600d548161075e610c35565b6107689190612ec4565b11156107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a090612d05565b60405180910390fd5b6107b38282611ba7565b5050565b6060600380546107c69061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546107f29061301d565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b600061085482611bc5565b61088a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d0826110f4565b90508073ffffffffffffffffffffffffffffffffffffffff166108f1611c24565b73ffffffffffffffffffffffffffffffffffffffff16146109545761091d81610918611c24565b611a11565b610953576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601260009054906101000a900460ff1615610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90612d65565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb90612d85565b60405180910390fd5b600d546001610ad1610c35565b610adb9190612ec4565b1115610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390612d05565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590612c85565b60405180910390fd5b600e54421015610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90612cc5565b60405180910390fd5b610bee336001611ba7565b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000610c3f611c2c565b6002546001540303905090565b610c54611b29565b80600c8190555050565b6000610c6982611c31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cdc84611cff565b91509150610cf28187610ced611c24565b611d21565b610d3e57610d0786610d02611c24565b611a11565b610d3d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610da5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db28686866001611d65565b8015610dbd57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e8b85610e67888887611d6b565b7c020000000000000000000000000000000000000000000000000000000017611d93565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f13576000600185019050600060056000838152602001908152602001600020541415610f11576001548114610f10578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f7b8686866001611dbe565b505050505050565b6000803086604051602001610f99929190612b35565b604051602081830303815290604052805190602001209050600181604051602001610fc49190612b61565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610ffa9493929190612c1e565b6020604051602081039080840390855afa15801561101c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b61109c83838360405180602001604052806000815250611613565b505050565b6110a9611b29565b82600e8190555081600f8190555080601081905550505050565b6110cb611b29565b8181601191906110dc92919061227c565b505050565b601260009054906101000a900460ff1681565b60006110ff82611c31565b9050919050565b600c5481565b601180546111199061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546111459061301d565b80156111925780601f1061116757610100808354040283529160200191611192565b820191906000526020600020905b81548152906001019060200180831161117557829003601f168201915b505050505081565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111c8611b29565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611293611b29565b61129d6000611dc4565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b600e5481565b6060600480546112e39061301d565b80601f016020809104026020016040519081016040528092919081815260200182805461130f9061301d565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b5050505050905090565b61136e611c24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113d3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006113e0611c24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661148d611c24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114d29190612c03565b60405180910390a35050565b6114e6611b29565b6002600954141561152c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152390612dc5565b60405180910390fd5b60026009819055506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161157c90612b87565b60006040518083038185875af1925050503d80600081146115b9576040519150601f19603f3d011682016040523d82523d6000602084013e6115be565b606091505b5050905080611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990612da5565b60405180910390fd5b506001600981905550565b60105481565b61161e848484610c5e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116805761164984848484611e88565b61167f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061169182611bc5565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612de5565b60405180910390fd5b601180546116dd9061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546117099061301d565b80156117565780601f1061172b57610100808354040283529160200191611756565b820191906000526020600020905b81548152906001019060200180831161173957829003601f168201915b50505050509050919050565b600d5481565b60136020528060005260406000206000915090505481565b601260009054906101000a900460ff16156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790612d65565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590612d85565b60405180910390fd5b600d54600161184b610c35565b6118559190612ec4565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90612d05565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90612c85565b60405180910390fd5b82828261192733848484610f83565b611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90612d45565b60405180910390fd5b600f54421015801561197a57506010544211155b6119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090612d25565b60405180910390fd5b6119c4336001611ba7565b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aad611b29565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490612ca5565b60405180910390fd5b611b2681611dc4565b50565b611b31611fe8565b73ffffffffffffffffffffffffffffffffffffffff16611b4f61129f565b73ffffffffffffffffffffffffffffffffffffffff1614611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90612ce5565b60405180910390fd5b565b611bc1828260405180602001604052806000815250611ff0565b5050565b600081611bd0611c2c565b11158015611bdf575060015482105b8015611c1d575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611c40611c2c565b11611cc857600154811015611cc75760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611cc5575b6000811415611cbb576005600083600190039350838152602001908152602001600020549050611c90565b8092505050611cfa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d8286868461208e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eae611c24565b8786866040518563ffffffff1660e01b8152600401611ed09493929190612bb7565b602060405180830381600087803b158015611eea57600080fd5b505af1925050508015611f1b57506040513d601f19601f82011682018060405250810190611f1891906126fc565b60015b611f95573d8060008114611f4b576040519150601f19603f3d011682016040523d82523d6000602084013e611f50565b606091505b50600081511415611f8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b611ffa8383612097565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120895760006001549050600083820390505b61203b6000868380600101945086611e88565b612071576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061202857816001541461208657600080fd5b50505b505050565b60009392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612105576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612140576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214d6000848385611d65565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121c4836121b56000866000611d6b565b6121be8561226c565b17611d93565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121e8578060018190555050506122676000848385611dbe565b505050565b60006001821460e11b9050919050565b8280546122889061301d565b90600052602060002090601f0160209004810192826122aa57600085556122f1565b82601f106122c357803560ff19168380011785556122f1565b828001600101855582156122f1579182015b828111156122f05782358255916020019190600101906122d5565b5b5090506122fe9190612302565b5090565b5b8082111561231b576000816000905550600101612303565b5090565b600061233261232d84612e45565b612e20565b90508281526020810184848401111561234e5761234d61314a565b5b612359848285612fdb565b509392505050565b60008135905061237081613473565b92915050565b6000813590506123858161348a565b92915050565b60008135905061239a816134a1565b92915050565b6000813590506123af816134b8565b92915050565b6000815190506123c4816134b8565b92915050565b600082601f8301126123df576123de613140565b5b81356123ef84826020860161231f565b91505092915050565b60008083601f84011261240e5761240d613140565b5b8235905067ffffffffffffffff81111561242b5761242a61313b565b5b60208301915083600182028301111561244757612446613145565b5b9250929050565b60008135905061245d816134cf565b92915050565b600081359050612472816134e6565b92915050565b60006020828403121561248e5761248d613154565b5b600061249c84828501612361565b91505092915050565b600080604083850312156124bc576124bb613154565b5b60006124ca85828601612361565b92505060206124db85828601612361565b9150509250929050565b6000806000606084860312156124fe576124fd613154565b5b600061250c86828701612361565b935050602061251d86828701612361565b925050604061252e8682870161244e565b9150509250925092565b6000806000806080858703121561255257612551613154565b5b600061256087828801612361565b945050602061257187828801612361565b93505060406125828782880161244e565b925050606085013567ffffffffffffffff8111156125a3576125a261314f565b5b6125af878288016123ca565b91505092959194509250565b600080604083850312156125d2576125d1613154565b5b60006125e085828601612361565b92505060206125f185828601612376565b9150509250929050565b6000806040838503121561261257612611613154565b5b600061262085828601612361565b92505060206126318582860161244e565b9150509250929050565b6000806000806080858703121561265557612654613154565b5b600061266387828801612361565b945050602061267487828801612463565b93505060406126858782880161238b565b92505060606126968782880161238b565b91505092959194509250565b6000602082840312156126b8576126b7613154565b5b60006126c684828501612376565b91505092915050565b6000602082840312156126e5576126e4613154565b5b60006126f3848285016123a0565b91505092915050565b60006020828403121561271257612711613154565b5b6000612720848285016123b5565b91505092915050565b600080602083850312156127405761273f613154565b5b600083013567ffffffffffffffff81111561275e5761275d61314f565b5b61276a858286016123f8565b92509250509250929050565b60006020828403121561278c5761278b613154565b5b600061279a8482850161244e565b91505092915050565b6000806000606084860312156127bc576127bb613154565b5b60006127ca8682870161244e565b93505060206127db8682870161244e565b92505060406127ec8682870161244e565b9150509250925092565b60008060006060848603121561280f5761280e613154565b5b600061281d86828701612463565b935050602061282e8682870161238b565b925050604061283f8682870161238b565b9150509250925092565b61285281612f1a565b82525050565b61286961286482612f1a565b613080565b82525050565b61287881612f2c565b82525050565b61288781612f38565b82525050565b61289e61289982612f38565b613092565b82525050565b60006128af82612e76565b6128b98185612e8c565b93506128c9818560208601612fea565b6128d281613159565b840191505092915050565b6128ee6128e982612fa5565b613080565b82525050565b60006128ff82612e81565b6129098185612ea8565b9350612919818560208601612fea565b61292281613159565b840191505092915050565b600061293a601a83612ea8565b915061294582613177565b602082019050919050565b600061295d601c83612eb9565b9150612968826131a0565b601c82019050919050565b6000612980602683612ea8565b915061298b826131c9565b604082019050919050565b60006129a3601783612ea8565b91506129ae82613218565b602082019050919050565b60006129c6602083612ea8565b91506129d182613241565b602082019050919050565b60006129e9603383612ea8565b91506129f48261326a565b604082019050919050565b6000612a0c602083612ea8565b9150612a17826132b9565b602082019050919050565b6000612a2f604b83612ea8565b9150612a3a826132e2565b606082019050919050565b6000612a52602e83612ea8565b9150612a5d82613357565b604082019050919050565b6000612a75601083612ea8565b9150612a80826133a6565b602082019050919050565b6000612a98600083612e9d565b9150612aa3826133cf565b600082019050919050565b6000612abb601083612ea8565b9150612ac6826133d2565b602082019050919050565b6000612ade601f83612ea8565b9150612ae9826133fb565b602082019050919050565b6000612b01603083612ea8565b9150612b0c82613424565b604082019050919050565b612b2081612f8e565b82525050565b612b2f81612f98565b82525050565b6000612b4182856128dd565b601482019150612b518284612858565b6014820191508190509392505050565b6000612b6c82612950565b9150612b78828461288d565b60208201915081905092915050565b6000612b9282612a8b565b9150819050919050565b6000602082019050612bb16000830184612849565b92915050565b6000608082019050612bcc6000830187612849565b612bd96020830186612849565b612be66040830185612b17565b8181036060830152612bf881846128a4565b905095945050505050565b6000602082019050612c18600083018461286f565b92915050565b6000608082019050612c33600083018761287e565b612c406020830186612b26565b612c4d604083018561287e565b612c5a606083018461287e565b95945050505050565b60006020820190508181036000830152612c7d81846128f4565b905092915050565b60006020820190508181036000830152612c9e8161292d565b9050919050565b60006020820190508181036000830152612cbe81612973565b9050919050565b60006020820190508181036000830152612cde81612996565b9050919050565b60006020820190508181036000830152612cfe816129b9565b9050919050565b60006020820190508181036000830152612d1e816129dc565b9050919050565b60006020820190508181036000830152612d3e816129ff565b9050919050565b60006020820190508181036000830152612d5e81612a22565b9050919050565b60006020820190508181036000830152612d7e81612a45565b9050919050565b60006020820190508181036000830152612d9e81612a68565b9050919050565b60006020820190508181036000830152612dbe81612aae565b9050919050565b60006020820190508181036000830152612dde81612ad1565b9050919050565b60006020820190508181036000830152612dfe81612af4565b9050919050565b6000602082019050612e1a6000830184612b17565b92915050565b6000612e2a612e3b565b9050612e36828261304f565b919050565b6000604051905090565b600067ffffffffffffffff821115612e6057612e5f61310c565b5b612e6982613159565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ecf82612f8e565b9150612eda83612f8e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f0f57612f0e6130ae565b5b828201905092915050565b6000612f2582612f6e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612fb082612fb7565b9050919050565b6000612fc282612fc9565b9050919050565b6000612fd482612f6e565b9050919050565b82818337600083830152505050565b60005b83811015613008578082015181840152602081019050612fed565b83811115613017576000848401525b50505050565b6000600282049050600182168061303557607f821691505b60208210811415613049576130486130dd565b5b50919050565b61305882613159565b810181811067ffffffffffffffff821117156130775761307661310c565b5b80604052505050565b600061308b8261309c565b9050919050565b6000819050919050565b60006130a78261316a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f752063616e206f6e6c79206d696e74203120746f6b656e2e000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50757263686173652077696e646f7720636c6f7365642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5468697320616d6f756e74206f6620746f6b656e7320776f756c64207375727060008201527f61737320746865206d617820737570706c792e00000000000000000000000000602082015250565b7f50726573616c653a2070757263686173652077696e646f7720636c6f7365642e600082015250565b7f496e76616c69642073696e67617475726520666f72206164647265737320636160008201527f6c6c696e67207468652066756e6374696f6e2c206163636f756e74206e6f742060208201527f696e2070726573616c652e000000000000000000000000000000000000000000604082015250565b7f4d696e74696e67206e6f7420617661696c61626c652c2074686520636f6e747260008201527f616374206973207061757365642e000000000000000000000000000000000000602082015250565b7f4e6f20626f747320616c6c6f7765642e00000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b61347c81612f1a565b811461348757600080fd5b50565b61349381612f2c565b811461349e57600080fd5b50565b6134aa81612f38565b81146134b557600080fd5b50565b6134c181612f42565b81146134cc57600080fd5b50565b6134d881612f8e565b81146134e357600080fd5b50565b6134ef81612f98565b81146134fa57600080fd5b5056fea2646970667358221220e755c7b63361e1200faa94ceb4491f7d7f2aa95e532753a87a30aa24b1ea39aa64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6362437931626b3247487a5245324e724a6a356155465546756e5a7a5872646455646b4d45414e687332644b000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff000000000000000000000000d29eeef7d210a4cb65cac432662f8c56f4112ccb

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80636c2d481f11610125578063ac446002116100ad578063d5abeb011161007c578063d5abeb01146105dd578063e051b416146105fb578063e8229fcd1461062b578063e985e9c514610647578063f2fde38b146106775761021c565b8063ac44600214610569578063afd9400e14610573578063b88d4fde14610591578063c87b56dd146105ad5761021c565b80638da5cb5b116100f45780638da5cb5b146104d557806390f0a3dd146104f357806392e044941461051157806395d89b411461052f578063a22cb4651461054d5761021c565b80636c2d481f146104615780636f8b44b01461047f57806370a082311461049b578063715018a6146104cb5761021c565b806323b872dd116101a857806355f804b31161017757806355f804b3146103bb5780635c975abb146103d75780636352211e146103f5578063639814e0146104255780636c0360eb146104435761021c565b806323b872dd14610337578063326241141461035357806342842e0e1461038357806342d592441461039f5761021c565b8063081812fc116101ef578063081812fc146102a7578063095ea7b3146102d75780631249c58b146102f357806318160ddd146102fd5780631fe9eabc1461031b5761021c565b806301ffc9a71461022157806302329a2914610251578063050225ea1461026d57806306fdde0314610289575b600080fd5b61023b600480360381019061023691906126cf565b610693565b6040516102489190612c03565b60405180910390f35b61026b600480360381019061026691906126a2565b610725565b005b610287600480360381019061028291906125fb565b61074a565b005b6102916107b7565b60405161029e9190612c63565b60405180910390f35b6102c160048036038101906102bc9190612776565b610849565b6040516102ce9190612b9c565b60405180910390f35b6102f160048036038101906102ec91906125fb565b6108c5565b005b6102fb610a06565b005b610305610c35565b6040516103129190612e05565b60405180910390f35b61033560048036038101906103309190612776565b610c4c565b005b610351600480360381019061034c91906124e5565b610c5e565b005b61036d6004803603810190610368919061263b565b610f83565b60405161037a9190612c03565b60405180910390f35b61039d600480360381019061039891906124e5565b611081565b005b6103b960048036038101906103b491906127a3565b6110a1565b005b6103d560048036038101906103d09190612729565b6110c3565b005b6103df6110e1565b6040516103ec9190612c03565b60405180910390f35b61040f600480360381019061040a9190612776565b6110f4565b60405161041c9190612b9c565b60405180910390f35b61042d611106565b60405161043a9190612e05565b60405180910390f35b61044b61110c565b6040516104589190612c63565b60405180910390f35b61046961119a565b6040516104769190612b9c565b60405180910390f35b61049960048036038101906104949190612776565b6111c0565b005b6104b560048036038101906104b09190612478565b6111d2565b6040516104c29190612e05565b60405180910390f35b6104d361128b565b005b6104dd61129f565b6040516104ea9190612b9c565b60405180910390f35b6104fb6112c8565b6040516105089190612e05565b60405180910390f35b6105196112ce565b6040516105269190612e05565b60405180910390f35b6105376112d4565b6040516105449190612c63565b60405180910390f35b610567600480360381019061056291906125bb565b611366565b005b6105716114de565b005b61057b61160d565b6040516105889190612e05565b60405180910390f35b6105ab60048036038101906105a69190612538565b611613565b005b6105c760048036038101906105c29190612776565b611686565b6040516105d49190612c63565b60405180910390f35b6105e5611762565b6040516105f29190612e05565b60405180910390f35b61061560048036038101906106109190612478565b611768565b6040516106229190612e05565b60405180910390f35b610645600480360381019061064091906127f6565b611780565b005b610661600480360381019061065c91906124a5565b611a11565b60405161066e9190612c03565b60405180910390f35b610691600480360381019061068c9190612478565b611aa5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ee57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061071e5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b61072d611b29565b80601260006101000a81548160ff02191690831515021790555050565b610752611b29565b600d548161075e610c35565b6107689190612ec4565b11156107a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a090612d05565b60405180910390fd5b6107b38282611ba7565b5050565b6060600380546107c69061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546107f29061301d565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050905090565b600061085482611bc5565b61088a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108d0826110f4565b90508073ffffffffffffffffffffffffffffffffffffffff166108f1611c24565b73ffffffffffffffffffffffffffffffffffffffff16146109545761091d81610918611c24565b611a11565b610953576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601260009054906101000a900460ff1615610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d90612d65565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb90612d85565b60405180910390fd5b600d546001610ad1610c35565b610adb9190612ec4565b1115610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390612d05565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590612c85565b60405180910390fd5b600e54421015610be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bda90612cc5565b60405180910390fd5b610bee336001611ba7565b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000610c3f611c2c565b6002546001540303905090565b610c54611b29565b80600c8190555050565b6000610c6982611c31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd0576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cdc84611cff565b91509150610cf28187610ced611c24565b611d21565b610d3e57610d0786610d02611c24565b611a11565b610d3d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610da5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db28686866001611d65565b8015610dbd57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e8b85610e67888887611d6b565b7c020000000000000000000000000000000000000000000000000000000017611d93565b600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f13576000600185019050600060056000838152602001908152602001600020541415610f11576001548114610f10578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f7b8686866001611dbe565b505050505050565b6000803086604051602001610f99929190612b35565b604051602081830303815290604052805190602001209050600181604051602001610fc49190612b61565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610ffa9493929190612c1e565b6020604051602081039080840390855afa15801561101c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b61109c83838360405180602001604052806000815250611613565b505050565b6110a9611b29565b82600e8190555081600f8190555080601081905550505050565b6110cb611b29565b8181601191906110dc92919061227c565b505050565b601260009054906101000a900460ff1681565b60006110ff82611c31565b9050919050565b600c5481565b601180546111199061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546111459061301d565b80156111925780601f1061116757610100808354040283529160200191611192565b820191906000526020600020905b81548152906001019060200180831161117557829003601f168201915b505050505081565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111c8611b29565b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611293611b29565b61129d6000611dc4565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b600e5481565b6060600480546112e39061301d565b80601f016020809104026020016040519081016040528092919081815260200182805461130f9061301d565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b5050505050905090565b61136e611c24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113d3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006113e0611c24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661148d611c24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114d29190612c03565b60405180910390a35050565b6114e6611b29565b6002600954141561152c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152390612dc5565b60405180910390fd5b60026009819055506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161157c90612b87565b60006040518083038185875af1925050503d80600081146115b9576040519150601f19603f3d011682016040523d82523d6000602084013e6115be565b606091505b5050905080611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f990612da5565b60405180910390fd5b506001600981905550565b60105481565b61161e848484610c5e565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116805761164984848484611e88565b61167f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061169182611bc5565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612de5565b60405180910390fd5b601180546116dd9061301d565b80601f01602080910402602001604051908101604052809291908181526020018280546117099061301d565b80156117565780601f1061172b57610100808354040283529160200191611756565b820191906000526020600020905b81548152906001019060200180831161173957829003601f168201915b50505050509050919050565b600d5481565b60136020528060005260406000206000915090505481565b601260009054906101000a900460ff16156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790612d65565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590612d85565b60405180910390fd5b600d54600161184b610c35565b6118559190612ec4565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90612d05565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90612c85565b60405180910390fd5b82828261192733848484610f83565b611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90612d45565b60405180910390fd5b600f54421015801561197a57506010544211155b6119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090612d25565b60405180910390fd5b6119c4336001611ba7565b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050505050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aad611b29565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490612ca5565b60405180910390fd5b611b2681611dc4565b50565b611b31611fe8565b73ffffffffffffffffffffffffffffffffffffffff16611b4f61129f565b73ffffffffffffffffffffffffffffffffffffffff1614611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90612ce5565b60405180910390fd5b565b611bc1828260405180602001604052806000815250611ff0565b5050565b600081611bd0611c2c565b11158015611bdf575060015482105b8015611c1d575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611c40611c2c565b11611cc857600154811015611cc75760006005600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611cc5575b6000811415611cbb576005600083600190039350838152602001908152602001600020549050611c90565b8092505050611cfa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600790508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d8286868461208e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611eae611c24565b8786866040518563ffffffff1660e01b8152600401611ed09493929190612bb7565b602060405180830381600087803b158015611eea57600080fd5b505af1925050508015611f1b57506040513d601f19601f82011682018060405250810190611f1891906126fc565b60015b611f95573d8060008114611f4b576040519150601f19603f3d011682016040523d82523d6000602084013e611f50565b606091505b50600081511415611f8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600033905090565b611ffa8383612097565b60008373ffffffffffffffffffffffffffffffffffffffff163b146120895760006001549050600083820390505b61203b6000868380600101945086611e88565b612071576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061202857816001541461208657600080fd5b50505b505050565b60009392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612105576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612140576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61214d6000848385611d65565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121c4836121b56000866000611d6b565b6121be8561226c565b17611d93565b60056000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106121e8578060018190555050506122676000848385611dbe565b505050565b60006001821460e11b9050919050565b8280546122889061301d565b90600052602060002090601f0160209004810192826122aa57600085556122f1565b82601f106122c357803560ff19168380011785556122f1565b828001600101855582156122f1579182015b828111156122f05782358255916020019190600101906122d5565b5b5090506122fe9190612302565b5090565b5b8082111561231b576000816000905550600101612303565b5090565b600061233261232d84612e45565b612e20565b90508281526020810184848401111561234e5761234d61314a565b5b612359848285612fdb565b509392505050565b60008135905061237081613473565b92915050565b6000813590506123858161348a565b92915050565b60008135905061239a816134a1565b92915050565b6000813590506123af816134b8565b92915050565b6000815190506123c4816134b8565b92915050565b600082601f8301126123df576123de613140565b5b81356123ef84826020860161231f565b91505092915050565b60008083601f84011261240e5761240d613140565b5b8235905067ffffffffffffffff81111561242b5761242a61313b565b5b60208301915083600182028301111561244757612446613145565b5b9250929050565b60008135905061245d816134cf565b92915050565b600081359050612472816134e6565b92915050565b60006020828403121561248e5761248d613154565b5b600061249c84828501612361565b91505092915050565b600080604083850312156124bc576124bb613154565b5b60006124ca85828601612361565b92505060206124db85828601612361565b9150509250929050565b6000806000606084860312156124fe576124fd613154565b5b600061250c86828701612361565b935050602061251d86828701612361565b925050604061252e8682870161244e565b9150509250925092565b6000806000806080858703121561255257612551613154565b5b600061256087828801612361565b945050602061257187828801612361565b93505060406125828782880161244e565b925050606085013567ffffffffffffffff8111156125a3576125a261314f565b5b6125af878288016123ca565b91505092959194509250565b600080604083850312156125d2576125d1613154565b5b60006125e085828601612361565b92505060206125f185828601612376565b9150509250929050565b6000806040838503121561261257612611613154565b5b600061262085828601612361565b92505060206126318582860161244e565b9150509250929050565b6000806000806080858703121561265557612654613154565b5b600061266387828801612361565b945050602061267487828801612463565b93505060406126858782880161238b565b92505060606126968782880161238b565b91505092959194509250565b6000602082840312156126b8576126b7613154565b5b60006126c684828501612376565b91505092915050565b6000602082840312156126e5576126e4613154565b5b60006126f3848285016123a0565b91505092915050565b60006020828403121561271257612711613154565b5b6000612720848285016123b5565b91505092915050565b600080602083850312156127405761273f613154565b5b600083013567ffffffffffffffff81111561275e5761275d61314f565b5b61276a858286016123f8565b92509250509250929050565b60006020828403121561278c5761278b613154565b5b600061279a8482850161244e565b91505092915050565b6000806000606084860312156127bc576127bb613154565b5b60006127ca8682870161244e565b93505060206127db8682870161244e565b92505060406127ec8682870161244e565b9150509250925092565b60008060006060848603121561280f5761280e613154565b5b600061281d86828701612463565b935050602061282e8682870161238b565b925050604061283f8682870161238b565b9150509250925092565b61285281612f1a565b82525050565b61286961286482612f1a565b613080565b82525050565b61287881612f2c565b82525050565b61288781612f38565b82525050565b61289e61289982612f38565b613092565b82525050565b60006128af82612e76565b6128b98185612e8c565b93506128c9818560208601612fea565b6128d281613159565b840191505092915050565b6128ee6128e982612fa5565b613080565b82525050565b60006128ff82612e81565b6129098185612ea8565b9350612919818560208601612fea565b61292281613159565b840191505092915050565b600061293a601a83612ea8565b915061294582613177565b602082019050919050565b600061295d601c83612eb9565b9150612968826131a0565b601c82019050919050565b6000612980602683612ea8565b915061298b826131c9565b604082019050919050565b60006129a3601783612ea8565b91506129ae82613218565b602082019050919050565b60006129c6602083612ea8565b91506129d182613241565b602082019050919050565b60006129e9603383612ea8565b91506129f48261326a565b604082019050919050565b6000612a0c602083612ea8565b9150612a17826132b9565b602082019050919050565b6000612a2f604b83612ea8565b9150612a3a826132e2565b606082019050919050565b6000612a52602e83612ea8565b9150612a5d82613357565b604082019050919050565b6000612a75601083612ea8565b9150612a80826133a6565b602082019050919050565b6000612a98600083612e9d565b9150612aa3826133cf565b600082019050919050565b6000612abb601083612ea8565b9150612ac6826133d2565b602082019050919050565b6000612ade601f83612ea8565b9150612ae9826133fb565b602082019050919050565b6000612b01603083612ea8565b9150612b0c82613424565b604082019050919050565b612b2081612f8e565b82525050565b612b2f81612f98565b82525050565b6000612b4182856128dd565b601482019150612b518284612858565b6014820191508190509392505050565b6000612b6c82612950565b9150612b78828461288d565b60208201915081905092915050565b6000612b9282612a8b565b9150819050919050565b6000602082019050612bb16000830184612849565b92915050565b6000608082019050612bcc6000830187612849565b612bd96020830186612849565b612be66040830185612b17565b8181036060830152612bf881846128a4565b905095945050505050565b6000602082019050612c18600083018461286f565b92915050565b6000608082019050612c33600083018761287e565b612c406020830186612b26565b612c4d604083018561287e565b612c5a606083018461287e565b95945050505050565b60006020820190508181036000830152612c7d81846128f4565b905092915050565b60006020820190508181036000830152612c9e8161292d565b9050919050565b60006020820190508181036000830152612cbe81612973565b9050919050565b60006020820190508181036000830152612cde81612996565b9050919050565b60006020820190508181036000830152612cfe816129b9565b9050919050565b60006020820190508181036000830152612d1e816129dc565b9050919050565b60006020820190508181036000830152612d3e816129ff565b9050919050565b60006020820190508181036000830152612d5e81612a22565b9050919050565b60006020820190508181036000830152612d7e81612a45565b9050919050565b60006020820190508181036000830152612d9e81612a68565b9050919050565b60006020820190508181036000830152612dbe81612aae565b9050919050565b60006020820190508181036000830152612dde81612ad1565b9050919050565b60006020820190508181036000830152612dfe81612af4565b9050919050565b6000602082019050612e1a6000830184612b17565b92915050565b6000612e2a612e3b565b9050612e36828261304f565b919050565b6000604051905090565b600067ffffffffffffffff821115612e6057612e5f61310c565b5b612e6982613159565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ecf82612f8e565b9150612eda83612f8e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612f0f57612f0e6130ae565b5b828201905092915050565b6000612f2582612f6e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612fb082612fb7565b9050919050565b6000612fc282612fc9565b9050919050565b6000612fd482612f6e565b9050919050565b82818337600083830152505050565b60005b83811015613008578082015181840152602081019050612fed565b83811115613017576000848401525b50505050565b6000600282049050600182168061303557607f821691505b60208210811415613049576130486130dd565b5b50919050565b61305882613159565b810181811067ffffffffffffffff821117156130775761307661310c565b5b80604052505050565b600061308b8261309c565b9050919050565b6000819050919050565b60006130a78261316a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f752063616e206f6e6c79206d696e74203120746f6b656e2e000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50757263686173652077696e646f7720636c6f7365642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5468697320616d6f756e74206f6620746f6b656e7320776f756c64207375727060008201527f61737320746865206d617820737570706c792e00000000000000000000000000602082015250565b7f50726573616c653a2070757263686173652077696e646f7720636c6f7365642e600082015250565b7f496e76616c69642073696e67617475726520666f72206164647265737320636160008201527f6c6c696e67207468652066756e6374696f6e2c206163636f756e74206e6f742060208201527f696e2070726573616c652e000000000000000000000000000000000000000000604082015250565b7f4d696e74696e67206e6f7420617661696c61626c652c2074686520636f6e747260008201527f616374206973207061757365642e000000000000000000000000000000000000602082015250565b7f4e6f20626f747320616c6c6f7765642e00000000000000000000000000000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b61347c81612f1a565b811461348757600080fd5b50565b61349381612f2c565b811461349e57600080fd5b50565b6134aa81612f38565b81146134b557600080fd5b50565b6134c181612f42565b81146134cc57600080fd5b50565b6134d881612f8e565b81146134e357600080fd5b50565b6134ef81612f98565b81146134fa57600080fd5b5056fea2646970667358221220e755c7b63361e1200faa94ceb4491f7d7f2aa95e532753a87a30aa24b1ea39aa64736f6c63430008070033

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

000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff000000000000000000000000d29eeef7d210a4cb65cac432662f8c56f4112ccb

-----Decoded View---------------
Arg [0] : _signerRole (address): 0xA65aae78EdEF916d4102BA7b5672068C0D35fbff
Arg [1] : _addressWithdraw (address): 0xd29eeEF7d210a4cB65CaC432662F8C56f4112Ccb

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a65aae78edef916d4102ba7b5672068c0d35fbff
Arg [1] : 000000000000000000000000d29eeef7d210a4cb65cac432662f8c56f4112ccb


Deployed Bytecode Sourcemap

53651:3975:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56586:81;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55819:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22736:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24682:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24230:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55595:210;;;:::i;:::-;;16143:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56957:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33947:2800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57115:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25572:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56679:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56315:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54256:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22525:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53849:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54119:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53757:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56471:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17768:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52756:103;;;:::i;:::-;;52108:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53990:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53944:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22905:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24958:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57425:196;;;:::i;:::-;;54043:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25828:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56082:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53888:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54311:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55253:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25337:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53014:201;;;;;;;;;;;;;:::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;56586:81::-;51994:13;:11;:13::i;:::-;56653:6:::1;56644;;:15;;;;;;;;;;;;;;;;;;56586:81:::0;:::o;55819:223::-;51994:13;:11;:13::i;:::-;55933:9:::1;;55921:8;55905:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;55897:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;56011:23;56021:2;56025:8;56011:9;:23::i;:::-;55819:223:::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;55595:210::-;54868:6;;;;;;;;;;;54867:7;54859:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54957:10;54944:23;;:9;:23;;;54936:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55028:9;;55023:1;55007:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;54999:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;55140:1;55112:13;:25;55126:10;55112:25;;;;;;;;;;;;;;;;:29;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55673:11:::1;;55654:15;:30;;55646:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55733:24;55743:10;55755:1;55733:9;:24::i;:::-;55796:1;55768:13;:25;55782:10;55768:25;;;;;;;;;;;;;;;:29;;;;55595:210::o:0;16143:315::-;16196:7;16424:15;:13;:15::i;:::-;16409:12;;16393:13;;:28;:46;16386:53;;16143:315;:::o;56957:108::-;51994:13;:11;:13::i;:::-;57043:14:::1;57027:13;:30;;;;56957:108:::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;57115:302::-;57214:4;57231:12;57273:4;57279;57256:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57246:39;;;;;;57231:54;;57317:92;57390:4;57337:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;57327:69;;;;;;57398:2;57402;57406;57317:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57303:106;;:10;;;;;;;;;;;:106;;;57296:113;;;57115:302;;;;;;:::o;25572:185::-;25710:39;25727:4;25733:2;25737:7;25710:39;;;;;;;;;;;;:16;:39::i;:::-;25572:185;;;:::o;56679:270::-;51994:13;:11;:13::i;:::-;56825:12:::1;56811:11;:26;;;;56869:19;56848:18;:40;;;;56921:20;56899:19;:42;;;;56679:270:::0;;;:::o;56315:102::-;51994:13;:11;:13::i;:::-;56401:8:::1;;56391:7;:18;;;;;;;:::i;:::-;;56315:102:::0;;:::o;54256:26::-;;;;;;;;;;;;;:::o;22525:144::-;22589:7;22632:27;22651:7;22632:18;:27::i;:::-;22609:52;;22525:144;;;:::o;53849:32::-;;;;:::o;54119:106::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53757:25::-;;;;;;;;;;;;;:::o;56471:103::-;51994:13;:11;:13::i;:::-;56556:10:::1;56544:9;:22;;;;56471: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;53990:46::-;;;;:::o;53944: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;57425:196::-;51994:13;:11;:13::i;:::-;49033:1:::1;49631:7;;:19;;49623:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49033:1;49764:7;:18;;;;57494:12:::2;57512:15;;;;;;;;;;;:20;;57540:21;57512:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57493:73;;;57585:7;57577:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;57482:139;48989:1:::1;49943:7;:22;;;;57425:196::o:0;54043: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;56082:225::-;56155:13;56189:16;56197:7;56189;:16::i;:::-;56181:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56289:7;56275:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56082:225;;;:::o;53888:30::-;;;;:::o;54311:48::-;;;;;;;;;;;;;;;;;:::o;55253:334::-;54868:6;;;;;;;;;;;54867:7;54859:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54957:10;54944:23;;:9;:23;;;54936:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55028:9;;55023:1;55007:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;54999:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;55140:1;55112:13;:25;55126:10;55112:25;;;;;;;;;;;;;;;;:29;55104:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55348:2:::1;55352;55356;54670:44;54691:10;54703:2;54707;54711;54670:20;:44::i;:::-;54662:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;55398:18:::2;;55379:15;:37;;:79;;;;;55439:19;;55420:15;:38;;55379:79;55371:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;55515:24;55525:10;55537:1;55515:9;:24::i;:::-;55578:1;55550:13;:25;55564:10;55550:25;;;;;;;;;;;;;;;:29;;;;55183:1:::1;;;55253:334:::0;;;:::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;52273:132::-;52348:12;:10;:12::i;:::-;52337:23;;:7;:5;:7::i;:::-;:23;;;52329:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52273:132::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;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;43073:147::-;43210:6;43073:147;;;;;:::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;23846:322::-;23916:14;24147:1;24137:8;24134:15;24109:23;24105:45;24095:55;;23846:322;;;:::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:761::-;5785:6;5793;5801;5809;5858:3;5846:9;5837:7;5833:23;5829:33;5826:120;;;5865:79;;:::i;:::-;5826:120;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;6112:2;6138:51;6181:7;6172:6;6161:9;6157:22;6138:51;:::i;:::-;6128:61;;6083:116;6238:2;6264:53;6309:7;6300:6;6289:9;6285:22;6264:53;:::i;:::-;6254:63;;6209:118;6366:2;6392:53;6437:7;6428:6;6417:9;6413:22;6392:53;:::i;:::-;6382:63;;6337:118;5701:761;;;;;;;:::o;6468:323::-;6524:6;6573:2;6561:9;6552:7;6548:23;6544:32;6541:119;;;6579:79;;:::i;:::-;6541:119;6699:1;6724:50;6766:7;6757:6;6746:9;6742:22;6724:50;:::i;:::-;6714:60;;6670:114;6468:323;;;;:::o;6797:327::-;6855:6;6904:2;6892:9;6883:7;6879:23;6875:32;6872:119;;;6910:79;;:::i;:::-;6872:119;7030:1;7055:52;7099:7;7090:6;7079:9;7075:22;7055:52;:::i;:::-;7045:62;;7001:116;6797:327;;;;:::o;7130:349::-;7199:6;7248:2;7236:9;7227:7;7223:23;7219:32;7216:119;;;7254:79;;:::i;:::-;7216:119;7374:1;7399:63;7454:7;7445:6;7434:9;7430:22;7399:63;:::i;:::-;7389:73;;7345:127;7130:349;;;;:::o;7485:529::-;7556:6;7564;7613:2;7601:9;7592:7;7588:23;7584:32;7581:119;;;7619:79;;:::i;:::-;7581:119;7767:1;7756:9;7752:17;7739:31;7797:18;7789:6;7786:30;7783:117;;;7819:79;;:::i;:::-;7783:117;7932:65;7989:7;7980:6;7969:9;7965:22;7932:65;:::i;:::-;7914:83;;;;7710:297;7485:529;;;;;:::o;8020:329::-;8079:6;8128:2;8116:9;8107:7;8103:23;8099:32;8096:119;;;8134:79;;:::i;:::-;8096:119;8254:1;8279:53;8324:7;8315:6;8304:9;8300:22;8279:53;:::i;:::-;8269:63;;8225:117;8020:329;;;;:::o;8355:619::-;8432:6;8440;8448;8497:2;8485:9;8476:7;8472:23;8468:32;8465:119;;;8503:79;;:::i;:::-;8465:119;8623:1;8648:53;8693:7;8684:6;8673:9;8669:22;8648:53;:::i;:::-;8638:63;;8594:117;8750:2;8776:53;8821:7;8812:6;8801:9;8797:22;8776:53;:::i;:::-;8766:63;;8721:118;8878:2;8904:53;8949:7;8940:6;8929:9;8925:22;8904:53;:::i;:::-;8894:63;;8849:118;8355:619;;;;;:::o;8980:615::-;9055:6;9063;9071;9120:2;9108:9;9099:7;9095:23;9091:32;9088:119;;;9126:79;;:::i;:::-;9088:119;9246:1;9271:51;9314:7;9305:6;9294:9;9290:22;9271:51;:::i;:::-;9261:61;;9217:115;9371:2;9397:53;9442:7;9433:6;9422:9;9418:22;9397:53;:::i;:::-;9387:63;;9342:118;9499:2;9525:53;9570:7;9561:6;9550:9;9546:22;9525:53;:::i;:::-;9515:63;;9470:118;8980:615;;;;;:::o;9601:118::-;9688:24;9706:5;9688:24;:::i;:::-;9683:3;9676:37;9601:118;;:::o;9725:157::-;9830:45;9850:24;9868:5;9850:24;:::i;:::-;9830:45;:::i;:::-;9825:3;9818:58;9725:157;;:::o;9888:109::-;9969:21;9984:5;9969:21;:::i;:::-;9964:3;9957:34;9888:109;;:::o;10003:118::-;10090:24;10108:5;10090:24;:::i;:::-;10085:3;10078:37;10003:118;;:::o;10127:157::-;10232:45;10252:24;10270:5;10252:24;:::i;:::-;10232:45;:::i;:::-;10227:3;10220:58;10127:157;;:::o;10290:360::-;10376:3;10404:38;10436:5;10404:38;:::i;:::-;10458:70;10521:6;10516:3;10458:70;:::i;:::-;10451:77;;10537:52;10582:6;10577:3;10570:4;10563:5;10559:16;10537:52;:::i;:::-;10614:29;10636:6;10614:29;:::i;:::-;10609:3;10605:39;10598:46;;10380:270;10290:360;;;;:::o;10656:194::-;10773:70;10793:49;10836:5;10793:49;:::i;:::-;10773:70;:::i;:::-;10768:3;10761:83;10656:194;;:::o;10856:364::-;10944:3;10972:39;11005:5;10972:39;:::i;:::-;11027:71;11091:6;11086:3;11027:71;:::i;:::-;11020:78;;11107:52;11152:6;11147:3;11140:4;11133:5;11129:16;11107:52;:::i;:::-;11184:29;11206:6;11184:29;:::i;:::-;11179:3;11175:39;11168:46;;10948:272;10856:364;;;;:::o;11226:366::-;11368:3;11389:67;11453:2;11448:3;11389:67;:::i;:::-;11382:74;;11465:93;11554:3;11465:93;:::i;:::-;11583:2;11578:3;11574:12;11567:19;;11226:366;;;:::o;11598:402::-;11758:3;11779:85;11861:2;11856:3;11779:85;:::i;:::-;11772:92;;11873:93;11962:3;11873:93;:::i;:::-;11991:2;11986:3;11982:12;11975:19;;11598:402;;;:::o;12006:366::-;12148:3;12169:67;12233:2;12228:3;12169:67;:::i;:::-;12162:74;;12245:93;12334:3;12245:93;:::i;:::-;12363:2;12358:3;12354:12;12347:19;;12006:366;;;:::o;12378:::-;12520:3;12541:67;12605:2;12600:3;12541:67;:::i;:::-;12534:74;;12617:93;12706:3;12617:93;:::i;:::-;12735:2;12730:3;12726:12;12719:19;;12378:366;;;:::o;12750:::-;12892:3;12913:67;12977:2;12972:3;12913:67;:::i;:::-;12906:74;;12989:93;13078:3;12989:93;:::i;:::-;13107:2;13102:3;13098:12;13091:19;;12750:366;;;:::o;13122:::-;13264:3;13285:67;13349:2;13344:3;13285:67;:::i;:::-;13278:74;;13361:93;13450:3;13361:93;:::i;:::-;13479:2;13474:3;13470:12;13463:19;;13122:366;;;:::o;13494:::-;13636:3;13657:67;13721:2;13716:3;13657:67;:::i;:::-;13650:74;;13733:93;13822:3;13733:93;:::i;:::-;13851:2;13846:3;13842:12;13835:19;;13494:366;;;:::o;13866:::-;14008:3;14029:67;14093:2;14088:3;14029:67;:::i;:::-;14022:74;;14105:93;14194:3;14105:93;:::i;:::-;14223:2;14218:3;14214:12;14207:19;;13866:366;;;:::o;14238:::-;14380:3;14401:67;14465:2;14460:3;14401:67;:::i;:::-;14394:74;;14477:93;14566:3;14477:93;:::i;:::-;14595:2;14590:3;14586:12;14579:19;;14238:366;;;:::o;14610:::-;14752:3;14773:67;14837:2;14832:3;14773:67;:::i;:::-;14766:74;;14849:93;14938:3;14849:93;:::i;:::-;14967:2;14962:3;14958:12;14951:19;;14610:366;;;:::o;14982:398::-;15141:3;15162:83;15243:1;15238:3;15162:83;:::i;:::-;15155:90;;15254:93;15343:3;15254:93;:::i;:::-;15372:1;15367:3;15363:11;15356:18;;14982:398;;;:::o;15386:366::-;15528:3;15549:67;15613:2;15608:3;15549:67;:::i;:::-;15542:74;;15625:93;15714:3;15625:93;:::i;:::-;15743:2;15738:3;15734:12;15727:19;;15386:366;;;:::o;15758:::-;15900:3;15921:67;15985:2;15980:3;15921:67;:::i;:::-;15914:74;;15997:93;16086:3;15997:93;:::i;:::-;16115:2;16110:3;16106:12;16099:19;;15758:366;;;:::o;16130:::-;16272:3;16293:67;16357:2;16352:3;16293:67;:::i;:::-;16286:74;;16369:93;16458:3;16369:93;:::i;:::-;16487:2;16482:3;16478:12;16471:19;;16130:366;;;:::o;16502:118::-;16589:24;16607:5;16589:24;:::i;:::-;16584:3;16577:37;16502:118;;:::o;16626:112::-;16709:22;16725:5;16709:22;:::i;:::-;16704:3;16697:35;16626:112;;:::o;16744:421::-;16896:3;16911:87;16994:3;16985:6;16911:87;:::i;:::-;17023:2;17018:3;17014:12;17007:19;;17036:75;17107:3;17098:6;17036:75;:::i;:::-;17136:2;17131:3;17127:12;17120:19;;17156:3;17149:10;;16744:421;;;;;:::o;17171:522::-;17384:3;17406:148;17550:3;17406:148;:::i;:::-;17399:155;;17564:75;17635:3;17626:6;17564:75;:::i;:::-;17664:2;17659:3;17655:12;17648:19;;17684:3;17677:10;;17171:522;;;;:::o;17699:379::-;17883:3;17905:147;18048:3;17905:147;:::i;:::-;17898:154;;18069:3;18062:10;;17699:379;;;:::o;18084:222::-;18177:4;18215:2;18204:9;18200:18;18192:26;;18228:71;18296:1;18285:9;18281:17;18272:6;18228:71;:::i;:::-;18084:222;;;;:::o;18312:640::-;18507:4;18545:3;18534:9;18530:19;18522:27;;18559:71;18627:1;18616:9;18612:17;18603:6;18559:71;:::i;:::-;18640:72;18708:2;18697:9;18693:18;18684:6;18640:72;:::i;:::-;18722;18790:2;18779:9;18775:18;18766:6;18722:72;:::i;:::-;18841:9;18835:4;18831:20;18826:2;18815:9;18811:18;18804:48;18869:76;18940:4;18931:6;18869:76;:::i;:::-;18861:84;;18312:640;;;;;;;:::o;18958:210::-;19045:4;19083:2;19072:9;19068:18;19060:26;;19096:65;19158:1;19147:9;19143:17;19134:6;19096:65;:::i;:::-;18958:210;;;;:::o;19174:545::-;19347:4;19385:3;19374:9;19370:19;19362:27;;19399:71;19467:1;19456:9;19452:17;19443:6;19399:71;:::i;:::-;19480:68;19544:2;19533:9;19529:18;19520:6;19480:68;:::i;:::-;19558:72;19626:2;19615:9;19611:18;19602:6;19558:72;:::i;:::-;19640;19708:2;19697:9;19693:18;19684:6;19640:72;:::i;:::-;19174:545;;;;;;;:::o;19725:313::-;19838:4;19876:2;19865:9;19861:18;19853:26;;19925:9;19919:4;19915:20;19911:1;19900:9;19896:17;19889:47;19953:78;20026:4;20017:6;19953:78;:::i;:::-;19945:86;;19725:313;;;;:::o;20044:419::-;20210:4;20248:2;20237:9;20233:18;20225:26;;20297:9;20291:4;20287:20;20283:1;20272:9;20268:17;20261:47;20325:131;20451:4;20325:131;:::i;:::-;20317:139;;20044:419;;;:::o;20469:::-;20635:4;20673:2;20662:9;20658:18;20650:26;;20722:9;20716:4;20712:20;20708:1;20697:9;20693:17;20686:47;20750:131;20876:4;20750:131;:::i;:::-;20742:139;;20469:419;;;:::o;20894:::-;21060:4;21098:2;21087:9;21083:18;21075:26;;21147:9;21141:4;21137:20;21133:1;21122:9;21118:17;21111:47;21175:131;21301:4;21175:131;:::i;:::-;21167:139;;20894:419;;;:::o;21319:::-;21485:4;21523:2;21512:9;21508:18;21500:26;;21572:9;21566:4;21562:20;21558:1;21547:9;21543:17;21536:47;21600:131;21726:4;21600:131;:::i;:::-;21592:139;;21319:419;;;:::o;21744:::-;21910:4;21948:2;21937:9;21933:18;21925:26;;21997:9;21991:4;21987:20;21983:1;21972:9;21968:17;21961:47;22025:131;22151:4;22025:131;:::i;:::-;22017:139;;21744:419;;;:::o;22169:::-;22335:4;22373:2;22362:9;22358:18;22350:26;;22422:9;22416:4;22412:20;22408:1;22397:9;22393:17;22386:47;22450:131;22576:4;22450:131;:::i;:::-;22442:139;;22169:419;;;:::o;22594:::-;22760:4;22798:2;22787:9;22783:18;22775:26;;22847:9;22841:4;22837:20;22833:1;22822:9;22818:17;22811:47;22875:131;23001:4;22875:131;:::i;:::-;22867:139;;22594:419;;;:::o;23019:::-;23185:4;23223:2;23212:9;23208:18;23200:26;;23272:9;23266:4;23262:20;23258:1;23247:9;23243:17;23236:47;23300:131;23426:4;23300:131;:::i;:::-;23292:139;;23019:419;;;:::o;23444:::-;23610:4;23648:2;23637:9;23633:18;23625:26;;23697:9;23691:4;23687:20;23683:1;23672:9;23668:17;23661:47;23725:131;23851:4;23725:131;:::i;:::-;23717:139;;23444:419;;;:::o;23869:::-;24035:4;24073:2;24062:9;24058:18;24050:26;;24122:9;24116:4;24112:20;24108:1;24097:9;24093:17;24086:47;24150:131;24276:4;24150:131;:::i;:::-;24142:139;;23869:419;;;:::o;24294:::-;24460:4;24498:2;24487:9;24483:18;24475:26;;24547:9;24541:4;24537:20;24533:1;24522:9;24518:17;24511:47;24575:131;24701:4;24575:131;:::i;:::-;24567:139;;24294:419;;;:::o;24719:::-;24885:4;24923:2;24912:9;24908:18;24900:26;;24972:9;24966:4;24962:20;24958:1;24947:9;24943:17;24936:47;25000:131;25126:4;25000:131;:::i;:::-;24992:139;;24719:419;;;:::o;25144:222::-;25237:4;25275:2;25264:9;25260:18;25252:26;;25288:71;25356:1;25345:9;25341:17;25332:6;25288:71;:::i;:::-;25144:222;;;;:::o;25372:129::-;25406:6;25433:20;;:::i;:::-;25423:30;;25462:33;25490:4;25482:6;25462:33;:::i;:::-;25372:129;;;:::o;25507:75::-;25540:6;25573:2;25567:9;25557:19;;25507:75;:::o;25588:307::-;25649:4;25739:18;25731:6;25728:30;25725:56;;;25761:18;;:::i;:::-;25725:56;25799:29;25821:6;25799:29;:::i;:::-;25791:37;;25883:4;25877;25873:15;25865:23;;25588:307;;;:::o;25901:98::-;25952:6;25986:5;25980:12;25970:22;;25901:98;;;:::o;26005:99::-;26057:6;26091:5;26085:12;26075:22;;26005:99;;;:::o;26110:168::-;26193:11;26227:6;26222:3;26215:19;26267:4;26262:3;26258:14;26243:29;;26110:168;;;;:::o;26284:147::-;26385:11;26422:3;26407:18;;26284:147;;;;:::o;26437:169::-;26521:11;26555:6;26550:3;26543:19;26595:4;26590:3;26586:14;26571:29;;26437:169;;;;:::o;26612:148::-;26714:11;26751:3;26736:18;;26612:148;;;;:::o;26766:305::-;26806:3;26825:20;26843:1;26825:20;:::i;:::-;26820:25;;26859:20;26877:1;26859:20;:::i;:::-;26854:25;;27013:1;26945:66;26941:74;26938:1;26935:81;26932:107;;;27019:18;;:::i;:::-;26932:107;27063:1;27060;27056:9;27049:16;;26766:305;;;;:::o;27077:96::-;27114:7;27143:24;27161:5;27143:24;:::i;:::-;27132:35;;27077:96;;;:::o;27179:90::-;27213:7;27256:5;27249:13;27242:21;27231:32;;27179:90;;;:::o;27275:77::-;27312:7;27341:5;27330:16;;27275:77;;;:::o;27358:149::-;27394:7;27434:66;27427:5;27423:78;27412:89;;27358:149;;;:::o;27513:126::-;27550:7;27590:42;27583:5;27579:54;27568:65;;27513:126;;;:::o;27645:77::-;27682:7;27711:5;27700:16;;27645:77;;;:::o;27728:86::-;27763:7;27803:4;27796:5;27792:16;27781:27;;27728:86;;;:::o;27820:138::-;27882:9;27915:37;27946:5;27915:37;:::i;:::-;27902:50;;27820:138;;;:::o;27964:126::-;28014:9;28047:37;28078:5;28047:37;:::i;:::-;28034:50;;27964:126;;;:::o;28096:113::-;28146:9;28179:24;28197:5;28179:24;:::i;:::-;28166:37;;28096:113;;;:::o;28215:154::-;28299:6;28294:3;28289;28276:30;28361:1;28352:6;28347:3;28343:16;28336:27;28215:154;;;:::o;28375:307::-;28443:1;28453:113;28467:6;28464:1;28461:13;28453:113;;;28552:1;28547:3;28543:11;28537:18;28533:1;28528:3;28524:11;28517:39;28489:2;28486:1;28482:10;28477:15;;28453:113;;;28584:6;28581:1;28578:13;28575:101;;;28664:1;28655:6;28650:3;28646:16;28639:27;28575:101;28424:258;28375:307;;;:::o;28688:320::-;28732:6;28769:1;28763:4;28759:12;28749:22;;28816:1;28810:4;28806:12;28837:18;28827:81;;28893:4;28885:6;28881:17;28871:27;;28827:81;28955:2;28947:6;28944:14;28924:18;28921:38;28918:84;;;28974:18;;:::i;:::-;28918:84;28739:269;28688:320;;;:::o;29014:281::-;29097:27;29119:4;29097:27;:::i;:::-;29089:6;29085:40;29227:6;29215:10;29212:22;29191:18;29179:10;29176:34;29173:62;29170:88;;;29238:18;;:::i;:::-;29170:88;29278:10;29274:2;29267:22;29057:238;29014:281;;:::o;29301:100::-;29340:7;29369:26;29389:5;29369:26;:::i;:::-;29358:37;;29301:100;;;:::o;29407:79::-;29446:7;29475:5;29464:16;;29407:79;;;:::o;29492:94::-;29531:7;29560:20;29574:5;29560:20;:::i;:::-;29549:31;;29492:94;;;:::o;29592:180::-;29640:77;29637:1;29630:88;29737:4;29734:1;29727:15;29761:4;29758:1;29751:15;29778:180;29826:77;29823:1;29816:88;29923:4;29920:1;29913:15;29947:4;29944:1;29937:15;29964:180;30012:77;30009:1;30002:88;30109:4;30106:1;30099:15;30133:4;30130:1;30123:15;30150:117;30259:1;30256;30249:12;30273:117;30382:1;30379;30372:12;30396:117;30505:1;30502;30495:12;30519:117;30628:1;30625;30618:12;30642:117;30751:1;30748;30741:12;30765:117;30874:1;30871;30864:12;30888:102;30929:6;30980:2;30976:7;30971:2;30964:5;30960:14;30956:28;30946:38;;30888:102;;;:::o;30996:94::-;31029:8;31077:5;31073:2;31069:14;31048:35;;30996:94;;;:::o;31096:176::-;31236:28;31232:1;31224:6;31220:14;31213:52;31096:176;:::o;31278:214::-;31418:66;31414:1;31406:6;31402:14;31395:90;31278:214;:::o;31498:225::-;31638:34;31634:1;31626:6;31622:14;31615:58;31707:8;31702:2;31694:6;31690:15;31683:33;31498:225;:::o;31729:173::-;31869:25;31865:1;31857:6;31853:14;31846:49;31729:173;:::o;31908:182::-;32048:34;32044:1;32036:6;32032:14;32025:58;31908:182;:::o;32096:238::-;32236:34;32232:1;32224:6;32220:14;32213:58;32305:21;32300:2;32292:6;32288:15;32281:46;32096:238;:::o;32340:182::-;32480:34;32476:1;32468:6;32464:14;32457:58;32340:182;:::o;32528:299::-;32668:34;32664:1;32656:6;32652:14;32645:58;32737:34;32732:2;32724:6;32720:15;32713:59;32806:13;32801:2;32793:6;32789:15;32782:38;32528:299;:::o;32833:233::-;32973:34;32969:1;32961:6;32957:14;32950:58;33042:16;33037:2;33029:6;33025:15;33018:41;32833:233;:::o;33072:166::-;33212:18;33208:1;33200:6;33196:14;33189:42;33072:166;:::o;33244:114::-;;:::o;33364:166::-;33504:18;33500:1;33492:6;33488:14;33481:42;33364:166;:::o;33536:181::-;33676:33;33672:1;33664:6;33660:14;33653:57;33536:181;:::o;33723:235::-;33863:34;33859:1;33851:6;33847:14;33840:58;33932:18;33927:2;33919:6;33915:15;33908:43;33723:235;:::o;33964:122::-;34037:24;34055:5;34037:24;:::i;:::-;34030:5;34027:35;34017:63;;34076:1;34073;34066:12;34017:63;33964:122;:::o;34092:116::-;34162:21;34177:5;34162:21;:::i;:::-;34155:5;34152:32;34142:60;;34198:1;34195;34188:12;34142:60;34092:116;:::o;34214:122::-;34287:24;34305:5;34287:24;:::i;:::-;34280:5;34277:35;34267:63;;34326:1;34323;34316:12;34267:63;34214:122;:::o;34342:120::-;34414:23;34431:5;34414:23;:::i;:::-;34407:5;34404:34;34394:62;;34452:1;34449;34442:12;34394:62;34342:120;:::o;34468:122::-;34541:24;34559:5;34541:24;:::i;:::-;34534:5;34531:35;34521:63;;34580:1;34577;34570:12;34521:63;34468:122;:::o;34596:118::-;34667:22;34683:5;34667:22;:::i;:::-;34660:5;34657:33;34647:61;;34704:1;34701;34694:12;34647:61;34596:118;:::o

Swarm Source

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