Token Aesthetic Diversity

 

Overview ERC-721

Total Supply:
5 AEDV

Holders:
2 addresses
Balance
0 AEDV
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AestheticDiversity

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-14
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// 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 v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface 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);
}

// File: @openzeppelin/contracts/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/AestheticDiversity.sol

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









contract AestheticDiversity is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Pausable, IERC2981, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private _tokenIds;

    Counters.Counter private _mintCount;

    Counters.Counter private _giveawayCount;

    uint256 public maxMintable = 265;

    uint256 public maxTokens = 250;

    uint256 public maxGiveaway = 15;

    uint256 public royaltiesPercentage = 7;

    uint256 public mintPrice;

    address payable public payableAddressOne;

    address payable public payableAddressTwo;

    string private _defaultBaseURI;

    bool public salesAvailable;

    constructor() ERC721("Aesthetic Diversity", "AEDV") {
        salesAvailable = false;
        _tokenIds.increment();
        _pause();
    }

    function burn(uint256 tokenId) public {
        require(ownerOf(tokenId) == msg.sender, "You're not the owner");
        _burn(tokenId);
    }

    function mint(uint256 quantity) external payable whenNotPaused {
        uint256 amountMint = _mintCount.current();
        require(amountMint < maxMintable && ((amountMint + quantity) < maxMintable), "Mint limit exceeded!");
        require(salesAvailable, "Sales isn't public yet!");
        
        uint256 totalPrice = mintPrice * quantity;
        require(msg.value >= totalPrice, "Invalid amount!");

        payableAddressOne.transfer(totalPrice);

        uint256 tokenId = _tokenIds.current();
        for (uint256 i = 0; i < quantity; i++) {
            mintNFT(msg.sender, tokenId + i);
        }
    }

    function giveaway(address to, uint256 quantity) public onlyOwner {
        uint256 amountGiveaway = _giveawayCount.current();
        require(amountGiveaway < maxGiveaway && (amountGiveaway + quantity) < maxGiveaway, "Mint limit exceeded!");
        
        uint256 tokenId = _tokenIds.current();
        for (uint256 i = 0; i < quantity; i++) {
            giveNFT(to, tokenId + i);
        }
    }

    function mintNFT(address to, uint256 tokenId) internal {
        internalMint(to, tokenId);
        _mintCount.increment();
    }

    function giveNFT(address to, uint256 tokenId) internal {
        internalMint(to, tokenId);
        _giveawayCount.increment();
    }

    function internalMint(address to, uint256 tokenId) internal {
        require(tokenId <= maxTokens, "Token limit exceeded!");
        _safeMint(to, tokenId);
        _tokenIds.increment();
    }

    function togglePause() public onlyOwner {
        if (paused()) {
            _unpause();
        } else {
            _pause();
        }
    }

    function toggleSalesAvailable() public onlyOwner {
        salesAvailable = !salesAvailable;
    }

    function setBaseURI(string calldata newBaseURI) public onlyOwner {
        _defaultBaseURI = newBaseURI;
    }

    function setPayableAddressOne(address newAddress) public onlyOwner {
        payableAddressOne = payable(newAddress);
    }

    function setPayableAddressTwo(address newAddress) public onlyOwner {
        payableAddressTwo = payable(newAddress);
    }

    function setRoyaltiesPercentage(uint256 newPercentage) public onlyOwner {
        royaltiesPercentage = newPercentage;
    }

    function setMaxTokens(uint256 newMax) public onlyOwner {
        maxTokens = newMax;
    }

    function setMaxGiveaway(uint256 newMax) public onlyOwner {
        maxGiveaway = newMax;
        maxMintable = maxTokens - maxGiveaway;
    }

    function setMaxMintable(uint256 newMax) public onlyOwner {
        maxMintable = newMax;
        maxGiveaway = maxTokens - maxMintable;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"));
    }

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

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, IERC165, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override (IERC2981) returns (address receiver, uint256 royaltyAmount) {
        require(_exists(tokenId), "Token doesn't exists");
        uint256 royaltiesValue = (salePrice * royaltiesPercentage) / 100;
        return (payableAddressTwo, royaltiesValue);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddressOne","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddressTwo","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltiesPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":[],"name":"salesAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setPayableAddressOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setPayableAddressTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPercentage","type":"uint256"}],"name":"setRoyaltiesPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSalesAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

6080604052610109600f5560fa601055600f60115560076012553480156200002657600080fd5b506040518060400160405280601381526020017f41657374686574696320446976657273697479000000000000000000000000008152506040518060400160405280600481526020017f41454456000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ab929190620002fd565b508060019080519060200190620000c4929190620002fd565b5050506000600b60006101000a81548160ff02191690831515021790555062000102620000f66200014a60201b60201c565b6200015260201b60201c565b6000601760006101000a81548160ff02191690831515021790555062000134600c6200021860201b62001cbb1760201c565b620001446200022e60201b60201c565b620004f7565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b6200023e620002e660201b60201c565b1562000281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002789062000402565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002cd6200014a60201b60201c565b604051620002dc9190620003e5565b60405180910390a1565b6000600b60009054906101000a900460ff16905090565b8280546200030b9062000469565b90600052602060002090601f0160209004810192826200032f57600085556200037b565b82601f106200034a57805160ff19168380011785556200037b565b828001600101855582156200037b579182015b828111156200037a5782518255916020019190600101906200035d565b5b5090506200038a91906200038e565b5090565b5b80821115620003a95760008160009055506001016200038f565b5090565b620003b88162000435565b82525050565b6000620003cd60108362000424565b9150620003da82620004ce565b602082019050919050565b6000602082019050620003fc6000830184620003ad565b92915050565b600060208201905081810360008301526200041d81620003be565b9050919050565b600082825260208201905092915050565b6000620004428262000449565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200048257607f821691505b602082108114156200049957620004986200049f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b614d0080620005076000396000f3fe6080604052600436106102465760003560e01c80635c975abb11610139578063b19c167e116100b6578063e83157421161007a578063e83157421461086c578063e985e9c514610897578063f2fde38b146108d4578063f3f72d1c146108fd578063ff0b9b3014610914578063ffbb98641461093f57610246565b8063b19c167e14610799578063b88d4fde146107c4578063c4ae3168146107ed578063c87b56dd14610804578063cafa8dfe1461084157610246565b80638da5cb5b116100fd5780638da5cb5b146106d55780639466d2061461070057806395d89b4114610729578063a0712d6814610754578063a22cb4651461077057610246565b80635c975abb146105ee5780636352211e146106195780636817c76c1461065657806370a0823114610681578063715018a6146106be57610246565b80632a55205a116101c757806342842e0e1161018b57806342842e0e1461050b57806342966c6814610534578063459ba3ae1461055d5780634f6ccce71461058857806355f804b3146105c557610246565b80632a55205a146104135780632bf2dda2146104515780632f745c591461047a57806335e7b43e146104b75780633e16039c146104e257610246565b806311e776fe1161020e57806311e776fe1461034257806318160ddd1461036b5780632154dc391461039657806323b872dd146103c157806325d387b5146103ea57610246565b806301ffc9a71461024b578063050225ea1461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613755565b610968565b60405161027f9190613dd3565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613715565b61097a565b005b3480156102bd57600080fd5b506102c6610aa8565b6040516102d39190613dee565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe91906137fc565b610b3a565b6040516103109190613d28565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613715565b610bbf565b005b34801561034e57600080fd5b50610369600480360381019061036491906137fc565b610cd7565b005b34801561037757600080fd5b50610380610d5d565b60405161038d9190614150565b60405180910390f35b3480156103a257600080fd5b506103ab610d6a565b6040516103b89190614150565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e391906135ff565b610d70565b005b3480156103f657600080fd5b50610411600480360381019061040c91906137fc565b610dd0565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613829565b610e6c565b604051610448929190613daa565b60405180910390f35b34801561045d57600080fd5b5061047860048036038101906104739190613592565b610f05565b005b34801561048657600080fd5b506104a1600480360381019061049c9190613715565b610fc5565b6040516104ae9190614150565b60405180910390f35b3480156104c357600080fd5b506104cc61106a565b6040516104d99190613dd3565b60405180910390f35b3480156104ee57600080fd5b50610509600480360381019061050491906137fc565b61107d565b005b34801561051757600080fd5b50610532600480360381019061052d91906135ff565b611119565b005b34801561054057600080fd5b5061055b600480360381019061055691906137fc565b611139565b005b34801561056957600080fd5b506105726111bb565b60405161057f9190614150565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906137fc565b6111c1565b6040516105bc9190614150565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e791906137af565b611232565b005b3480156105fa57600080fd5b506106036112c4565b6040516106109190613dd3565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b91906137fc565b6112db565b60405161064d9190613d28565b60405180910390f35b34801561066257600080fd5b5061066b61138d565b6040516106789190614150565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190613592565b611393565b6040516106b59190614150565b60405180910390f35b3480156106ca57600080fd5b506106d361144b565b005b3480156106e157600080fd5b506106ea6114d3565b6040516106f79190613d28565b60405180910390f35b34801561070c57600080fd5b50610727600480360381019061072291906137fc565b6114fd565b005b34801561073557600080fd5b5061073e611583565b60405161074b9190613dee565b60405180910390f35b61076e600480360381019061076991906137fc565b611615565b005b34801561077c57600080fd5b50610797600480360381019061079291906136d5565b61181c565b005b3480156107a557600080fd5b506107ae611832565b6040516107bb9190613d43565b60405180910390f35b3480156107d057600080fd5b506107eb60048036038101906107e69190613652565b611858565b005b3480156107f957600080fd5b506108026118ba565b005b34801561081057600080fd5b5061082b600480360381019061082691906137fc565b61195b565b6040516108389190613dee565b60405180910390f35b34801561084d57600080fd5b50610856611995565b6040516108639190614150565b60405180910390f35b34801561087857600080fd5b5061088161199b565b60405161088e9190614150565b60405180910390f35b3480156108a357600080fd5b506108be60048036038101906108b991906135bf565b6119a1565b6040516108cb9190613dd3565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f69190613592565b611a35565b005b34801561090957600080fd5b50610912611b2d565b005b34801561092057600080fd5b50610929611bd5565b6040516109369190613d43565b60405180910390f35b34801561094b57600080fd5b5061096660048036038101906109619190613592565b611bfb565b005b600061097382611cd1565b9050919050565b610982611d4b565b73ffffffffffffffffffffffffffffffffffffffff166109a06114d3565b73ffffffffffffffffffffffffffffffffffffffff16146109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed90614090565b60405180910390fd5b6000610a02600e611d53565b905060115481108015610a2157506011548282610a1f9190614204565b105b610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613fd0565b60405180910390fd5b6000610a6c600c611d53565b905060005b83811015610aa157610a8e858284610a899190614204565b611d61565b8080610a9990614444565b915050610a71565b5050505050565b606060008054610ab7906143e1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae3906143e1565b8015610b305780601f10610b0557610100808354040283529160200191610b30565b820191906000526020600020905b815481529060010190602001808311610b1357829003601f168201915b5050505050905090565b6000610b4582611d79565b610b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7b90614070565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bca826112db565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c32906140b0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c5a611d4b565b73ffffffffffffffffffffffffffffffffffffffff161480610c895750610c8881610c83611d4b565b6119a1565b5b610cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbf90613fb0565b60405180910390fd5b610cd28383611de5565b505050565b610cdf611d4b565b73ffffffffffffffffffffffffffffffffffffffff16610cfd6114d3565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614090565b60405180910390fd5b8060108190555050565b6000600880549050905090565b600f5481565b610d81610d7b611d4b565b82611e9e565b610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db7906140f0565b60405180910390fd5b610dcb838383611f7c565b505050565b610dd8611d4b565b73ffffffffffffffffffffffffffffffffffffffff16610df66114d3565b73ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4390614090565b60405180910390fd5b80600f81905550600f54601054610e6391906142e5565b60118190555050565b600080610e7884611d79565b610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae90613f50565b60405180910390fd5b6000606460125485610ec9919061428b565b610ed3919061425a565b9050601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b610f0d611d4b565b73ffffffffffffffffffffffffffffffffffffffff16610f2b6114d3565b73ffffffffffffffffffffffffffffffffffffffff1614610f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7890614090565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610fd083611393565b8210611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890613e70565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601760009054906101000a900460ff1681565b611085611d4b565b73ffffffffffffffffffffffffffffffffffffffff166110a36114d3565b73ffffffffffffffffffffffffffffffffffffffff16146110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090614090565b60405180910390fd5b8060118190555060115460105461111091906142e5565b600f8190555050565b61113483838360405180602001604052806000815250611858565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611159826112db565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690614130565b60405180910390fd5b6111b8816121e3565b50565b60115481565b60006111cb610d5d565b821061120c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120390614110565b60405180910390fd5b600882815481106112205761121f61457a565b5b90600052602060002001549050919050565b61123a611d4b565b73ffffffffffffffffffffffffffffffffffffffff166112586114d3565b73ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590614090565b60405180910390fd5b8181601691906112bf929190613380565b505050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137b90614010565b60405180910390fd5b80915050919050565b60135481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90613ff0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611453611d4b565b73ffffffffffffffffffffffffffffffffffffffff166114716114d3565b73ffffffffffffffffffffffffffffffffffffffff16146114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90614090565b60405180910390fd5b6114d160006121ef565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611505611d4b565b73ffffffffffffffffffffffffffffffffffffffff166115236114d3565b73ffffffffffffffffffffffffffffffffffffffff1614611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090614090565b60405180910390fd5b8060128190555050565b606060018054611592906143e1565b80601f01602080910402602001604051908101604052809291908181526020018280546115be906143e1565b801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b5050505050905090565b61161d6112c4565b1561165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165490613f90565b60405180910390fd5b6000611669600d611d53565b9050600f54811080156116885750600f5482826116869190614204565b105b6116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be90613fd0565b60405180910390fd5b601760009054906101000a900460ff16611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d90613e10565b60405180910390fd5b600082601354611726919061428b565b90508034101561176b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176290614050565b60405180910390fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117d3573d6000803e3d6000fd5b5060006117e0600c611d53565b905060005b84811015611815576118023382846117fd9190614204565b6122b5565b808061180d90614444565b9150506117e5565b5050505050565b61182e611827611d4b565b83836122cd565b5050565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611869611863611d4b565b83611e9e565b6118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f906140f0565b60405180910390fd5b6118b48484848461243a565b50505050565b6118c2611d4b565b73ffffffffffffffffffffffffffffffffffffffff166118e06114d3565b73ffffffffffffffffffffffffffffffffffffffff1614611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90614090565b60405180910390fd5b61193e6112c4565b156119505761194b612496565b611959565b611958612538565b5b565b60606119656125db565b61196e8361266d565b60405160200161197f929190613cf9565b6040516020818303038152906040529050919050565b60125481565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a3d611d4b565b73ffffffffffffffffffffffffffffffffffffffff16611a5b6114d3565b73ffffffffffffffffffffffffffffffffffffffff1614611ab1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa890614090565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1890613eb0565b60405180910390fd5b611b2a816121ef565b50565b611b35611d4b565b73ffffffffffffffffffffffffffffffffffffffff16611b536114d3565b73ffffffffffffffffffffffffffffffffffffffff1614611ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba090614090565b60405180910390fd5b601760009054906101000a900460ff1615601760006101000a81548160ff021916908315150217905550565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c03611d4b565b73ffffffffffffffffffffffffffffffffffffffff16611c216114d3565b73ffffffffffffffffffffffffffffffffffffffff1614611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90614090565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d445750611d43826127ce565b5b9050919050565b600033905090565b600081600001549050919050565b611d6b82826128b0565b611d75600e611cbb565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e58836112db565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ea982611d79565b611ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edf90613f70565b60405180910390fd5b6000611ef3836112db565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f6257508373ffffffffffffffffffffffffffffffffffffffff16611f4a84610b3a565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f735750611f7281856119a1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f9c826112db565b73ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990613ed0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205990613f10565b60405180910390fd5b61206d83838361290d565b612078600082611de5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c891906142e5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461211f9190614204565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121de83838361291d565b505050565b6121ec81612922565b50565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122bf82826128b0565b6122c9600d611cbb565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233390613f30565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161242d9190613dd3565b60405180910390a3505050565b612445848484611f7c565b61245184848484612975565b612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790613e90565b60405180910390fd5b50505050565b61249e6112c4565b6124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490613e50565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612521611d4b565b60405161252e9190613d28565b60405180910390a1565b6125406112c4565b15612580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257790613f90565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125c4611d4b565b6040516125d19190613d28565b60405180910390a1565b6060601680546125ea906143e1565b80601f0160208091040260200160405190810160405280929190818152602001828054612616906143e1565b80156126635780601f1061263857610100808354040283529160200191612663565b820191906000526020600020905b81548152906001019060200180831161264657829003601f168201915b5050505050905090565b606060008214156126b5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127c9565b600082905060005b600082146126e75780806126d090614444565b915050600a826126e0919061425a565b91506126bd565b60008167ffffffffffffffff811115612703576127026145a9565b5b6040519080825280601f01601f1916602001820160405280156127355781602001600182028036833780820191505090505b5090505b600085146127c25760018261274e91906142e5565b9150600a8561275d919061448d565b60306127699190614204565b60f81b81838151811061277f5761277e61457a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127bb919061425a565b9450612739565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061289957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806128a957506128a882612b0c565b5b9050919050565b6010548111156128f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ec906140d0565b60405180910390fd5b6128ff8282612b76565b612909600c611cbb565b5050565b612918838383612b94565b505050565b505050565b61292b81612bec565b6000600a6000838152602001908152602001600020805461294b906143e1565b90501461297257600a600082815260200190815260200160002060006129719190613406565b5b50565b60006129968473ffffffffffffffffffffffffffffffffffffffff16612d09565b15612aff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129bf611d4b565b8786866040518563ffffffff1660e01b81526004016129e19493929190613d5e565b602060405180830381600087803b1580156129fb57600080fd5b505af1925050508015612a2c57506040513d601f19601f82011682018060405250810190612a299190613782565b60015b612aaf573d8060008114612a5c576040519150601f19603f3d011682016040523d82523d6000602084013e612a61565b606091505b50600081511415612aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9e90613e90565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b04565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b90828260405180602001604052806000815250612d2c565b5050565b612b9f838383612d87565b612ba76112c4565b15612be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bde90613e30565b60405180910390fd5b505050565b6000612bf7826112db565b9050612c058160008461290d565b612c10600083611de5565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6091906142e5565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d058160008461291d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b612d368383612e9b565b612d436000848484612975565b612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990613e90565b60405180910390fd5b505050565b612d92838383613075565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612dd557612dd08161307a565b612e14565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e1357612e1283826130c3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e5757612e5281613230565b612e96565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e9557612e948282613301565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0290614030565b60405180910390fd5b612f1481611d79565b15612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b90613ef0565b60405180910390fd5b612f606000838361290d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fb09190614204565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130716000838361291d565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130d084611393565b6130da91906142e5565b90506000600760008481526020019081526020016000205490508181146131bf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061324491906142e5565b90506000600960008481526020019081526020016000205490506000600883815481106132745761327361457a565b5b9060005260206000200154905080600883815481106132965761329561457a565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132e5576132e461454b565b5b6001900381819060005260206000200160009055905550505050565b600061330c83611393565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461338c906143e1565b90600052602060002090601f0160209004810192826133ae57600085556133f5565b82601f106133c757803560ff19168380011785556133f5565b828001600101855582156133f5579182015b828111156133f45782358255916020019190600101906133d9565b5b5090506134029190613446565b5090565b508054613412906143e1565b6000825580601f106134245750613443565b601f0160209004906000526020600020908101906134429190613446565b5b50565b5b8082111561345f576000816000905550600101613447565b5090565b600061347661347184614190565b61416b565b905082815260208101848484011115613492576134916145e7565b5b61349d84828561439f565b509392505050565b6000813590506134b481614c6e565b92915050565b6000813590506134c981614c85565b92915050565b6000813590506134de81614c9c565b92915050565b6000815190506134f381614c9c565b92915050565b600082601f83011261350e5761350d6145dd565b5b813561351e848260208601613463565b91505092915050565b60008083601f84011261353d5761353c6145dd565b5b8235905067ffffffffffffffff81111561355a576135596145d8565b5b602083019150836001820283011115613576576135756145e2565b5b9250929050565b60008135905061358c81614cb3565b92915050565b6000602082840312156135a8576135a76145f1565b5b60006135b6848285016134a5565b91505092915050565b600080604083850312156135d6576135d56145f1565b5b60006135e4858286016134a5565b92505060206135f5858286016134a5565b9150509250929050565b600080600060608486031215613618576136176145f1565b5b6000613626868287016134a5565b9350506020613637868287016134a5565b92505060406136488682870161357d565b9150509250925092565b6000806000806080858703121561366c5761366b6145f1565b5b600061367a878288016134a5565b945050602061368b878288016134a5565b935050604061369c8782880161357d565b925050606085013567ffffffffffffffff8111156136bd576136bc6145ec565b5b6136c9878288016134f9565b91505092959194509250565b600080604083850312156136ec576136eb6145f1565b5b60006136fa858286016134a5565b925050602061370b858286016134ba565b9150509250929050565b6000806040838503121561372c5761372b6145f1565b5b600061373a858286016134a5565b925050602061374b8582860161357d565b9150509250929050565b60006020828403121561376b5761376a6145f1565b5b6000613779848285016134cf565b91505092915050565b600060208284031215613798576137976145f1565b5b60006137a6848285016134e4565b91505092915050565b600080602083850312156137c6576137c56145f1565b5b600083013567ffffffffffffffff8111156137e4576137e36145ec565b5b6137f085828601613527565b92509250509250929050565b600060208284031215613812576138116145f1565b5b60006138208482850161357d565b91505092915050565b600080604083850312156138405761383f6145f1565b5b600061384e8582860161357d565b925050602061385f8582860161357d565b9150509250929050565b6138728161432b565b82525050565b61388181614319565b82525050565b6138908161433d565b82525050565b60006138a1826141c1565b6138ab81856141d7565b93506138bb8185602086016143ae565b6138c4816145f6565b840191505092915050565b60006138da826141cc565b6138e481856141e8565b93506138f48185602086016143ae565b6138fd816145f6565b840191505092915050565b6000613913826141cc565b61391d81856141f9565b935061392d8185602086016143ae565b80840191505092915050565b60006139466017836141e8565b915061395182614607565b602082019050919050565b6000613969602b836141e8565b915061397482614630565b604082019050919050565b600061398c6014836141e8565b91506139978261467f565b602082019050919050565b60006139af602b836141e8565b91506139ba826146a8565b604082019050919050565b60006139d26032836141e8565b91506139dd826146f7565b604082019050919050565b60006139f56026836141e8565b9150613a0082614746565b604082019050919050565b6000613a186025836141e8565b9150613a2382614795565b604082019050919050565b6000613a3b601c836141e8565b9150613a46826147e4565b602082019050919050565b6000613a5e6024836141e8565b9150613a698261480d565b604082019050919050565b6000613a816019836141e8565b9150613a8c8261485c565b602082019050919050565b6000613aa46014836141e8565b9150613aaf82614885565b602082019050919050565b6000613ac7602c836141e8565b9150613ad2826148ae565b604082019050919050565b6000613aea6010836141e8565b9150613af5826148fd565b602082019050919050565b6000613b0d6038836141e8565b9150613b1882614926565b604082019050919050565b6000613b306014836141e8565b9150613b3b82614975565b602082019050919050565b6000613b53602a836141e8565b9150613b5e8261499e565b604082019050919050565b6000613b766029836141e8565b9150613b81826149ed565b604082019050919050565b6000613b996020836141e8565b9150613ba482614a3c565b602082019050919050565b6000613bbc600f836141e8565b9150613bc782614a65565b602082019050919050565b6000613bdf602c836141e8565b9150613bea82614a8e565b604082019050919050565b6000613c026005836141f9565b9150613c0d82614add565b600582019050919050565b6000613c256020836141e8565b9150613c3082614b06565b602082019050919050565b6000613c486021836141e8565b9150613c5382614b2f565b604082019050919050565b6000613c6b6015836141e8565b9150613c7682614b7e565b602082019050919050565b6000613c8e6031836141e8565b9150613c9982614ba7565b604082019050919050565b6000613cb1602c836141e8565b9150613cbc82614bf6565b604082019050919050565b6000613cd46014836141e8565b9150613cdf82614c45565b602082019050919050565b613cf381614395565b82525050565b6000613d058285613908565b9150613d118284613908565b9150613d1c82613bf5565b91508190509392505050565b6000602082019050613d3d6000830184613878565b92915050565b6000602082019050613d586000830184613869565b92915050565b6000608082019050613d736000830187613878565b613d806020830186613878565b613d8d6040830185613cea565b8181036060830152613d9f8184613896565b905095945050505050565b6000604082019050613dbf6000830185613878565b613dcc6020830184613cea565b9392505050565b6000602082019050613de86000830184613887565b92915050565b60006020820190508181036000830152613e0881846138cf565b905092915050565b60006020820190508181036000830152613e2981613939565b9050919050565b60006020820190508181036000830152613e498161395c565b9050919050565b60006020820190508181036000830152613e698161397f565b9050919050565b60006020820190508181036000830152613e89816139a2565b9050919050565b60006020820190508181036000830152613ea9816139c5565b9050919050565b60006020820190508181036000830152613ec9816139e8565b9050919050565b60006020820190508181036000830152613ee981613a0b565b9050919050565b60006020820190508181036000830152613f0981613a2e565b9050919050565b60006020820190508181036000830152613f2981613a51565b9050919050565b60006020820190508181036000830152613f4981613a74565b9050919050565b60006020820190508181036000830152613f6981613a97565b9050919050565b60006020820190508181036000830152613f8981613aba565b9050919050565b60006020820190508181036000830152613fa981613add565b9050919050565b60006020820190508181036000830152613fc981613b00565b9050919050565b60006020820190508181036000830152613fe981613b23565b9050919050565b6000602082019050818103600083015261400981613b46565b9050919050565b6000602082019050818103600083015261402981613b69565b9050919050565b6000602082019050818103600083015261404981613b8c565b9050919050565b6000602082019050818103600083015261406981613baf565b9050919050565b6000602082019050818103600083015261408981613bd2565b9050919050565b600060208201905081810360008301526140a981613c18565b9050919050565b600060208201905081810360008301526140c981613c3b565b9050919050565b600060208201905081810360008301526140e981613c5e565b9050919050565b6000602082019050818103600083015261410981613c81565b9050919050565b6000602082019050818103600083015261412981613ca4565b9050919050565b6000602082019050818103600083015261414981613cc7565b9050919050565b60006020820190506141656000830184613cea565b92915050565b6000614175614186565b90506141818282614413565b919050565b6000604051905090565b600067ffffffffffffffff8211156141ab576141aa6145a9565b5b6141b4826145f6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061420f82614395565b915061421a83614395565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561424f5761424e6144be565b5b828201905092915050565b600061426582614395565b915061427083614395565b9250826142805761427f6144ed565b5b828204905092915050565b600061429682614395565b91506142a183614395565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142da576142d96144be565b5b828202905092915050565b60006142f082614395565b91506142fb83614395565b92508282101561430e5761430d6144be565b5b828203905092915050565b600061432482614375565b9050919050565b600061433682614375565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143cc5780820151818401526020810190506143b1565b838111156143db576000848401525b50505050565b600060028204905060018216806143f957607f821691505b6020821081141561440d5761440c61451c565b5b50919050565b61441c826145f6565b810181811067ffffffffffffffff8211171561443b5761443a6145a9565b5b80604052505050565b600061444f82614395565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614482576144816144be565b5b600182019050919050565b600061449882614395565b91506144a383614395565b9250826144b3576144b26144ed565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53616c65732069736e2774207075626c69632079657421000000000000000000600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f65736e277420657869737473000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d696e74206c696d697420657863656564656421000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f496e76616c696420616d6f756e74210000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e206c696d6974206578636565646564210000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f75277265206e6f7420746865206f776e6572000000000000000000000000600082015250565b614c7781614319565b8114614c8257600080fd5b50565b614c8e8161433d565b8114614c9957600080fd5b50565b614ca581614349565b8114614cb057600080fd5b50565b614cbc81614395565b8114614cc757600080fd5b5056fea2646970667358221220cc780902b4be03e0d1eeceea4510d2c766c3c1d4bc512a7a5936e610e11c079764736f6c63430008070033

Deployed ByteCode Sourcemap

53380:4913:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57765:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55020:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30967:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32526:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32049:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56712:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47752:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53707:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33276:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56964:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57953:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;56445:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47420:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54044:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56812:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33686:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54231:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53787:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47942:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56192:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8144:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30661:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53874:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30391:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56578:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31136:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54384:628;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32819:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53907:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33942:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55926:150;;;;;;;;;;;;;:::i;:::-;;57116:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53827:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53748:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33045:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56084:100;;;;;;;;;;;;;:::i;:::-;;53956:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56312:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57765:180;57877:4;57901:36;57925:11;57901:23;:36::i;:::-;57894:43;;57765:180;;;:::o;55020:408::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55096:22:::1;55121:24;:14;:22;:24::i;:::-;55096:49;;55181:11;;55164:14;:28;:73;;;;;55226:11;;55214:8;55197:14;:25;;;;:::i;:::-;55196:41;55164:73;55156:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;55283:15;55301:19;:9;:17;:19::i;:::-;55283:37;;55336:9;55331:90;55355:8;55351:1;:12;55331:90;;;55385:24;55393:2;55407:1;55397:7;:11;;;;:::i;:::-;55385:7;:24::i;:::-;55365:3;;;;;:::i;:::-;;;;55331:90;;;;55085:343;;55020:408:::0;;:::o;30967:100::-;31021:13;31054:5;31047:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30967:100;:::o;32526:221::-;32602:7;32630:16;32638:7;32630;:16::i;:::-;32622:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32715:15;:24;32731:7;32715:24;;;;;;;;;;;;;;;;;;;;;32708:31;;32526:221;;;:::o;32049:411::-;32130:13;32146:23;32161:7;32146:14;:23::i;:::-;32130:39;;32194:5;32188:11;;:2;:11;;;;32180:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32288:5;32272:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32297:37;32314:5;32321:12;:10;:12::i;:::-;32297:16;:37::i;:::-;32272:62;32250:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32431:21;32440:2;32444:7;32431:8;:21::i;:::-;32119:341;32049:411;;:::o;56712:92::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56790:6:::1;56778:9;:18;;;;56712:92:::0;:::o;47752:113::-;47813:7;47840:10;:17;;;;47833:24;;47752:113;:::o;53707:32::-;;;;:::o;33276:339::-;33471:41;33490:12;:10;:12::i;:::-;33504:7;33471:18;:41::i;:::-;33463:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33579:28;33589:4;33595:2;33599:7;33579:9;:28::i;:::-;33276:339;;;:::o;56964:144::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57046:6:::1;57032:11;:20;;;;57089:11;;57077:9;;:23;;;;:::i;:::-;57063:11;:37;;;;56964:144:::0;:::o;57953:337::-;58053:16;58071:21;58113:16;58121:7;58113;:16::i;:::-;58105:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;58165:22;58226:3;58203:19;;58191:9;:31;;;;:::i;:::-;58190:39;;;;:::i;:::-;58165:64;;58248:17;;;;;;;;;;;58267:14;58240:42;;;;;57953:337;;;;;:::o;56445:125::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56551:10:::1;56523:17;;:39;;;;;;;;;;;;;;;;;;56445:125:::0;:::o;47420:256::-;47517:7;47553:23;47570:5;47553:16;:23::i;:::-;47545:5;:31;47537:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47642:12;:19;47655:5;47642:19;;;;;;;;;;;;;;;:26;47662:5;47642:26;;;;;;;;;;;;47635:33;;47420:256;;;;:::o;54044:26::-;;;;;;;;;;;;;:::o;56812:144::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56894:6:::1;56880:11;:20;;;;56937:11;;56925:9;;:23;;;;:::i;:::-;56911:11;:37;;;;56812:144:::0;:::o;33686:185::-;33824:39;33841:4;33847:2;33851:7;33824:39;;;;;;;;;;;;:16;:39::i;:::-;33686:185;;;:::o;54231:145::-;54308:10;54288:30;;:16;54296:7;54288;:16::i;:::-;:30;;;54280:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54354:14;54360:7;54354:5;:14::i;:::-;54231:145;:::o;53787:31::-;;;;:::o;47942:233::-;48017:7;48053:30;:28;:30::i;:::-;48045:5;:38;48037:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48150:10;48161:5;48150:17;;;;;;;;:::i;:::-;;;;;;;;;;48143:24;;47942:233;;;:::o;56192:112::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56286:10:::1;;56268:15;:28;;;;;;;:::i;:::-;;56192:112:::0;;:::o;8144:86::-;8191:4;8215:7;;;;;;;;;;;8208:14;;8144:86;:::o;30661:239::-;30733:7;30753:13;30769:7;:16;30777:7;30769:16;;;;;;;;;;;;;;;;;;;;;30753:32;;30821:1;30804:19;;:5;:19;;;;30796:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30887:5;30880:12;;;30661:239;;;:::o;53874:24::-;;;;:::o;30391:208::-;30463:7;30508:1;30491:19;;:5;:19;;;;30483:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30575:9;:16;30585:5;30575:16;;;;;;;;;;;;;;;;30568:23;;30391:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;56578:126::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56683:13:::1;56661:19;:35;;;;56578:126:::0;:::o;31136:104::-;31192:13;31225:7;31218:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31136:104;:::o;54384:628::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;54458:18:::1;54479:20;:10;:18;:20::i;:::-;54458:41;;54531:11;;54518:10;:24;:67;;;;;54573:11;;54561:8;54548:10;:21;;;;:::i;:::-;54547:37;54518:67;54510:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;54629:14;;;;;;;;;;;54621:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54692:18;54725:8;54713:9;;:20;;;;:::i;:::-;54692:41;;54765:10;54752:9;:23;;54744:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;54808:17;;;;;;;;;;;:26;;:38;54835:10;54808:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54859:15;54877:19;:9;:17;:19::i;:::-;54859:37;;54912:9;54907:98;54931:8;54927:1;:12;54907:98;;;54961:32;54969:10;54991:1;54981:7;:11;;;;:::i;:::-;54961:7;:32::i;:::-;54941:3;;;;;:::i;:::-;;;;54907:98;;;;54447:565;;;54384:628:::0;:::o;32819:155::-;32914:52;32933:12;:10;:12::i;:::-;32947:8;32957;32914:18;:52::i;:::-;32819:155;;:::o;53907:40::-;;;;;;;;;;;;;:::o;33942:328::-;34117:41;34136:12;:10;:12::i;:::-;34150:7;34117:18;:41::i;:::-;34109:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34223:39;34237:4;34243:2;34247:7;34256:5;34223:13;:39::i;:::-;33942:328;;;;:::o;55926:150::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55981:8:::1;:6;:8::i;:::-;55977:92;;;56006:10;:8;:10::i;:::-;55977:92;;;56049:8;:6;:8::i;:::-;55977:92;55926:150::o:0;57116:197::-;57207:13;57264:10;:8;:10::i;:::-;57276:18;:7;:16;:18::i;:::-;57247:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57233:72;;57116:197;;;:::o;53827:38::-;;;;:::o;53748:30::-;;;;:::o;33045:164::-;33142:4;33166:18;:25;33185:5;33166:25;;;;;;;;;;;;;;;:35;33192:8;33166:35;;;;;;;;;;;;;;;;;;;;;;;;;33159:42;;33045:164;;;;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;56084:100::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56162:14:::1;;;;;;;;;;;56161:15;56144:14;;:32;;;;;;;;;;;;;;;;;;56084:100::o:0;53956:40::-;;;;;;;;;;;;;:::o;56312:125::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56418:10:::1;56390:17;;:39;;;;;;;;;;;;;;;;;;56312:125:::0;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;47112:224::-;47214:4;47253:35;47238:50;;;:11;:50;;;;:90;;;;47292:36;47316:11;47292:23;:36::i;:::-;47238:90;47231:97;;47112:224;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;55576:136::-;55642:25;55655:2;55659:7;55642:12;:25::i;:::-;55678:26;:14;:24;:26::i;:::-;55576:136;;:::o;35780:127::-;35845:4;35897:1;35869:30;;:7;:16;35877:7;35869:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35862:37;;35780:127;;;:::o;39926:174::-;40028:2;40001:15;:24;40017:7;40001:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40084:7;40080:2;40046:46;;40055:23;40070:7;40055:14;:23::i;:::-;40046:46;;;;;;;;;;;;39926:174;;:::o;36074:348::-;36167:4;36192:16;36200:7;36192;:16::i;:::-;36184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36268:13;36284:23;36299:7;36284:14;:23::i;:::-;36268:39;;36337:5;36326:16;;:7;:16;;;:51;;;;36370:7;36346:31;;:20;36358:7;36346:11;:20::i;:::-;:31;;;36326:51;:87;;;;36381:32;36398:5;36405:7;36381:16;:32::i;:::-;36326:87;36318:96;;;36074:348;;;;:::o;39183:625::-;39342:4;39315:31;;:23;39330:7;39315:14;:23::i;:::-;:31;;;39307:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39421:1;39407:16;;:2;:16;;;;39399:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39477:39;39498:4;39504:2;39508:7;39477:20;:39::i;:::-;39581:29;39598:1;39602:7;39581:8;:29::i;:::-;39642:1;39623:9;:15;39633:4;39623:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39671:1;39654:9;:13;39664:2;39654:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39702:2;39683:7;:16;39691:7;39683:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39741:7;39737:2;39722:27;;39731:4;39722:27;;;;;;;;;;;;39762:38;39782:4;39788:2;39792:7;39762:19;:38::i;:::-;39183:625;;;:::o;57437:115::-;57524:20;57536:7;57524:11;:20::i;:::-;57437:115;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;55436:132::-;55502:25;55515:2;55519:7;55502:12;:25::i;:::-;55538:22;:10;:20;:22::i;:::-;55436:132;;:::o;40242:315::-;40397:8;40388:17;;:5;:17;;;;40380:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40484:8;40446:18;:25;40465:5;40446:25;;;;;;;;;;;;;;;:35;40472:8;40446:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40530:8;40508:41;;40523:5;40508:41;;;40540:8;40508:41;;;;;;:::i;:::-;;;;;;;;40242:315;;;:::o;35152:::-;35309:28;35319:4;35325:2;35329:7;35309:9;:28::i;:::-;35356:48;35379:4;35385:2;35389:7;35398:5;35356:22;:48::i;:::-;35348:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35152:315;;;;:::o;9203:120::-;8747:8;:6;:8::i;:::-;8739:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;9272:5:::1;9262:7;;:15;;;;;;;;;;;;;;;;;;9293:22;9302:12;:10;:12::i;:::-;9293:22;;;;;;:::i;:::-;;;;;;;;9203:120::o:0;8944:118::-;8470:8;:6;:8::i;:::-;8469:9;8461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9014:4:::1;9004:7;;:14;;;;;;;;;;;;;;;;;;9034:20;9041:12;:10;:12::i;:::-;9034:20;;;;;;:::i;:::-;;;;;;;;8944:118::o:0;57321:108::-;57373:13;57406:15;57399:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57321:108;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;30022:305::-;30124:4;30176:25;30161:40;;;:11;:40;;;;:105;;;;30233:33;30218:48;;;:11;:48;;;;30161:105;:158;;;;30283:36;30307:11;30283:23;:36::i;:::-;30161:158;30141:178;;30022:305;;;:::o;55720:198::-;55810:9;;55799:7;:20;;55791:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;55856:22;55866:2;55870:7;55856:9;:22::i;:::-;55889:21;:9;:19;:21::i;:::-;55720:198;;:::o;57560:197::-;57704:45;57731:4;57737:2;57741:7;57704:26;:45::i;:::-;57560:197;;;:::o;43004:125::-;;;;:::o;45888:206::-;45957:20;45969:7;45957:11;:20::i;:::-;46031:1;46000:10;:19;46011:7;46000:19;;;;;;;;;;;45994:33;;;;;:::i;:::-;;;:38;45990:97;;46056:10;:19;46067:7;46056:19;;;;;;;;;;;;46049:26;;;;:::i;:::-;45990:97;45888:206;:::o;41122:799::-;41277:4;41298:15;:2;:13;;;:15::i;:::-;41294:620;;;41350:2;41334:36;;;41371:12;:10;:12::i;:::-;41385:4;41391:7;41400:5;41334:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41330:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41593:1;41576:6;:13;:18;41572:272;;;41619:60;;;;;;;;;;:::i;:::-;;;;;;;;41572:272;41794:6;41788:13;41779:6;41775:2;41771:15;41764:38;41330:529;41467:41;;;41457:51;;;:6;:51;;;;41450:58;;;;;41294:620;41898:4;41891:11;;41122:799;;;;;;;:::o;21696:157::-;21781:4;21820:25;21805:40;;;:11;:40;;;;21798:47;;21696:157;;;:::o;36764:110::-;36840:26;36850:2;36854:7;36840:26;;;;;;;;;;;;:9;:26::i;:::-;36764:110;;:::o;43814:275::-;43958:45;43985:4;43991:2;43995:7;43958:26;:45::i;:::-;44025:8;:6;:8::i;:::-;44024:9;44016:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43814:275;;;:::o;38426:420::-;38486:13;38502:23;38517:7;38502:14;:23::i;:::-;38486:39;;38538:48;38559:5;38574:1;38578:7;38538:20;:48::i;:::-;38627:29;38644:1;38648:7;38627:8;:29::i;:::-;38689:1;38669:9;:16;38679:5;38669:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38708:7;:16;38716:7;38708:16;;;;;;;;;;;;38701:23;;;;;;;;;;;38770:7;38766:1;38742:36;;38751:5;38742:36;;;;;;;;;;;;38791:47;38811:5;38826:1;38830:7;38791:19;:47::i;:::-;38475:371;38426:420;:::o;10563:326::-;10623:4;10880:1;10858:7;:19;;;:23;10851:30;;10563:326;;;:::o;37101:321::-;37231:18;37237:2;37241:7;37231:5;:18::i;:::-;37282:54;37313:1;37317:2;37321:7;37330:5;37282:22;:54::i;:::-;37260:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37101:321;;;:::o;48788:589::-;48932:45;48959:4;48965:2;48969:7;48932:26;:45::i;:::-;49010:1;48994:18;;:4;:18;;;48990:187;;;49029:40;49061:7;49029:31;:40::i;:::-;48990:187;;;49099:2;49091:10;;:4;:10;;;49087:90;;49118:47;49151:4;49157:7;49118:32;:47::i;:::-;49087:90;48990:187;49205:1;49191:16;;:2;:16;;;49187:183;;;49224:45;49261:7;49224:36;:45::i;:::-;49187:183;;;49297:4;49291:10;;:2;:10;;;49287:83;;49318:40;49346:2;49350:7;49318:27;:40::i;:::-;49287:83;49187:183;48788:589;;;:::o;37758:439::-;37852:1;37838:16;;:2;:16;;;;37830:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37911:16;37919:7;37911;:16::i;:::-;37910:17;37902:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37973:45;38002:1;38006:2;38010:7;37973:20;:45::i;:::-;38048:1;38031:9;:13;38041:2;38031:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38079:2;38060:7;:16;38068:7;38060:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38124:7;38120:2;38099:33;;38116:1;38099:33;;;;;;;;;;;;38145:44;38173:1;38177:2;38181:7;38145:19;:44::i;:::-;37758:439;;:::o;42493:126::-;;;;:::o;50100:164::-;50204:10;:17;;;;50177:15;:24;50193:7;50177:24;;;;;;;;;;;:44;;;;50232:10;50248:7;50232:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50100:164;:::o;50891:988::-;51157:22;51207:1;51182:22;51199:4;51182:16;:22::i;:::-;:26;;;;:::i;:::-;51157:51;;51219:18;51240:17;:26;51258:7;51240:26;;;;;;;;;;;;51219:47;;51387:14;51373:10;:28;51369:328;;51418:19;51440:12;:18;51453:4;51440:18;;;;;;;;;;;;;;;:34;51459:14;51440:34;;;;;;;;;;;;51418:56;;51524:11;51491:12;:18;51504:4;51491:18;;;;;;;;;;;;;;;:30;51510:10;51491:30;;;;;;;;;;;:44;;;;51641:10;51608:17;:30;51626:11;51608:30;;;;;;;;;;;:43;;;;51403:294;51369:328;51793:17;:26;51811:7;51793:26;;;;;;;;;;;51786:33;;;51837:12;:18;51850:4;51837:18;;;;;;;;;;;;;;;:34;51856:14;51837:34;;;;;;;;;;;51830:41;;;50972:907;;50891:988;;:::o;52174:1079::-;52427:22;52472:1;52452:10;:17;;;;:21;;;;:::i;:::-;52427:46;;52484:18;52505:15;:24;52521:7;52505:24;;;;;;;;;;;;52484:45;;52856:19;52878:10;52889:14;52878:26;;;;;;;;:::i;:::-;;;;;;;;;;52856:48;;52942:11;52917:10;52928;52917:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53053:10;53022:15;:28;53038:11;53022:28;;;;;;;;;;;:41;;;;53194:15;:24;53210:7;53194:24;;;;;;;;;;;53187:31;;;53229:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52245:1008;;;52174:1079;:::o;49678:221::-;49763:14;49780:20;49797:2;49780:16;:20::i;:::-;49763:37;;49838:7;49811:12;:16;49824:2;49811:16;;;;;;;;;;;;;;;:24;49828:6;49811:24;;;;;;;;;;;:34;;;;49885:6;49856:17;:26;49874:7;49856:26;;;;;;;;;;;:35;;;;49752:147;49678:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::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:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:474::-;7041:6;7049;7098:2;7086:9;7077:7;7073:23;7069:32;7066:119;;;7104:79;;:::i;:::-;7066:119;7224:1;7249:53;7294:7;7285:6;7274:9;7270:22;7249:53;:::i;:::-;7239:63;;7195:117;7351:2;7377:53;7422:7;7413:6;7402:9;7398:22;7377:53;:::i;:::-;7367:63;;7322:118;6973:474;;;;;:::o;7453:142::-;7556:32;7582:5;7556:32;:::i;:::-;7551:3;7544:45;7453:142;;:::o;7601:118::-;7688:24;7706:5;7688:24;:::i;:::-;7683:3;7676:37;7601:118;;:::o;7725:109::-;7806:21;7821:5;7806:21;:::i;:::-;7801:3;7794:34;7725:109;;:::o;7840:360::-;7926:3;7954:38;7986:5;7954:38;:::i;:::-;8008:70;8071:6;8066:3;8008:70;:::i;:::-;8001:77;;8087:52;8132:6;8127:3;8120:4;8113:5;8109:16;8087:52;:::i;:::-;8164:29;8186:6;8164:29;:::i;:::-;8159:3;8155:39;8148:46;;7930:270;7840:360;;;;:::o;8206:364::-;8294:3;8322:39;8355:5;8322:39;:::i;:::-;8377:71;8441:6;8436:3;8377:71;:::i;:::-;8370:78;;8457:52;8502:6;8497:3;8490:4;8483:5;8479:16;8457:52;:::i;:::-;8534:29;8556:6;8534:29;:::i;:::-;8529:3;8525:39;8518:46;;8298:272;8206:364;;;;:::o;8576:377::-;8682:3;8710:39;8743:5;8710:39;:::i;:::-;8765:89;8847:6;8842:3;8765:89;:::i;:::-;8758:96;;8863:52;8908:6;8903:3;8896:4;8889:5;8885:16;8863:52;:::i;:::-;8940:6;8935:3;8931:16;8924:23;;8686:267;8576:377;;;;:::o;8959:366::-;9101:3;9122:67;9186:2;9181:3;9122:67;:::i;:::-;9115:74;;9198:93;9287:3;9198:93;:::i;:::-;9316:2;9311:3;9307:12;9300:19;;8959:366;;;:::o;9331:::-;9473:3;9494:67;9558:2;9553:3;9494:67;:::i;:::-;9487:74;;9570:93;9659:3;9570:93;:::i;:::-;9688:2;9683:3;9679:12;9672:19;;9331:366;;;:::o;9703:::-;9845:3;9866:67;9930:2;9925:3;9866:67;:::i;:::-;9859:74;;9942:93;10031:3;9942:93;:::i;:::-;10060:2;10055:3;10051:12;10044:19;;9703:366;;;:::o;10075:::-;10217:3;10238:67;10302:2;10297:3;10238:67;:::i;:::-;10231:74;;10314:93;10403:3;10314:93;:::i;:::-;10432:2;10427:3;10423:12;10416:19;;10075:366;;;:::o;10447:::-;10589:3;10610:67;10674:2;10669:3;10610:67;:::i;:::-;10603:74;;10686:93;10775:3;10686:93;:::i;:::-;10804:2;10799:3;10795:12;10788:19;;10447:366;;;:::o;10819:::-;10961:3;10982:67;11046:2;11041:3;10982:67;:::i;:::-;10975:74;;11058:93;11147:3;11058:93;:::i;:::-;11176:2;11171:3;11167:12;11160:19;;10819:366;;;:::o;11191:::-;11333:3;11354:67;11418:2;11413:3;11354:67;:::i;:::-;11347:74;;11430:93;11519:3;11430:93;:::i;:::-;11548:2;11543:3;11539:12;11532:19;;11191:366;;;:::o;11563:::-;11705:3;11726:67;11790:2;11785:3;11726:67;:::i;:::-;11719:74;;11802:93;11891:3;11802:93;:::i;:::-;11920:2;11915:3;11911:12;11904:19;;11563:366;;;:::o;11935:::-;12077:3;12098:67;12162:2;12157:3;12098:67;:::i;:::-;12091:74;;12174:93;12263:3;12174:93;:::i;:::-;12292:2;12287:3;12283:12;12276:19;;11935:366;;;:::o;12307:::-;12449:3;12470:67;12534:2;12529:3;12470:67;:::i;:::-;12463:74;;12546:93;12635:3;12546:93;:::i;:::-;12664:2;12659:3;12655:12;12648:19;;12307:366;;;:::o;12679:::-;12821:3;12842:67;12906:2;12901:3;12842:67;:::i;:::-;12835:74;;12918:93;13007:3;12918:93;:::i;:::-;13036:2;13031:3;13027:12;13020:19;;12679:366;;;:::o;13051:::-;13193:3;13214:67;13278:2;13273:3;13214:67;:::i;:::-;13207:74;;13290:93;13379:3;13290:93;:::i;:::-;13408:2;13403:3;13399:12;13392:19;;13051:366;;;:::o;13423:::-;13565:3;13586:67;13650:2;13645:3;13586:67;:::i;:::-;13579:74;;13662:93;13751:3;13662:93;:::i;:::-;13780:2;13775:3;13771:12;13764:19;;13423:366;;;:::o;13795:::-;13937:3;13958:67;14022:2;14017:3;13958:67;:::i;:::-;13951:74;;14034:93;14123:3;14034:93;:::i;:::-;14152:2;14147:3;14143:12;14136:19;;13795:366;;;:::o;14167:::-;14309:3;14330:67;14394:2;14389:3;14330:67;:::i;:::-;14323:74;;14406:93;14495:3;14406:93;:::i;:::-;14524:2;14519:3;14515:12;14508:19;;14167:366;;;:::o;14539:::-;14681:3;14702:67;14766:2;14761:3;14702:67;:::i;:::-;14695:74;;14778:93;14867:3;14778:93;:::i;:::-;14896:2;14891:3;14887:12;14880:19;;14539:366;;;:::o;14911:::-;15053:3;15074:67;15138:2;15133:3;15074:67;:::i;:::-;15067:74;;15150:93;15239:3;15150:93;:::i;:::-;15268:2;15263:3;15259:12;15252:19;;14911:366;;;:::o;15283:::-;15425:3;15446:67;15510:2;15505:3;15446:67;:::i;:::-;15439:74;;15522:93;15611:3;15522:93;:::i;:::-;15640:2;15635:3;15631:12;15624:19;;15283:366;;;:::o;15655:::-;15797:3;15818:67;15882:2;15877:3;15818:67;:::i;:::-;15811:74;;15894:93;15983:3;15894:93;:::i;:::-;16012:2;16007:3;16003:12;15996:19;;15655:366;;;:::o;16027:::-;16169:3;16190:67;16254:2;16249:3;16190:67;:::i;:::-;16183:74;;16266:93;16355:3;16266:93;:::i;:::-;16384:2;16379:3;16375:12;16368:19;;16027:366;;;:::o;16399:400::-;16559:3;16580:84;16662:1;16657:3;16580:84;:::i;:::-;16573:91;;16673:93;16762:3;16673:93;:::i;:::-;16791:1;16786:3;16782:11;16775:18;;16399:400;;;:::o;16805:366::-;16947:3;16968:67;17032:2;17027:3;16968:67;:::i;:::-;16961:74;;17044:93;17133:3;17044:93;:::i;:::-;17162:2;17157:3;17153:12;17146:19;;16805:366;;;:::o;17177:::-;17319:3;17340:67;17404:2;17399:3;17340:67;:::i;:::-;17333:74;;17416:93;17505:3;17416:93;:::i;:::-;17534:2;17529:3;17525:12;17518:19;;17177:366;;;:::o;17549:::-;17691:3;17712:67;17776:2;17771:3;17712:67;:::i;:::-;17705:74;;17788:93;17877:3;17788:93;:::i;:::-;17906:2;17901:3;17897:12;17890:19;;17549:366;;;:::o;17921:::-;18063:3;18084:67;18148:2;18143:3;18084:67;:::i;:::-;18077:74;;18160:93;18249:3;18160:93;:::i;:::-;18278:2;18273:3;18269:12;18262:19;;17921:366;;;:::o;18293:::-;18435:3;18456:67;18520:2;18515:3;18456:67;:::i;:::-;18449:74;;18532:93;18621:3;18532:93;:::i;:::-;18650:2;18645:3;18641:12;18634:19;;18293:366;;;:::o;18665:::-;18807:3;18828:67;18892:2;18887:3;18828:67;:::i;:::-;18821:74;;18904:93;18993:3;18904:93;:::i;:::-;19022:2;19017:3;19013:12;19006:19;;18665:366;;;:::o;19037:118::-;19124:24;19142:5;19124:24;:::i;:::-;19119:3;19112:37;19037:118;;:::o;19161:701::-;19442:3;19464:95;19555:3;19546:6;19464:95;:::i;:::-;19457:102;;19576:95;19667:3;19658:6;19576:95;:::i;:::-;19569:102;;19688:148;19832:3;19688:148;:::i;:::-;19681:155;;19853:3;19846:10;;19161:701;;;;;:::o;19868:222::-;19961:4;19999:2;19988:9;19984:18;19976:26;;20012:71;20080:1;20069:9;20065:17;20056:6;20012:71;:::i;:::-;19868:222;;;;:::o;20096:254::-;20205:4;20243:2;20232:9;20228:18;20220:26;;20256:87;20340:1;20329:9;20325:17;20316:6;20256:87;:::i;:::-;20096:254;;;;:::o;20356:640::-;20551:4;20589:3;20578:9;20574:19;20566:27;;20603:71;20671:1;20660:9;20656:17;20647:6;20603:71;:::i;:::-;20684:72;20752:2;20741:9;20737:18;20728:6;20684:72;:::i;:::-;20766;20834:2;20823:9;20819:18;20810:6;20766:72;:::i;:::-;20885:9;20879:4;20875:20;20870:2;20859:9;20855:18;20848:48;20913:76;20984:4;20975:6;20913:76;:::i;:::-;20905:84;;20356:640;;;;;;;:::o;21002:332::-;21123:4;21161:2;21150:9;21146:18;21138:26;;21174:71;21242:1;21231:9;21227:17;21218:6;21174:71;:::i;:::-;21255:72;21323:2;21312:9;21308:18;21299:6;21255:72;:::i;:::-;21002:332;;;;;:::o;21340:210::-;21427:4;21465:2;21454:9;21450:18;21442:26;;21478:65;21540:1;21529:9;21525:17;21516:6;21478:65;:::i;:::-;21340:210;;;;:::o;21556:313::-;21669:4;21707:2;21696:9;21692:18;21684:26;;21756:9;21750:4;21746:20;21742:1;21731:9;21727:17;21720:47;21784:78;21857:4;21848:6;21784:78;:::i;:::-;21776:86;;21556:313;;;;:::o;21875:419::-;22041:4;22079:2;22068:9;22064:18;22056:26;;22128:9;22122:4;22118:20;22114:1;22103:9;22099:17;22092:47;22156:131;22282:4;22156:131;:::i;:::-;22148:139;;21875:419;;;:::o;22300:::-;22466:4;22504:2;22493:9;22489:18;22481:26;;22553:9;22547:4;22543:20;22539:1;22528:9;22524:17;22517:47;22581:131;22707:4;22581:131;:::i;:::-;22573:139;;22300:419;;;:::o;22725:::-;22891:4;22929:2;22918:9;22914:18;22906:26;;22978:9;22972:4;22968:20;22964:1;22953:9;22949:17;22942:47;23006:131;23132:4;23006:131;:::i;:::-;22998:139;;22725:419;;;:::o;23150:::-;23316:4;23354:2;23343:9;23339:18;23331:26;;23403:9;23397:4;23393:20;23389:1;23378:9;23374:17;23367:47;23431:131;23557:4;23431:131;:::i;:::-;23423:139;;23150:419;;;:::o;23575:::-;23741:4;23779:2;23768:9;23764:18;23756:26;;23828:9;23822:4;23818:20;23814:1;23803:9;23799:17;23792:47;23856:131;23982:4;23856:131;:::i;:::-;23848:139;;23575:419;;;:::o;24000:::-;24166:4;24204:2;24193:9;24189:18;24181:26;;24253:9;24247:4;24243:20;24239:1;24228:9;24224:17;24217:47;24281:131;24407:4;24281:131;:::i;:::-;24273:139;;24000:419;;;:::o;24425:::-;24591:4;24629:2;24618:9;24614:18;24606:26;;24678:9;24672:4;24668:20;24664:1;24653:9;24649:17;24642:47;24706:131;24832:4;24706:131;:::i;:::-;24698:139;;24425:419;;;:::o;24850:::-;25016:4;25054:2;25043:9;25039:18;25031:26;;25103:9;25097:4;25093:20;25089:1;25078:9;25074:17;25067:47;25131:131;25257:4;25131:131;:::i;:::-;25123:139;;24850:419;;;:::o;25275:::-;25441:4;25479:2;25468:9;25464:18;25456:26;;25528:9;25522:4;25518:20;25514:1;25503:9;25499:17;25492:47;25556:131;25682:4;25556:131;:::i;:::-;25548:139;;25275:419;;;:::o;25700:::-;25866:4;25904:2;25893:9;25889:18;25881:26;;25953:9;25947:4;25943:20;25939:1;25928:9;25924:17;25917:47;25981:131;26107:4;25981:131;:::i;:::-;25973:139;;25700:419;;;:::o;26125:::-;26291:4;26329:2;26318:9;26314:18;26306:26;;26378:9;26372:4;26368:20;26364:1;26353:9;26349:17;26342:47;26406:131;26532:4;26406:131;:::i;:::-;26398:139;;26125:419;;;:::o;26550:::-;26716:4;26754:2;26743:9;26739:18;26731:26;;26803:9;26797:4;26793:20;26789:1;26778:9;26774:17;26767:47;26831:131;26957:4;26831:131;:::i;:::-;26823:139;;26550:419;;;:::o;26975:::-;27141:4;27179:2;27168:9;27164:18;27156:26;;27228:9;27222:4;27218:20;27214:1;27203:9;27199:17;27192:47;27256:131;27382:4;27256:131;:::i;:::-;27248:139;;26975:419;;;:::o;27400:::-;27566:4;27604:2;27593:9;27589:18;27581:26;;27653:9;27647:4;27643:20;27639:1;27628:9;27624:17;27617:47;27681:131;27807:4;27681:131;:::i;:::-;27673:139;;27400:419;;;:::o;27825:::-;27991:4;28029:2;28018:9;28014:18;28006:26;;28078:9;28072:4;28068:20;28064:1;28053:9;28049:17;28042:47;28106:131;28232:4;28106:131;:::i;:::-;28098:139;;27825:419;;;:::o;28250:::-;28416:4;28454:2;28443:9;28439:18;28431:26;;28503:9;28497:4;28493:20;28489:1;28478:9;28474:17;28467:47;28531:131;28657:4;28531:131;:::i;:::-;28523:139;;28250:419;;;:::o;28675:::-;28841:4;28879:2;28868:9;28864:18;28856:26;;28928:9;28922:4;28918:20;28914:1;28903:9;28899:17;28892:47;28956:131;29082:4;28956:131;:::i;:::-;28948:139;;28675:419;;;:::o;29100:::-;29266:4;29304:2;29293:9;29289:18;29281:26;;29353:9;29347:4;29343:20;29339:1;29328:9;29324:17;29317:47;29381:131;29507:4;29381:131;:::i;:::-;29373:139;;29100:419;;;:::o;29525:::-;29691:4;29729:2;29718:9;29714:18;29706:26;;29778:9;29772:4;29768:20;29764:1;29753:9;29749:17;29742:47;29806:131;29932:4;29806:131;:::i;:::-;29798:139;;29525:419;;;:::o;29950:::-;30116:4;30154:2;30143:9;30139:18;30131:26;;30203:9;30197:4;30193:20;30189:1;30178:9;30174:17;30167:47;30231:131;30357:4;30231:131;:::i;:::-;30223:139;;29950:419;;;:::o;30375:::-;30541:4;30579:2;30568:9;30564:18;30556:26;;30628:9;30622:4;30618:20;30614:1;30603:9;30599:17;30592:47;30656:131;30782:4;30656:131;:::i;:::-;30648:139;;30375:419;;;:::o;30800:::-;30966:4;31004:2;30993:9;30989:18;30981:26;;31053:9;31047:4;31043:20;31039:1;31028:9;31024:17;31017:47;31081:131;31207:4;31081:131;:::i;:::-;31073:139;;30800:419;;;:::o;31225:::-;31391:4;31429:2;31418:9;31414:18;31406:26;;31478:9;31472:4;31468:20;31464:1;31453:9;31449:17;31442:47;31506:131;31632:4;31506:131;:::i;:::-;31498:139;;31225:419;;;:::o;31650:::-;31816:4;31854:2;31843:9;31839:18;31831:26;;31903:9;31897:4;31893:20;31889:1;31878:9;31874:17;31867:47;31931:131;32057:4;31931:131;:::i;:::-;31923:139;;31650:419;;;:::o;32075:::-;32241:4;32279:2;32268:9;32264:18;32256:26;;32328:9;32322:4;32318:20;32314:1;32303:9;32299:17;32292:47;32356:131;32482:4;32356:131;:::i;:::-;32348:139;;32075:419;;;:::o;32500:::-;32666:4;32704:2;32693:9;32689:18;32681:26;;32753:9;32747:4;32743:20;32739:1;32728:9;32724:17;32717:47;32781:131;32907:4;32781:131;:::i;:::-;32773:139;;32500:419;;;:::o;32925:222::-;33018:4;33056:2;33045:9;33041:18;33033:26;;33069:71;33137:1;33126:9;33122:17;33113:6;33069:71;:::i;:::-;32925:222;;;;:::o;33153:129::-;33187:6;33214:20;;:::i;:::-;33204:30;;33243:33;33271:4;33263:6;33243:33;:::i;:::-;33153:129;;;:::o;33288:75::-;33321:6;33354:2;33348:9;33338:19;;33288:75;:::o;33369:307::-;33430:4;33520:18;33512:6;33509:30;33506:56;;;33542:18;;:::i;:::-;33506:56;33580:29;33602:6;33580:29;:::i;:::-;33572:37;;33664:4;33658;33654:15;33646:23;;33369:307;;;:::o;33682:98::-;33733:6;33767:5;33761:12;33751:22;;33682:98;;;:::o;33786:99::-;33838:6;33872:5;33866:12;33856:22;;33786:99;;;:::o;33891:168::-;33974:11;34008:6;34003:3;33996:19;34048:4;34043:3;34039:14;34024:29;;33891:168;;;;:::o;34065:169::-;34149:11;34183:6;34178:3;34171:19;34223:4;34218:3;34214:14;34199:29;;34065:169;;;;:::o;34240:148::-;34342:11;34379:3;34364:18;;34240:148;;;;:::o;34394:305::-;34434:3;34453:20;34471:1;34453:20;:::i;:::-;34448:25;;34487:20;34505:1;34487:20;:::i;:::-;34482:25;;34641:1;34573:66;34569:74;34566:1;34563:81;34560:107;;;34647:18;;:::i;:::-;34560:107;34691:1;34688;34684:9;34677:16;;34394:305;;;;:::o;34705:185::-;34745:1;34762:20;34780:1;34762:20;:::i;:::-;34757:25;;34796:20;34814:1;34796:20;:::i;:::-;34791:25;;34835:1;34825:35;;34840:18;;:::i;:::-;34825:35;34882:1;34879;34875:9;34870:14;;34705:185;;;;:::o;34896:348::-;34936:7;34959:20;34977:1;34959:20;:::i;:::-;34954:25;;34993:20;35011:1;34993:20;:::i;:::-;34988:25;;35181:1;35113:66;35109:74;35106:1;35103:81;35098:1;35091:9;35084:17;35080:105;35077:131;;;35188:18;;:::i;:::-;35077:131;35236:1;35233;35229:9;35218:20;;34896:348;;;;:::o;35250:191::-;35290:4;35310:20;35328:1;35310:20;:::i;:::-;35305:25;;35344:20;35362:1;35344:20;:::i;:::-;35339:25;;35383:1;35380;35377:8;35374:34;;;35388:18;;:::i;:::-;35374:34;35433:1;35430;35426:9;35418:17;;35250:191;;;;:::o;35447:96::-;35484:7;35513:24;35531:5;35513:24;:::i;:::-;35502:35;;35447:96;;;:::o;35549:104::-;35594:7;35623:24;35641:5;35623:24;:::i;:::-;35612:35;;35549:104;;;:::o;35659:90::-;35693:7;35736:5;35729:13;35722:21;35711:32;;35659:90;;;:::o;35755:149::-;35791:7;35831:66;35824:5;35820:78;35809:89;;35755:149;;;:::o;35910:126::-;35947:7;35987:42;35980:5;35976:54;35965:65;;35910:126;;;:::o;36042:77::-;36079:7;36108:5;36097:16;;36042:77;;;:::o;36125:154::-;36209:6;36204:3;36199;36186:30;36271:1;36262:6;36257:3;36253:16;36246:27;36125:154;;;:::o;36285:307::-;36353:1;36363:113;36377:6;36374:1;36371:13;36363:113;;;36462:1;36457:3;36453:11;36447:18;36443:1;36438:3;36434:11;36427:39;36399:2;36396:1;36392:10;36387:15;;36363:113;;;36494:6;36491:1;36488:13;36485:101;;;36574:1;36565:6;36560:3;36556:16;36549:27;36485:101;36334:258;36285:307;;;:::o;36598:320::-;36642:6;36679:1;36673:4;36669:12;36659:22;;36726:1;36720:4;36716:12;36747:18;36737:81;;36803:4;36795:6;36791:17;36781:27;;36737:81;36865:2;36857:6;36854:14;36834:18;36831:38;36828:84;;;36884:18;;:::i;:::-;36828:84;36649:269;36598:320;;;:::o;36924:281::-;37007:27;37029:4;37007:27;:::i;:::-;36999:6;36995:40;37137:6;37125:10;37122:22;37101:18;37089:10;37086:34;37083:62;37080:88;;;37148:18;;:::i;:::-;37080:88;37188:10;37184:2;37177:22;36967:238;36924:281;;:::o;37211:233::-;37250:3;37273:24;37291:5;37273:24;:::i;:::-;37264:33;;37319:66;37312:5;37309:77;37306:103;;;37389:18;;:::i;:::-;37306:103;37436:1;37429:5;37425:13;37418:20;;37211:233;;;:::o;37450:176::-;37482:1;37499:20;37517:1;37499:20;:::i;:::-;37494:25;;37533:20;37551:1;37533:20;:::i;:::-;37528:25;;37572:1;37562:35;;37577:18;;:::i;:::-;37562:35;37618:1;37615;37611:9;37606:14;;37450:176;;;;:::o;37632:180::-;37680:77;37677:1;37670:88;37777:4;37774:1;37767:15;37801:4;37798:1;37791:15;37818:180;37866:77;37863:1;37856:88;37963:4;37960:1;37953:15;37987:4;37984:1;37977:15;38004:180;38052:77;38049:1;38042:88;38149:4;38146:1;38139:15;38173:4;38170:1;38163:15;38190:180;38238:77;38235:1;38228:88;38335:4;38332:1;38325:15;38359:4;38356:1;38349:15;38376:180;38424:77;38421:1;38414:88;38521:4;38518:1;38511:15;38545:4;38542:1;38535:15;38562:180;38610:77;38607:1;38600:88;38707:4;38704:1;38697:15;38731:4;38728:1;38721:15;38748:117;38857:1;38854;38847:12;38871:117;38980:1;38977;38970:12;38994:117;39103:1;39100;39093:12;39117:117;39226:1;39223;39216:12;39240:117;39349:1;39346;39339:12;39363:117;39472:1;39469;39462:12;39486:102;39527:6;39578:2;39574:7;39569:2;39562:5;39558:14;39554:28;39544:38;;39486:102;;;:::o;39594:173::-;39734:25;39730:1;39722:6;39718:14;39711:49;39594:173;:::o;39773:230::-;39913:34;39909:1;39901:6;39897:14;39890:58;39982:13;39977:2;39969:6;39965:15;39958:38;39773:230;:::o;40009:170::-;40149:22;40145:1;40137:6;40133:14;40126:46;40009:170;:::o;40185:230::-;40325:34;40321:1;40313:6;40309:14;40302:58;40394:13;40389:2;40381:6;40377:15;40370:38;40185:230;:::o;40421:237::-;40561:34;40557:1;40549:6;40545:14;40538:58;40630:20;40625:2;40617:6;40613:15;40606:45;40421:237;:::o;40664:225::-;40804:34;40800:1;40792:6;40788:14;40781:58;40873:8;40868:2;40860:6;40856:15;40849:33;40664:225;:::o;40895:224::-;41035:34;41031:1;41023:6;41019:14;41012:58;41104:7;41099:2;41091:6;41087:15;41080:32;40895:224;:::o;41125:178::-;41265:30;41261:1;41253:6;41249:14;41242:54;41125:178;:::o;41309:223::-;41449:34;41445:1;41437:6;41433:14;41426:58;41518:6;41513:2;41505:6;41501:15;41494:31;41309:223;:::o;41538:175::-;41678:27;41674:1;41666:6;41662:14;41655:51;41538:175;:::o;41719:170::-;41859:22;41855:1;41847:6;41843:14;41836:46;41719:170;:::o;41895:231::-;42035:34;42031:1;42023:6;42019:14;42012:58;42104:14;42099:2;42091:6;42087:15;42080:39;41895:231;:::o;42132:166::-;42272:18;42268:1;42260:6;42256:14;42249:42;42132:166;:::o;42304:243::-;42444:34;42440:1;42432:6;42428:14;42421:58;42513:26;42508:2;42500:6;42496:15;42489:51;42304:243;:::o;42553:170::-;42693:22;42689:1;42681:6;42677:14;42670:46;42553:170;:::o;42729:229::-;42869:34;42865:1;42857:6;42853:14;42846:58;42938:12;42933:2;42925:6;42921:15;42914:37;42729:229;:::o;42964:228::-;43104:34;43100:1;43092:6;43088:14;43081:58;43173:11;43168:2;43160:6;43156:15;43149:36;42964:228;:::o;43198:182::-;43338:34;43334:1;43326:6;43322:14;43315:58;43198:182;:::o;43386:165::-;43526:17;43522:1;43514:6;43510:14;43503:41;43386:165;:::o;43557:231::-;43697:34;43693:1;43685:6;43681:14;43674:58;43766:14;43761:2;43753:6;43749:15;43742:39;43557:231;:::o;43794:155::-;43934:7;43930:1;43922:6;43918:14;43911:31;43794:155;:::o;43955:182::-;44095:34;44091:1;44083:6;44079:14;44072:58;43955:182;:::o;44143:220::-;44283:34;44279:1;44271:6;44267:14;44260:58;44352:3;44347:2;44339:6;44335:15;44328:28;44143:220;:::o;44369:171::-;44509:23;44505:1;44497:6;44493:14;44486:47;44369:171;:::o;44546:236::-;44686:34;44682:1;44674:6;44670:14;44663:58;44755:19;44750:2;44742:6;44738:15;44731:44;44546:236;:::o;44788:231::-;44928:34;44924:1;44916:6;44912:14;44905:58;44997:14;44992:2;44984:6;44980:15;44973:39;44788:231;:::o;45025:170::-;45165:22;45161:1;45153:6;45149:14;45142:46;45025:170;:::o;45201:122::-;45274:24;45292:5;45274:24;:::i;:::-;45267:5;45264:35;45254:63;;45313:1;45310;45303:12;45254:63;45201:122;:::o;45329:116::-;45399:21;45414:5;45399:21;:::i;:::-;45392:5;45389:32;45379:60;;45435:1;45432;45425:12;45379:60;45329:116;:::o;45451:120::-;45523:23;45540:5;45523:23;:::i;:::-;45516:5;45513:34;45503:62;;45561:1;45558;45551:12;45503:62;45451:120;:::o;45577:122::-;45650:24;45668:5;45650:24;:::i;:::-;45643:5;45640:35;45630:63;;45689:1;45686;45679:12;45630:63;45577:122;:::o

Swarm Source

ipfs://cc780902b4be03e0d1eeceea4510d2c766c3c1d4bc512a7a5936e610e11c0797
Loading