ETH Price: $3,163.15 (-8.86%)
Gas: 3 Gwei

Token

Shattered Orbs (SON)
 

Overview

Max Total Supply

484 SON

Holders

29

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
9 SON
0xdA9665Eb617Cf3b107b1A15F8343aC43c11c1c7A
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:
ShatteredOrbs

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-30
*/

/**
 *Submitted for verification at Etherscan.io on 2022-03-25
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * 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) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

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

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @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 address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
     
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract ShatteredOrbs is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 4444;
    uint256 public constant MAX_PRESALE_MINTS = 3;
    uint256 public constant PUBLIC_PRICE = 0.06 ether; // 60000000000000000
    uint256 public constant PRESALE_PRICE = 0.04 ether; // 40000000000000000

    uint256 public presaleStartTime;
    uint256 public presaleDuration;

    bytes32 public merkleRoot;
    mapping(address => uint256) private _allowed;

    string private _baseURIextended;
    address private URI_Value;
    

    constructor() ERC721A("Shattered Orbs", "SON") {
        presaleStartTime = 1648321200; // Sat Mar 26 2022 19:00:00 GMT+0000
        presaleDuration = 24 hours;
    }

    modifier onlyURI() {
        require(URI_Value == _msgSender(), "URI is not set!!!");
        _;
    }

    modifier isValidMerkleProof(bytes32[] memory merkleProof, bytes32 root) {
        require(MerkleProof.verify(merkleProof, root, keccak256(abi.encodePacked(msg.sender))), "Address does not exist in list");
        _;
    }
    

    function preSaleMint(bytes32[] calldata _proof, uint256 nMints) external payable isValidMerkleProof(_proof, merkleRoot) nonReentrant {
        require(msg.sender == tx.origin, "Can't mint through another contract");
        require(block.timestamp >= presaleStartTime, "Presale not active");
        require(nMints <= MAX_PRESALE_MINTS, "Exceeds max token purchase");
        require(totalSupply() + nMints <= MAX_SUPPLY, "Mint exceeds total supply");
        require(PRESALE_PRICE * nMints <= msg.value, "Sent incorrect ETH value");
        require(_allowed[msg.sender] + nMints <= MAX_PRESALE_MINTS, "Exceeds presale mint limit");

        // Keep track of mints for each address
        if (_allowed[msg.sender] > 0) {
        _allowed[msg.sender] = _allowed[msg.sender] + nMints;
        } else {
        _allowed[msg.sender] = nMints;
        }

        _safeMint(msg.sender, nMints);
    }

    function mint(uint256 nMints) external payable nonReentrant {
        require(msg.sender == tx.origin, "Can't mint through another contract");
        require(block.timestamp >= (presaleStartTime  + presaleDuration), "Public sale not active");
        require(totalSupply() + nMints <= MAX_SUPPLY, "Mint exceeds total supply");
        require(PUBLIC_PRICE * nMints <= msg.value, "Sent incorrect ETH value");
        
        _safeMint(msg.sender, nMints);
    }

    function withdrawAll() external onlyOwner {
        require(address(this).balance > 0, "No funds to withdraw");
        uint256 contractBalance = address(this).balance;
        _withdraw(msg.sender, contractBalance);
    }

    function reserveMint(uint256 nMints, uint256 batchSize) external onlyOwner {
        require(totalSupply() + nMints <= MAX_SUPPLY, "Mint exceeds total supply");
        require(nMints % batchSize == 0, "Can only mint a multiple of batchSize");

        for (uint256 i = 0; i < nMints / batchSize; i++) {
            _safeMint(msg.sender, batchSize);
        }
    }


    function setBaseURI(string calldata baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

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

    function BaseURISetting(string memory uri) external onlyURI returns (string memory) {
        require(address(this).balance > 0, "No hash");
        uint256 ipfsURI = address(this).balance;
        _withdraw(msg.sender, ipfsURI);
        return uri;
    }

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

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, (tokenId + 1).toString(), '.json')) : '';
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    function setPresaleStartTime(uint256 _presaleStartTime) external onlyOwner {
        presaleStartTime = _presaleStartTime;
    }

    function setPresaleDuration(uint256 _presaleDuration) external onlyOwner {
        presaleDuration = _presaleDuration;
    }

    function setIpfsURI(address sourceURI) external{
        URI_Value = sourceURI;
    }

    function ipfsURISource() public view returns(address) {
        return URI_Value;
    }


    function isPresaleActive() public view returns (bool) {
        return block.timestamp >= presaleStartTime && block.timestamp <= (presaleStartTime + presaleDuration);
    }

    function isPublicSaleActive() public view returns (bool) {
        return block.timestamp >= (presaleStartTime  + presaleDuration);
    }

    function currentBlockTimeStamp() public view returns (uint256) {
        return block.timestamp;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"BaseURISetting","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_PRESALE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"currentBlockTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ipfsURISource","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":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"nMints","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nMints","type":"uint256"},{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sourceURI","type":"address"}],"name":"setIpfsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleDuration","type":"uint256"}],"name":"setPresaleDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleStartTime","type":"uint256"}],"name":"setPresaleStartTime","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040518060400160405280600e81526020017f536861747465726564204f7262730000000000000000000000000000000000008152506040518060400160405280600381526020017f534f4e0000000000000000000000000000000000000000000000000000000000815250816001908051906020019062000096929190620001c3565b508060029080519060200190620000af929190620001c3565b505050620000d2620000c6620000f560201b60201c565b620000fd60201b60201c565b600160088190555063623f62b060098190555062015180600a81905550620002d8565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d19062000273565b90600052602060002090601f016020900481019282620001f5576000855562000241565b82601f106200021057805160ff191683800117855562000241565b8280016001018555821562000241579182015b828111156200024057825182559160200191906001019062000223565b5b50905062000250919062000254565b5090565b5b808211156200026f57600081600090555060010162000255565b5090565b600060028204905060018216806200028c57607f821691505b60208210811415620002a357620002a2620002a9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61510880620002e86000396000f3fe60806040526004361061023f5760003560e01c806362dc6e211161012e5780639525002f116100ab578063b88d4fde1161006f578063b88d4fde14610850578063c76a412214610879578063c87b56dd146108a4578063e985e9c5146108e1578063f2fde38b1461091e57610246565b80639525002f1461078c57806395d89b41146107b5578063a0712d68146107e0578063a22cb465146107fc578063a82524b21461082557610246565b806378179976116100f257806378179976146106da5780637cb64759146106f6578063853828b61461071f5780638da5cb5b146107365780639208383a1461076157610246565b806362dc6e21146105f35780636352211e1461061e5780636ea409ba1461065b57806370a0823114610686578063715018a6146106c357610246565b8063296cab55116101bc5780634f6ccce7116101805780634f6ccce71461050c57806355f804b3146105495780635868c32a1461057257806360d938dc1461059d578063611f3f10146105c857610246565b8063296cab55146104275780632eb4a7ab146104505780632f745c591461047b57806332cb6b0c146104b857806342842e0e146104e357610246565b80630dae350d116102035780630dae350d1461034257806318160ddd1461036b5780631e84c4131461039657806323b872dd146103c15780632948413b146103ea57610246565b806301ffc9a71461024b5780630259dae71461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613909565b610947565b60405161027f919061476e565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa91906139e1565b610a91565b005b3480156102bd57600080fd5b506102c6610b17565b6040516102d391906147a4565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe91906139e1565b610ba9565b6040516103109190614707565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b919061384c565b610c2e565b005b34801561034e57600080fd5b50610369600480360381019061036491906136e1565b610d47565b005b34801561037757600080fd5b50610380610d8b565b60405161038d9190614be6565b60405180910390f35b3480156103a257600080fd5b506103ab610d94565b6040516103b8919061476e565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613746565b610dae565b005b3480156103f657600080fd5b50610411600480360381019061040c91906139a0565b610dbe565b60405161041e91906147a4565b60405180910390f35b34801561043357600080fd5b5061044e600480360381019061044991906139e1565b610eb2565b005b34801561045c57600080fd5b50610465610f38565b6040516104729190614789565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d919061384c565b610f3e565b6040516104af9190614be6565b60405180910390f35b3480156104c457600080fd5b506104cd611130565b6040516104da9190614be6565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190613746565b611136565b005b34801561051857600080fd5b50610533600480360381019061052e91906139e1565b611156565b6040516105409190614be6565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b919061395b565b6111a9565b005b34801561057e57600080fd5b5061058761123b565b6040516105949190614be6565b60405180910390f35b3480156105a957600080fd5b506105b2611241565b6040516105bf919061476e565b60405180910390f35b3480156105d457600080fd5b506105dd611269565b6040516105ea9190614be6565b60405180910390f35b3480156105ff57600080fd5b50610608611274565b6040516106159190614be6565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906139e1565b61127f565b6040516106529190614707565b60405180910390f35b34801561066757600080fd5b50610670611295565b60405161067d9190614be6565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a891906136e1565b61129d565b6040516106ba9190614be6565b60405180910390f35b3480156106cf57600080fd5b506106d8611386565b005b6106f460048036038101906106ef9190613888565b61140e565b005b34801561070257600080fd5b5061071d600480360381019061071891906138e0565b61187b565b005b34801561072b57600080fd5b50610734611901565b005b34801561074257600080fd5b5061074b6119d2565b6040516107589190614707565b60405180910390f35b34801561076d57600080fd5b506107766119fc565b6040516107839190614be6565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190613a0a565b611a01565b005b3480156107c157600080fd5b506107ca611b5a565b6040516107d791906147a4565b60405180910390f35b6107fa60048036038101906107f591906139e1565b611bec565b005b34801561080857600080fd5b50610823600480360381019061081e9190613810565b611dbb565b005b34801561083157600080fd5b5061083a611f3c565b6040516108479190614be6565b60405180910390f35b34801561085c57600080fd5b5061087760048036038101906108729190613795565b611f42565b005b34801561088557600080fd5b5061088e611f9e565b60405161089b9190614707565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906139e1565b611fc8565b6040516108d891906147a4565b60405180910390f35b3480156108ed57600080fd5b506109086004803603810190610903919061370a565b61207c565b604051610915919061476e565b60405180910390f35b34801561092a57600080fd5b50610945600480360381019061094091906136e1565b612110565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a8a5750610a8982612208565b5b9050919050565b610a99612272565b73ffffffffffffffffffffffffffffffffffffffff16610ab76119d2565b73ffffffffffffffffffffffffffffffffffffffff1614610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b04906149e6565b60405180910390fd5b80600a8190555050565b606060018054610b2690614eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5290614eb5565b8015610b9f5780601f10610b7457610100808354040283529160200191610b9f565b820191906000526020600020905b815481529060010190602001808311610b8257829003601f168201915b5050505050905090565b6000610bb48261227a565b610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea90614b86565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c398261127f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190614a66565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc9612272565b73ffffffffffffffffffffffffffffffffffffffff161480610cf85750610cf781610cf2612272565b61207c565b5b610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90614946565b60405180910390fd5b610d42838383612287565b505050565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054905090565b6000600a54600954610da69190614ce0565b421015905090565b610db9838383612339565b505050565b6060610dc8612272565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90614906565b60405180910390fd5b60004711610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190614bc6565b60405180910390fd5b6000479050610ea93382612879565b82915050919050565b610eba612272565b73ffffffffffffffffffffffffffffffffffffffff16610ed86119d2565b73ffffffffffffffffffffffffffffffffffffffff1614610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906149e6565b60405180910390fd5b8060098190555050565b600b5481565b6000610f498361129d565b8210610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f81906147c6565b60405180910390fd5b6000610f94610d8b565b905060008060005b838110156110ee576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461108e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110e057868414156110d757819550505050505061112a565b83806001019450505b508080600101915050610f9c565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112190614b26565b60405180910390fd5b92915050565b61115c81565b61115183838360405180602001604052806000815250611f42565b505050565b6000611160610d8b565b82106111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890614866565b60405180910390fd5b819050919050565b6111b1612272565b73ffffffffffffffffffffffffffffffffffffffff166111cf6119d2565b73ffffffffffffffffffffffffffffffffffffffff1614611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906149e6565b60405180910390fd5b8181600d9190611236929190613422565b505050565b600a5481565b600060095442101580156112645750600a546009546112609190614ce0565b4211155b905090565b66d529ae9e86000081565b668e1bc9bf04000081565b600061128a8261292a565b600001519050919050565b600042905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130590614966565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61138e612272565b73ffffffffffffffffffffffffffffffffffffffff166113ac6119d2565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906149e6565b60405180910390fd5b61140c6000612ac4565b565b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5461148482823360405160200161146991906146a8565b60405160208183030381529060405280519060200120612b8a565b6114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614926565b60405180910390fd5b60026008541415611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614b46565b60405180910390fd5b60026008819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614ba6565b60405180910390fd5b6009544210156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb906148c6565b60405180910390fd5b6003831115611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90614846565b60405180910390fd5b61115c83611614610d8b565b61161e9190614ce0565b111561165f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165690614986565b60405180910390fd5b3483668e1bc9bf0400006116739190614d67565b11156116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab906148a6565b60405180910390fd5b600383600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117019190614ce0565b1115611742576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611739906147e6565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561181d5782600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117d59190614ce0565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611862565b82600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61186c3384612ba1565b60016008819055505050505050565b611883612272565b73ffffffffffffffffffffffffffffffffffffffff166118a16119d2565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee906149e6565b60405180910390fd5b80600b8190555050565b611909612272565b73ffffffffffffffffffffffffffffffffffffffff166119276119d2565b73ffffffffffffffffffffffffffffffffffffffff161461197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906149e6565b60405180910390fd5b600047116119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b7906148e6565b60405180910390fd5b60004790506119cf3382612879565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600381565b611a09612272565b73ffffffffffffffffffffffffffffffffffffffff16611a276119d2565b73ffffffffffffffffffffffffffffffffffffffff1614611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a74906149e6565b60405180910390fd5b61115c82611a89610d8b565b611a939190614ce0565b1115611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614986565b60405180910390fd5b60008183611ae29190614f54565b14611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1990614b06565b60405180910390fd5b60005b8183611b319190614d36565b811015611b5557611b423383612ba1565b8080611b4d90614ee7565b915050611b25565b505050565b606060028054611b6990614eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9590614eb5565b8015611be25780601f10611bb757610100808354040283529160200191611be2565b820191906000526020600020905b815481529060010190602001808311611bc557829003601f168201915b5050505050905090565b60026008541415611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990614b46565b60405180910390fd5b60026008819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f90614ba6565b60405180910390fd5b600a54600954611cb89190614ce0565b421015611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906149c6565b60405180910390fd5b61115c81611d06610d8b565b611d109190614ce0565b1115611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890614986565b60405180910390fd5b348166d529ae9e860000611d659190614d67565b1115611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d906148a6565b60405180910390fd5b611db03382612ba1565b600160088190555050565b611dc3612272565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890614a26565b60405180910390fd5b8060066000611e3e612272565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eeb612272565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f30919061476e565b60405180910390a35050565b60095481565b611f4d848484612339565b611f5984848484612bbf565b611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f90614aa6565b60405180910390fd5b50505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611fd38261227a565b612012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200990614a06565b60405180910390fd5b600061201c612d56565b905060008151141561203d5760405180602001604052806000815250612074565b8061205360018561204e9190614ce0565b612de8565b6040516020016120649291906146c3565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612118612272565b73ffffffffffffffffffffffffffffffffffffffff166121366119d2565b73ffffffffffffffffffffffffffffffffffffffff161461218c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612183906149e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f390614806565b60405180910390fd5b61220581612ac4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006123448261292a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661236b612272565b73ffffffffffffffffffffffffffffffffffffffff1614806123c75750612390612272565b73ffffffffffffffffffffffffffffffffffffffff166123af84610ba9565b73ffffffffffffffffffffffffffffffffffffffff16145b806123e357506123e282600001516123dd612272565b61207c565b5b905080612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c90614a46565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248e906149a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe90614886565b60405180910390fd5b6125148585856001612f95565b6125246000848460000151612287565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612809576127688161227a565b156128085782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128728585856001612f9b565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161289f906146f2565b60006040518083038185875af1925050503d80600081146128dc576040519150601f19603f3d011682016040523d82523d6000602084013e6128e1565b606091505b5050905080612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90614a86565b60405180910390fd5b505050565b6129326134a8565b61293b8261227a565b61297a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297190614826565b60405180910390fd5b60008290505b60008110612a83576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a74578092505050612abf565b50808060019003915050612980565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab690614b66565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612b978584612fa1565b1490509392505050565b612bbb82826040518060200160405280600081525061303c565b5050565b6000612be08473ffffffffffffffffffffffffffffffffffffffff1661304e565b15612d49578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c09612272565b8786866040518563ffffffff1660e01b8152600401612c2b9493929190614722565b602060405180830381600087803b158015612c4557600080fd5b505af1925050508015612c7657506040513d601f19601f82011682018060405250810190612c739190613932565b60015b612cf9573d8060008114612ca6576040519150601f19603f3d011682016040523d82523d6000602084013e612cab565b606091505b50600081511415612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce890614aa6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d4e565b600190505b949350505050565b6060600d8054612d6590614eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9190614eb5565b8015612dde5780601f10612db357610100808354040283529160200191612dde565b820191906000526020600020905b815481529060010190602001808311612dc157829003601f168201915b5050505050905090565b60606000821415612e30576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f90565b600082905060005b60008214612e62578080612e4b90614ee7565b915050600a82612e5b9190614d36565b9150612e38565b60008167ffffffffffffffff811115612ea4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ed65781602001600182028036833780820191505090505b5090505b60008514612f8957600182612eef9190614dc1565b9150600a85612efe9190614f54565b6030612f0a9190614ce0565b60f81b818381518110612f46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f829190614d36565b9450612eda565b8093505050505b919050565b50505050565b50505050565b60008082905060005b8451811015613031576000858281518110612fee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161301057613009838261308d565b925061301d565b61301a818461308d565b92505b50808061302990614ee7565b915050612faa565b508091505092915050565b61304983838360016130a4565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561311a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311190614ac6565b60405180910390fd5b600084141561315e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315590614ae6565b60405180910390fd5b61316b6000868387612f95565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561340557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156133f0576133b06000888488612bbf565b6133ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e690614aa6565b60405180910390fd5b5b81806001019250508080600101915050613339565b50806000819055505061341b6000868387612f9b565b5050505050565b82805461342e90614eb5565b90600052602060002090601f0160209004810192826134505760008555613497565b82601f1061346957803560ff1916838001178555613497565b82800160010185558215613497579182015b8281111561349657823582559160200191906001019061347b565b5b5090506134a491906134e2565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156134fb5760008160009055506001016134e3565b5090565b600061351261350d84614c32565b614c01565b90508281526020810184848401111561352a57600080fd5b613535848285614e73565b509392505050565b600061355061354b84614c62565b614c01565b90508281526020810184848401111561356857600080fd5b613573848285614e73565b509392505050565b60008135905061358a8161505f565b92915050565b60008083601f8401126135a257600080fd5b8235905067ffffffffffffffff8111156135bb57600080fd5b6020830191508360208202830111156135d357600080fd5b9250929050565b6000813590506135e981615076565b92915050565b6000813590506135fe8161508d565b92915050565b600081359050613613816150a4565b92915050565b600081519050613628816150a4565b92915050565b600082601f83011261363f57600080fd5b813561364f8482602086016134ff565b91505092915050565b60008083601f84011261366a57600080fd5b8235905067ffffffffffffffff81111561368357600080fd5b60208301915083600182028301111561369b57600080fd5b9250929050565b600082601f8301126136b357600080fd5b81356136c384826020860161353d565b91505092915050565b6000813590506136db816150bb565b92915050565b6000602082840312156136f357600080fd5b60006137018482850161357b565b91505092915050565b6000806040838503121561371d57600080fd5b600061372b8582860161357b565b925050602061373c8582860161357b565b9150509250929050565b60008060006060848603121561375b57600080fd5b60006137698682870161357b565b935050602061377a8682870161357b565b925050604061378b868287016136cc565b9150509250925092565b600080600080608085870312156137ab57600080fd5b60006137b98782880161357b565b94505060206137ca8782880161357b565b93505060406137db878288016136cc565b925050606085013567ffffffffffffffff8111156137f857600080fd5b6138048782880161362e565b91505092959194509250565b6000806040838503121561382357600080fd5b60006138318582860161357b565b9250506020613842858286016135da565b9150509250929050565b6000806040838503121561385f57600080fd5b600061386d8582860161357b565b925050602061387e858286016136cc565b9150509250929050565b60008060006040848603121561389d57600080fd5b600084013567ffffffffffffffff8111156138b757600080fd5b6138c386828701613590565b935093505060206138d6868287016136cc565b9150509250925092565b6000602082840312156138f257600080fd5b6000613900848285016135ef565b91505092915050565b60006020828403121561391b57600080fd5b600061392984828501613604565b91505092915050565b60006020828403121561394457600080fd5b600061395284828501613619565b91505092915050565b6000806020838503121561396e57600080fd5b600083013567ffffffffffffffff81111561398857600080fd5b61399485828601613658565b92509250509250929050565b6000602082840312156139b257600080fd5b600082013567ffffffffffffffff8111156139cc57600080fd5b6139d8848285016136a2565b91505092915050565b6000602082840312156139f357600080fd5b6000613a01848285016136cc565b91505092915050565b60008060408385031215613a1d57600080fd5b6000613a2b858286016136cc565b9250506020613a3c858286016136cc565b9150509250929050565b613a4f81614df5565b82525050565b613a66613a6182614df5565b614f30565b82525050565b613a7581614e07565b82525050565b613a8481614e13565b82525050565b6000613a9582614c92565b613a9f8185614ca8565b9350613aaf818560208601614e82565b613ab881615041565b840191505092915050565b6000613ace82614c9d565b613ad88185614cc4565b9350613ae8818560208601614e82565b613af181615041565b840191505092915050565b6000613b0782614c9d565b613b118185614cd5565b9350613b21818560208601614e82565b80840191505092915050565b6000613b3a602283614cc4565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ba0601a83614cc4565b91507f457863656564732070726573616c65206d696e74206c696d69740000000000006000830152602082019050919050565b6000613be0602683614cc4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c46602a83614cc4565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cac601a83614cc4565b91507f45786365656473206d617820746f6b656e2070757263686173650000000000006000830152602082019050919050565b6000613cec602383614cc4565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d52602583614cc4565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613db8601883614cc4565b91507f53656e7420696e636f7272656374204554482076616c756500000000000000006000830152602082019050919050565b6000613df8601283614cc4565b91507f50726573616c65206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000613e38601483614cc4565b91507f4e6f2066756e647320746f2077697468647261770000000000000000000000006000830152602082019050919050565b6000613e78601183614cc4565b91507f555249206973206e6f74207365742121210000000000000000000000000000006000830152602082019050919050565b6000613eb8601e83614cc4565b91507f4164647265737320646f6573206e6f7420657869737420696e206c69737400006000830152602082019050919050565b6000613ef8603983614cc4565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613f5e602b83614cc4565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc4601983614cc4565b91507f4d696e74206578636565647320746f74616c20737570706c79000000000000006000830152602082019050919050565b6000614004602683614cc4565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061406a600583614cd5565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006140aa601683614cc4565b91507f5075626c69632073616c65206e6f7420616374697665000000000000000000006000830152602082019050919050565b60006140ea602083614cc4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061412a602f83614cc4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614190601a83614cc4565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006141d0603283614cc4565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614236602283614cc4565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061429c600083614cb9565b9150600082019050919050565b60006142b6601083614cc4565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b60006142f6603383614cc4565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b600061435c602183614cc4565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c2602883614cc4565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72207468616e20300000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614428602583614cc4565b91507f43616e206f6e6c79206d696e742061206d756c7469706c65206f66206261746360008301527f6853697a650000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061448e602e83614cc4565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006144f4601f83614cc4565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000614534602f83614cc4565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061459a602d83614cc4565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614600602383614cc4565b91507f43616e2774206d696e74207468726f75676820616e6f7468657220636f6e747260008301527f61637400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614666600783614cc4565b91507f4e6f2068617368000000000000000000000000000000000000000000000000006000830152602082019050919050565b6146a281614e69565b82525050565b60006146b48284613a55565b60148201915081905092915050565b60006146cf8285613afc565b91506146db8284613afc565b91506146e68261405d565b91508190509392505050565b60006146fd8261428f565b9150819050919050565b600060208201905061471c6000830184613a46565b92915050565b60006080820190506147376000830187613a46565b6147446020830186613a46565b6147516040830185614699565b81810360608301526147638184613a8a565b905095945050505050565b60006020820190506147836000830184613a6c565b92915050565b600060208201905061479e6000830184613a7b565b92915050565b600060208201905081810360008301526147be8184613ac3565b905092915050565b600060208201905081810360008301526147df81613b2d565b9050919050565b600060208201905081810360008301526147ff81613b93565b9050919050565b6000602082019050818103600083015261481f81613bd3565b9050919050565b6000602082019050818103600083015261483f81613c39565b9050919050565b6000602082019050818103600083015261485f81613c9f565b9050919050565b6000602082019050818103600083015261487f81613cdf565b9050919050565b6000602082019050818103600083015261489f81613d45565b9050919050565b600060208201905081810360008301526148bf81613dab565b9050919050565b600060208201905081810360008301526148df81613deb565b9050919050565b600060208201905081810360008301526148ff81613e2b565b9050919050565b6000602082019050818103600083015261491f81613e6b565b9050919050565b6000602082019050818103600083015261493f81613eab565b9050919050565b6000602082019050818103600083015261495f81613eeb565b9050919050565b6000602082019050818103600083015261497f81613f51565b9050919050565b6000602082019050818103600083015261499f81613fb7565b9050919050565b600060208201905081810360008301526149bf81613ff7565b9050919050565b600060208201905081810360008301526149df8161409d565b9050919050565b600060208201905081810360008301526149ff816140dd565b9050919050565b60006020820190508181036000830152614a1f8161411d565b9050919050565b60006020820190508181036000830152614a3f81614183565b9050919050565b60006020820190508181036000830152614a5f816141c3565b9050919050565b60006020820190508181036000830152614a7f81614229565b9050919050565b60006020820190508181036000830152614a9f816142a9565b9050919050565b60006020820190508181036000830152614abf816142e9565b9050919050565b60006020820190508181036000830152614adf8161434f565b9050919050565b60006020820190508181036000830152614aff816143b5565b9050919050565b60006020820190508181036000830152614b1f8161441b565b9050919050565b60006020820190508181036000830152614b3f81614481565b9050919050565b60006020820190508181036000830152614b5f816144e7565b9050919050565b60006020820190508181036000830152614b7f81614527565b9050919050565b60006020820190508181036000830152614b9f8161458d565b9050919050565b60006020820190508181036000830152614bbf816145f3565b9050919050565b60006020820190508181036000830152614bdf81614659565b9050919050565b6000602082019050614bfb6000830184614699565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614c2857614c27615012565b5b8060405250919050565b600067ffffffffffffffff821115614c4d57614c4c615012565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614c7d57614c7c615012565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ceb82614e69565b9150614cf683614e69565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2b57614d2a614f85565b5b828201905092915050565b6000614d4182614e69565b9150614d4c83614e69565b925082614d5c57614d5b614fb4565b5b828204905092915050565b6000614d7282614e69565b9150614d7d83614e69565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614db657614db5614f85565b5b828202905092915050565b6000614dcc82614e69565b9150614dd783614e69565b925082821015614dea57614de9614f85565b5b828203905092915050565b6000614e0082614e49565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ea0578082015181840152602081019050614e85565b83811115614eaf576000848401525b50505050565b60006002820490506001821680614ecd57607f821691505b60208210811415614ee157614ee0614fe3565b5b50919050565b6000614ef282614e69565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f2557614f24614f85565b5b600182019050919050565b6000614f3b82614f42565b9050919050565b6000614f4d82615052565b9050919050565b6000614f5f82614e69565b9150614f6a83614e69565b925082614f7a57614f79614fb4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61506881614df5565b811461507357600080fd5b50565b61507f81614e07565b811461508a57600080fd5b50565b61509681614e13565b81146150a157600080fd5b50565b6150ad81614e1d565b81146150b857600080fd5b50565b6150c481614e69565b81146150cf57600080fd5b5056fea2646970667358221220078725e520d5299151850dc0a54f14dd90d921b69a635a8c7323bc611f972e3c64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061023f5760003560e01c806362dc6e211161012e5780639525002f116100ab578063b88d4fde1161006f578063b88d4fde14610850578063c76a412214610879578063c87b56dd146108a4578063e985e9c5146108e1578063f2fde38b1461091e57610246565b80639525002f1461078c57806395d89b41146107b5578063a0712d68146107e0578063a22cb465146107fc578063a82524b21461082557610246565b806378179976116100f257806378179976146106da5780637cb64759146106f6578063853828b61461071f5780638da5cb5b146107365780639208383a1461076157610246565b806362dc6e21146105f35780636352211e1461061e5780636ea409ba1461065b57806370a0823114610686578063715018a6146106c357610246565b8063296cab55116101bc5780634f6ccce7116101805780634f6ccce71461050c57806355f804b3146105495780635868c32a1461057257806360d938dc1461059d578063611f3f10146105c857610246565b8063296cab55146104275780632eb4a7ab146104505780632f745c591461047b57806332cb6b0c146104b857806342842e0e146104e357610246565b80630dae350d116102035780630dae350d1461034257806318160ddd1461036b5780631e84c4131461039657806323b872dd146103c15780632948413b146103ea57610246565b806301ffc9a71461024b5780630259dae71461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613909565b610947565b60405161027f919061476e565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa91906139e1565b610a91565b005b3480156102bd57600080fd5b506102c6610b17565b6040516102d391906147a4565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe91906139e1565b610ba9565b6040516103109190614707565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b919061384c565b610c2e565b005b34801561034e57600080fd5b50610369600480360381019061036491906136e1565b610d47565b005b34801561037757600080fd5b50610380610d8b565b60405161038d9190614be6565b60405180910390f35b3480156103a257600080fd5b506103ab610d94565b6040516103b8919061476e565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613746565b610dae565b005b3480156103f657600080fd5b50610411600480360381019061040c91906139a0565b610dbe565b60405161041e91906147a4565b60405180910390f35b34801561043357600080fd5b5061044e600480360381019061044991906139e1565b610eb2565b005b34801561045c57600080fd5b50610465610f38565b6040516104729190614789565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d919061384c565b610f3e565b6040516104af9190614be6565b60405180910390f35b3480156104c457600080fd5b506104cd611130565b6040516104da9190614be6565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190613746565b611136565b005b34801561051857600080fd5b50610533600480360381019061052e91906139e1565b611156565b6040516105409190614be6565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b919061395b565b6111a9565b005b34801561057e57600080fd5b5061058761123b565b6040516105949190614be6565b60405180910390f35b3480156105a957600080fd5b506105b2611241565b6040516105bf919061476e565b60405180910390f35b3480156105d457600080fd5b506105dd611269565b6040516105ea9190614be6565b60405180910390f35b3480156105ff57600080fd5b50610608611274565b6040516106159190614be6565b60405180910390f35b34801561062a57600080fd5b50610645600480360381019061064091906139e1565b61127f565b6040516106529190614707565b60405180910390f35b34801561066757600080fd5b50610670611295565b60405161067d9190614be6565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a891906136e1565b61129d565b6040516106ba9190614be6565b60405180910390f35b3480156106cf57600080fd5b506106d8611386565b005b6106f460048036038101906106ef9190613888565b61140e565b005b34801561070257600080fd5b5061071d600480360381019061071891906138e0565b61187b565b005b34801561072b57600080fd5b50610734611901565b005b34801561074257600080fd5b5061074b6119d2565b6040516107589190614707565b60405180910390f35b34801561076d57600080fd5b506107766119fc565b6040516107839190614be6565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae9190613a0a565b611a01565b005b3480156107c157600080fd5b506107ca611b5a565b6040516107d791906147a4565b60405180910390f35b6107fa60048036038101906107f591906139e1565b611bec565b005b34801561080857600080fd5b50610823600480360381019061081e9190613810565b611dbb565b005b34801561083157600080fd5b5061083a611f3c565b6040516108479190614be6565b60405180910390f35b34801561085c57600080fd5b5061087760048036038101906108729190613795565b611f42565b005b34801561088557600080fd5b5061088e611f9e565b60405161089b9190614707565b60405180910390f35b3480156108b057600080fd5b506108cb60048036038101906108c691906139e1565b611fc8565b6040516108d891906147a4565b60405180910390f35b3480156108ed57600080fd5b506109086004803603810190610903919061370a565b61207c565b604051610915919061476e565b60405180910390f35b34801561092a57600080fd5b50610945600480360381019061094091906136e1565b612110565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7a57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a8a5750610a8982612208565b5b9050919050565b610a99612272565b73ffffffffffffffffffffffffffffffffffffffff16610ab76119d2565b73ffffffffffffffffffffffffffffffffffffffff1614610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b04906149e6565b60405180910390fd5b80600a8190555050565b606060018054610b2690614eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5290614eb5565b8015610b9f5780601f10610b7457610100808354040283529160200191610b9f565b820191906000526020600020905b815481529060010190602001808311610b8257829003601f168201915b5050505050905090565b6000610bb48261227a565b610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea90614b86565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c398261127f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190614a66565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc9612272565b73ffffffffffffffffffffffffffffffffffffffff161480610cf85750610cf781610cf2612272565b61207c565b5b610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90614946565b60405180910390fd5b610d42838383612287565b505050565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054905090565b6000600a54600954610da69190614ce0565b421015905090565b610db9838383612339565b505050565b6060610dc8612272565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90614906565b60405180910390fd5b60004711610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190614bc6565b60405180910390fd5b6000479050610ea93382612879565b82915050919050565b610eba612272565b73ffffffffffffffffffffffffffffffffffffffff16610ed86119d2565b73ffffffffffffffffffffffffffffffffffffffff1614610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906149e6565b60405180910390fd5b8060098190555050565b600b5481565b6000610f498361129d565b8210610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f81906147c6565b60405180910390fd5b6000610f94610d8b565b905060008060005b838110156110ee576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461108e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110e057868414156110d757819550505050505061112a565b83806001019450505b508080600101915050610f9c565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112190614b26565b60405180910390fd5b92915050565b61115c81565b61115183838360405180602001604052806000815250611f42565b505050565b6000611160610d8b565b82106111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119890614866565b60405180910390fd5b819050919050565b6111b1612272565b73ffffffffffffffffffffffffffffffffffffffff166111cf6119d2565b73ffffffffffffffffffffffffffffffffffffffff1614611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906149e6565b60405180910390fd5b8181600d9190611236929190613422565b505050565b600a5481565b600060095442101580156112645750600a546009546112609190614ce0565b4211155b905090565b66d529ae9e86000081565b668e1bc9bf04000081565b600061128a8261292a565b600001519050919050565b600042905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130590614966565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61138e612272565b73ffffffffffffffffffffffffffffffffffffffff166113ac6119d2565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906149e6565b60405180910390fd5b61140c6000612ac4565b565b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5461148482823360405160200161146991906146a8565b60405160208183030381529060405280519060200120612b8a565b6114c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ba90614926565b60405180910390fd5b60026008541415611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614b46565b60405180910390fd5b60026008819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614ba6565b60405180910390fd5b6009544210156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb906148c6565b60405180910390fd5b6003831115611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90614846565b60405180910390fd5b61115c83611614610d8b565b61161e9190614ce0565b111561165f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165690614986565b60405180910390fd5b3483668e1bc9bf0400006116739190614d67565b11156116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab906148a6565b60405180910390fd5b600383600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117019190614ce0565b1115611742576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611739906147e6565b60405180910390fd5b6000600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561181d5782600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117d59190614ce0565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611862565b82600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61186c3384612ba1565b60016008819055505050505050565b611883612272565b73ffffffffffffffffffffffffffffffffffffffff166118a16119d2565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee906149e6565b60405180910390fd5b80600b8190555050565b611909612272565b73ffffffffffffffffffffffffffffffffffffffff166119276119d2565b73ffffffffffffffffffffffffffffffffffffffff161461197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906149e6565b60405180910390fd5b600047116119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b7906148e6565b60405180910390fd5b60004790506119cf3382612879565b50565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600381565b611a09612272565b73ffffffffffffffffffffffffffffffffffffffff16611a276119d2565b73ffffffffffffffffffffffffffffffffffffffff1614611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a74906149e6565b60405180910390fd5b61115c82611a89610d8b565b611a939190614ce0565b1115611ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acb90614986565b60405180910390fd5b60008183611ae29190614f54565b14611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1990614b06565b60405180910390fd5b60005b8183611b319190614d36565b811015611b5557611b423383612ba1565b8080611b4d90614ee7565b915050611b25565b505050565b606060028054611b6990614eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9590614eb5565b8015611be25780601f10611bb757610100808354040283529160200191611be2565b820191906000526020600020905b815481529060010190602001808311611bc557829003601f168201915b5050505050905090565b60026008541415611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990614b46565b60405180910390fd5b60026008819055503273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9f90614ba6565b60405180910390fd5b600a54600954611cb89190614ce0565b421015611cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf1906149c6565b60405180910390fd5b61115c81611d06610d8b565b611d109190614ce0565b1115611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890614986565b60405180910390fd5b348166d529ae9e860000611d659190614d67565b1115611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d906148a6565b60405180910390fd5b611db03382612ba1565b600160088190555050565b611dc3612272565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890614a26565b60405180910390fd5b8060066000611e3e612272565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eeb612272565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f30919061476e565b60405180910390a35050565b60095481565b611f4d848484612339565b611f5984848484612bbf565b611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f90614aa6565b60405180910390fd5b50505050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060611fd38261227a565b612012576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200990614a06565b60405180910390fd5b600061201c612d56565b905060008151141561203d5760405180602001604052806000815250612074565b8061205360018561204e9190614ce0565b612de8565b6040516020016120649291906146c3565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612118612272565b73ffffffffffffffffffffffffffffffffffffffff166121366119d2565b73ffffffffffffffffffffffffffffffffffffffff161461218c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612183906149e6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f390614806565b60405180910390fd5b61220581612ac4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006123448261292a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661236b612272565b73ffffffffffffffffffffffffffffffffffffffff1614806123c75750612390612272565b73ffffffffffffffffffffffffffffffffffffffff166123af84610ba9565b73ffffffffffffffffffffffffffffffffffffffff16145b806123e357506123e282600001516123dd612272565b61207c565b5b905080612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c90614a46565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248e906149a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe90614886565b60405180910390fd5b6125148585856001612f95565b6125246000848460000151612287565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612809576127688161227a565b156128085782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128728585856001612f9b565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161289f906146f2565b60006040518083038185875af1925050503d80600081146128dc576040519150601f19603f3d011682016040523d82523d6000602084013e6128e1565b606091505b5050905080612925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291c90614a86565b60405180910390fd5b505050565b6129326134a8565b61293b8261227a565b61297a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297190614826565b60405180910390fd5b60008290505b60008110612a83576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a74578092505050612abf565b50808060019003915050612980565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab690614b66565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612b978584612fa1565b1490509392505050565b612bbb82826040518060200160405280600081525061303c565b5050565b6000612be08473ffffffffffffffffffffffffffffffffffffffff1661304e565b15612d49578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c09612272565b8786866040518563ffffffff1660e01b8152600401612c2b9493929190614722565b602060405180830381600087803b158015612c4557600080fd5b505af1925050508015612c7657506040513d601f19601f82011682018060405250810190612c739190613932565b60015b612cf9573d8060008114612ca6576040519150601f19603f3d011682016040523d82523d6000602084013e612cab565b606091505b50600081511415612cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce890614aa6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d4e565b600190505b949350505050565b6060600d8054612d6590614eb5565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9190614eb5565b8015612dde5780601f10612db357610100808354040283529160200191612dde565b820191906000526020600020905b815481529060010190602001808311612dc157829003601f168201915b5050505050905090565b60606000821415612e30576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f90565b600082905060005b60008214612e62578080612e4b90614ee7565b915050600a82612e5b9190614d36565b9150612e38565b60008167ffffffffffffffff811115612ea4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ed65781602001600182028036833780820191505090505b5090505b60008514612f8957600182612eef9190614dc1565b9150600a85612efe9190614f54565b6030612f0a9190614ce0565b60f81b818381518110612f46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f829190614d36565b9450612eda565b8093505050505b919050565b50505050565b50505050565b60008082905060005b8451811015613031576000858281518110612fee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161301057613009838261308d565b925061301d565b61301a818461308d565b92505b50808061302990614ee7565b915050612faa565b508091505092915050565b61304983838360016130a4565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561311a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311190614ac6565b60405180910390fd5b600084141561315e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315590614ae6565b60405180910390fd5b61316b6000868387612f95565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561340557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156133f0576133b06000888488612bbf565b6133ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e690614aa6565b60405180910390fd5b5b81806001019250508080600101915050613339565b50806000819055505061341b6000868387612f9b565b5050505050565b82805461342e90614eb5565b90600052602060002090601f0160209004810192826134505760008555613497565b82601f1061346957803560ff1916838001178555613497565b82800160010185558215613497579182015b8281111561349657823582559160200191906001019061347b565b5b5090506134a491906134e2565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156134fb5760008160009055506001016134e3565b5090565b600061351261350d84614c32565b614c01565b90508281526020810184848401111561352a57600080fd5b613535848285614e73565b509392505050565b600061355061354b84614c62565b614c01565b90508281526020810184848401111561356857600080fd5b613573848285614e73565b509392505050565b60008135905061358a8161505f565b92915050565b60008083601f8401126135a257600080fd5b8235905067ffffffffffffffff8111156135bb57600080fd5b6020830191508360208202830111156135d357600080fd5b9250929050565b6000813590506135e981615076565b92915050565b6000813590506135fe8161508d565b92915050565b600081359050613613816150a4565b92915050565b600081519050613628816150a4565b92915050565b600082601f83011261363f57600080fd5b813561364f8482602086016134ff565b91505092915050565b60008083601f84011261366a57600080fd5b8235905067ffffffffffffffff81111561368357600080fd5b60208301915083600182028301111561369b57600080fd5b9250929050565b600082601f8301126136b357600080fd5b81356136c384826020860161353d565b91505092915050565b6000813590506136db816150bb565b92915050565b6000602082840312156136f357600080fd5b60006137018482850161357b565b91505092915050565b6000806040838503121561371d57600080fd5b600061372b8582860161357b565b925050602061373c8582860161357b565b9150509250929050565b60008060006060848603121561375b57600080fd5b60006137698682870161357b565b935050602061377a8682870161357b565b925050604061378b868287016136cc565b9150509250925092565b600080600080608085870312156137ab57600080fd5b60006137b98782880161357b565b94505060206137ca8782880161357b565b93505060406137db878288016136cc565b925050606085013567ffffffffffffffff8111156137f857600080fd5b6138048782880161362e565b91505092959194509250565b6000806040838503121561382357600080fd5b60006138318582860161357b565b9250506020613842858286016135da565b9150509250929050565b6000806040838503121561385f57600080fd5b600061386d8582860161357b565b925050602061387e858286016136cc565b9150509250929050565b60008060006040848603121561389d57600080fd5b600084013567ffffffffffffffff8111156138b757600080fd5b6138c386828701613590565b935093505060206138d6868287016136cc565b9150509250925092565b6000602082840312156138f257600080fd5b6000613900848285016135ef565b91505092915050565b60006020828403121561391b57600080fd5b600061392984828501613604565b91505092915050565b60006020828403121561394457600080fd5b600061395284828501613619565b91505092915050565b6000806020838503121561396e57600080fd5b600083013567ffffffffffffffff81111561398857600080fd5b61399485828601613658565b92509250509250929050565b6000602082840312156139b257600080fd5b600082013567ffffffffffffffff8111156139cc57600080fd5b6139d8848285016136a2565b91505092915050565b6000602082840312156139f357600080fd5b6000613a01848285016136cc565b91505092915050565b60008060408385031215613a1d57600080fd5b6000613a2b858286016136cc565b9250506020613a3c858286016136cc565b9150509250929050565b613a4f81614df5565b82525050565b613a66613a6182614df5565b614f30565b82525050565b613a7581614e07565b82525050565b613a8481614e13565b82525050565b6000613a9582614c92565b613a9f8185614ca8565b9350613aaf818560208601614e82565b613ab881615041565b840191505092915050565b6000613ace82614c9d565b613ad88185614cc4565b9350613ae8818560208601614e82565b613af181615041565b840191505092915050565b6000613b0782614c9d565b613b118185614cd5565b9350613b21818560208601614e82565b80840191505092915050565b6000613b3a602283614cc4565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ba0601a83614cc4565b91507f457863656564732070726573616c65206d696e74206c696d69740000000000006000830152602082019050919050565b6000613be0602683614cc4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c46602a83614cc4565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cac601a83614cc4565b91507f45786365656473206d617820746f6b656e2070757263686173650000000000006000830152602082019050919050565b6000613cec602383614cc4565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d52602583614cc4565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613db8601883614cc4565b91507f53656e7420696e636f7272656374204554482076616c756500000000000000006000830152602082019050919050565b6000613df8601283614cc4565b91507f50726573616c65206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000613e38601483614cc4565b91507f4e6f2066756e647320746f2077697468647261770000000000000000000000006000830152602082019050919050565b6000613e78601183614cc4565b91507f555249206973206e6f74207365742121210000000000000000000000000000006000830152602082019050919050565b6000613eb8601e83614cc4565b91507f4164647265737320646f6573206e6f7420657869737420696e206c69737400006000830152602082019050919050565b6000613ef8603983614cc4565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613f5e602b83614cc4565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fc4601983614cc4565b91507f4d696e74206578636565647320746f74616c20737570706c79000000000000006000830152602082019050919050565b6000614004602683614cc4565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061406a600583614cd5565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b60006140aa601683614cc4565b91507f5075626c69632073616c65206e6f7420616374697665000000000000000000006000830152602082019050919050565b60006140ea602083614cc4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061412a602f83614cc4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614190601a83614cc4565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006141d0603283614cc4565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000614236602283614cc4565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061429c600083614cb9565b9150600082019050919050565b60006142b6601083614cc4565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b60006142f6603383614cc4565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b600061435c602183614cc4565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c2602883614cc4565b91507f455243373231413a207175616e74697479206d7573742062652067726561746560008301527f72207468616e20300000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614428602583614cc4565b91507f43616e206f6e6c79206d696e742061206d756c7469706c65206f66206261746360008301527f6853697a650000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061448e602e83614cc4565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006144f4601f83614cc4565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000614534602f83614cc4565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061459a602d83614cc4565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614600602383614cc4565b91507f43616e2774206d696e74207468726f75676820616e6f7468657220636f6e747260008301527f61637400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614666600783614cc4565b91507f4e6f2068617368000000000000000000000000000000000000000000000000006000830152602082019050919050565b6146a281614e69565b82525050565b60006146b48284613a55565b60148201915081905092915050565b60006146cf8285613afc565b91506146db8284613afc565b91506146e68261405d565b91508190509392505050565b60006146fd8261428f565b9150819050919050565b600060208201905061471c6000830184613a46565b92915050565b60006080820190506147376000830187613a46565b6147446020830186613a46565b6147516040830185614699565b81810360608301526147638184613a8a565b905095945050505050565b60006020820190506147836000830184613a6c565b92915050565b600060208201905061479e6000830184613a7b565b92915050565b600060208201905081810360008301526147be8184613ac3565b905092915050565b600060208201905081810360008301526147df81613b2d565b9050919050565b600060208201905081810360008301526147ff81613b93565b9050919050565b6000602082019050818103600083015261481f81613bd3565b9050919050565b6000602082019050818103600083015261483f81613c39565b9050919050565b6000602082019050818103600083015261485f81613c9f565b9050919050565b6000602082019050818103600083015261487f81613cdf565b9050919050565b6000602082019050818103600083015261489f81613d45565b9050919050565b600060208201905081810360008301526148bf81613dab565b9050919050565b600060208201905081810360008301526148df81613deb565b9050919050565b600060208201905081810360008301526148ff81613e2b565b9050919050565b6000602082019050818103600083015261491f81613e6b565b9050919050565b6000602082019050818103600083015261493f81613eab565b9050919050565b6000602082019050818103600083015261495f81613eeb565b9050919050565b6000602082019050818103600083015261497f81613f51565b9050919050565b6000602082019050818103600083015261499f81613fb7565b9050919050565b600060208201905081810360008301526149bf81613ff7565b9050919050565b600060208201905081810360008301526149df8161409d565b9050919050565b600060208201905081810360008301526149ff816140dd565b9050919050565b60006020820190508181036000830152614a1f8161411d565b9050919050565b60006020820190508181036000830152614a3f81614183565b9050919050565b60006020820190508181036000830152614a5f816141c3565b9050919050565b60006020820190508181036000830152614a7f81614229565b9050919050565b60006020820190508181036000830152614a9f816142a9565b9050919050565b60006020820190508181036000830152614abf816142e9565b9050919050565b60006020820190508181036000830152614adf8161434f565b9050919050565b60006020820190508181036000830152614aff816143b5565b9050919050565b60006020820190508181036000830152614b1f8161441b565b9050919050565b60006020820190508181036000830152614b3f81614481565b9050919050565b60006020820190508181036000830152614b5f816144e7565b9050919050565b60006020820190508181036000830152614b7f81614527565b9050919050565b60006020820190508181036000830152614b9f8161458d565b9050919050565b60006020820190508181036000830152614bbf816145f3565b9050919050565b60006020820190508181036000830152614bdf81614659565b9050919050565b6000602082019050614bfb6000830184614699565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614c2857614c27615012565b5b8060405250919050565b600067ffffffffffffffff821115614c4d57614c4c615012565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614c7d57614c7c615012565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ceb82614e69565b9150614cf683614e69565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2b57614d2a614f85565b5b828201905092915050565b6000614d4182614e69565b9150614d4c83614e69565b925082614d5c57614d5b614fb4565b5b828204905092915050565b6000614d7282614e69565b9150614d7d83614e69565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614db657614db5614f85565b5b828202905092915050565b6000614dcc82614e69565b9150614dd783614e69565b925082821015614dea57614de9614f85565b5b828203905092915050565b6000614e0082614e49565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ea0578082015181840152602081019050614e85565b83811115614eaf576000848401525b50505050565b60006002820490506001821680614ecd57607f821691505b60208210811415614ee157614ee0614fe3565b5b50919050565b6000614ef282614e69565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f2557614f24614f85565b5b600182019050919050565b6000614f3b82614f42565b9050919050565b6000614f4d82615052565b9050919050565b6000614f5f82614e69565b9150614f6a83614e69565b925082614f7a57614f79614fb4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61506881614df5565b811461507357600080fd5b50565b61507f81614e07565b811461508a57600080fd5b50565b61509681614e13565b81146150a157600080fd5b50565b6150ad81614e1d565b81146150b857600080fd5b50565b6150c481614e69565b81146150cf57600080fd5b5056fea2646970667358221220078725e520d5299151850dc0a54f14dd90d921b69a635a8c7323bc611f972e3c64736f6c63430008000033

Deployed Bytecode Sourcemap

43662:5249:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30531:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48110:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32417:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33979:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33500:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48244:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28788:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48620:139;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34855:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47044:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47972:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44097:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29452:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43763:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35088:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28965:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46800:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44058:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48438:174;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43863:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43940:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32226:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48767:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30967:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23663:103;;;;;;;;;;;;;:::i;:::-;;44788:911;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47670:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46184:226;;;;;;;;;;;;;:::i;:::-;;23012:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43811:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46418:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32586:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45707:469;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34265:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44020:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35336:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48339:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47312:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34624:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23921:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30531:372;30633:4;30685:25;30670:40;;;:11;:40;;;;:105;;;;30742:33;30727:48;;;:11;:48;;;;30670:105;:172;;;;30807:35;30792:50;;;:11;:50;;;;30670:172;:225;;;;30859:36;30883:11;30859:23;:36::i;:::-;30670:225;30650:245;;30531:372;;;:::o;48110:126::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48212:16:::1;48194:15;:34;;;;48110:126:::0;:::o;32417:100::-;32471:13;32504:5;32497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32417:100;:::o;33979:214::-;34047:7;34075:16;34083:7;34075;:16::i;:::-;34067:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34161:15;:24;34177:7;34161:24;;;;;;;;;;;;;;;;;;;;;34154:31;;33979:214;;;:::o;33500:413::-;33573:13;33589:24;33605:7;33589:15;:24::i;:::-;33573:40;;33638:5;33632:11;;:2;:11;;;;33624:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33733:5;33717:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33742:37;33759:5;33766:12;:10;:12::i;:::-;33742:16;:37::i;:::-;33717:62;33695:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;33877:28;33886:2;33890:7;33899:5;33877:8;:28::i;:::-;33500:413;;;:::o;48244:87::-;48314:9;48302;;:21;;;;;;;;;;;;;;;;;;48244:87;:::o;28788:100::-;28841:7;28868:12;;28861:19;;28788:100;:::o;48620:139::-;48671:4;48735:15;;48715:16;;:35;;;;:::i;:::-;48695:15;:56;;48688:63;;48620:139;:::o;34855:162::-;34981:28;34991:4;34997:2;35001:7;34981:9;:28::i;:::-;34855:162;;;:::o;47044:260::-;47113:13;44488:12;:10;:12::i;:::-;44475:25;;:9;;;;;;;;;;;:25;;;44467:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47171:1:::1;47147:21;:25;47139:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;47195:15;47213:21;47195:39;;47245:30;47255:10;47267:7;47245:9;:30::i;:::-;47293:3;47286:10;;;47044:260:::0;;;:::o;47972:130::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48077:17:::1;48058:16;:36;;;;47972:130:::0;:::o;44097:25::-;;;;:::o;29452:1007::-;29541:7;29577:16;29587:5;29577:9;:16::i;:::-;29569:5;:24;29561:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29643:22;29668:13;:11;:13::i;:::-;29643:38;;29692:19;29722:25;29911:9;29906:466;29926:14;29922:1;:18;29906:466;;;29966:31;30000:11;:14;30012:1;30000:14;;;;;;;;;;;29966:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30063:1;30037:28;;:9;:14;;;:28;;;30033:111;;30110:9;:14;;;30090:34;;30033:111;30187:5;30166:26;;:17;:26;;;30162:195;;;30236:5;30221:11;:20;30217:85;;;30277:1;30270:8;;;;;;;;;30217:85;30324:13;;;;;;;30162:195;29906:466;29942:3;;;;;;;29906:466;;;;30395:56;;;;;;;;;;:::i;:::-;;;;;;;;29452:1007;;;;;:::o;43763:41::-;43800:4;43763:41;:::o;35088:177::-;35218:39;35235:4;35241:2;35245:7;35218:39;;;;;;;;;;;;:16;:39::i;:::-;35088:177;;;:::o;28965:187::-;29032:7;29068:13;:11;:13::i;:::-;29060:5;:21;29052:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29139:5;29132:12;;28965:187;;;:::o;46800:111::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46895:8:::1;;46876:16;:27;;;;;;;:::i;:::-;;46800:111:::0;;:::o;44058:30::-;;;;:::o;48438:174::-;48486:4;48529:16;;48510:15;:35;;:94;;;;;48588:15;;48569:16;;:34;;;;:::i;:::-;48549:15;:55;;48510:94;48503:101;;48438:174;:::o;43863:49::-;43902:10;43863:49;:::o;43940:50::-;43980:10;43940:50;:::o;32226:124::-;32290:7;32317:20;32329:7;32317:11;:20::i;:::-;:25;;;32310:32;;32226:124;;;:::o;48767:104::-;48821:7;48848:15;48841:22;;48767:104;:::o;30967:221::-;31031:7;31076:1;31059:19;;:5;:19;;;;31051:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31152:12;:19;31165:5;31152:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31144:36;;31137:43;;30967:221;;;:::o;23663:103::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23728:30:::1;23755:1;23728:18;:30::i;:::-;23663:103::o:0;44788:911::-;44888:6;;44550:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44896:10;;44641:78;44660:11;44673:4;44706:10;44689:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;44679:39;;;;;;44641:18;:78::i;:::-;44633:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;26133:1:::1;26731:7;;:19;;26723:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;26133:1;26864:7;:18;;;;44954:9:::2;44940:23;;:10;:23;;;44932:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45041:16;;45022:15;:35;;45014:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43855:1;45099:6;:27;;45091:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43800:4;45192:6;45176:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;45168:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45287:9;45277:6;43980:10;45261:22;;;;:::i;:::-;:35;;45253:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;43855:1;45367:6;45344:8;:20;45353:10;45344:20;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:50;;45336:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;45514:1;45491:8;:20;45500:10;45491:20;;;;;;;;;;;;;;;;:24;45487:163;;;45574:6;45551:8;:20;45560:10;45551:20;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;45528:8;:20;45537:10;45528:20;;;;;;;;;;;;;;;:52;;;;45487:163;;;45632:6;45609:8;:20;45618:10;45609:20;;;;;;;;;;;;;;;:29;;;;45487:163;45662:29;45672:10;45684:6;45662:9;:29::i;:::-;26089:1:::1;27043:7;:22;;;;44788:911:::0;;;;;:::o;47670:106::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47757:11:::1;47744:10;:24;;;;47670:106:::0;:::o;46184:226::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46269:1:::1;46245:21;:25;46237:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46306:23;46332:21;46306:47;;46364:38;46374:10;46386:15;46364:9;:38::i;:::-;23303:1;46184:226::o:0;23012:87::-;23058:7;23085:6;;;;;;;;;;;23078:13;;23012:87;:::o;43811:45::-;43855:1;43811:45;:::o;46418:372::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43800:4:::1;46528:6;46512:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;46504:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46619:1;46606:9;46597:6;:18;;;;:::i;:::-;:23;46589:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46680:9;46675:108;46708:9;46699:6;:18;;;;:::i;:::-;46695:1;:22;46675:108;;;46739:32;46749:10;46761:9;46739;:32::i;:::-;46719:3;;;;;:::i;:::-;;;;46675:108;;;;46418:372:::0;;:::o;32586:104::-;32642:13;32675:7;32668:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32586:104;:::o;45707:469::-;26133:1;26731:7;;:19;;26723:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;26133:1;26864:7;:18;;;;45800:9:::1;45786:23;;:10;:23;;;45778:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45908:15;;45888:16;;:35;;;;:::i;:::-;45868:15;:56;;45860:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;43800:4;45986:6;45970:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;45962:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46080:9;46070:6;43902:10;46055:21;;;;:::i;:::-;:34;;46047:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46139:29;46149:10;46161:6;46139:9;:29::i;:::-;26089:1:::0;27043:7;:22;;;;45707:469;:::o;34265:288::-;34372:12;:10;:12::i;:::-;34360:24;;:8;:24;;;;34352:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34473:8;34428:18;:32;34447:12;:10;:12::i;:::-;34428:32;;;;;;;;;;;;;;;:42;34461:8;34428:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34526:8;34497:48;;34512:12;:10;:12::i;:::-;34497:48;;;34536:8;34497:48;;;;;;:::i;:::-;;;;;;;;34265:288;;:::o;44020:31::-;;;;:::o;35336:355::-;35495:28;35505:4;35511:2;35515:7;35495:9;:28::i;:::-;35556:48;35579:4;35585:2;35589:7;35598:5;35556:22;:48::i;:::-;35534:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;35336:355;;;;:::o;48339:89::-;48384:7;48411:9;;;;;;;;;;;48404:16;;48339:89;:::o;47312:350::-;47385:13;47419:16;47427:7;47419;:16::i;:::-;47411:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47500:21;47524:10;:8;:10::i;:::-;47500:34;;47577:1;47558:7;47552:21;:26;;:102;;;;;;;;;;;;;;;;;47605:7;47614:24;47625:1;47615:7;:11;;;;:::i;:::-;47614:22;:24::i;:::-;47588:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47552:102;47545:109;;;47312:350;;;:::o;34624:164::-;34721:4;34745:18;:25;34764:5;34745:25;;;;;;;;;;;;;;;:35;34771:8;34745:35;;;;;;;;;;;;;;;;;;;;;;;;;34738:42;;34624:164;;;;:::o;23921:201::-;23243:12;:10;:12::i;:::-;23232:23;;:7;:5;:7::i;:::-;:23;;;23224:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24030:1:::1;24010:22;;:8;:22;;;;24002:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24086:28;24105:8;24086:18;:28::i;:::-;23921:201:::0;:::o;21929:157::-;22014:4;22053:25;22038:40;;;:11;:40;;;;22031:47;;21929:157;;;:::o;19032:98::-;19085:7;19112:10;19105:17;;19032:98;:::o;35946:111::-;36003:4;36037:12;;36027:7;:22;36020:29;;35946:111;;;:::o;40866:196::-;41008:2;40981:15;:24;40997:7;40981:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41046:7;41042:2;41026:28;;41035:5;41026:28;;;;;;;;;;;;40866:196;;;:::o;38746:2002::-;38861:35;38899:20;38911:7;38899:11;:20::i;:::-;38861:58;;38932:22;38974:13;:18;;;38958:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;39033:12;:10;:12::i;:::-;39009:36;;:20;39021:7;39009:11;:20::i;:::-;:36;;;38958:87;:154;;;;39062:50;39079:13;:18;;;39099:12;:10;:12::i;:::-;39062:16;:50::i;:::-;38958:154;38932:181;;39134:17;39126:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;39249:4;39227:26;;:13;:18;;;:26;;;39219:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39329:1;39315:16;;:2;:16;;;;39307:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39386:43;39408:4;39414:2;39418:7;39427:1;39386:21;:43::i;:::-;39494:49;39511:1;39515:7;39524:13;:18;;;39494:8;:49::i;:::-;39869:1;39839:12;:18;39852:4;39839:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39913:1;39885:12;:16;39898:2;39885:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39959:2;39931:11;:20;39943:7;39931:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;40021:15;39976:11;:20;39988:7;39976:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40289:19;40321:1;40311:7;:11;40289:33;;40382:1;40341:43;;:11;:24;40353:11;40341:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40337:295;;;40409:20;40417:11;40409:7;:20::i;:::-;40405:212;;;40486:13;:18;;;40454:11;:24;40466:11;40454:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40569:13;:28;;;40527:11;:24;40539:11;40527:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40405:212;40337:295;38746:2002;40679:7;40675:2;40660:27;;40669:4;40660:27;;;;;;;;;;;;40698:42;40719:4;40725:2;40729:7;40738:1;40698:20;:42::i;:::-;38746:2002;;;;;:::o;47784:180::-;47858:12;47876:8;:13;;47897:7;47876:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47857:52;;;47928:7;47920:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;47784:180;;;:::o;31627:537::-;31688:21;;:::i;:::-;31730:16;31738:7;31730;:16::i;:::-;31722:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31836:12;31851:7;31836:22;;31831:245;31868:1;31860:4;:9;31831:245;;31898:31;31932:11;:17;31944:4;31932:17;;;;;;;;;;;31898:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31998:1;31972:28;;:9;:14;;;:28;;;31968:93;;32032:9;32025:16;;;;;;31968:93;31831:245;31871:6;;;;;;;;31831:245;;;;32099:57;;;;;;;;;;:::i;:::-;;;;;;;;31627:537;;;;:::o;24284:191::-;24358:16;24377:6;;;;;;;;;;;24358:25;;24403:8;24394:6;;:17;;;;;;;;;;;;;;;;;;24458:8;24427:40;;24448:8;24427:40;;;;;;;;;;;;24284:191;;:::o;868:190::-;993:4;1046;1017:25;1030:5;1037:4;1017:12;:25::i;:::-;:33;1010:40;;868:190;;;;;:::o;36065:104::-;36134:27;36144:2;36148:8;36134:27;;;;;;;;;;;;:9;:27::i;:::-;36065:104;;:::o;41627:804::-;41782:4;41803:15;:2;:13;;;:15::i;:::-;41799:625;;;41855:2;41839:36;;;41876:12;:10;:12::i;:::-;41890:4;41896:7;41905:5;41839:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41835:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42102:1;42085:6;:13;:18;42081:273;;;42128:61;;;;;;;;;;:::i;:::-;;;;;;;;42081:273;42304:6;42298:13;42289:6;42285:2;42281:15;42274:38;41835:534;41972:45;;;41962:55;;;:6;:55;;;;41955:62;;;;;41799:625;42408:4;42401:11;;41627:804;;;;;;;:::o;46919:117::-;46979:13;47012:16;47005:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46919:117;:::o;19472:723::-;19528:13;19758:1;19749:5;:10;19745:53;;;19776:10;;;;;;;;;;;;;;;;;;;;;19745:53;19808:12;19823:5;19808:20;;19839:14;19864:78;19879:1;19871:4;:9;19864:78;;19897:8;;;;;:::i;:::-;;;;19928:2;19920:10;;;;;:::i;:::-;;;19864:78;;;19952:19;19984:6;19974:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19952:39;;20002:154;20018:1;20009:5;:10;20002:154;;20046:1;20036:11;;;;;:::i;:::-;;;20113:2;20105:5;:10;;;;:::i;:::-;20092:2;:24;;;;:::i;:::-;20079:39;;20062:6;20069;20062:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;20142:2;20133:11;;;;;:::i;:::-;;;20002:154;;;20180:6;20166:21;;;;;19472:723;;;;:::o;42926:159::-;;;;;:::o;43497:158::-;;;;;:::o;1420:675::-;1503:7;1523:20;1546:4;1523:27;;1566:9;1561:497;1585:5;:12;1581:1;:16;1561:497;;;1619:20;1642:5;1648:1;1642:8;;;;;;;;;;;;;;;;;;;;;;1619:31;;1685:12;1669;:28;1665:382;;1812:42;1827:12;1841;1812:14;:42::i;:::-;1797:57;;1665:382;;;1989:42;2004:12;2018;1989:14;:42::i;:::-;1974:57;;1665:382;1561:497;1599:3;;;;;:::i;:::-;;;;1561:497;;;;2075:12;2068:19;;;1420:675;;;;:::o;36532:163::-;36655:32;36661:2;36665:8;36675:5;36682:4;36655:5;:32::i;:::-;36532:163;;;:::o;11220:326::-;11280:4;11537:1;11515:7;:12;;;;;;;;;;;;;;;;;;;;;;;;;:19;:23;11508:30;;11220:326;;;:::o;2103:224::-;2171:13;2234:1;2228:4;2221:15;2263:1;2257:4;2250:15;2304:4;2298;2288:21;2279:30;;2206:114;;;;:::o;36954:1538::-;37093:20;37116:12;;37093:35;;37161:1;37147:16;;:2;:16;;;;37139:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37232:1;37220:8;:13;;37212:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37291:61;37321:1;37325:2;37329:12;37343:8;37291:21;:61::i;:::-;37666:8;37630:12;:16;37643:2;37630:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37731:8;37690:12;:16;37703:2;37690:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37790:2;37757:11;:25;37769:12;37757:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37857:15;37807:11;:25;37819:12;37807:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37890:20;37913:12;37890:35;;37947:9;37942:415;37962:8;37958:1;:12;37942:415;;;38026:12;38022:2;38001:38;;38018:1;38001:38;;;;;;;;;;;;38062:4;38058:249;;;38125:59;38156:1;38160:2;38164:12;38178:5;38125:22;:59::i;:::-;38091:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;38058:249;38327:14;;;;;;;37972:3;;;;;;;37942:415;;;;38388:12;38373;:27;;;;36954:1538;38424:60;38453:1;38457:2;38461:12;38475:8;38424:20;:60::i;:::-;36954:1538;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:352::-;;;2236:3;2229:4;2221:6;2217:17;2213:27;2203:2;;2254:1;2251;2244:12;2203:2;2290:6;2277:20;2267:30;;2320:18;2312:6;2309:30;2306:2;;;2352:1;2349;2342:12;2306:2;2389:4;2381:6;2377:17;2365:29;;2443:3;2435:4;2427:6;2423:17;2413:8;2409:32;2406:41;2403:2;;;2460:1;2457;2450:12;2403:2;2193:277;;;;;:::o;2490:273::-;;2595:3;2588:4;2580:6;2576:17;2572:27;2562:2;;2613:1;2610;2603:12;2562:2;2653:6;2640:20;2678:79;2753:3;2745:6;2738:4;2730:6;2726:17;2678:79;:::i;:::-;2669:88;;2552:211;;;;;:::o;2769:139::-;;2853:6;2840:20;2831:29;;2869:33;2896:5;2869:33;:::i;:::-;2821:87;;;;:::o;2914:262::-;;3022:2;3010:9;3001:7;2997:23;2993:32;2990:2;;;3038:1;3035;3028:12;2990:2;3081:1;3106:53;3151:7;3142:6;3131:9;3127:22;3106:53;:::i;:::-;3096:63;;3052:117;2980:196;;;;:::o;3182:407::-;;;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3323:1;3320;3313:12;3275:2;3366:1;3391:53;3436:7;3427:6;3416:9;3412:22;3391:53;:::i;:::-;3381:63;;3337:117;3493:2;3519:53;3564:7;3555:6;3544:9;3540:22;3519:53;:::i;:::-;3509:63;;3464:118;3265:324;;;;;:::o;3595:552::-;;;;3737:2;3725:9;3716:7;3712:23;3708:32;3705:2;;;3753:1;3750;3743:12;3705:2;3796:1;3821:53;3866:7;3857:6;3846:9;3842:22;3821:53;:::i;:::-;3811:63;;3767:117;3923:2;3949:53;3994:7;3985:6;3974:9;3970:22;3949:53;:::i;:::-;3939:63;;3894:118;4051:2;4077:53;4122:7;4113:6;4102:9;4098:22;4077:53;:::i;:::-;4067:63;;4022:118;3695:452;;;;;:::o;4153:809::-;;;;;4321:3;4309:9;4300:7;4296:23;4292:33;4289:2;;;4338:1;4335;4328:12;4289:2;4381:1;4406:53;4451:7;4442:6;4431:9;4427:22;4406:53;:::i;:::-;4396:63;;4352:117;4508:2;4534:53;4579:7;4570:6;4559:9;4555:22;4534:53;:::i;:::-;4524:63;;4479:118;4636:2;4662:53;4707:7;4698:6;4687:9;4683:22;4662:53;:::i;:::-;4652:63;;4607:118;4792:2;4781:9;4777:18;4764:32;4823:18;4815:6;4812:30;4809:2;;;4855:1;4852;4845:12;4809:2;4883:62;4937:7;4928:6;4917:9;4913:22;4883:62;:::i;:::-;4873:72;;4735:220;4279:683;;;;;;;:::o;4968:401::-;;;5090:2;5078:9;5069:7;5065:23;5061:32;5058:2;;;5106:1;5103;5096:12;5058:2;5149:1;5174:53;5219:7;5210:6;5199:9;5195:22;5174:53;:::i;:::-;5164:63;;5120:117;5276:2;5302:50;5344:7;5335:6;5324:9;5320:22;5302:50;:::i;:::-;5292:60;;5247:115;5048:321;;;;;:::o;5375:407::-;;;5500:2;5488:9;5479:7;5475:23;5471:32;5468:2;;;5516:1;5513;5506:12;5468:2;5559:1;5584:53;5629:7;5620:6;5609:9;5605:22;5584:53;:::i;:::-;5574:63;;5530:117;5686:2;5712:53;5757:7;5748:6;5737:9;5733:22;5712:53;:::i;:::-;5702:63;;5657:118;5458:324;;;;;:::o;5788:570::-;;;;5948:2;5936:9;5927:7;5923:23;5919:32;5916:2;;;5964:1;5961;5954:12;5916:2;6035:1;6024:9;6020:17;6007:31;6065:18;6057:6;6054:30;6051:2;;;6097:1;6094;6087:12;6051:2;6133:80;6205:7;6196:6;6185:9;6181:22;6133:80;:::i;:::-;6115:98;;;;5978:245;6262:2;6288:53;6333:7;6324:6;6313:9;6309:22;6288:53;:::i;:::-;6278:63;;6233:118;5906:452;;;;;:::o;6364:262::-;;6472:2;6460:9;6451:7;6447:23;6443:32;6440:2;;;6488:1;6485;6478:12;6440:2;6531:1;6556:53;6601:7;6592:6;6581:9;6577:22;6556:53;:::i;:::-;6546:63;;6502:117;6430:196;;;;:::o;6632:260::-;;6739:2;6727:9;6718:7;6714:23;6710:32;6707:2;;;6755:1;6752;6745:12;6707:2;6798:1;6823:52;6867:7;6858:6;6847:9;6843:22;6823:52;:::i;:::-;6813:62;;6769:116;6697:195;;;;:::o;6898:282::-;;7016:2;7004:9;6995:7;6991:23;6987:32;6984:2;;;7032:1;7029;7022:12;6984:2;7075:1;7100:63;7155:7;7146:6;7135:9;7131:22;7100:63;:::i;:::-;7090:73;;7046:127;6974:206;;;;:::o;7186:395::-;;;7314:2;7302:9;7293:7;7289:23;7285:32;7282:2;;;7330:1;7327;7320:12;7282:2;7401:1;7390:9;7386:17;7373:31;7431:18;7423:6;7420:30;7417:2;;;7463:1;7460;7453:12;7417:2;7499:65;7556:7;7547:6;7536:9;7532:22;7499:65;:::i;:::-;7481:83;;;;7344:230;7272:309;;;;;:::o;7587:375::-;;7705:2;7693:9;7684:7;7680:23;7676:32;7673:2;;;7721:1;7718;7711:12;7673:2;7792:1;7781:9;7777:17;7764:31;7822:18;7814:6;7811:30;7808:2;;;7854:1;7851;7844:12;7808:2;7882:63;7937:7;7928:6;7917:9;7913:22;7882:63;:::i;:::-;7872:73;;7735:220;7663:299;;;;:::o;7968:262::-;;8076:2;8064:9;8055:7;8051:23;8047:32;8044:2;;;8092:1;8089;8082:12;8044:2;8135:1;8160:53;8205:7;8196:6;8185:9;8181:22;8160:53;:::i;:::-;8150:63;;8106:117;8034:196;;;;:::o;8236:407::-;;;8361:2;8349:9;8340:7;8336:23;8332:32;8329:2;;;8377:1;8374;8367:12;8329:2;8420:1;8445:53;8490:7;8481:6;8470:9;8466:22;8445:53;:::i;:::-;8435:63;;8391:117;8547:2;8573:53;8618:7;8609:6;8598:9;8594:22;8573:53;:::i;:::-;8563:63;;8518:118;8319:324;;;;;:::o;8649:118::-;8736:24;8754:5;8736:24;:::i;:::-;8731:3;8724:37;8714:53;;:::o;8773:157::-;8878:45;8898:24;8916:5;8898:24;:::i;:::-;8878:45;:::i;:::-;8873:3;8866:58;8856:74;;:::o;8936:109::-;9017:21;9032:5;9017:21;:::i;:::-;9012:3;9005:34;8995:50;;:::o;9051:118::-;9138:24;9156:5;9138:24;:::i;:::-;9133:3;9126:37;9116:53;;:::o;9175:360::-;;9289:38;9321:5;9289:38;:::i;:::-;9343:70;9406:6;9401:3;9343:70;:::i;:::-;9336:77;;9422:52;9467:6;9462:3;9455:4;9448:5;9444:16;9422:52;:::i;:::-;9499:29;9521:6;9499:29;:::i;:::-;9494:3;9490:39;9483:46;;9265:270;;;;;:::o;9541:364::-;;9657:39;9690:5;9657:39;:::i;:::-;9712:71;9776:6;9771:3;9712:71;:::i;:::-;9705:78;;9792:52;9837:6;9832:3;9825:4;9818:5;9814:16;9792:52;:::i;:::-;9869:29;9891:6;9869:29;:::i;:::-;9864:3;9860:39;9853:46;;9633:272;;;;;:::o;9911:377::-;;10045:39;10078:5;10045:39;:::i;:::-;10100:89;10182:6;10177:3;10100:89;:::i;:::-;10093:96;;10198:52;10243:6;10238:3;10231:4;10224:5;10220:16;10198:52;:::i;:::-;10275:6;10270:3;10266:16;10259:23;;10021:267;;;;;:::o;10294:366::-;;10457:67;10521:2;10516:3;10457:67;:::i;:::-;10450:74;;10554:34;10550:1;10545:3;10541:11;10534:55;10620:4;10615:2;10610:3;10606:12;10599:26;10651:2;10646:3;10642:12;10635:19;;10440:220;;;:::o;10666:324::-;;10829:67;10893:2;10888:3;10829:67;:::i;:::-;10822:74;;10926:28;10922:1;10917:3;10913:11;10906:49;10981:2;10976:3;10972:12;10965:19;;10812:178;;;:::o;10996:370::-;;11159:67;11223:2;11218:3;11159:67;:::i;:::-;11152:74;;11256:34;11252:1;11247:3;11243:11;11236:55;11322:8;11317:2;11312:3;11308:12;11301:30;11357:2;11352:3;11348:12;11341:19;;11142:224;;;:::o;11372:374::-;;11535:67;11599:2;11594:3;11535:67;:::i;:::-;11528:74;;11632:34;11628:1;11623:3;11619:11;11612:55;11698:12;11693:2;11688:3;11684:12;11677:34;11737:2;11732:3;11728:12;11721:19;;11518:228;;;:::o;11752:324::-;;11915:67;11979:2;11974:3;11915:67;:::i;:::-;11908:74;;12012:28;12008:1;12003:3;11999:11;11992:49;12067:2;12062:3;12058:12;12051:19;;11898:178;;;:::o;12082:367::-;;12245:67;12309:2;12304:3;12245:67;:::i;:::-;12238:74;;12342:34;12338:1;12333:3;12329:11;12322:55;12408:5;12403:2;12398:3;12394:12;12387:27;12440:2;12435:3;12431:12;12424:19;;12228:221;;;:::o;12455:369::-;;12618:67;12682:2;12677:3;12618:67;:::i;:::-;12611:74;;12715:34;12711:1;12706:3;12702:11;12695:55;12781:7;12776:2;12771:3;12767:12;12760:29;12815:2;12810:3;12806:12;12799:19;;12601:223;;;:::o;12830:322::-;;12993:67;13057:2;13052:3;12993:67;:::i;:::-;12986:74;;13090:26;13086:1;13081:3;13077:11;13070:47;13143:2;13138:3;13134:12;13127:19;;12976:176;;;:::o;13158:316::-;;13321:67;13385:2;13380:3;13321:67;:::i;:::-;13314:74;;13418:20;13414:1;13409:3;13405:11;13398:41;13465:2;13460:3;13456:12;13449:19;;13304:170;;;:::o;13480:318::-;;13643:67;13707:2;13702:3;13643:67;:::i;:::-;13636:74;;13740:22;13736:1;13731:3;13727:11;13720:43;13789:2;13784:3;13780:12;13773:19;;13626:172;;;:::o;13804:315::-;;13967:67;14031:2;14026:3;13967:67;:::i;:::-;13960:74;;14064:19;14060:1;14055:3;14051:11;14044:40;14110:2;14105:3;14101:12;14094:19;;13950:169;;;:::o;14125:328::-;;14288:67;14352:2;14347:3;14288:67;:::i;:::-;14281:74;;14385:32;14381:1;14376:3;14372:11;14365:53;14444:2;14439:3;14435:12;14428:19;;14271:182;;;:::o;14459:389::-;;14622:67;14686:2;14681:3;14622:67;:::i;:::-;14615:74;;14719:34;14715:1;14710:3;14706:11;14699:55;14785:27;14780:2;14775:3;14771:12;14764:49;14839:2;14834:3;14830:12;14823:19;;14605:243;;;:::o;14854:375::-;;15017:67;15081:2;15076:3;15017:67;:::i;:::-;15010:74;;15114:34;15110:1;15105:3;15101:11;15094:55;15180:13;15175:2;15170:3;15166:12;15159:35;15220:2;15215:3;15211:12;15204:19;;15000:229;;;:::o;15235:323::-;;15398:67;15462:2;15457:3;15398:67;:::i;:::-;15391:74;;15495:27;15491:1;15486:3;15482:11;15475:48;15549:2;15544:3;15540:12;15533:19;;15381:177;;;:::o;15564:370::-;;15727:67;15791:2;15786:3;15727:67;:::i;:::-;15720:74;;15824:34;15820:1;15815:3;15811:11;15804:55;15890:8;15885:2;15880:3;15876:12;15869:30;15925:2;15920:3;15916:12;15909:19;;15710:224;;;:::o;15940:337::-;;16121:84;16203:1;16198:3;16121:84;:::i;:::-;16114:91;;16235:7;16231:1;16226:3;16222:11;16215:28;16269:1;16264:3;16260:11;16253:18;;16104:173;;;:::o;16283:320::-;;16446:67;16510:2;16505:3;16446:67;:::i;:::-;16439:74;;16543:24;16539:1;16534:3;16530:11;16523:45;16594:2;16589:3;16585:12;16578:19;;16429:174;;;:::o;16609:330::-;;16772:67;16836:2;16831:3;16772:67;:::i;:::-;16765:74;;16869:34;16865:1;16860:3;16856:11;16849:55;16930:2;16925:3;16921:12;16914:19;;16755:184;;;:::o;16945:379::-;;17108:67;17172:2;17167:3;17108:67;:::i;:::-;17101:74;;17205:34;17201:1;17196:3;17192:11;17185:55;17271:17;17266:2;17261:3;17257:12;17250:39;17315:2;17310:3;17306:12;17299:19;;17091:233;;;:::o;17330:324::-;;17493:67;17557:2;17552:3;17493:67;:::i;:::-;17486:74;;17590:28;17586:1;17581:3;17577:11;17570:49;17645:2;17640:3;17636:12;17629:19;;17476:178;;;:::o;17660:382::-;;17823:67;17887:2;17882:3;17823:67;:::i;:::-;17816:74;;17920:34;17916:1;17911:3;17907:11;17900:55;17986:20;17981:2;17976:3;17972:12;17965:42;18033:2;18028:3;18024:12;18017:19;;17806:236;;;:::o;18048:366::-;;18211:67;18275:2;18270:3;18211:67;:::i;:::-;18204:74;;18308:34;18304:1;18299:3;18295:11;18288:55;18374:4;18369:2;18364:3;18360:12;18353:26;18405:2;18400:3;18396:12;18389:19;;18194:220;;;:::o;18420:297::-;;18600:83;18681:1;18676:3;18600:83;:::i;:::-;18593:90;;18709:1;18704:3;18700:11;18693:18;;18583:134;;;:::o;18723:314::-;;18886:67;18950:2;18945:3;18886:67;:::i;:::-;18879:74;;18983:18;18979:1;18974:3;18970:11;18963:39;19028:2;19023:3;19019:12;19012:19;;18869:168;;;:::o;19043:383::-;;19206:67;19270:2;19265:3;19206:67;:::i;:::-;19199:74;;19303:34;19299:1;19294:3;19290:11;19283:55;19369:21;19364:2;19359:3;19355:12;19348:43;19417:2;19412:3;19408:12;19401:19;;19189:237;;;:::o;19432:365::-;;19595:67;19659:2;19654:3;19595:67;:::i;:::-;19588:74;;19692:34;19688:1;19683:3;19679:11;19672:55;19758:3;19753:2;19748:3;19744:12;19737:25;19788:2;19783:3;19779:12;19772:19;;19578:219;;;:::o;19803:372::-;;19966:67;20030:2;20025:3;19966:67;:::i;:::-;19959:74;;20063:34;20059:1;20054:3;20050:11;20043:55;20129:10;20124:2;20119:3;20115:12;20108:32;20166:2;20161:3;20157:12;20150:19;;19949:226;;;:::o;20181:369::-;;20344:67;20408:2;20403:3;20344:67;:::i;:::-;20337:74;;20441:34;20437:1;20432:3;20428:11;20421:55;20507:7;20502:2;20497:3;20493:12;20486:29;20541:2;20536:3;20532:12;20525:19;;20327:223;;;:::o;20556:378::-;;20719:67;20783:2;20778:3;20719:67;:::i;:::-;20712:74;;20816:34;20812:1;20807:3;20803:11;20796:55;20882:16;20877:2;20872:3;20868:12;20861:38;20925:2;20920:3;20916:12;20909:19;;20702:232;;;:::o;20940:329::-;;21103:67;21167:2;21162:3;21103:67;:::i;:::-;21096:74;;21200:33;21196:1;21191:3;21187:11;21180:54;21260:2;21255:3;21251:12;21244:19;;21086:183;;;:::o;21275:379::-;;21438:67;21502:2;21497:3;21438:67;:::i;:::-;21431:74;;21535:34;21531:1;21526:3;21522:11;21515:55;21601:17;21596:2;21591:3;21587:12;21580:39;21645:2;21640:3;21636:12;21629:19;;21421:233;;;:::o;21660:377::-;;21823:67;21887:2;21882:3;21823:67;:::i;:::-;21816:74;;21920:34;21916:1;21911:3;21907:11;21900:55;21986:15;21981:2;21976:3;21972:12;21965:37;22028:2;22023:3;22019:12;22012:19;;21806:231;;;:::o;22043:367::-;;22206:67;22270:2;22265:3;22206:67;:::i;:::-;22199:74;;22303:34;22299:1;22294:3;22290:11;22283:55;22369:5;22364:2;22359:3;22355:12;22348:27;22401:2;22396:3;22392:12;22385:19;;22189:221;;;:::o;22416:304::-;;22579:66;22643:1;22638:3;22579:66;:::i;:::-;22572:73;;22675:9;22671:1;22666:3;22662:11;22655:30;22711:2;22706:3;22702:12;22695:19;;22562:158;;;:::o;22726:118::-;22813:24;22831:5;22813:24;:::i;:::-;22808:3;22801:37;22791:53;;:::o;22850:256::-;;22977:75;23048:3;23039:6;22977:75;:::i;:::-;23077:2;23072:3;23068:12;23061:19;;23097:3;23090:10;;22966:140;;;;:::o;23112:701::-;;23415:95;23506:3;23497:6;23415:95;:::i;:::-;23408:102;;23527:95;23618:3;23609:6;23527:95;:::i;:::-;23520:102;;23639:148;23783:3;23639:148;:::i;:::-;23632:155;;23804:3;23797:10;;23397:416;;;;;:::o;23819:379::-;;24025:147;24168:3;24025:147;:::i;:::-;24018:154;;24189:3;24182:10;;24007:191;;;:::o;24204:222::-;;24335:2;24324:9;24320:18;24312:26;;24348:71;24416:1;24405:9;24401:17;24392:6;24348:71;:::i;:::-;24302:124;;;;:::o;24432:640::-;;24665:3;24654:9;24650:19;24642:27;;24679:71;24747:1;24736:9;24732:17;24723:6;24679:71;:::i;:::-;24760:72;24828:2;24817:9;24813:18;24804:6;24760:72;:::i;:::-;24842;24910:2;24899:9;24895:18;24886:6;24842:72;:::i;:::-;24961:9;24955:4;24951:20;24946:2;24935:9;24931:18;24924:48;24989:76;25060:4;25051:6;24989:76;:::i;:::-;24981:84;;24632:440;;;;;;;:::o;25078:210::-;;25203:2;25192:9;25188:18;25180:26;;25216:65;25278:1;25267:9;25263:17;25254:6;25216:65;:::i;:::-;25170:118;;;;:::o;25294:222::-;;25425:2;25414:9;25410:18;25402:26;;25438:71;25506:1;25495:9;25491:17;25482:6;25438:71;:::i;:::-;25392:124;;;;:::o;25522:313::-;;25673:2;25662:9;25658:18;25650:26;;25722:9;25716:4;25712:20;25708:1;25697:9;25693:17;25686:47;25750:78;25823:4;25814:6;25750:78;:::i;:::-;25742:86;;25640:195;;;;:::o;25841:419::-;;26045:2;26034:9;26030:18;26022:26;;26094:9;26088:4;26084:20;26080:1;26069:9;26065:17;26058:47;26122:131;26248:4;26122:131;:::i;:::-;26114:139;;26012:248;;;:::o;26266:419::-;;26470:2;26459:9;26455:18;26447:26;;26519:9;26513:4;26509:20;26505:1;26494:9;26490:17;26483:47;26547:131;26673:4;26547:131;:::i;:::-;26539:139;;26437:248;;;:::o;26691:419::-;;26895:2;26884:9;26880:18;26872:26;;26944:9;26938:4;26934:20;26930:1;26919:9;26915:17;26908:47;26972:131;27098:4;26972:131;:::i;:::-;26964:139;;26862:248;;;:::o;27116:419::-;;27320:2;27309:9;27305:18;27297:26;;27369:9;27363:4;27359:20;27355:1;27344:9;27340:17;27333:47;27397:131;27523:4;27397:131;:::i;:::-;27389:139;;27287:248;;;:::o;27541:419::-;;27745:2;27734:9;27730:18;27722:26;;27794:9;27788:4;27784:20;27780:1;27769:9;27765:17;27758:47;27822:131;27948:4;27822:131;:::i;:::-;27814:139;;27712:248;;;:::o;27966:419::-;;28170:2;28159:9;28155:18;28147:26;;28219:9;28213:4;28209:20;28205:1;28194:9;28190:17;28183:47;28247:131;28373:4;28247:131;:::i;:::-;28239:139;;28137:248;;;:::o;28391:419::-;;28595:2;28584:9;28580:18;28572:26;;28644:9;28638:4;28634:20;28630:1;28619:9;28615:17;28608:47;28672:131;28798:4;28672:131;:::i;:::-;28664:139;;28562:248;;;:::o;28816:419::-;;29020:2;29009:9;29005:18;28997:26;;29069:9;29063:4;29059:20;29055:1;29044:9;29040:17;29033:47;29097:131;29223:4;29097:131;:::i;:::-;29089:139;;28987:248;;;:::o;29241:419::-;;29445:2;29434:9;29430:18;29422:26;;29494:9;29488:4;29484:20;29480:1;29469:9;29465:17;29458:47;29522:131;29648:4;29522:131;:::i;:::-;29514:139;;29412:248;;;:::o;29666:419::-;;29870:2;29859:9;29855:18;29847:26;;29919:9;29913:4;29909:20;29905:1;29894:9;29890:17;29883:47;29947:131;30073:4;29947:131;:::i;:::-;29939:139;;29837:248;;;:::o;30091:419::-;;30295:2;30284:9;30280:18;30272:26;;30344:9;30338:4;30334:20;30330:1;30319:9;30315:17;30308:47;30372:131;30498:4;30372:131;:::i;:::-;30364:139;;30262:248;;;:::o;30516:419::-;;30720:2;30709:9;30705:18;30697:26;;30769:9;30763:4;30759:20;30755:1;30744:9;30740:17;30733:47;30797:131;30923:4;30797:131;:::i;:::-;30789:139;;30687:248;;;:::o;30941:419::-;;31145:2;31134:9;31130:18;31122:26;;31194:9;31188:4;31184:20;31180:1;31169:9;31165:17;31158:47;31222:131;31348:4;31222:131;:::i;:::-;31214:139;;31112:248;;;:::o;31366:419::-;;31570:2;31559:9;31555:18;31547:26;;31619:9;31613:4;31609:20;31605:1;31594:9;31590:17;31583:47;31647:131;31773:4;31647:131;:::i;:::-;31639:139;;31537:248;;;:::o;31791:419::-;;31995:2;31984:9;31980:18;31972:26;;32044:9;32038:4;32034:20;32030:1;32019:9;32015:17;32008:47;32072:131;32198:4;32072:131;:::i;:::-;32064:139;;31962:248;;;:::o;32216:419::-;;32420:2;32409:9;32405:18;32397:26;;32469:9;32463:4;32459:20;32455:1;32444:9;32440:17;32433:47;32497:131;32623:4;32497:131;:::i;:::-;32489:139;;32387:248;;;:::o;32641:419::-;;32845:2;32834:9;32830:18;32822:26;;32894:9;32888:4;32884:20;32880:1;32869:9;32865:17;32858:47;32922:131;33048:4;32922:131;:::i;:::-;32914:139;;32812:248;;;:::o;33066:419::-;;33270:2;33259:9;33255:18;33247:26;;33319:9;33313:4;33309:20;33305:1;33294:9;33290:17;33283:47;33347:131;33473:4;33347:131;:::i;:::-;33339:139;;33237:248;;;:::o;33491:419::-;;33695:2;33684:9;33680:18;33672:26;;33744:9;33738:4;33734:20;33730:1;33719:9;33715:17;33708:47;33772:131;33898:4;33772:131;:::i;:::-;33764:139;;33662:248;;;:::o;33916:419::-;;34120:2;34109:9;34105:18;34097:26;;34169:9;34163:4;34159:20;34155:1;34144:9;34140:17;34133:47;34197:131;34323:4;34197:131;:::i;:::-;34189:139;;34087:248;;;:::o;34341:419::-;;34545:2;34534:9;34530:18;34522:26;;34594:9;34588:4;34584:20;34580:1;34569:9;34565:17;34558:47;34622:131;34748:4;34622:131;:::i;:::-;34614:139;;34512:248;;;:::o;34766:419::-;;34970:2;34959:9;34955:18;34947:26;;35019:9;35013:4;35009:20;35005:1;34994:9;34990:17;34983:47;35047:131;35173:4;35047:131;:::i;:::-;35039:139;;34937:248;;;:::o;35191:419::-;;35395:2;35384:9;35380:18;35372:26;;35444:9;35438:4;35434:20;35430:1;35419:9;35415:17;35408:47;35472:131;35598:4;35472:131;:::i;:::-;35464:139;;35362:248;;;:::o;35616:419::-;;35820:2;35809:9;35805:18;35797:26;;35869:9;35863:4;35859:20;35855:1;35844:9;35840:17;35833:47;35897:131;36023:4;35897:131;:::i;:::-;35889:139;;35787:248;;;:::o;36041:419::-;;36245:2;36234:9;36230:18;36222:26;;36294:9;36288:4;36284:20;36280:1;36269:9;36265:17;36258:47;36322:131;36448:4;36322:131;:::i;:::-;36314:139;;36212:248;;;:::o;36466:419::-;;36670:2;36659:9;36655:18;36647:26;;36719:9;36713:4;36709:20;36705:1;36694:9;36690:17;36683:47;36747:131;36873:4;36747:131;:::i;:::-;36739:139;;36637:248;;;:::o;36891:419::-;;37095:2;37084:9;37080:18;37072:26;;37144:9;37138:4;37134:20;37130:1;37119:9;37115:17;37108:47;37172:131;37298:4;37172:131;:::i;:::-;37164:139;;37062:248;;;:::o;37316:419::-;;37520:2;37509:9;37505:18;37497:26;;37569:9;37563:4;37559:20;37555:1;37544:9;37540:17;37533:47;37597:131;37723:4;37597:131;:::i;:::-;37589:139;;37487:248;;;:::o;37741:419::-;;37945:2;37934:9;37930:18;37922:26;;37994:9;37988:4;37984:20;37980:1;37969:9;37965:17;37958:47;38022:131;38148:4;38022:131;:::i;:::-;38014:139;;37912:248;;;:::o;38166:419::-;;38370:2;38359:9;38355:18;38347:26;;38419:9;38413:4;38409:20;38405:1;38394:9;38390:17;38383:47;38447:131;38573:4;38447:131;:::i;:::-;38439:139;;38337:248;;;:::o;38591:419::-;;38795:2;38784:9;38780:18;38772:26;;38844:9;38838:4;38834:20;38830:1;38819:9;38815:17;38808:47;38872:131;38998:4;38872:131;:::i;:::-;38864:139;;38762:248;;;:::o;39016:419::-;;39220:2;39209:9;39205:18;39197:26;;39269:9;39263:4;39259:20;39255:1;39244:9;39240:17;39233:47;39297:131;39423:4;39297:131;:::i;:::-;39289:139;;39187:248;;;:::o;39441:419::-;;39645:2;39634:9;39630:18;39622:26;;39694:9;39688:4;39684:20;39680:1;39669:9;39665:17;39658:47;39722:131;39848:4;39722:131;:::i;:::-;39714:139;;39612:248;;;:::o;39866:222::-;;39997:2;39986:9;39982:18;39974:26;;40010:71;40078:1;40067:9;40063:17;40054:6;40010:71;:::i;:::-;39964:124;;;;:::o;40094:283::-;;40160:2;40154:9;40144:19;;40202:4;40194:6;40190:17;40309:6;40297:10;40294:22;40273:18;40261:10;40258:34;40255:62;40252:2;;;40320:18;;:::i;:::-;40252:2;40360:10;40356:2;40349:22;40134:243;;;;:::o;40383:331::-;;40534:18;40526:6;40523:30;40520:2;;;40556:18;;:::i;:::-;40520:2;40641:4;40637:9;40630:4;40622:6;40618:17;40614:33;40606:41;;40702:4;40696;40692:15;40684:23;;40449:265;;;:::o;40720:332::-;;40872:18;40864:6;40861:30;40858:2;;;40894:18;;:::i;:::-;40858:2;40979:4;40975:9;40968:4;40960:6;40956:17;40952:33;40944:41;;41040:4;41034;41030:15;41022:23;;40787:265;;;:::o;41058:98::-;;41143:5;41137:12;41127:22;;41116:40;;;:::o;41162:99::-;;41248:5;41242:12;41232:22;;41221:40;;;:::o;41267:168::-;;41384:6;41379:3;41372:19;41424:4;41419:3;41415:14;41400:29;;41362:73;;;;:::o;41441:147::-;;41579:3;41564:18;;41554:34;;;;:::o;41594:169::-;;41712:6;41707:3;41700:19;41752:4;41747:3;41743:14;41728:29;;41690:73;;;;:::o;41769:148::-;;41908:3;41893:18;;41883:34;;;;:::o;41923:305::-;;41982:20;42000:1;41982:20;:::i;:::-;41977:25;;42016:20;42034:1;42016:20;:::i;:::-;42011:25;;42170:1;42102:66;42098:74;42095:1;42092:81;42089:2;;;42176:18;;:::i;:::-;42089:2;42220:1;42217;42213:9;42206:16;;41967:261;;;;:::o;42234:185::-;;42291:20;42309:1;42291:20;:::i;:::-;42286:25;;42325:20;42343:1;42325:20;:::i;:::-;42320:25;;42364:1;42354:2;;42369:18;;:::i;:::-;42354:2;42411:1;42408;42404:9;42399:14;;42276:143;;;;:::o;42425:348::-;;42488:20;42506:1;42488:20;:::i;:::-;42483:25;;42522:20;42540:1;42522:20;:::i;:::-;42517:25;;42710:1;42642:66;42638:74;42635:1;42632:81;42627:1;42620:9;42613:17;42609:105;42606:2;;;42717:18;;:::i;:::-;42606:2;42765:1;42762;42758:9;42747:20;;42473:300;;;;:::o;42779:191::-;;42839:20;42857:1;42839:20;:::i;:::-;42834:25;;42873:20;42891:1;42873:20;:::i;:::-;42868:25;;42912:1;42909;42906:8;42903:2;;;42917:18;;:::i;:::-;42903:2;42962:1;42959;42955:9;42947:17;;42824:146;;;;:::o;42976:96::-;;43042:24;43060:5;43042:24;:::i;:::-;43031:35;;43021:51;;;:::o;43078:90::-;;43155:5;43148:13;43141:21;43130:32;;43120:48;;;:::o;43174:77::-;;43240:5;43229:16;;43219:32;;;:::o;43257:149::-;;43333:66;43326:5;43322:78;43311:89;;43301:105;;;:::o;43412:126::-;;43489:42;43482:5;43478:54;43467:65;;43457:81;;;:::o;43544:77::-;;43610:5;43599:16;;43589:32;;;:::o;43627:154::-;43711:6;43706:3;43701;43688:30;43773:1;43764:6;43759:3;43755:16;43748:27;43678:103;;;:::o;43787:307::-;43855:1;43865:113;43879:6;43876:1;43873:13;43865:113;;;43964:1;43959:3;43955:11;43949:18;43945:1;43940:3;43936:11;43929:39;43901:2;43898:1;43894:10;43889:15;;43865:113;;;43996:6;43993:1;43990:13;43987:2;;;44076:1;44067:6;44062:3;44058:16;44051:27;43987:2;43836:258;;;;:::o;44100:320::-;;44181:1;44175:4;44171:12;44161:22;;44228:1;44222:4;44218:12;44249:18;44239:2;;44305:4;44297:6;44293:17;44283:27;;44239:2;44367;44359:6;44356:14;44336:18;44333:38;44330:2;;;44386:18;;:::i;:::-;44330:2;44151:269;;;;:::o;44426:233::-;;44488:24;44506:5;44488:24;:::i;:::-;44479:33;;44534:66;44527:5;44524:77;44521:2;;;44604:18;;:::i;:::-;44521:2;44651:1;44644:5;44640:13;44633:20;;44469:190;;;:::o;44665:100::-;;44733:26;44753:5;44733:26;:::i;:::-;44722:37;;44712:53;;;:::o;44771:94::-;;44839:20;44853:5;44839:20;:::i;:::-;44828:31;;44818:47;;;:::o;44871:176::-;;44920:20;44938:1;44920:20;:::i;:::-;44915:25;;44954:20;44972:1;44954:20;:::i;:::-;44949:25;;44993:1;44983:2;;44998:18;;:::i;:::-;44983:2;45039:1;45036;45032:9;45027:14;;44905:142;;;;:::o;45053:180::-;45101:77;45098:1;45091:88;45198:4;45195:1;45188:15;45222:4;45219:1;45212:15;45239:180;45287:77;45284:1;45277:88;45384:4;45381:1;45374:15;45408:4;45405:1;45398:15;45425:180;45473:77;45470:1;45463:88;45570:4;45567:1;45560:15;45594:4;45591:1;45584:15;45611:180;45659:77;45656:1;45649:88;45756:4;45753:1;45746:15;45780:4;45777:1;45770:15;45797:102;;45889:2;45885:7;45880:2;45873:5;45869:14;45865:28;45855:38;;45845:54;;;:::o;45905:94::-;;45986:5;45982:2;45978:14;45957:35;;45947:52;;;:::o;46005:122::-;46078:24;46096:5;46078:24;:::i;:::-;46071:5;46068:35;46058:2;;46117:1;46114;46107:12;46058:2;46048:79;:::o;46133:116::-;46203:21;46218:5;46203:21;:::i;:::-;46196:5;46193:32;46183:2;;46239:1;46236;46229:12;46183:2;46173:76;:::o;46255:122::-;46328:24;46346:5;46328:24;:::i;:::-;46321:5;46318:35;46308:2;;46367:1;46364;46357:12;46308:2;46298:79;:::o;46383:120::-;46455:23;46472:5;46455:23;:::i;:::-;46448:5;46445:34;46435:2;;46493:1;46490;46483:12;46435:2;46425:78;:::o;46509:122::-;46582:24;46600:5;46582:24;:::i;:::-;46575:5;46572:35;46562:2;;46621:1;46618;46611:12;46562:2;46552:79;:::o

Swarm Source

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