ETH Price: $3,414.28 (+0.27%)
Gas: 7 Gwei

Token

Angry Ants ()
 

Overview

Max Total Supply

173 Angry Ants

Holders

68

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Angry Ants
0xd6b0d389b4888e06038b2ed629cf9636adad98c9
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AngryAnts

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-10-05
*/

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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


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

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

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

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

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// 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/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: contracts/AngryAnts.sol


pragma solidity ^0.8.0;

interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

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

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

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

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

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

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

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

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

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

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

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev 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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

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

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, 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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

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

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

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

error InvalidQueryRange();

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

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

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

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

contract AngryAnts is  Ownable, ERC721AQueryable {
    using Strings for uint256;
    
    IERC721 public AntNest;
    IERC20 public Token;

    uint256 public c_ant = 2;
    uint256 d_amount = 20 ether;

    address nestAddress = 0x5B11E3B21345a938B9b93111b12aa3c5290A9a10; 
    address tokenAddress = 0xe87A6EBBcAc5c3AFB43b5206eA9A209209ed3d36;

    address public MasterAddress = 0x3aE0a07F3D49A578716d440B2689A9055C3DC611;
    address public constant  DEAD = 0x000000000000000000000000000000000000dEaD;

    string baseURI = "https://data.antwars.xyz/ipfs/a454200629c539008875b296a13a415e0/json/";

    string public baseExtension = ".json";
    
    bool public active = false;
    
    constructor()
        ERC721A("Angry Ants", "")
    {
        AntNest = IERC721(nestAddress);
        Token = IERC20(tokenAddress);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory base = _baseURI();
        return bytes(base).length != 0 ? string(abi.encodePacked(base, tokenId.toString() , baseExtension)) : '';
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

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

    function setCostAmount(uint256 _amount) external onlyOwner {
        c_ant = _amount;
    }

    function setDigAmount(uint256 _amount) external onlyOwner {
        d_amount = _amount;
    }

    function setAntNestContract(address _address) external onlyOwner {
        AntNest = IERC721(_address);
    }

    function setTokenContract(address _address) external onlyOwner {
        Token = IERC20(_address);
    }

    function setMasterAddress(address _address) external onlyOwner {
        MasterAddress = _address;
    }

    function filpActive() external onlyOwner {
        active = !active;
    }

    function mintAnt(uint256[] memory _tokenId) public{
        require(active);   

        uint256  l  = _tokenId.length;
        require(l >= c_ant);

        require(l % c_ant == 0, "Check Anthills quantity");

        for(uint i = 0;i < l;i++){
            require(AntNest.ownerOf(_tokenId[i]) ==  msg.sender);

            AntNest.transferFrom(msg.sender, DEAD, _tokenId[i]);
        }

        uint256 n  =  l / c_ant;

        uint256 amount = n * d_amount;
        Token.transferFrom(MasterAddress, msg.sender, amount);

        _safeMint(msg.sender, n);
        
    }


    function safeMint(address to, uint256 tokenQuantity) public  onlyOwner{
        require(
            tokenQuantity > 0,
            "Exchanged monster must be greater than 0"
        );

        _safeMint(to, tokenQuantity);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"AntNest","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MasterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"c_ant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"filpActive","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"mintAnt","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAntNestContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setCostAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setDigAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setMasterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526002600b556801158e460913d00000600c55735b11e3b21345a938b9b93111b12aa3c5290a9a10600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e87a6ebbcac5c3afb43b5206ea9a209209ed3d36600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733ae0a07f3d49a578716d440b2689a9055c3dc611600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060800160405280604581526020016200465e6045913960109080519060200190620001469291906200040b565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060119080519060200190620001949291906200040b565b506000601260006101000a81548160ff021916908315150217905550348015620001bd57600080fd5b506040518060400160405280600a81526020017f416e67727920416e7473000000000000000000000000000000000000000000008152506040518060200160405280600081525062000224620002186200033a60201b60201c565b6200034260201b60201c565b81600390805190602001906200023c9291906200040b565b508060049080519060200190620002559291906200040b565b50620002666200040660201b60201c565b6001819055505050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000520565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200041990620004bb565b90600052602060002090601f0160209004810192826200043d576000855562000489565b82601f106200045857805160ff191683800117855562000489565b8280016001018555821562000489579182015b82811115620004885782518255916020019190600101906200046b565b5b5090506200049891906200049c565b5090565b5b80821115620004b75760008160009055506001016200049d565b5090565b60006002820490506001821680620004d457607f821691505b60208210811415620004eb57620004ea620004f1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61412e80620005306000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80638462151c11610130578063c0833524116100b8578063e7dc2c1c1161007c578063e7dc2c1c14610650578063e92920a81461066c578063e985e9c51461068a578063f2fde38b146106ba578063fbb18e99146106d657610227565b8063c083352414610596578063c23dc68f146105b4578063c2412676146105e4578063c668286214610602578063c87b56dd1461062057610227565b8063a1448194116100ff578063a144819414610508578063a22cb46514610524578063adff578e14610540578063b88d4fde1461055e578063bbcd5bbe1461057a57610227565b80638462151c1461046c5780638da5cb5b1461049c57806395d89b41146104ba57806399a2557a146104d857610227565b806342842e0e116101b35780635d06a611116101825780635d06a611146103ca5780636352211e146103e6578063644d55691461041657806370a0823114610432578063715018a61461046257610227565b806342842e0e1461035857806355a5d7121461037457806355f804b31461037e5780635bbb21771461039a57610227565b8063081812fc116101fa578063081812fc146102b6578063095ea7b3146102e657806318160ddd1461030257806323b872dd1461032057806326307aaf1461033c57610227565b806301ffc9a71461022c57806302fb0c5e1461025c57806303fd2a451461027a57806306fdde0314610298575b600080fd5b61024660048036038101906102419190613365565b6106f2565b60405161025391906138ed565b60405180910390f35b6102646107d4565b60405161027191906138ed565b60405180910390f35b6102826107e7565b60405161028f919061380b565b60405180910390f35b6102a06107ed565b6040516102ad919061393e565b60405180910390f35b6102d060048036038101906102cb9190613408565b61087f565b6040516102dd919061380b565b60405180910390f35b61030060048036038101906102fb919061325c565b6108fb565b005b61030a610a00565b60405161031791906139fb565b60405180910390f35b61033a60048036038101906103359190613146565b610a17565b005b610356600480360381019061035191906132ef565b610a27565b005b610372600480360381019061036d9190613146565b610d75565b005b61037c610d95565b005b610398600480360381019061039391906133bf565b610dc9565b005b6103b460048036038101906103af91906132ef565b610deb565b6040516103c191906138a9565b60405180910390f35b6103e460048036038101906103df91906130ac565b610eac565b005b61040060048036038101906103fb9190613408565b610ef8565b60405161040d919061380b565b60405180910390f35b610430600480360381019061042b91906130ac565b610f0e565b005b61044c600480360381019061044791906130ac565b610f5a565b60405161045991906139fb565b60405180910390f35b61046a61102a565b005b610486600480360381019061048191906130ac565b61103e565b60405161049391906138cb565b60405180910390f35b6104a4611240565b6040516104b1919061380b565b60405180910390f35b6104c2611269565b6040516104cf919061393e565b60405180910390f35b6104f260048036038101906104ed919061329c565b6112fb565b6040516104ff91906138cb565b60405180910390f35b610522600480360381019061051d919061325c565b6115c2565b005b61053e6004803603810190610539919061321c565b61161b565b005b610548611793565b6040516105559190613923565b60405180910390f35b61057860048036038101906105739190613199565b6117b9565b005b610594600480360381019061058f91906130ac565b611831565b005b61059e61187d565b6040516105ab91906139fb565b60405180910390f35b6105ce60048036038101906105c99190613408565b611883565b6040516105db91906139e0565b60405180910390f35b6105ec6119a0565b6040516105f99190613908565b60405180910390f35b61060a6119c6565b604051610617919061393e565b60405180910390f35b61063a60048036038101906106359190613408565b611a54565b604051610647919061393e565b60405180910390f35b61066a60048036038101906106659190613408565b611af6565b005b610674611b08565b604051610681919061380b565b60405180910390f35b6106a4600480360381019061069f9190613106565b611b2e565b6040516106b191906138ed565b60405180910390f35b6106d460048036038101906106cf91906130ac565b611bc2565b005b6106f060048036038101906106eb9190613408565b611c46565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107cd57506107cc82611c58565b5b9050919050565b601260009054906101000a900460ff1681565b61dead81565b6060600380546107fc90613dba565b80601f016020809104026020016040519081016040528092919081815260200182805461082890613dba565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b600061088a82611cc2565b6108c0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090682610ef8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561096e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661098d611d10565b73ffffffffffffffffffffffffffffffffffffffff16146109f0576109b9816109b4611d10565b611b2e565b6109ef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6109fb838383611d18565b505050565b6000610a0a611dca565b6002546001540303905090565b610a22838383611dcf565b505050565b601260009054906101000a900460ff16610a4057600080fd5b600081519050600b54811015610a5557600080fd5b6000600b5482610a659190613e66565b14610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613980565b60405180910390fd5b60005b81811015610c6c573373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110610b1857610b17613f24565b5b60200260200101516040518263ffffffff1660e01b8152600401610b3c91906139fb565b60206040518083038186803b158015610b5457600080fd5b505afa158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906130d9565b73ffffffffffffffffffffffffffffffffffffffff1614610bac57600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3361dead868581518110610c0157610c00613f24565b5b60200260200101516040518463ffffffff1660e01b8152600401610c2793929190613826565b600060405180830381600087803b158015610c4157600080fd5b505af1158015610c55573d6000803e3d6000fd5b505050508080610c6490613e1d565b915050610aa8565b506000600b5482610c7d9190613be9565b90506000600c5482610c8f9190613c1a565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633846040518463ffffffff1660e01b8152600401610d1293929190613826565b602060405180830381600087803b158015610d2c57600080fd5b505af1158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d649190613338565b50610d6f3383612285565b50505050565b610d90838383604051806020016040528060008152506117b9565b505050565b610d9d6122a3565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b610dd16122a3565b8060109080519060200190610de7929190612db5565b5050565b606060008251905060008167ffffffffffffffff811115610e0f57610e0e613f53565b5b604051908082528060200260200182016040528015610e4857816020015b610e35612e3b565b815260200190600190039081610e2d5790505b50905060005b828114610ea157610e78858281518110610e6b57610e6a613f24565b5b6020026020010151611883565b828281518110610e8b57610e8a613f24565b5b6020026020010181905250806001019050610e4e565b508092505050919050565b610eb46122a3565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610f0382612321565b600001519050919050565b610f166122a3565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fc2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110326122a3565b61103c60006125ac565b565b6060600080600061104e85610f5a565b905060008167ffffffffffffffff81111561106c5761106b613f53565b5b60405190808252806020026020018201604052801561109a5781602001602082028036833780820191505090505b5090506110a5612e3b565b60006110af611dca565b90505b83861461123257600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050915081604001511561118b57611227565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146111cb57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611226578083878060010198508151811061121957611218613f24565b5b6020026020010181815250505b5b8060010190506110b2565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461127890613dba565b80601f01602080910402602001604051908101604052809291908181526020018280546112a490613dba565b80156112f15780601f106112c6576101008083540402835291602001916112f1565b820191906000526020600020905b8154815290600101906020018083116112d457829003601f168201915b5050505050905090565b6060818310611336576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806001549050611346611dca565b85101561135857611355611dca565b94505b80841115611364578093505b600061136f87610f5a565b90508486101561139257600086860390508181101561138c578091505b50611397565b600090505b60008167ffffffffffffffff8111156113b3576113b2613f53565b5b6040519080825280602002602001820160405280156113e15781602001602082028036833780820191505090505b50905060008214156113f957809450505050506115bb565b600061140488611883565b90506000816040015161141957816000015190505b60008990505b88811415801561142f5750848714155b156115ad57600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611506576115a2565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461154657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a1578084888060010199508151811061159457611593613f24565b5b6020026020010181815250505b5b80600101905061141f565b508583528296505050505050505b9392505050565b6115ca6122a3565b6000811161160d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611604906139c0565b60405180910390fd5b6116178282612285565b5050565b611623611d10565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611688576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611695611d10565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611742611d10565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161178791906138ed565b60405180910390a35050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117c4848484611dcf565b6117e38373ffffffffffffffffffffffffffffffffffffffff16612670565b1561182b576117f484848484612693565b61182a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6118396122a3565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b61188b612e3b565b611893612e3b565b61189b611dca565b8310806118aa57506001548310155b156118b8578091505061199b565b600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561198e578091505061199b565b61199783612321565b9150505b919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601180546119d390613dba565b80601f01602080910402602001604051908101604052809291908181526020018280546119ff90613dba565b8015611a4c5780601f10611a2157610100808354040283529160200191611a4c565b820191906000526020600020905b815481529060010190602001808311611a2f57829003601f168201915b505050505081565b6060611a5f82611cc2565b611a95576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a9f6127f3565b9050600081511415611ac05760405180602001604052806000815250611aee565b80611aca84612885565b6011604051602001611ade939291906137da565b6040516020818303038152906040525b915050919050565b611afe6122a3565b80600c8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bca6122a3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613960565b60405180910390fd5b611c43816125ac565b50565b611c4e6122a3565b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611ccd611dca565b11158015611cdc575060015482105b8015611d09575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611dda82612321565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e45576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e66611d10565b73ffffffffffffffffffffffffffffffffffffffff161480611e955750611e9485611e8f611d10565b611b2e565b5b80611eda5750611ea3611d10565b73ffffffffffffffffffffffffffffffffffffffff16611ec28461087f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f13576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f7a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f8785858560016129e6565b611f9360008487611d18565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561221357600154821461221257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461227e85858560016129ec565b5050505050565b61229f8282604051806020016040528060008152506129f2565b5050565b6122ab611d10565b73ffffffffffffffffffffffffffffffffffffffff166122c9611240565b73ffffffffffffffffffffffffffffffffffffffff161461231f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612316906139a0565b60405180910390fd5b565b612329612e3b565b600082905080612337611dca565b1161257557600154811015612574576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161257257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124565780925050506125a7565b5b60011561257157818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461256c5780925050506125a7565b612457565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126b9611d10565b8786866040518563ffffffff1660e01b81526004016126db949392919061385d565b602060405180830381600087803b1580156126f557600080fd5b505af192505050801561272657506040513d601f19601f820116820180604052508101906127239190613392565b60015b6127a0573d8060008114612756576040519150601f19603f3d011682016040523d82523d6000602084013e61275b565b606091505b50600081511415612798576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461280290613dba565b80601f016020809104026020016040519081016040528092919081815260200182805461282e90613dba565b801561287b5780601f106128505761010080835404028352916020019161287b565b820191906000526020600020905b81548152906001019060200180831161285e57829003601f168201915b5050505050905090565b606060008214156128cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e1565b600082905060005b600082146128ff5780806128e890613e1d565b915050600a826128f89190613be9565b91506128d5565b60008167ffffffffffffffff81111561291b5761291a613f53565b5b6040519080825280601f01601f19166020018201604052801561294d5781602001600182028036833780820191505090505b5090505b600085146129da576001826129669190613c74565b9150600a856129759190613e66565b60306129819190613b93565b60f81b81838151811061299757612996613f24565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d39190613be9565b9450612951565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a60576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612a9b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612aa860008583866129e6565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612c698673ffffffffffffffffffffffffffffffffffffffff16612670565b15612d2e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cde6000878480600101955087612693565b612d14576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612c6f578260015414612d2957600080fd5b612d99565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d2f575b816001819055505050612daf60008583866129ec565b50505050565b828054612dc190613dba565b90600052602060002090601f016020900481019282612de35760008555612e2a565b82601f10612dfc57805160ff1916838001178555612e2a565b82800160010185558215612e2a579182015b82811115612e29578251825591602001919060010190612e0e565b5b509050612e379190612e7e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e97576000816000905550600101612e7f565b5090565b6000612eae612ea984613a3b565b613a16565b90508083825260208201905082856020860282011115612ed157612ed0613f87565b5b60005b85811015612f015781612ee78882613097565b845260208401935060208301925050600181019050612ed4565b5050509392505050565b6000612f1e612f1984613a67565b613a16565b905082815260208101848484011115612f3a57612f39613f8c565b5b612f45848285613d78565b509392505050565b6000612f60612f5b84613a98565b613a16565b905082815260208101848484011115612f7c57612f7b613f8c565b5b612f87848285613d78565b509392505050565b600081359050612f9e8161409c565b92915050565b600081519050612fb38161409c565b92915050565b600082601f830112612fce57612fcd613f82565b5b8135612fde848260208601612e9b565b91505092915050565b600081359050612ff6816140b3565b92915050565b60008151905061300b816140b3565b92915050565b600081359050613020816140ca565b92915050565b600081519050613035816140ca565b92915050565b600082601f8301126130505761304f613f82565b5b8135613060848260208601612f0b565b91505092915050565b600082601f83011261307e5761307d613f82565b5b813561308e848260208601612f4d565b91505092915050565b6000813590506130a6816140e1565b92915050565b6000602082840312156130c2576130c1613f96565b5b60006130d084828501612f8f565b91505092915050565b6000602082840312156130ef576130ee613f96565b5b60006130fd84828501612fa4565b91505092915050565b6000806040838503121561311d5761311c613f96565b5b600061312b85828601612f8f565b925050602061313c85828601612f8f565b9150509250929050565b60008060006060848603121561315f5761315e613f96565b5b600061316d86828701612f8f565b935050602061317e86828701612f8f565b925050604061318f86828701613097565b9150509250925092565b600080600080608085870312156131b3576131b2613f96565b5b60006131c187828801612f8f565b94505060206131d287828801612f8f565b93505060406131e387828801613097565b925050606085013567ffffffffffffffff81111561320457613203613f91565b5b6132108782880161303b565b91505092959194509250565b6000806040838503121561323357613232613f96565b5b600061324185828601612f8f565b925050602061325285828601612fe7565b9150509250929050565b6000806040838503121561327357613272613f96565b5b600061328185828601612f8f565b925050602061329285828601613097565b9150509250929050565b6000806000606084860312156132b5576132b4613f96565b5b60006132c386828701612f8f565b93505060206132d486828701613097565b92505060406132e586828701613097565b9150509250925092565b60006020828403121561330557613304613f96565b5b600082013567ffffffffffffffff81111561332357613322613f91565b5b61332f84828501612fb9565b91505092915050565b60006020828403121561334e5761334d613f96565b5b600061335c84828501612ffc565b91505092915050565b60006020828403121561337b5761337a613f96565b5b600061338984828501613011565b91505092915050565b6000602082840312156133a8576133a7613f96565b5b60006133b684828501613026565b91505092915050565b6000602082840312156133d5576133d4613f96565b5b600082013567ffffffffffffffff8111156133f3576133f2613f91565b5b6133ff84828501613069565b91505092915050565b60006020828403121561341e5761341d613f96565b5b600061342c84828501613097565b91505092915050565b60006134418383613729565b60608301905092915050565b600061345983836137ad565b60208301905092915050565b61346e81613ca8565b82525050565b61347d81613ca8565b82525050565b600061348e82613afe565b6134988185613b44565b93506134a383613ac9565b8060005b838110156134d45781516134bb8882613435565b97506134c683613b2a565b9250506001810190506134a7565b5085935050505092915050565b60006134ec82613b09565b6134f68185613b55565b935061350183613ad9565b8060005b83811015613532578151613519888261344d565b975061352483613b37565b925050600181019050613505565b5085935050505092915050565b61354881613cba565b82525050565b61355781613cba565b82525050565b600061356882613b14565b6135728185613b66565b9350613582818560208601613d87565b61358b81613f9b565b840191505092915050565b61359f81613d30565b82525050565b6135ae81613d42565b82525050565b60006135bf82613b1f565b6135c98185613b77565b93506135d9818560208601613d87565b6135e281613f9b565b840191505092915050565b60006135f882613b1f565b6136028185613b88565b9350613612818560208601613d87565b80840191505092915050565b6000815461362b81613dba565b6136358186613b88565b94506001821660008114613650576001811461366157613694565b60ff19831686528186019350613694565b61366a85613ae9565b60005b8381101561368c5781548189015260018201915060208101905061366d565b838801955050505b50505092915050565b60006136aa602683613b77565b91506136b582613fac565b604082019050919050565b60006136cd601783613b77565b91506136d882613ffb565b602082019050919050565b60006136f0602083613b77565b91506136fb82614024565b602082019050919050565b6000613713602883613b77565b915061371e8261404d565b604082019050919050565b60608201600082015161373f6000850182613465565b50602082015161375260208501826137cb565b506040820151613765604085018261353f565b50505050565b6060820160008201516137816000850182613465565b50602082015161379460208501826137cb565b5060408201516137a7604085018261353f565b50505050565b6137b681613d12565b82525050565b6137c581613d12565b82525050565b6137d481613d1c565b82525050565b60006137e682866135ed565b91506137f282856135ed565b91506137fe828461361e565b9150819050949350505050565b60006020820190506138206000830184613474565b92915050565b600060608201905061383b6000830186613474565b6138486020830185613474565b61385560408301846137bc565b949350505050565b60006080820190506138726000830187613474565b61387f6020830186613474565b61388c60408301856137bc565b818103606083015261389e818461355d565b905095945050505050565b600060208201905081810360008301526138c38184613483565b905092915050565b600060208201905081810360008301526138e581846134e1565b905092915050565b6000602082019050613902600083018461354e565b92915050565b600060208201905061391d6000830184613596565b92915050565b600060208201905061393860008301846135a5565b92915050565b6000602082019050818103600083015261395881846135b4565b905092915050565b600060208201905081810360008301526139798161369d565b9050919050565b60006020820190508181036000830152613999816136c0565b9050919050565b600060208201905081810360008301526139b9816136e3565b9050919050565b600060208201905081810360008301526139d981613706565b9050919050565b60006060820190506139f5600083018461376b565b92915050565b6000602082019050613a1060008301846137bc565b92915050565b6000613a20613a31565b9050613a2c8282613dec565b919050565b6000604051905090565b600067ffffffffffffffff821115613a5657613a55613f53565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a8257613a81613f53565b5b613a8b82613f9b565b9050602081019050919050565b600067ffffffffffffffff821115613ab357613ab2613f53565b5b613abc82613f9b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b9e82613d12565b9150613ba983613d12565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bde57613bdd613e97565b5b828201905092915050565b6000613bf482613d12565b9150613bff83613d12565b925082613c0f57613c0e613ec6565b5b828204905092915050565b6000613c2582613d12565b9150613c3083613d12565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c6957613c68613e97565b5b828202905092915050565b6000613c7f82613d12565b9150613c8a83613d12565b925082821015613c9d57613c9c613e97565b5b828203905092915050565b6000613cb382613cf2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000613d3b82613d54565b9050919050565b6000613d4d82613d54565b9050919050565b6000613d5f82613d66565b9050919050565b6000613d7182613cf2565b9050919050565b82818337600083830152505050565b60005b83811015613da5578082015181840152602081019050613d8a565b83811115613db4576000848401525b50505050565b60006002820490506001821680613dd257607f821691505b60208210811415613de657613de5613ef5565b5b50919050565b613df582613f9b565b810181811067ffffffffffffffff82111715613e1457613e13613f53565b5b80604052505050565b6000613e2882613d12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e5b57613e5a613e97565b5b600182019050919050565b6000613e7182613d12565b9150613e7c83613d12565b925082613e8c57613e8b613ec6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436865636b20416e7468696c6c73207175616e74697479000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786368616e676564206d6f6e73746572206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6140a581613ca8565b81146140b057600080fd5b50565b6140bc81613cba565b81146140c757600080fd5b50565b6140d381613cc6565b81146140de57600080fd5b50565b6140ea81613d12565b81146140f557600080fd5b5056fea2646970667358221220655b4cd0b756addbf73e57f2d028f455cc7f0049da374f74b6fc9783b014639664736f6c6343000807003368747470733a2f2f646174612e616e74776172732e78797a2f697066732f6134353432303036323963353339303038383735623239366131336134313565302f6a736f6e2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80638462151c11610130578063c0833524116100b8578063e7dc2c1c1161007c578063e7dc2c1c14610650578063e92920a81461066c578063e985e9c51461068a578063f2fde38b146106ba578063fbb18e99146106d657610227565b8063c083352414610596578063c23dc68f146105b4578063c2412676146105e4578063c668286214610602578063c87b56dd1461062057610227565b8063a1448194116100ff578063a144819414610508578063a22cb46514610524578063adff578e14610540578063b88d4fde1461055e578063bbcd5bbe1461057a57610227565b80638462151c1461046c5780638da5cb5b1461049c57806395d89b41146104ba57806399a2557a146104d857610227565b806342842e0e116101b35780635d06a611116101825780635d06a611146103ca5780636352211e146103e6578063644d55691461041657806370a0823114610432578063715018a61461046257610227565b806342842e0e1461035857806355a5d7121461037457806355f804b31461037e5780635bbb21771461039a57610227565b8063081812fc116101fa578063081812fc146102b6578063095ea7b3146102e657806318160ddd1461030257806323b872dd1461032057806326307aaf1461033c57610227565b806301ffc9a71461022c57806302fb0c5e1461025c57806303fd2a451461027a57806306fdde0314610298575b600080fd5b61024660048036038101906102419190613365565b6106f2565b60405161025391906138ed565b60405180910390f35b6102646107d4565b60405161027191906138ed565b60405180910390f35b6102826107e7565b60405161028f919061380b565b60405180910390f35b6102a06107ed565b6040516102ad919061393e565b60405180910390f35b6102d060048036038101906102cb9190613408565b61087f565b6040516102dd919061380b565b60405180910390f35b61030060048036038101906102fb919061325c565b6108fb565b005b61030a610a00565b60405161031791906139fb565b60405180910390f35b61033a60048036038101906103359190613146565b610a17565b005b610356600480360381019061035191906132ef565b610a27565b005b610372600480360381019061036d9190613146565b610d75565b005b61037c610d95565b005b610398600480360381019061039391906133bf565b610dc9565b005b6103b460048036038101906103af91906132ef565b610deb565b6040516103c191906138a9565b60405180910390f35b6103e460048036038101906103df91906130ac565b610eac565b005b61040060048036038101906103fb9190613408565b610ef8565b60405161040d919061380b565b60405180910390f35b610430600480360381019061042b91906130ac565b610f0e565b005b61044c600480360381019061044791906130ac565b610f5a565b60405161045991906139fb565b60405180910390f35b61046a61102a565b005b610486600480360381019061048191906130ac565b61103e565b60405161049391906138cb565b60405180910390f35b6104a4611240565b6040516104b1919061380b565b60405180910390f35b6104c2611269565b6040516104cf919061393e565b60405180910390f35b6104f260048036038101906104ed919061329c565b6112fb565b6040516104ff91906138cb565b60405180910390f35b610522600480360381019061051d919061325c565b6115c2565b005b61053e6004803603810190610539919061321c565b61161b565b005b610548611793565b6040516105559190613923565b60405180910390f35b61057860048036038101906105739190613199565b6117b9565b005b610594600480360381019061058f91906130ac565b611831565b005b61059e61187d565b6040516105ab91906139fb565b60405180910390f35b6105ce60048036038101906105c99190613408565b611883565b6040516105db91906139e0565b60405180910390f35b6105ec6119a0565b6040516105f99190613908565b60405180910390f35b61060a6119c6565b604051610617919061393e565b60405180910390f35b61063a60048036038101906106359190613408565b611a54565b604051610647919061393e565b60405180910390f35b61066a60048036038101906106659190613408565b611af6565b005b610674611b08565b604051610681919061380b565b60405180910390f35b6106a4600480360381019061069f9190613106565b611b2e565b6040516106b191906138ed565b60405180910390f35b6106d460048036038101906106cf91906130ac565b611bc2565b005b6106f060048036038101906106eb9190613408565b611c46565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107cd57506107cc82611c58565b5b9050919050565b601260009054906101000a900460ff1681565b61dead81565b6060600380546107fc90613dba565b80601f016020809104026020016040519081016040528092919081815260200182805461082890613dba565b80156108755780601f1061084a57610100808354040283529160200191610875565b820191906000526020600020905b81548152906001019060200180831161085857829003601f168201915b5050505050905090565b600061088a82611cc2565b6108c0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090682610ef8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561096e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661098d611d10565b73ffffffffffffffffffffffffffffffffffffffff16146109f0576109b9816109b4611d10565b611b2e565b6109ef576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6109fb838383611d18565b505050565b6000610a0a611dca565b6002546001540303905090565b610a22838383611dcf565b505050565b601260009054906101000a900460ff16610a4057600080fd5b600081519050600b54811015610a5557600080fd5b6000600b5482610a659190613e66565b14610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613980565b60405180910390fd5b60005b81811015610c6c573373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e858481518110610b1857610b17613f24565b5b60200260200101516040518263ffffffff1660e01b8152600401610b3c91906139fb565b60206040518083038186803b158015610b5457600080fd5b505afa158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c91906130d9565b73ffffffffffffffffffffffffffffffffffffffff1614610bac57600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3361dead868581518110610c0157610c00613f24565b5b60200260200101516040518463ffffffff1660e01b8152600401610c2793929190613826565b600060405180830381600087803b158015610c4157600080fd5b505af1158015610c55573d6000803e3d6000fd5b505050508080610c6490613e1d565b915050610aa8565b506000600b5482610c7d9190613be9565b90506000600c5482610c8f9190613c1a565b9050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633846040518463ffffffff1660e01b8152600401610d1293929190613826565b602060405180830381600087803b158015610d2c57600080fd5b505af1158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d649190613338565b50610d6f3383612285565b50505050565b610d90838383604051806020016040528060008152506117b9565b505050565b610d9d6122a3565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b610dd16122a3565b8060109080519060200190610de7929190612db5565b5050565b606060008251905060008167ffffffffffffffff811115610e0f57610e0e613f53565b5b604051908082528060200260200182016040528015610e4857816020015b610e35612e3b565b815260200190600190039081610e2d5790505b50905060005b828114610ea157610e78858281518110610e6b57610e6a613f24565b5b6020026020010151611883565b828281518110610e8b57610e8a613f24565b5b6020026020010181905250806001019050610e4e565b508092505050919050565b610eb46122a3565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610f0382612321565b600001519050919050565b610f166122a3565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fc2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110326122a3565b61103c60006125ac565b565b6060600080600061104e85610f5a565b905060008167ffffffffffffffff81111561106c5761106b613f53565b5b60405190808252806020026020018201604052801561109a5781602001602082028036833780820191505090505b5090506110a5612e3b565b60006110af611dca565b90505b83861461123257600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050915081604001511561118b57611227565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146111cb57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611226578083878060010198508151811061121957611218613f24565b5b6020026020010181815250505b5b8060010190506110b2565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461127890613dba565b80601f01602080910402602001604051908101604052809291908181526020018280546112a490613dba565b80156112f15780601f106112c6576101008083540402835291602001916112f1565b820191906000526020600020905b8154815290600101906020018083116112d457829003601f168201915b5050505050905090565b6060818310611336576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806001549050611346611dca565b85101561135857611355611dca565b94505b80841115611364578093505b600061136f87610f5a565b90508486101561139257600086860390508181101561138c578091505b50611397565b600090505b60008167ffffffffffffffff8111156113b3576113b2613f53565b5b6040519080825280602002602001820160405280156113e15781602001602082028036833780820191505090505b50905060008214156113f957809450505050506115bb565b600061140488611883565b90506000816040015161141957816000015190505b60008990505b88811415801561142f5750848714155b156115ad57600560008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611506576115a2565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461154657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a1578084888060010199508151811061159457611593613f24565b5b6020026020010181815250505b5b80600101905061141f565b508583528296505050505050505b9392505050565b6115ca6122a3565b6000811161160d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611604906139c0565b60405180910390fd5b6116178282612285565b5050565b611623611d10565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611688576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611695611d10565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611742611d10565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161178791906138ed565b60405180910390a35050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117c4848484611dcf565b6117e38373ffffffffffffffffffffffffffffffffffffffff16612670565b1561182b576117f484848484612693565b61182a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6118396122a3565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b61188b612e3b565b611893612e3b565b61189b611dca565b8310806118aa57506001548310155b156118b8578091505061199b565b600560008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561198e578091505061199b565b61199783612321565b9150505b919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601180546119d390613dba565b80601f01602080910402602001604051908101604052809291908181526020018280546119ff90613dba565b8015611a4c5780601f10611a2157610100808354040283529160200191611a4c565b820191906000526020600020905b815481529060010190602001808311611a2f57829003601f168201915b505050505081565b6060611a5f82611cc2565b611a95576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a9f6127f3565b9050600081511415611ac05760405180602001604052806000815250611aee565b80611aca84612885565b6011604051602001611ade939291906137da565b6040516020818303038152906040525b915050919050565b611afe6122a3565b80600c8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bca6122a3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190613960565b60405180910390fd5b611c43816125ac565b50565b611c4e6122a3565b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611ccd611dca565b11158015611cdc575060015482105b8015611d09575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611dda82612321565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e45576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611e66611d10565b73ffffffffffffffffffffffffffffffffffffffff161480611e955750611e9485611e8f611d10565b611b2e565b5b80611eda5750611ea3611d10565b73ffffffffffffffffffffffffffffffffffffffff16611ec28461087f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f13576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f7a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f8785858560016129e6565b611f9360008487611d18565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561221357600154821461221257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461227e85858560016129ec565b5050505050565b61229f8282604051806020016040528060008152506129f2565b5050565b6122ab611d10565b73ffffffffffffffffffffffffffffffffffffffff166122c9611240565b73ffffffffffffffffffffffffffffffffffffffff161461231f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612316906139a0565b60405180910390fd5b565b612329612e3b565b600082905080612337611dca565b1161257557600154811015612574576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161257257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124565780925050506125a7565b5b60011561257157818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461256c5780925050506125a7565b612457565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126b9611d10565b8786866040518563ffffffff1660e01b81526004016126db949392919061385d565b602060405180830381600087803b1580156126f557600080fd5b505af192505050801561272657506040513d601f19601f820116820180604052508101906127239190613392565b60015b6127a0573d8060008114612756576040519150601f19603f3d011682016040523d82523d6000602084013e61275b565b606091505b50600081511415612798576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461280290613dba565b80601f016020809104026020016040519081016040528092919081815260200182805461282e90613dba565b801561287b5780601f106128505761010080835404028352916020019161287b565b820191906000526020600020905b81548152906001019060200180831161285e57829003601f168201915b5050505050905090565b606060008214156128cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e1565b600082905060005b600082146128ff5780806128e890613e1d565b915050600a826128f89190613be9565b91506128d5565b60008167ffffffffffffffff81111561291b5761291a613f53565b5b6040519080825280601f01601f19166020018201604052801561294d5781602001600182028036833780820191505090505b5090505b600085146129da576001826129669190613c74565b9150600a856129759190613e66565b60306129819190613b93565b60f81b81838151811061299757612996613f24565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d39190613be9565b9450612951565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a60576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612a9b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612aa860008583866129e6565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612c698673ffffffffffffffffffffffffffffffffffffffff16612670565b15612d2e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cde6000878480600101955087612693565b612d14576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612c6f578260015414612d2957600080fd5b612d99565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d2f575b816001819055505050612daf60008583866129ec565b50505050565b828054612dc190613dba565b90600052602060002090601f016020900481019282612de35760008555612e2a565b82601f10612dfc57805160ff1916838001178555612e2a565b82800160010185558215612e2a579182015b82811115612e29578251825591602001919060010190612e0e565b5b509050612e379190612e7e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e97576000816000905550600101612e7f565b5090565b6000612eae612ea984613a3b565b613a16565b90508083825260208201905082856020860282011115612ed157612ed0613f87565b5b60005b85811015612f015781612ee78882613097565b845260208401935060208301925050600181019050612ed4565b5050509392505050565b6000612f1e612f1984613a67565b613a16565b905082815260208101848484011115612f3a57612f39613f8c565b5b612f45848285613d78565b509392505050565b6000612f60612f5b84613a98565b613a16565b905082815260208101848484011115612f7c57612f7b613f8c565b5b612f87848285613d78565b509392505050565b600081359050612f9e8161409c565b92915050565b600081519050612fb38161409c565b92915050565b600082601f830112612fce57612fcd613f82565b5b8135612fde848260208601612e9b565b91505092915050565b600081359050612ff6816140b3565b92915050565b60008151905061300b816140b3565b92915050565b600081359050613020816140ca565b92915050565b600081519050613035816140ca565b92915050565b600082601f8301126130505761304f613f82565b5b8135613060848260208601612f0b565b91505092915050565b600082601f83011261307e5761307d613f82565b5b813561308e848260208601612f4d565b91505092915050565b6000813590506130a6816140e1565b92915050565b6000602082840312156130c2576130c1613f96565b5b60006130d084828501612f8f565b91505092915050565b6000602082840312156130ef576130ee613f96565b5b60006130fd84828501612fa4565b91505092915050565b6000806040838503121561311d5761311c613f96565b5b600061312b85828601612f8f565b925050602061313c85828601612f8f565b9150509250929050565b60008060006060848603121561315f5761315e613f96565b5b600061316d86828701612f8f565b935050602061317e86828701612f8f565b925050604061318f86828701613097565b9150509250925092565b600080600080608085870312156131b3576131b2613f96565b5b60006131c187828801612f8f565b94505060206131d287828801612f8f565b93505060406131e387828801613097565b925050606085013567ffffffffffffffff81111561320457613203613f91565b5b6132108782880161303b565b91505092959194509250565b6000806040838503121561323357613232613f96565b5b600061324185828601612f8f565b925050602061325285828601612fe7565b9150509250929050565b6000806040838503121561327357613272613f96565b5b600061328185828601612f8f565b925050602061329285828601613097565b9150509250929050565b6000806000606084860312156132b5576132b4613f96565b5b60006132c386828701612f8f565b93505060206132d486828701613097565b92505060406132e586828701613097565b9150509250925092565b60006020828403121561330557613304613f96565b5b600082013567ffffffffffffffff81111561332357613322613f91565b5b61332f84828501612fb9565b91505092915050565b60006020828403121561334e5761334d613f96565b5b600061335c84828501612ffc565b91505092915050565b60006020828403121561337b5761337a613f96565b5b600061338984828501613011565b91505092915050565b6000602082840312156133a8576133a7613f96565b5b60006133b684828501613026565b91505092915050565b6000602082840312156133d5576133d4613f96565b5b600082013567ffffffffffffffff8111156133f3576133f2613f91565b5b6133ff84828501613069565b91505092915050565b60006020828403121561341e5761341d613f96565b5b600061342c84828501613097565b91505092915050565b60006134418383613729565b60608301905092915050565b600061345983836137ad565b60208301905092915050565b61346e81613ca8565b82525050565b61347d81613ca8565b82525050565b600061348e82613afe565b6134988185613b44565b93506134a383613ac9565b8060005b838110156134d45781516134bb8882613435565b97506134c683613b2a565b9250506001810190506134a7565b5085935050505092915050565b60006134ec82613b09565b6134f68185613b55565b935061350183613ad9565b8060005b83811015613532578151613519888261344d565b975061352483613b37565b925050600181019050613505565b5085935050505092915050565b61354881613cba565b82525050565b61355781613cba565b82525050565b600061356882613b14565b6135728185613b66565b9350613582818560208601613d87565b61358b81613f9b565b840191505092915050565b61359f81613d30565b82525050565b6135ae81613d42565b82525050565b60006135bf82613b1f565b6135c98185613b77565b93506135d9818560208601613d87565b6135e281613f9b565b840191505092915050565b60006135f882613b1f565b6136028185613b88565b9350613612818560208601613d87565b80840191505092915050565b6000815461362b81613dba565b6136358186613b88565b94506001821660008114613650576001811461366157613694565b60ff19831686528186019350613694565b61366a85613ae9565b60005b8381101561368c5781548189015260018201915060208101905061366d565b838801955050505b50505092915050565b60006136aa602683613b77565b91506136b582613fac565b604082019050919050565b60006136cd601783613b77565b91506136d882613ffb565b602082019050919050565b60006136f0602083613b77565b91506136fb82614024565b602082019050919050565b6000613713602883613b77565b915061371e8261404d565b604082019050919050565b60608201600082015161373f6000850182613465565b50602082015161375260208501826137cb565b506040820151613765604085018261353f565b50505050565b6060820160008201516137816000850182613465565b50602082015161379460208501826137cb565b5060408201516137a7604085018261353f565b50505050565b6137b681613d12565b82525050565b6137c581613d12565b82525050565b6137d481613d1c565b82525050565b60006137e682866135ed565b91506137f282856135ed565b91506137fe828461361e565b9150819050949350505050565b60006020820190506138206000830184613474565b92915050565b600060608201905061383b6000830186613474565b6138486020830185613474565b61385560408301846137bc565b949350505050565b60006080820190506138726000830187613474565b61387f6020830186613474565b61388c60408301856137bc565b818103606083015261389e818461355d565b905095945050505050565b600060208201905081810360008301526138c38184613483565b905092915050565b600060208201905081810360008301526138e581846134e1565b905092915050565b6000602082019050613902600083018461354e565b92915050565b600060208201905061391d6000830184613596565b92915050565b600060208201905061393860008301846135a5565b92915050565b6000602082019050818103600083015261395881846135b4565b905092915050565b600060208201905081810360008301526139798161369d565b9050919050565b60006020820190508181036000830152613999816136c0565b9050919050565b600060208201905081810360008301526139b9816136e3565b9050919050565b600060208201905081810360008301526139d981613706565b9050919050565b60006060820190506139f5600083018461376b565b92915050565b6000602082019050613a1060008301846137bc565b92915050565b6000613a20613a31565b9050613a2c8282613dec565b919050565b6000604051905090565b600067ffffffffffffffff821115613a5657613a55613f53565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a8257613a81613f53565b5b613a8b82613f9b565b9050602081019050919050565b600067ffffffffffffffff821115613ab357613ab2613f53565b5b613abc82613f9b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b9e82613d12565b9150613ba983613d12565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bde57613bdd613e97565b5b828201905092915050565b6000613bf482613d12565b9150613bff83613d12565b925082613c0f57613c0e613ec6565b5b828204905092915050565b6000613c2582613d12565b9150613c3083613d12565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c6957613c68613e97565b5b828202905092915050565b6000613c7f82613d12565b9150613c8a83613d12565b925082821015613c9d57613c9c613e97565b5b828203905092915050565b6000613cb382613cf2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000613d3b82613d54565b9050919050565b6000613d4d82613d54565b9050919050565b6000613d5f82613d66565b9050919050565b6000613d7182613cf2565b9050919050565b82818337600083830152505050565b60005b83811015613da5578082015181840152602081019050613d8a565b83811115613db4576000848401525b50505050565b60006002820490506001821680613dd257607f821691505b60208210811415613de657613de5613ef5565b5b50919050565b613df582613f9b565b810181811067ffffffffffffffff82111715613e1457613e13613f53565b5b80604052505050565b6000613e2882613d12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e5b57613e5a613e97565b5b600182019050919050565b6000613e7182613d12565b9150613e7c83613d12565b925082613e8c57613e8b613ec6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436865636b20416e7468696c6c73207175616e74697479000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786368616e676564206d6f6e73746572206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6140a581613ca8565b81146140b057600080fd5b50565b6140bc81613cba565b81146140c757600080fd5b50565b6140d381613cc6565b81146140de57600080fd5b50565b6140ea81613d12565b81146140f557600080fd5b5056fea2646970667358221220655b4cd0b756addbf73e57f2d028f455cc7f0049da374f74b6fc9783b014639664736f6c63430008070033

Deployed Bytecode Sourcemap

56273:2960:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31142:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56947:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56717:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34257:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35761:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35323:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30382:312;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36626:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58382:595;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36867:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58298:76;;;:::i;:::-;;57519:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51360:523;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58184:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34065:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57951:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31511:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16735:103;;;:::i;:::-;;55286:980;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16087:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34426:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52273:2564;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58987:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36037:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56367:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37123:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58070:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56424:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50760:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56396:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56897:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57136:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57848:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56637:73;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36395:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16993:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57747:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31142:305;31244:4;31296:25;31281:40;;;:11;:40;;;;:105;;;;31353:33;31338:48;;;:11;:48;;;;31281:105;:158;;;;31403:36;31427:11;31403:23;:36::i;:::-;31281:158;31261:178;;31142:305;;;:::o;56947:26::-;;;;;;;;;;;;;:::o;56717:74::-;56749:42;56717:74;:::o;34257:100::-;34311:13;34344:5;34337:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34257:100;:::o;35761:204::-;35829:7;35854:16;35862:7;35854;:16::i;:::-;35849:64;;35879:34;;;;;;;;;;;;;;35849:64;35933:15;:24;35949:7;35933:24;;;;;;;;;;;;;;;;;;;;;35926:31;;35761:204;;;:::o;35323:372::-;35396:13;35412:24;35428:7;35412:15;:24::i;:::-;35396:40;;35457:5;35451:11;;:2;:11;;;35447:48;;;35471:24;;;;;;;;;;;;;;35447:48;35528:5;35512:21;;:12;:10;:12::i;:::-;:21;;;35508:139;;35539:37;35556:5;35563:12;:10;:12::i;:::-;35539:16;:37::i;:::-;35535:112;;35600:35;;;;;;;;;;;;;;35535:112;35508:139;35659:28;35668:2;35672:7;35681:5;35659:8;:28::i;:::-;35385:310;35323:372;;:::o;30382:312::-;30435:7;30660:15;:13;:15::i;:::-;30645:12;;30629:13;;:28;:46;30622:53;;30382:312;:::o;36626:170::-;36760:28;36770:4;36776:2;36780:7;36760:9;:28::i;:::-;36626:170;;;:::o;58382:595::-;58451:6;;;;;;;;;;;58443:15;;;;;;58474:10;58488:8;:15;58474:29;;58527:5;;58522:1;:10;;58514:19;;;;;;58567:1;58558:5;;58554:1;:9;;;;:::i;:::-;:14;58546:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;58613:6;58609:172;58628:1;58624;:5;58609:172;;;58690:10;58657:43;;:7;;;;;;;;;;;:15;;;58673:8;58682:1;58673:11;;;;;;;;:::i;:::-;;;;;;;;58657:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;58649:52;;;;;;58718:7;;;;;;;;;;;:20;;;58739:10;56749:42;58757:8;58766:1;58757:11;;;;;;;;:::i;:::-;;;;;;;;58718:51;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58630:3;;;;;:::i;:::-;;;;58609:172;;;;58793:9;58811:5;;58807:1;:9;;;;:::i;:::-;58793:23;;58829:14;58850:8;;58846:1;:12;;;;:::i;:::-;58829:29;;58869:5;;;;;;;;;;;:18;;;58888:13;;;;;;;;;;;58903:10;58915:6;58869:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58935:24;58945:10;58957:1;58935:9;:24::i;:::-;58432:545;;;58382:595;:::o;36867:185::-;37005:39;37022:4;37028:2;37032:7;37005:39;;;;;;;;;;;;:16;:39::i;:::-;36867:185;;;:::o;58298:76::-;15973:13;:11;:13::i;:::-;58360:6:::1;;;;;;;;;;;58359:7;58350:6;;:16;;;;;;;;;;;;;;;;;;58298:76::o:0;57519:104::-;15973:13;:11;:13::i;:::-;57604:11:::1;57594:7;:21;;;;;;;;;;;;:::i;:::-;;57519:104:::0;:::o;51360:523::-;51467:23;51533:22;51558:8;:15;51533:40;;51588:34;51664:14;51625:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;51588:105;;51713:9;51708:125;51729:14;51724:1;:19;51708:125;;51785:32;51805:8;51814:1;51805:11;;;;;;;;:::i;:::-;;;;;;;;51785:19;:32::i;:::-;51769:10;51780:1;51769:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;51745:3;;;;;51708:125;;;;51854:10;51847:17;;;;51360:523;;;:::o;58184:106::-;15973:13;:11;:13::i;:::-;58274:8:::1;58258:13;;:24;;;;;;;;;;;;;;;;;;58184:106:::0;:::o;34065:125::-;34129:7;34156:21;34169:7;34156:12;:21::i;:::-;:26;;;34149:33;;34065:125;;;:::o;57951:111::-;15973:13;:11;:13::i;:::-;58045:8:::1;58027:7;;:27;;;;;;;;;;;;;;;;;;57951:111:::0;:::o;31511:206::-;31575:7;31616:1;31599:19;;:5;:19;;;31595:60;;;31627:28;;;;;;;;;;;;;;31595:60;31681:12;:19;31694:5;31681:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31673:36;;31666:43;;31511:206;;;:::o;16735:103::-;15973:13;:11;:13::i;:::-;16800:30:::1;16827:1;16800:18;:30::i;:::-;16735:103::o:0;55286:980::-;55374:16;55433:19;55467:25;55507:22;55532:16;55542:5;55532:9;:16::i;:::-;55507:41;;55563:25;55605:14;55591:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55563:57;;55635:31;;:::i;:::-;55704:9;55716:15;:13;:15::i;:::-;55704:27;;55681:537;55765:14;55750:11;:29;55681:537;;55848:11;:14;55860:1;55848:14;;;;;;;;;;;55836:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55885:9;:16;;;55881:73;;;55926:8;;55881:73;56002:1;55976:28;;:9;:14;;;:28;;;55972:111;;56049:9;:14;;;56029:34;;55972:111;56126:5;56105:26;;:17;:26;;;56101:102;;;56182:1;56156:8;56165:13;;;;;;56156:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;56101:102;55681:537;55798:3;;;;;55681:537;;;;56239:8;56232:15;;;;;;;55286:980;;;:::o;16087:87::-;16133:7;16160:6;;;;;;;;;;;16153:13;;16087:87;:::o;34426:104::-;34482:13;34515:7;34508:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34426:104;:::o;52273:2564::-;52399:16;52466:4;52457:5;:13;52453:45;;52479:19;;;;;;;;;;;;;;52453:45;52513:19;52547:17;52567:13;;52547:33;;52666:15;:13;:15::i;:::-;52658:5;:23;52654:87;;;52710:15;:13;:15::i;:::-;52702:23;;52654:87;52821:9;52814:4;:16;52810:73;;;52858:9;52851:16;;52810:73;52897:25;52925:16;52935:5;52925:9;:16::i;:::-;52897:44;;53119:4;53111:5;:12;53107:278;;;53144:19;53173:5;53166:4;:12;53144:34;;53215:17;53201:11;:31;53197:111;;;53277:11;53257:31;;53197:111;53125:198;53107:278;;;53368:1;53348:21;;53107:278;53399:25;53441:17;53427:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53399:60;;53499:1;53478:17;:22;53474:78;;;53528:8;53521:15;;;;;;;;53474:78;53696:31;53730:26;53750:5;53730:19;:26::i;:::-;53696:60;;53771:25;54016:9;:16;;;54011:92;;54073:9;:14;;;54053:34;;54011:92;54140:9;54152:5;54140:17;;54117:543;54181:4;54176:1;:9;;:45;;;;;54204:17;54189:11;:32;;54176:45;54117:543;;;54290:11;:14;54302:1;54290:14;;;;;;;;;;;54278:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54327:9;:16;;;54323:73;;;54368:8;;54323:73;54444:1;54418:28;;:9;:14;;;:28;;;54414:111;;54491:9;:14;;;54471:34;;54414:111;54568:5;54547:26;;:17;:26;;;54543:102;;;54624:1;54598:8;54607:13;;;;;;54598:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;54543:102;54117:543;54240:3;;;;;54117:543;;;;54762:11;54752:8;54745:29;54810:8;54803:15;;;;;;;;52273:2564;;;;;;:::o;58987:237::-;15973:13;:11;:13::i;:::-;59106:1:::1;59090:13;:17;59068:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;59188:28;59198:2;59202:13;59188:9;:28::i;:::-;58987:237:::0;;:::o;36037:287::-;36148:12;:10;:12::i;:::-;36136:24;;:8;:24;;;36132:54;;;36169:17;;;;;;;;;;;;;;36132:54;36244:8;36199:18;:32;36218:12;:10;:12::i;:::-;36199:32;;;;;;;;;;;;;;;:42;36232:8;36199:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36297:8;36268:48;;36283:12;:10;:12::i;:::-;36268:48;;;36307:8;36268:48;;;;;;:::i;:::-;;;;;;;;36037:287;;:::o;56367:22::-;;;;;;;;;;;;;:::o;37123:370::-;37290:28;37300:4;37306:2;37310:7;37290:9;:28::i;:::-;37333:15;:2;:13;;;:15::i;:::-;37329:157;;;37354:56;37385:4;37391:2;37395:7;37404:5;37354:30;:56::i;:::-;37350:136;;37434:40;;;;;;;;;;;;;;37350:136;37329:157;37123:370;;;;:::o;58070:106::-;15973:13;:11;:13::i;:::-;58159:8:::1;58144:5;;:24;;;;;;;;;;;;;;;;;;58070:106:::0;:::o;56424:24::-;;;;:::o;50760:441::-;50854:21;;:::i;:::-;50893:31;;:::i;:::-;50949:15;:13;:15::i;:::-;50939:7;:25;:53;;;;50979:13;;50968:7;:24;;50939:53;50935:102;;;51016:9;51009:16;;;;;50935:102;51059:11;:20;51071:7;51059:20;;;;;;;;;;;51047:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51094:9;:16;;;51090:65;;;51134:9;51127:16;;;;;51090:65;51172:21;51185:7;51172:12;:21::i;:::-;51165:28;;;50760:441;;;;:::o;56396:19::-;;;;;;;;;;;;;:::o;56897:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57136:375::-;57254:13;57290:16;57298:7;57290;:16::i;:::-;57285:59;;57315:29;;;;;;;;;;;;;;57285:59;57357:18;57378:10;:8;:10::i;:::-;57357:31;;57428:1;57412:4;57406:18;:23;;:97;;;;;;;;;;;;;;;;;57456:4;57462:18;:7;:16;:18::i;:::-;57483:13;57439:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57406:97;57399:104;;;57136:375;;;:::o;57848:95::-;15973:13;:11;:13::i;:::-;57928:7:::1;57917:8;:18;;;;57848:95:::0;:::o;56637:73::-;;;;;;;;;;;;;:::o;36395:164::-;36492:4;36516:18;:25;36535:5;36516:25;;;;;;;;;;;;;;;:35;36542:8;36516:35;;;;;;;;;;;;;;;;;;;;;;;;;36509:42;;36395:164;;;;:::o;16993:201::-;15973:13;:11;:13::i;:::-;17102:1:::1;17082:22;;:8;:22;;;;17074:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17158:28;17177:8;17158:18;:28::i;:::-;16993:201:::0;:::o;57747:93::-;15973:13;:11;:13::i;:::-;57825:7:::1;57817:5;:15;;;;57747:93:::0;:::o;5611:157::-;5696:4;5735:25;5720:40;;;:11;:40;;;;5713:47;;5611:157;;;:::o;37748:174::-;37805:4;37848:7;37829:15;:13;:15::i;:::-;:26;;:53;;;;;37869:13;;37859:7;:23;37829:53;:85;;;;;37887:11;:20;37899:7;37887:20;;;;;;;;;;;:27;;;;;;;;;;;;37886:28;37829:85;37822:92;;37748:174;;;:::o;14638:98::-;14691:7;14718:10;14711:17;;14638:98;:::o;46970:196::-;47112:2;47085:15;:24;47101:7;47085:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47150:7;47146:2;47130:28;;47139:5;47130:28;;;;;;;;;;;;46970:196;;;:::o;30156:92::-;30212:7;30156:92;:::o;41918:2130::-;42033:35;42071:21;42084:7;42071:12;:21::i;:::-;42033:59;;42131:4;42109:26;;:13;:18;;;:26;;;42105:67;;42144:28;;;;;;;;;;;;;;42105:67;42185:22;42227:4;42211:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;42248:36;42265:4;42271:12;:10;:12::i;:::-;42248:16;:36::i;:::-;42211:73;:126;;;;42325:12;:10;:12::i;:::-;42301:36;;:20;42313:7;42301:11;:20::i;:::-;:36;;;42211:126;42185:153;;42356:17;42351:66;;42382:35;;;;;;;;;;;;;;42351:66;42446:1;42432:16;;:2;:16;;;42428:52;;;42457:23;;;;;;;;;;;;;;42428:52;42493:43;42515:4;42521:2;42525:7;42534:1;42493:21;:43::i;:::-;42601:35;42618:1;42622:7;42631:4;42601:8;:35::i;:::-;42962:1;42932:12;:18;42945:4;42932:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43006:1;42978:12;:16;42991:2;42978:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43024:31;43058:11;:20;43070:7;43058:20;;;;;;;;;;;43024:54;;43109:2;43093:8;:13;;;:18;;;;;;;;;;;;;;;;;;43159:15;43126:8;:23;;;:49;;;;;;;;;;;;;;;;;;43427:19;43459:1;43449:7;:11;43427:33;;43475:31;43509:11;:24;43521:11;43509:24;;;;;;;;;;;43475:58;;43577:1;43552:27;;:8;:13;;;;;;;;;;;;:27;;;43548:384;;;43762:13;;43747:11;:28;43743:174;;43816:4;43800:8;:13;;;:20;;;;;;;;;;;;;;;;;;43869:13;:28;;;43843:8;:23;;;:54;;;;;;;;;;;;;;;;;;43743:174;43548:384;42907:1036;;;43979:7;43975:2;43960:27;;43969:4;43960:27;;;;;;;;;;;;43998:42;44019:4;44025:2;44029:7;44038:1;43998:20;:42::i;:::-;42022:2026;;41918:2130;;;:::o;38006:104::-;38075:27;38085:2;38089:8;38075:27;;;;;;;;;;;;:9;:27::i;:::-;38006:104;;:::o;16252:132::-;16327:12;:10;:12::i;:::-;16316:23;;:7;:5;:7::i;:::-;:23;;;16308:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16252:132::o;32892:1111::-;32954:21;;:::i;:::-;32988:12;33003:7;32988:22;;33071:4;33052:15;:13;:15::i;:::-;:23;33048:888;;33088:13;;33081:4;:20;33077:859;;;33122:31;33156:11;:17;33168:4;33156:17;;;;;;;;;;;33122:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33197:9;:16;;;33192:729;;33268:1;33242:28;;:9;:14;;;:28;;;33238:101;;33306:9;33299:16;;;;;;33238:101;33641:261;33648:4;33641:261;;;33681:6;;;;;;;;33726:11;:17;33738:4;33726:17;;;;;;;;;;;33714:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33800:1;33774:28;;:9;:14;;;:28;;;33770:109;;33842:9;33835:16;;;;;;33770:109;33641:261;;;33192:729;33103:833;33077:859;33048:888;33964:31;;;;;;;;;;;;;;32892:1111;;;;:::o;17354:191::-;17428:16;17447:6;;;;;;;;;;;17428:25;;17473:8;17464:6;;:17;;;;;;;;;;;;;;;;;;17528:8;17497:40;;17518:8;17497:40;;;;;;;;;;;;17417:128;17354:191;:::o;18785:326::-;18845:4;19102:1;19080:7;:19;;;:23;19073:30;;18785:326;;;:::o;47658:667::-;47821:4;47858:2;47842:36;;;47879:12;:10;:12::i;:::-;47893:4;47899:7;47908:5;47842:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47838:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48093:1;48076:6;:13;:18;48072:235;;;48122:40;;;;;;;;;;;;;;48072:235;48265:6;48259:13;48250:6;48246:2;48242:15;48235:38;47838:480;47971:45;;;47961:55;;;:6;:55;;;;47954:62;;;47658:667;;;;;;:::o;57631:108::-;57691:13;57724:7;57717:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57631:108;:::o;11892:723::-;11948:13;12178:1;12169:5;:10;12165:53;;;12196:10;;;;;;;;;;;;;;;;;;;;;12165:53;12228:12;12243:5;12228:20;;12259:14;12284:78;12299:1;12291:4;:9;12284:78;;12317:8;;;;;:::i;:::-;;;;12348:2;12340:10;;;;;:::i;:::-;;;12284:78;;;12372:19;12404:6;12394:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12372:39;;12422:154;12438:1;12429:5;:10;12422:154;;12466:1;12456:11;;;;;:::i;:::-;;;12533:2;12525:5;:10;;;;:::i;:::-;12512:2;:24;;;;:::i;:::-;12499:39;;12482:6;12489;12482:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;12562:2;12553:11;;;;;:::i;:::-;;;12422:154;;;12600:6;12586:21;;;;;11892:723;;;;:::o;48973:159::-;;;;;:::o;49791:158::-;;;;;:::o;38483:1749::-;38606:20;38629:13;;38606:36;;38671:1;38657:16;;:2;:16;;;38653:48;;;38682:19;;;;;;;;;;;;;;38653:48;38728:1;38716:8;:13;38712:44;;;38738:18;;;;;;;;;;;;;;38712:44;38769:61;38799:1;38803:2;38807:12;38821:8;38769:21;:61::i;:::-;39142:8;39107:12;:16;39120:2;39107:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39206:8;39166:12;:16;39179:2;39166:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39265:2;39232:11;:25;39244:12;39232:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39332:15;39282:11;:25;39294:12;39282:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;39365:20;39388:12;39365:35;;39415:11;39444:8;39429:12;:23;39415:37;;39473:15;:2;:13;;;:15::i;:::-;39469:631;;;39509:313;39565:12;39561:2;39540:38;;39557:1;39540:38;;;;;;;;;;;;39606:69;39645:1;39649:2;39653:14;;;;;;39669:5;39606:30;:69::i;:::-;39601:174;;39711:40;;;;;;;;;;;;;;39601:174;39817:3;39802:12;:18;39509:313;;39903:12;39886:13;;:29;39882:43;;39917:8;;;39882:43;39469:631;;;39966:119;40022:14;;;;;;40018:2;39997:40;;40014:1;39997:40;;;;;;;;;;;;40080:3;40065:12;:18;39966:119;;39469:631;40130:12;40114:13;:28;;;;39082:1072;;40164:60;40193:1;40197:2;40201:12;40215:8;40164:20;:60::i;:::-;38595:1637;38483:1749;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:143::-;1788:5;1819:6;1813:13;1804:22;;1835:33;1862:5;1835:33;:::i;:::-;1731:143;;;;:::o;1897:370::-;1968:5;2017:3;2010:4;2002:6;1998:17;1994:27;1984:122;;2025:79;;:::i;:::-;1984:122;2142:6;2129:20;2167:94;2257:3;2249:6;2242:4;2234:6;2230:17;2167:94;:::i;:::-;2158:103;;1974:293;1897:370;;;;:::o;2273:133::-;2316:5;2354:6;2341:20;2332:29;;2370:30;2394:5;2370:30;:::i;:::-;2273:133;;;;:::o;2412:137::-;2466:5;2497:6;2491:13;2482:22;;2513:30;2537:5;2513:30;:::i;:::-;2412:137;;;;:::o;2555:::-;2600:5;2638:6;2625:20;2616:29;;2654:32;2680:5;2654:32;:::i;:::-;2555:137;;;;:::o;2698:141::-;2754:5;2785:6;2779:13;2770:22;;2801:32;2827:5;2801:32;:::i;:::-;2698:141;;;;:::o;2858:338::-;2913:5;2962:3;2955:4;2947:6;2943:17;2939:27;2929:122;;2970:79;;:::i;:::-;2929:122;3087:6;3074:20;3112:78;3186:3;3178:6;3171:4;3163:6;3159:17;3112:78;:::i;:::-;3103:87;;2919:277;2858:338;;;;:::o;3216:340::-;3272:5;3321:3;3314:4;3306:6;3302:17;3298:27;3288:122;;3329:79;;:::i;:::-;3288:122;3446:6;3433:20;3471:79;3546:3;3538:6;3531:4;3523:6;3519:17;3471:79;:::i;:::-;3462:88;;3278:278;3216:340;;;;:::o;3562:139::-;3608:5;3646:6;3633:20;3624:29;;3662:33;3689:5;3662:33;:::i;:::-;3562:139;;;;:::o;3707:329::-;3766:6;3815:2;3803:9;3794:7;3790:23;3786:32;3783:119;;;3821:79;;:::i;:::-;3783:119;3941:1;3966:53;4011:7;4002:6;3991:9;3987:22;3966:53;:::i;:::-;3956:63;;3912:117;3707:329;;;;:::o;4042:351::-;4112:6;4161:2;4149:9;4140:7;4136:23;4132:32;4129:119;;;4167:79;;:::i;:::-;4129:119;4287:1;4312:64;4368:7;4359:6;4348:9;4344:22;4312:64;:::i;:::-;4302:74;;4258:128;4042:351;;;;:::o;4399:474::-;4467:6;4475;4524:2;4512:9;4503:7;4499:23;4495:32;4492:119;;;4530:79;;:::i;:::-;4492:119;4650:1;4675:53;4720:7;4711:6;4700:9;4696:22;4675:53;:::i;:::-;4665:63;;4621:117;4777:2;4803:53;4848:7;4839:6;4828:9;4824:22;4803:53;:::i;:::-;4793:63;;4748:118;4399:474;;;;;:::o;4879:619::-;4956:6;4964;4972;5021:2;5009:9;5000:7;4996:23;4992:32;4989:119;;;5027:79;;:::i;:::-;4989:119;5147:1;5172:53;5217:7;5208:6;5197:9;5193:22;5172:53;:::i;:::-;5162:63;;5118:117;5274:2;5300:53;5345:7;5336:6;5325:9;5321:22;5300:53;:::i;:::-;5290:63;;5245:118;5402:2;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5373:118;4879:619;;;;;:::o;5504:943::-;5599:6;5607;5615;5623;5672:3;5660:9;5651:7;5647:23;5643:33;5640:120;;;5679:79;;:::i;:::-;5640:120;5799:1;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;:::i;:::-;5814:63;;5770:117;5926:2;5952:53;5997:7;5988:6;5977:9;5973:22;5952:53;:::i;:::-;5942:63;;5897:118;6054:2;6080:53;6125:7;6116:6;6105:9;6101:22;6080:53;:::i;:::-;6070:63;;6025:118;6210:2;6199:9;6195:18;6182:32;6241:18;6233:6;6230:30;6227:117;;;6263:79;;:::i;:::-;6227:117;6368:62;6422:7;6413:6;6402:9;6398:22;6368:62;:::i;:::-;6358:72;;6153:287;5504:943;;;;;;;:::o;6453:468::-;6518:6;6526;6575:2;6563:9;6554:7;6550:23;6546:32;6543:119;;;6581:79;;:::i;:::-;6543:119;6701:1;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6672:117;6828:2;6854:50;6896:7;6887:6;6876:9;6872:22;6854:50;:::i;:::-;6844:60;;6799:115;6453:468;;;;;:::o;6927:474::-;6995:6;7003;7052:2;7040:9;7031:7;7027:23;7023:32;7020:119;;;7058:79;;:::i;:::-;7020:119;7178:1;7203:53;7248:7;7239:6;7228:9;7224:22;7203:53;:::i;:::-;7193:63;;7149:117;7305:2;7331:53;7376:7;7367:6;7356:9;7352:22;7331:53;:::i;:::-;7321:63;;7276:118;6927:474;;;;;:::o;7407:619::-;7484:6;7492;7500;7549:2;7537:9;7528:7;7524:23;7520:32;7517:119;;;7555:79;;:::i;:::-;7517:119;7675:1;7700:53;7745:7;7736:6;7725:9;7721:22;7700:53;:::i;:::-;7690:63;;7646:117;7802:2;7828:53;7873:7;7864:6;7853:9;7849:22;7828:53;:::i;:::-;7818:63;;7773:118;7930:2;7956:53;8001:7;7992:6;7981:9;7977:22;7956:53;:::i;:::-;7946:63;;7901:118;7407:619;;;;;:::o;8032:539::-;8116:6;8165:2;8153:9;8144:7;8140:23;8136:32;8133:119;;;8171:79;;:::i;:::-;8133:119;8319:1;8308:9;8304:17;8291:31;8349:18;8341:6;8338:30;8335:117;;;8371:79;;:::i;:::-;8335:117;8476:78;8546:7;8537:6;8526:9;8522:22;8476:78;:::i;:::-;8466:88;;8262:302;8032:539;;;;:::o;8577:345::-;8644:6;8693:2;8681:9;8672:7;8668:23;8664:32;8661:119;;;8699:79;;:::i;:::-;8661:119;8819:1;8844:61;8897:7;8888:6;8877:9;8873:22;8844:61;:::i;:::-;8834:71;;8790:125;8577:345;;;;:::o;8928:327::-;8986:6;9035:2;9023:9;9014:7;9010:23;9006:32;9003:119;;;9041:79;;:::i;:::-;9003:119;9161:1;9186:52;9230:7;9221:6;9210:9;9206:22;9186:52;:::i;:::-;9176:62;;9132:116;8928:327;;;;:::o;9261:349::-;9330:6;9379:2;9367:9;9358:7;9354:23;9350:32;9347:119;;;9385:79;;:::i;:::-;9347:119;9505:1;9530:63;9585:7;9576:6;9565:9;9561:22;9530:63;:::i;:::-;9520:73;;9476:127;9261:349;;;;:::o;9616:509::-;9685:6;9734:2;9722:9;9713:7;9709:23;9705:32;9702:119;;;9740:79;;:::i;:::-;9702:119;9888:1;9877:9;9873:17;9860:31;9918:18;9910:6;9907:30;9904:117;;;9940:79;;:::i;:::-;9904:117;10045:63;10100:7;10091:6;10080:9;10076:22;10045:63;:::i;:::-;10035:73;;9831:287;9616:509;;;;:::o;10131:329::-;10190:6;10239:2;10227:9;10218:7;10214:23;10210:32;10207:119;;;10245:79;;:::i;:::-;10207:119;10365:1;10390:53;10435:7;10426:6;10415:9;10411:22;10390:53;:::i;:::-;10380:63;;10336:117;10131:329;;;;:::o;10466:303::-;10597:10;10618:108;10722:3;10714:6;10618:108;:::i;:::-;10758:4;10753:3;10749:14;10735:28;;10466:303;;;;:::o;10775:179::-;10844:10;10865:46;10907:3;10899:6;10865:46;:::i;:::-;10943:4;10938:3;10934:14;10920:28;;10775:179;;;;:::o;10960:108::-;11037:24;11055:5;11037:24;:::i;:::-;11032:3;11025:37;10960:108;;:::o;11074:118::-;11161:24;11179:5;11161:24;:::i;:::-;11156:3;11149:37;11074:118;;:::o;11274:980::-;11455:3;11484:85;11563:5;11484:85;:::i;:::-;11585:117;11695:6;11690:3;11585:117;:::i;:::-;11578:124;;11726:87;11807:5;11726:87;:::i;:::-;11836:7;11867:1;11852:377;11877:6;11874:1;11871:13;11852:377;;;11953:6;11947:13;11980:125;12101:3;12086:13;11980:125;:::i;:::-;11973:132;;12128:91;12212:6;12128:91;:::i;:::-;12118:101;;11912:317;11899:1;11896;11892:9;11887:14;;11852:377;;;11856:14;12245:3;12238:10;;11460:794;;;11274:980;;;;:::o;12290:732::-;12409:3;12438:54;12486:5;12438:54;:::i;:::-;12508:86;12587:6;12582:3;12508:86;:::i;:::-;12501:93;;12618:56;12668:5;12618:56;:::i;:::-;12697:7;12728:1;12713:284;12738:6;12735:1;12732:13;12713:284;;;12814:6;12808:13;12841:63;12900:3;12885:13;12841:63;:::i;:::-;12834:70;;12927:60;12980:6;12927:60;:::i;:::-;12917:70;;12773:224;12760:1;12757;12753:9;12748:14;;12713:284;;;12717:14;13013:3;13006:10;;12414:608;;;12290:732;;;;:::o;13028:99::-;13099:21;13114:5;13099:21;:::i;:::-;13094:3;13087:34;13028:99;;:::o;13133:109::-;13214:21;13229:5;13214:21;:::i;:::-;13209:3;13202:34;13133:109;;:::o;13248:360::-;13334:3;13362:38;13394:5;13362:38;:::i;:::-;13416:70;13479:6;13474:3;13416:70;:::i;:::-;13409:77;;13495:52;13540:6;13535:3;13528:4;13521:5;13517:16;13495:52;:::i;:::-;13572:29;13594:6;13572:29;:::i;:::-;13567:3;13563:39;13556:46;;13338:270;13248:360;;;;:::o;13614:157::-;13714:50;13758:5;13714:50;:::i;:::-;13709:3;13702:63;13614:157;;:::o;13777:161::-;13879:52;13925:5;13879:52;:::i;:::-;13874:3;13867:65;13777:161;;:::o;13944:364::-;14032:3;14060:39;14093:5;14060:39;:::i;:::-;14115:71;14179:6;14174:3;14115:71;:::i;:::-;14108:78;;14195:52;14240:6;14235:3;14228:4;14221:5;14217:16;14195:52;:::i;:::-;14272:29;14294:6;14272:29;:::i;:::-;14267:3;14263:39;14256:46;;14036:272;13944:364;;;;:::o;14314:377::-;14420:3;14448:39;14481:5;14448:39;:::i;:::-;14503:89;14585:6;14580:3;14503:89;:::i;:::-;14496:96;;14601:52;14646:6;14641:3;14634:4;14627:5;14623:16;14601:52;:::i;:::-;14678:6;14673:3;14669:16;14662:23;;14424:267;14314:377;;;;:::o;14721:845::-;14824:3;14861:5;14855:12;14890:36;14916:9;14890:36;:::i;:::-;14942:89;15024:6;15019:3;14942:89;:::i;:::-;14935:96;;15062:1;15051:9;15047:17;15078:1;15073:137;;;;15224:1;15219:341;;;;15040:520;;15073:137;15157:4;15153:9;15142;15138:25;15133:3;15126:38;15193:6;15188:3;15184:16;15177:23;;15073:137;;15219:341;15286:38;15318:5;15286:38;:::i;:::-;15346:1;15360:154;15374:6;15371:1;15368:13;15360:154;;;15448:7;15442:14;15438:1;15433:3;15429:11;15422:35;15498:1;15489:7;15485:15;15474:26;;15396:4;15393:1;15389:12;15384:17;;15360:154;;;15543:6;15538:3;15534:16;15527:23;;15226:334;;15040:520;;14828:738;;14721:845;;;;:::o;15572:366::-;15714:3;15735:67;15799:2;15794:3;15735:67;:::i;:::-;15728:74;;15811:93;15900:3;15811:93;:::i;:::-;15929:2;15924:3;15920:12;15913:19;;15572:366;;;:::o;15944:::-;16086:3;16107:67;16171:2;16166:3;16107:67;:::i;:::-;16100:74;;16183:93;16272:3;16183:93;:::i;:::-;16301:2;16296:3;16292:12;16285:19;;15944:366;;;:::o;16316:::-;16458:3;16479:67;16543:2;16538:3;16479:67;:::i;:::-;16472:74;;16555:93;16644:3;16555:93;:::i;:::-;16673:2;16668:3;16664:12;16657:19;;16316:366;;;:::o;16688:::-;16830:3;16851:67;16915:2;16910:3;16851:67;:::i;:::-;16844:74;;16927:93;17016:3;16927:93;:::i;:::-;17045:2;17040:3;17036:12;17029:19;;16688:366;;;:::o;17132:687::-;17281:4;17276:3;17272:14;17368:4;17361:5;17357:16;17351:23;17387:63;17444:4;17439:3;17435:14;17421:12;17387:63;:::i;:::-;17296:164;17552:4;17545:5;17541:16;17535:23;17571:61;17626:4;17621:3;17617:14;17603:12;17571:61;:::i;:::-;17470:172;17726:4;17719:5;17715:16;17709:23;17745:57;17796:4;17791:3;17787:14;17773:12;17745:57;:::i;:::-;17652:160;17250:569;17132:687;;:::o;17897:697::-;18056:4;18051:3;18047:14;18143:4;18136:5;18132:16;18126:23;18162:63;18219:4;18214:3;18210:14;18196:12;18162:63;:::i;:::-;18071:164;18327:4;18320:5;18316:16;18310:23;18346:61;18401:4;18396:3;18392:14;18378:12;18346:61;:::i;:::-;18245:172;18501:4;18494:5;18490:16;18484:23;18520:57;18571:4;18566:3;18562:14;18548:12;18520:57;:::i;:::-;18427:160;18025:569;17897:697;;:::o;18600:108::-;18677:24;18695:5;18677:24;:::i;:::-;18672:3;18665:37;18600:108;;:::o;18714:118::-;18801:24;18819:5;18801:24;:::i;:::-;18796:3;18789:37;18714:118;;:::o;18838:105::-;18913:23;18930:5;18913:23;:::i;:::-;18908:3;18901:36;18838:105;;:::o;18949:589::-;19174:3;19196:95;19287:3;19278:6;19196:95;:::i;:::-;19189:102;;19308:95;19399:3;19390:6;19308:95;:::i;:::-;19301:102;;19420:92;19508:3;19499:6;19420:92;:::i;:::-;19413:99;;19529:3;19522:10;;18949:589;;;;;;:::o;19544:222::-;19637:4;19675:2;19664:9;19660:18;19652:26;;19688:71;19756:1;19745:9;19741:17;19732:6;19688:71;:::i;:::-;19544:222;;;;:::o;19772:442::-;19921:4;19959:2;19948:9;19944:18;19936:26;;19972:71;20040:1;20029:9;20025:17;20016:6;19972:71;:::i;:::-;20053:72;20121:2;20110:9;20106:18;20097:6;20053:72;:::i;:::-;20135;20203:2;20192:9;20188:18;20179:6;20135:72;:::i;:::-;19772:442;;;;;;:::o;20220:640::-;20415:4;20453:3;20442:9;20438:19;20430:27;;20467:71;20535:1;20524:9;20520:17;20511:6;20467:71;:::i;:::-;20548:72;20616:2;20605:9;20601:18;20592:6;20548:72;:::i;:::-;20630;20698:2;20687:9;20683:18;20674:6;20630:72;:::i;:::-;20749:9;20743:4;20739:20;20734:2;20723:9;20719:18;20712:48;20777:76;20848:4;20839:6;20777:76;:::i;:::-;20769:84;;20220:640;;;;;;;:::o;20866:497::-;21071:4;21109:2;21098:9;21094:18;21086:26;;21158:9;21152:4;21148:20;21144:1;21133:9;21129:17;21122:47;21186:170;21351:4;21342:6;21186:170;:::i;:::-;21178:178;;20866:497;;;;:::o;21369:373::-;21512:4;21550:2;21539:9;21535:18;21527:26;;21599:9;21593:4;21589:20;21585:1;21574:9;21570:17;21563:47;21627:108;21730:4;21721:6;21627:108;:::i;:::-;21619:116;;21369:373;;;;:::o;21748:210::-;21835:4;21873:2;21862:9;21858:18;21850:26;;21886:65;21948:1;21937:9;21933:17;21924:6;21886:65;:::i;:::-;21748:210;;;;:::o;21964:248::-;22070:4;22108:2;22097:9;22093:18;22085:26;;22121:84;22202:1;22191:9;22187:17;22178:6;22121:84;:::i;:::-;21964:248;;;;:::o;22218:252::-;22326:4;22364:2;22353:9;22349:18;22341:26;;22377:86;22460:1;22449:9;22445:17;22436:6;22377:86;:::i;:::-;22218:252;;;;:::o;22476:313::-;22589:4;22627:2;22616:9;22612:18;22604:26;;22676:9;22670:4;22666:20;22662:1;22651:9;22647:17;22640:47;22704:78;22777:4;22768:6;22704:78;:::i;:::-;22696:86;;22476:313;;;;:::o;22795:419::-;22961:4;22999:2;22988:9;22984:18;22976:26;;23048:9;23042:4;23038:20;23034:1;23023:9;23019:17;23012:47;23076:131;23202:4;23076:131;:::i;:::-;23068:139;;22795:419;;;:::o;23220:::-;23386:4;23424:2;23413:9;23409:18;23401:26;;23473:9;23467:4;23463:20;23459:1;23448:9;23444:17;23437:47;23501:131;23627:4;23501:131;:::i;:::-;23493:139;;23220:419;;;:::o;23645:::-;23811:4;23849:2;23838:9;23834:18;23826:26;;23898:9;23892:4;23888:20;23884:1;23873:9;23869:17;23862:47;23926:131;24052:4;23926:131;:::i;:::-;23918:139;;23645:419;;;:::o;24070:::-;24236:4;24274:2;24263:9;24259:18;24251:26;;24323:9;24317:4;24313:20;24309:1;24298:9;24294:17;24287:47;24351:131;24477:4;24351:131;:::i;:::-;24343:139;;24070:419;;;:::o;24495:346::-;24650:4;24688:2;24677:9;24673:18;24665:26;;24701:133;24831:1;24820:9;24816:17;24807:6;24701:133;:::i;:::-;24495:346;;;;:::o;24847:222::-;24940:4;24978:2;24967:9;24963:18;24955:26;;24991:71;25059:1;25048:9;25044:17;25035:6;24991:71;:::i;:::-;24847:222;;;;:::o;25075:129::-;25109:6;25136:20;;:::i;:::-;25126:30;;25165:33;25193:4;25185:6;25165:33;:::i;:::-;25075:129;;;:::o;25210:75::-;25243:6;25276:2;25270:9;25260:19;;25210:75;:::o;25291:311::-;25368:4;25458:18;25450:6;25447:30;25444:56;;;25480:18;;:::i;:::-;25444:56;25530:4;25522:6;25518:17;25510:25;;25590:4;25584;25580:15;25572:23;;25291:311;;;:::o;25608:307::-;25669:4;25759:18;25751:6;25748:30;25745:56;;;25781:18;;:::i;:::-;25745:56;25819:29;25841:6;25819:29;:::i;:::-;25811:37;;25903:4;25897;25893:15;25885:23;;25608:307;;;:::o;25921:308::-;25983:4;26073:18;26065:6;26062:30;26059:56;;;26095:18;;:::i;:::-;26059:56;26133:29;26155:6;26133:29;:::i;:::-;26125:37;;26217:4;26211;26207:15;26199:23;;25921:308;;;:::o;26235:163::-;26333:4;26356:3;26348:11;;26386:4;26381:3;26377:14;26369:22;;26235:163;;;:::o;26404:132::-;26471:4;26494:3;26486:11;;26524:4;26519:3;26515:14;26507:22;;26404:132;;;:::o;26542:141::-;26591:4;26614:3;26606:11;;26637:3;26634:1;26627:14;26671:4;26668:1;26658:18;26650:26;;26542:141;;;:::o;26689:145::-;26787:6;26821:5;26815:12;26805:22;;26689:145;;;:::o;26840:114::-;26907:6;26941:5;26935:12;26925:22;;26840:114;;;:::o;26960:98::-;27011:6;27045:5;27039:12;27029:22;;26960:98;;;:::o;27064:99::-;27116:6;27150:5;27144:12;27134:22;;27064:99;;;:::o;27169:144::-;27270:4;27302;27297:3;27293:14;27285:22;;27169:144;;;:::o;27319:113::-;27389:4;27421;27416:3;27412:14;27404:22;;27319:113;;;:::o;27438:215::-;27568:11;27602:6;27597:3;27590:19;27642:4;27637:3;27633:14;27618:29;;27438:215;;;;:::o;27659:184::-;27758:11;27792:6;27787:3;27780:19;27832:4;27827:3;27823:14;27808:29;;27659:184;;;;:::o;27849:168::-;27932:11;27966:6;27961:3;27954:19;28006:4;28001:3;27997:14;27982:29;;27849:168;;;;:::o;28023:169::-;28107:11;28141:6;28136:3;28129:19;28181:4;28176:3;28172:14;28157:29;;28023:169;;;;:::o;28198:148::-;28300:11;28337:3;28322:18;;28198:148;;;;:::o;28352:305::-;28392:3;28411:20;28429:1;28411:20;:::i;:::-;28406:25;;28445:20;28463:1;28445:20;:::i;:::-;28440:25;;28599:1;28531:66;28527:74;28524:1;28521:81;28518:107;;;28605:18;;:::i;:::-;28518:107;28649:1;28646;28642:9;28635:16;;28352:305;;;;:::o;28663:185::-;28703:1;28720:20;28738:1;28720:20;:::i;:::-;28715:25;;28754:20;28772:1;28754:20;:::i;:::-;28749:25;;28793:1;28783:35;;28798:18;;:::i;:::-;28783:35;28840:1;28837;28833:9;28828:14;;28663:185;;;;:::o;28854:348::-;28894:7;28917:20;28935:1;28917:20;:::i;:::-;28912:25;;28951:20;28969:1;28951:20;:::i;:::-;28946:25;;29139:1;29071:66;29067:74;29064:1;29061:81;29056:1;29049:9;29042:17;29038:105;29035:131;;;29146:18;;:::i;:::-;29035:131;29194:1;29191;29187:9;29176:20;;28854:348;;;;:::o;29208:191::-;29248:4;29268:20;29286:1;29268:20;:::i;:::-;29263:25;;29302:20;29320:1;29302:20;:::i;:::-;29297:25;;29341:1;29338;29335:8;29332:34;;;29346:18;;:::i;:::-;29332:34;29391:1;29388;29384:9;29376:17;;29208:191;;;;:::o;29405:96::-;29442:7;29471:24;29489:5;29471:24;:::i;:::-;29460:35;;29405:96;;;:::o;29507:90::-;29541:7;29584:5;29577:13;29570:21;29559:32;;29507:90;;;:::o;29603:149::-;29639:7;29679:66;29672:5;29668:78;29657:89;;29603:149;;;:::o;29758:126::-;29795:7;29835:42;29828:5;29824:54;29813:65;;29758:126;;;:::o;29890:77::-;29927:7;29956:5;29945:16;;29890:77;;;:::o;29973:101::-;30009:7;30049:18;30042:5;30038:30;30027:41;;29973:101;;;:::o;30080:139::-;30143:9;30176:37;30207:5;30176:37;:::i;:::-;30163:50;;30080:139;;;:::o;30225:141::-;30290:9;30323:37;30354:5;30323:37;:::i;:::-;30310:50;;30225:141;;;:::o;30372:126::-;30422:9;30455:37;30486:5;30455:37;:::i;:::-;30442:50;;30372:126;;;:::o;30504:113::-;30554:9;30587:24;30605:5;30587:24;:::i;:::-;30574:37;;30504:113;;;:::o;30623:154::-;30707:6;30702:3;30697;30684:30;30769:1;30760:6;30755:3;30751:16;30744:27;30623:154;;;:::o;30783:307::-;30851:1;30861:113;30875:6;30872:1;30869:13;30861:113;;;30960:1;30955:3;30951:11;30945:18;30941:1;30936:3;30932:11;30925:39;30897:2;30894:1;30890:10;30885:15;;30861:113;;;30992:6;30989:1;30986:13;30983:101;;;31072:1;31063:6;31058:3;31054:16;31047:27;30983:101;30832:258;30783:307;;;:::o;31096:320::-;31140:6;31177:1;31171:4;31167:12;31157:22;;31224:1;31218:4;31214:12;31245:18;31235:81;;31301:4;31293:6;31289:17;31279:27;;31235:81;31363:2;31355:6;31352:14;31332:18;31329:38;31326:84;;;31382:18;;:::i;:::-;31326:84;31147:269;31096:320;;;:::o;31422:281::-;31505:27;31527:4;31505:27;:::i;:::-;31497:6;31493:40;31635:6;31623:10;31620:22;31599:18;31587:10;31584:34;31581:62;31578:88;;;31646:18;;:::i;:::-;31578:88;31686:10;31682:2;31675:22;31465:238;31422:281;;:::o;31709:233::-;31748:3;31771:24;31789:5;31771:24;:::i;:::-;31762:33;;31817:66;31810:5;31807:77;31804:103;;;31887:18;;:::i;:::-;31804:103;31934:1;31927:5;31923:13;31916:20;;31709:233;;;:::o;31948:176::-;31980:1;31997:20;32015:1;31997:20;:::i;:::-;31992:25;;32031:20;32049:1;32031:20;:::i;:::-;32026:25;;32070:1;32060:35;;32075:18;;:::i;:::-;32060:35;32116:1;32113;32109:9;32104:14;;31948:176;;;;:::o;32130:180::-;32178:77;32175:1;32168:88;32275:4;32272:1;32265:15;32299:4;32296:1;32289:15;32316:180;32364:77;32361:1;32354:88;32461:4;32458:1;32451:15;32485:4;32482:1;32475:15;32502:180;32550:77;32547:1;32540:88;32647:4;32644:1;32637:15;32671:4;32668:1;32661:15;32688:180;32736:77;32733:1;32726:88;32833:4;32830:1;32823:15;32857:4;32854:1;32847:15;32874:180;32922:77;32919:1;32912:88;33019:4;33016:1;33009:15;33043:4;33040:1;33033:15;33060:117;33169:1;33166;33159:12;33183:117;33292:1;33289;33282:12;33306:117;33415:1;33412;33405:12;33429:117;33538:1;33535;33528:12;33552:117;33661:1;33658;33651:12;33675:102;33716:6;33767:2;33763:7;33758:2;33751:5;33747:14;33743:28;33733:38;;33675:102;;;:::o;33783:225::-;33923:34;33919:1;33911:6;33907:14;33900:58;33992:8;33987:2;33979:6;33975:15;33968:33;33783:225;:::o;34014:173::-;34154:25;34150:1;34142:6;34138:14;34131:49;34014:173;:::o;34193:182::-;34333:34;34329:1;34321:6;34317:14;34310:58;34193:182;:::o;34381:227::-;34521:34;34517:1;34509:6;34505:14;34498:58;34590:10;34585:2;34577:6;34573:15;34566:35;34381:227;:::o;34614:122::-;34687:24;34705:5;34687:24;:::i;:::-;34680:5;34677:35;34667:63;;34726:1;34723;34716:12;34667:63;34614:122;:::o;34742:116::-;34812:21;34827:5;34812:21;:::i;:::-;34805:5;34802:32;34792:60;;34848:1;34845;34838:12;34792:60;34742:116;:::o;34864:120::-;34936:23;34953:5;34936:23;:::i;:::-;34929:5;34926:34;34916:62;;34974:1;34971;34964:12;34916:62;34864:120;:::o;34990:122::-;35063:24;35081:5;35063:24;:::i;:::-;35056:5;35053:35;35043:63;;35102:1;35099;35092:12;35043:63;34990:122;:::o

Swarm Source

ipfs://655b4cd0b756addbf73e57f2d028f455cc7f0049da374f74b6fc9783b0146396
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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