ETH Price: $3,466.47 (+3.98%)
Gas: 5.37 Gwei

Token

FusionsByGarvenLabs (FUSIONS)
 

Overview

Max Total Supply

425 FUSIONS

Holders

116

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
phuktep.eth
Balance
2 FUSIONS
0xf33364a83b6002d5070ec5fa31f5d9eb93572732
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:
FusionsByGarvenLabs

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)



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




            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)



////import "../../utils/introspection/IERC165.sol";

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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)



////import "./IERC165.sol";

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




            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)



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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)



/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)



////import "../IERC721.sol";

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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)


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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)



////import "../IERC721.sol";

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

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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)



////import "./IERC721.sol";
////import "./IERC721Receiver.sol";
////import "./extensions/IERC721Metadata.sol";
////import "../../utils/Address.sol";
////import "../../utils/Context.sol";
////import "../../utils/Strings.sol";
////import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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




         
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol)



/**
 * @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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)



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

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

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

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

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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)



////import "../utils/Context.sol";

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




        
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)



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




        
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)


////import "../utils/Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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





            
////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)



////import "../ERC721.sol";
////import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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




//SPDX-License-Identifier: MIT



////import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
////import "@openzeppelin/contracts/security/Pausable.sol";
////import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
////import "@openzeppelin/contracts/access/Ownable.sol";
////import "@openzeppelin/contracts/utils/Counters.sol";
////import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
////import "@openzeppelin/contracts/utils/Strings.sol";

contract FusionsByGarvenLabs is ERC721Enumerable, Ownable, Pausable, ReentrancyGuard{

    using Strings for uint256;
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    string public baseExtension = ".json";
    string public baseURI;
    string public notRevealedUri;
    bytes32 root = 0x3af020aab4e27a80329d7f7a7616a8c69b2317e8222e6211c2e495322c4a2a89;

    
    uint public maxSupply = 8000;
    uint public maxPublicAmount = 10;
    uint public price = 0.04 ether;
    uint public presalePrice;

    bool public presale;
    bool public isRevealed;

    mapping(address => bool) public isVerified;
    mapping(address => uint) public isAllowedToMintInPresale;
    mapping(address => uint) public maxMintable;
    mapping(address => uint) public preSaleMaxMintAmount;
    mapping(address => uint) public presaleMinted;

   event VStatus(bool status, address _address);


    constructor(string memory name, string memory symbol, string memory initRevealedURI) ERC721(name,symbol){
        setBaseURI(initRevealedURI);
        for(_tokenIds.current(); _tokenIds.current() < 100; _tokenIds.increment()){
            _safeMint(_msgSender(), _tokenIds.current());
        }
        startPresale();
    }


    function mint(uint mintAmount) public payable whenNotPaused() nonReentrant() {
        require(_tokenIds.current() <= maxSupply, "Max amount of NFT minted");
        if(presale == true){
            uint amount = presalePrice * mintAmount;
            require(msg.value >= amount, "inSufficient Funds");
            require(isVerified[msg.sender ] == true,"You are not eligible for presale");
            require(mintAmount <= preSaleMaxMintAmount[msg.sender],"You are not eligible to mint this number of NFT");
            presaleMinted[msg.sender] = presaleMinted[msg.sender] + mintAmount;
            require(presaleMinted[msg.sender] <= preSaleMaxMintAmount[msg.sender], "You cannot mint more than eligible");
            for(uint i = 1; i <= mintAmount; i++ ){
               _safeMint(_msgSender(), _tokenIds.current());
               _tokenIds.increment(); 
            }

        }

        if(presale == false){
            uint amount = price * mintAmount;

            require(msg.value >= amount,"inSufficient Funds");
            require(mintAmount <= maxPublicAmount,"cannot mint more than the amount");

            maxMintable[msg.sender] = maxMintable[msg.sender] + mintAmount;

            require(maxMintable[msg.sender] <= maxPublicAmount,"You cannot mint more than the max NFT allowed");

            for(uint i = 1; i <= mintAmount; i++ ){
               _safeMint(_msgSender(), _tokenIds.current());
               _tokenIds.increment();
            }
        }
    }

    function setRoot(bytes32 newRoot) public onlyOwner returns(bool){
        root = newRoot;
        return true;
    }

    function verification(bytes32[] memory proof, uint maxMintAmount) whenNotPaused() nonReentrant() public  returns(bool) {
       
        
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        bool verified = MerkleProof.verify(proof, root, leaf);
        
       

        if(verified == true){
            isVerified[msg.sender] = true;
            preSaleMaxMintAmount[msg.sender] = maxMintAmount;
        }
        emit VStatus(verified,msg.sender);
        return verified;
    }



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

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

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


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

    function totalMinted() public view returns(uint){
        return _tokenIds.current();
    }

    function startPresale() public onlyOwner returns(bool){
        presale = true;
        return presale;
    }

    function stopPresale() public onlyOwner returns(bool){
        presale = false;
        return presale;
    }

    function whiteListAddress(address[] memory _address) public onlyOwner() returns(bool){
        for(uint i; i < _address.length; i++){
            isVerified[_address[i]] = true;
            preSaleMaxMintAmount[_address[i]] = maxPublicAmount;
        }
        
        return true;
    }
    function pause() public onlyOwner() returns(bool) {
        _pause();
        return true;
    }

    function unPaused() public onlyOwner() returns(bool) {
        _unpause();
        return true;
    }

    function setPrice(uint _newPrice ) public onlyOwner returns(bool){
        price = _newPrice;
        return true;
    }

    function withdraw() public onlyOwner() returns (bool) {
        uint amount = address(this).balance;
       payable(msg.sender).transfer(amount);
       return true;
    }
     function viewRoot() public onlyOwner view returns(bytes32){
         return root;
    }

    function setMaxSupply(uint _maxSupply) public onlyOwner returns(bool){
        maxSupply = _maxSupply;
        return true;
    }

    function setPresalePrice(uint _price) public onlyOwner returns(bool){
        presalePrice = _price;
        return true;
    }

    function setMaxPublicSale(uint amount) public onlyOwner returns(bool){
        maxPublicAmount = amount;
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"initRevealedURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"},{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"VStatus","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToMintInPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleMaxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPresalePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"setRoot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"maxMintAmount","type":"uint256"}],"name":"verification","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"viewRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"}],"name":"whiteListAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000ecf565b507f3af020aab4e27a80329d7f7a7616a8c69b2317e8222e6211c2e495322c4a2a8960001b601055611f40601155600a601255668e1bc9bf0400006013553480156200009c57600080fd5b506040516200733f3803806200733f8339818101604052810190620000c2919062001034565b82828160009080519060200190620000dc92919062000ecf565b508060019080519060200190620000f592919062000ecf565b505050620001186200010c620001f360201b60201c565b620001fb60201b60201c565b6000600a60146101000a81548160ff0219169083151502179055506001600b819055506200014c81620002c160201b60201c565b62000163600c6200036c60201b620029a41760201c565b505b60646200017e600c6200036c60201b620029a41760201c565b1015620001d957620001bc62000199620001f360201b60201c565b620001b0600c6200036c60201b620029a41760201c565b6200037a60201b60201c565b620001d3600c620003a060201b620029b21760201c565b62000165565b620001e9620003b660201b60201c565b50505050620016fa565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d1620001f360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f76200047760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034790620012d7565b60405180910390fd5b80600e90805190602001906200036892919062000ecf565b5050565b600081600001549050919050565b6200039c828260405180602001604052806000815250620004a160201b60201c565b5050565b6001816000016000828254019250508190555050565b6000620003c8620001f360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003ee6200047760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000447576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043e90620012d7565b60405180910390fd5b6001601560006101000a81548160ff021916908315150217905550601560009054906101000a900460ff16905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620004b383836200050f60201b60201c565b620004c86000848484620006f560201b60201c565b6200050a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000501906200124f565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200057990620012b5565b60405180910390fd5b6200059381620008af60201b60201c565b15620005d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005cd9062001271565b60405180910390fd5b620005ea600083836200091b60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200063c919062001385565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620007238473ffffffffffffffffffffffffffffffffffffffff1662000a6260201b620029c81760201c565b15620008a2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000755620001f360201b60201c565b8786866040518563ffffffff1660e01b8152600401620007799493929190620011fb565b602060405180830381600087803b1580156200079457600080fd5b505af1925050508015620007c857506040513d601f19601f82011682018060405250810190620007c5919062001008565b60015b62000851573d8060008114620007fb576040519150601f19603f3d011682016040523d82523d6000602084013e62000800565b606091505b5060008151141562000849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000840906200124f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620008a7565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200093383838362000a7560201b620029db1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000980576200097a8162000a7a60201b60201c565b620009c8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620009c757620009c6838262000ac360201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000a155762000a0f8162000c4060201b60201c565b62000a5d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000a5c5762000a5b828262000d8860201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000add8462000e1460201b62001b251760201c565b62000ae99190620013e2565b905060006007600084815260200190815260200160002054905081811462000bcf576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000c569190620013e2565b905060006009600084815260200190815260200160002054905060006008838154811062000cad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000cf6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000d6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000da08362000e1460201b62001b251760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e7f9062001293565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000edd90620014bd565b90600052602060002090601f01602090048101928262000f01576000855562000f4d565b82601f1062000f1c57805160ff191683800117855562000f4d565b8280016001018555821562000f4d579182015b8281111562000f4c57825182559160200191906001019062000f2f565b5b50905062000f5c919062000f60565b5090565b5b8082111562000f7b57600081600090555060010162000f61565b5090565b600062000f9662000f908462001322565b620012f9565b90508281526020810184848401111562000faf57600080fd5b62000fbc84828562001487565b509392505050565b60008151905062000fd581620016e0565b92915050565b600082601f83011262000fed57600080fd5b815162000fff84826020860162000f7f565b91505092915050565b6000602082840312156200101b57600080fd5b60006200102b8482850162000fc4565b91505092915050565b6000806000606084860312156200104a57600080fd5b600084015167ffffffffffffffff8111156200106557600080fd5b620010738682870162000fdb565b935050602084015167ffffffffffffffff8111156200109157600080fd5b6200109f8682870162000fdb565b925050604084015167ffffffffffffffff811115620010bd57600080fd5b620010cb8682870162000fdb565b9150509250925092565b620010e0816200141d565b82525050565b6000620010f38262001358565b620010ff818562001363565b93506200111181856020860162001487565b6200111c81620015b6565b840191505092915050565b60006200113660328362001374565b91506200114382620015c7565b604082019050919050565b60006200115d601c8362001374565b91506200116a8262001616565b602082019050919050565b600062001184602a8362001374565b915062001191826200163f565b604082019050919050565b6000620011ab60208362001374565b9150620011b8826200168e565b602082019050919050565b6000620011d260208362001374565b9150620011df82620016b7565b602082019050919050565b620011f5816200147d565b82525050565b6000608082019050620012126000830187620010d5565b620012216020830186620010d5565b620012306040830185620011ea565b8181036060830152620012448184620010e6565b905095945050505050565b600060208201905081810360008301526200126a8162001127565b9050919050565b600060208201905081810360008301526200128c816200114e565b9050919050565b60006020820190508181036000830152620012ae8162001175565b9050919050565b60006020820190508181036000830152620012d0816200119c565b9050919050565b60006020820190508181036000830152620012f281620011c3565b9050919050565b60006200130562001318565b9050620013138282620014f3565b919050565b6000604051905090565b600067ffffffffffffffff82111562001340576200133f62001587565b5b6200134b82620015b6565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062001392826200147d565b91506200139f836200147d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620013d757620013d662001529565b5b828201905092915050565b6000620013ef826200147d565b9150620013fc836200147d565b92508282101562001412576200141162001529565b5b828203905092915050565b60006200142a826200145d565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620014a75780820151818401526020810190506200148a565b83811115620014b7576000848401525b50505050565b60006002820490506001821680620014d657607f821691505b60208210811415620014ed57620014ec62001558565b5b50919050565b620014fe82620015b6565b810181811067ffffffffffffffff8211171562001520576200151f62001587565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620016eb8162001431565b8114620016f757600080fd5b50565b615c35806200170a6000396000f3fe6080604052600436106102c85760003560e01c80636c0360eb11610175578063a22cb465116100dc578063c668286211610095578063dab5f3401161006f578063dab5f34014610b9c578063e985e9c514610bd9578063f2fde38b14610c16578063fdea8e0b14610c3f576102c8565b8063c668286214610b09578063c87b56dd14610b34578063d5abeb0114610b71576102c8565b8063a22cb465146109e7578063a2309ff814610a10578063b2bf781314610a3b578063b88d4fde14610a66578063b9209e3314610a8f578063bc660cac14610acc576102c8565b80638456cb591161012e5780638456cb59146108e25780638da5cb5b1461090d57806391b7f5ed1461093857806395d89b4114610975578063a035b1fe146109a0578063a0712d68146109cb576102c8565b80636c0360eb146107be5780636f8b44b0146107e957806370a0823114610826578063715018a6146108635780637dfdd6871461087a578063805e0b20146108a5576102c8565b806323b872dd116102345780634e41cfdb116101ed57806355f804b3116101c757806355f804b3146106f05780635c975abb146107195780635ed88ecf146107445780636352211e14610781576102c8565b80634e41cfdb1461064b5780634f6ccce71461068857806354214f69146106c5576102c8565b806323b872dd146105175780632f745c59146105405780633549345e1461057d5780633ccfd60b146105ba57806342842e0e146105e55780634d0ab1001461060e576102c8565b8063081812fc11610286578063081812fc146103f3578063081c8c4414610430578063095ea7b31461045b5780630b24bb231461048457806318160ddd146104c15780631ad2ad1a146104ec576102c8565b80620e7fa8146102cd57806301ffc9a7146102f857806304c98b2b14610335578063061a46a91461036057806306cc64fa1461038b57806306fdde03146103c8575b600080fd5b3480156102d957600080fd5b506102e2610c6a565b6040516102ef9190614f7e565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190614482565b610c70565b60405161032c9190614b7d565b60405180910390f35b34801561034157600080fd5b5061034a610cea565b6040516103579190614b7d565b60405180910390f35b34801561036c57600080fd5b50610375610d98565b6040516103829190614b7d565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190614405565b610e25565b6040516103bf9190614b7d565b60405180910390f35b3480156103d457600080fd5b506103dd610ff6565b6040516103ea9190614bdc565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190614515565b611088565b6040516104279190614b16565b60405180910390f35b34801561043c57600080fd5b5061044561110d565b6040516104529190614bdc565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190614388565b61119b565b005b34801561049057600080fd5b506104ab60048036038101906104a6919061421d565b6112b3565b6040516104b89190614f7e565b60405180910390f35b3480156104cd57600080fd5b506104d66112cb565b6040516104e39190614f7e565b60405180910390f35b3480156104f857600080fd5b506105016112d8565b60405161050e9190614b7d565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190614282565b611386565b005b34801561054c57600080fd5b5061056760048036038101906105629190614388565b6113e6565b6040516105749190614f7e565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190614515565b61148b565b6040516105b19190614b7d565b60405180910390f35b3480156105c657600080fd5b506105cf611519565b6040516105dc9190614b7d565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614282565b6115eb565b005b34801561061a57600080fd5b506106356004803603810190610630919061421d565b61160b565b6040516106429190614f7e565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906143c4565b611623565b60405161067f9190614b7d565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190614515565b6117e8565b6040516106bc9190614f7e565b60405180910390f35b3480156106d157600080fd5b506106da61187f565b6040516106e79190614b7d565b60405180910390f35b3480156106fc57600080fd5b50610717600480360381019061071291906144d4565b611892565b005b34801561072557600080fd5b5061072e611928565b60405161073b9190614b7d565b60405180910390f35b34801561075057600080fd5b5061076b6004803603810190610766919061421d565b61193f565b6040516107789190614f7e565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190614515565b611957565b6040516107b59190614b16565b60405180910390f35b3480156107ca57600080fd5b506107d3611a09565b6040516107e09190614bdc565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190614515565b611a97565b60405161081d9190614b7d565b60405180910390f35b34801561083257600080fd5b5061084d6004803603810190610848919061421d565b611b25565b60405161085a9190614f7e565b60405180910390f35b34801561086f57600080fd5b50610878611bdd565b005b34801561088657600080fd5b5061088f611c65565b60405161089c9190614bc1565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190614515565b611ceb565b6040516108d99190614b7d565b60405180910390f35b3480156108ee57600080fd5b506108f7611d79565b6040516109049190614b7d565b60405180910390f35b34801561091957600080fd5b50610922611e06565b60405161092f9190614b16565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190614515565b611e30565b60405161096c9190614b7d565b60405180910390f35b34801561098157600080fd5b5061098a611ebe565b6040516109979190614bdc565b60405180910390f35b3480156109ac57600080fd5b506109b5611f50565b6040516109c29190614f7e565b60405180910390f35b6109e560048036038101906109e09190614515565b611f56565b005b3480156109f357600080fd5b50610a0e6004803603810190610a09919061434c565b612572565b005b348015610a1c57600080fd5b50610a25612588565b604051610a329190614f7e565b60405180910390f35b348015610a4757600080fd5b50610a50612599565b604051610a5d9190614f7e565b60405180910390f35b348015610a7257600080fd5b50610a8d6004803603810190610a8891906142d1565b61259f565b005b348015610a9b57600080fd5b50610ab66004803603810190610ab1919061421d565b612601565b604051610ac39190614b7d565b60405180910390f35b348015610ad857600080fd5b50610af36004803603810190610aee919061421d565b612621565b604051610b009190614f7e565b60405180910390f35b348015610b1557600080fd5b50610b1e612639565b604051610b2b9190614bdc565b60405180910390f35b348015610b4057600080fd5b50610b5b6004803603810190610b569190614515565b6126c7565b604051610b689190614bdc565b60405180910390f35b348015610b7d57600080fd5b50610b86612771565b604051610b939190614f7e565b60405180910390f35b348015610ba857600080fd5b50610bc36004803603810190610bbe9190614459565b612777565b604051610bd09190614b7d565b60405180910390f35b348015610be557600080fd5b50610c006004803603810190610bfb9190614246565b612805565b604051610c0d9190614b7d565b60405180910390f35b348015610c2257600080fd5b50610c3d6004803603810190610c38919061421d565b612899565b005b348015610c4b57600080fd5b50610c54612991565b604051610c619190614b7d565b60405180910390f35b60145481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ce35750610ce2826129e0565b5b9050919050565b6000610cf4612ac2565b73ffffffffffffffffffffffffffffffffffffffff16610d12611e06565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90614e1e565b60405180910390fd5b6001601560006101000a81548160ff021916908315150217905550601560009054906101000a900460ff16905090565b6000610da2612ac2565b73ffffffffffffffffffffffffffffffffffffffff16610dc0611e06565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90614e1e565b60405180910390fd5b610e1e612aca565b6001905090565b6000610e2f611928565b15610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690614d3e565b60405180910390fd5b6002600b541415610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90614f5e565b60405180910390fd5b6002600b819055506000610ec7612ac2565b604051602001610ed79190614a9e565b6040516020818303038152906040528051906020012090506000610efe8560105484612b6c565b9050600115158115151415610faa576001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555083601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f7367756b6744e408b3eaae8198e1d9929f92453e224ced244d427bd49efc16be8133604051610fdb929190614b98565b60405180910390a180925050506001600b8190555092915050565b606060008054611005906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611031906152a5565b801561107e5780601f106110535761010080835404028352916020019161107e565b820191906000526020600020905b81548152906001019060200180831161106157829003601f168201915b5050505050905090565b600061109382612b83565b6110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990614dfe565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f805461111a906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611146906152a5565b80156111935780601f1061116857610100808354040283529160200191611193565b820191906000526020600020905b81548152906001019060200180831161117657829003601f168201915b505050505081565b60006111a682611957565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614e9e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611236612ac2565b73ffffffffffffffffffffffffffffffffffffffff16148061126557506112648161125f612ac2565b612805565b5b6112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90614d5e565b60405180910390fd5b6112ae8383612bef565b505050565b60176020528060005260406000206000915090505481565b6000600880549050905090565b60006112e2612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611300611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90614e1e565b60405180910390fd5b6000601560006101000a81548160ff021916908315150217905550601560009054906101000a900460ff16905090565b611397611391612ac2565b82612ca8565b6113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90614efe565b60405180910390fd5b6113e1838383612d86565b505050565b60006113f183611b25565b8210611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614c3e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000611495612ac2565b73ffffffffffffffffffffffffffffffffffffffff166114b3611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614e1e565b60405180910390fd5b8160148190555060019050919050565b6000611523612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611541611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90614e1e565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115e2573d6000803e3d6000fd5b50600191505090565b6116068383836040518060200160405280600081525061259f565b505050565b60196020528060005260406000206000915090505481565b600061162d612ac2565b73ffffffffffffffffffffffffffffffffffffffff1661164b611e06565b73ffffffffffffffffffffffffffffffffffffffff16146116a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169890614e1e565b60405180910390fd5b60005b82518110156117de576001601660008584815181106116ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060125460196000858481518110611785577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806117d690615308565b9150506116a4565b5060019050919050565b60006117f26112cb565b8210611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90614f1e565b60405180910390fd5b6008828154811061186d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601560019054906101000a900460ff1681565b61189a612ac2565b73ffffffffffffffffffffffffffffffffffffffff166118b8611e06565b73ffffffffffffffffffffffffffffffffffffffff161461190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590614e1e565b60405180910390fd5b80600e9080519060200190611924929190613f00565b5050565b6000600a60149054906101000a900460ff16905090565b60186020528060005260406000206000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614d9e565b60405180910390fd5b80915050919050565b600e8054611a16906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a42906152a5565b8015611a8f5780601f10611a6457610100808354040283529160200191611a8f565b820191906000526020600020905b815481529060010190602001808311611a7257829003601f168201915b505050505081565b6000611aa1612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611abf611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90614e1e565b60405180910390fd5b8160118190555060019050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614d7e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611be5612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611c03611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090614e1e565b60405180910390fd5b611c636000612fe2565b565b6000611c6f612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611c8d611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda90614e1e565b60405180910390fd5b601054905090565b6000611cf5612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611d13611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614e1e565b60405180910390fd5b8160128190555060019050919050565b6000611d83612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611da1611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee90614e1e565b60405180910390fd5b611dff6130a8565b6001905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e3a612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611e58611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590614e1e565b60405180910390fd5b8160138190555060019050919050565b606060018054611ecd906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef9906152a5565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050905090565b60135481565b611f5e611928565b15611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590614d3e565b60405180910390fd5b6002600b541415611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614f5e565b60405180910390fd5b6002600b81905550601154611ff9600c6129a4565b111561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190614cbe565b60405180910390fd5b60011515601560009054906101000a900460ff1615151415612357576000816014546120669190615157565b9050803410156120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a290614ebe565b60405180910390fd5b60011515601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590614f3e565b60405180910390fd5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156121c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b790614dbe565b60405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461220b91906150d0565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561230f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230690614e7e565b60405180910390fd5b6000600190505b82811161235457612337612328612ac2565b612332600c6129a4565b61314b565b612341600c6129b2565b808061234c90615308565b915050612316565b50505b60001515601560009054906101000a900460ff1615151415612567576000816013546123839190615157565b9050803410156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90614ebe565b60405180910390fd5b60125482111561240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614bfe565b60405180910390fd5b81601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461245891906150d0565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601254601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251690614ede565b60405180910390fd5b6000600190505b82811161256457612547612538612ac2565b612542600c6129a4565b61314b565b612551600c6129b2565b808061255c90615308565b915050612526565b50505b6001600b8190555050565b61258461257d612ac2565b8383613169565b5050565b6000612594600c6129a4565b905090565b60125481565b6125b06125aa612ac2565b83612ca8565b6125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e690614efe565b60405180910390fd5b6125fb848484846132d6565b50505050565b60166020528060005260406000206000915054906101000a900460ff1681565b601a6020528060005260406000206000915090505481565b600d8054612646906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612672906152a5565b80156126bf5780601f10612694576101008083540402835291602001916126bf565b820191906000526020600020905b8154815290600101906020018083116126a257829003601f168201915b505050505081565b60606126d282612b83565b612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890614e5e565b60405180910390fd5b600061271b613332565b9050600081511161273b5760405180602001604052806000815250612769565b80612745846133c4565b600d60405160200161275993929190614ae5565b6040516020818303038152906040525b915050919050565b60115481565b6000612781612ac2565b73ffffffffffffffffffffffffffffffffffffffff1661279f611e06565b73ffffffffffffffffffffffffffffffffffffffff16146127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec90614e1e565b60405180910390fd5b8160108190555060019050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128a1612ac2565b73ffffffffffffffffffffffffffffffffffffffff166128bf611e06565b73ffffffffffffffffffffffffffffffffffffffff1614612915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290c90614e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297c90614c7e565b60405180910390fd5b61298e81612fe2565b50565b601560009054906101000a900460ff1681565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612aab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612abb5750612aba82613571565b5b9050919050565b600033905090565b612ad2611928565b612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614c1e565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b55612ac2565b604051612b629190614b16565b60405180910390a1565b600082612b7985846135db565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c6283611957565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612cb382612b83565b612cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce990614d1e565b60405180910390fd5b6000612cfd83611957565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d6c57508373ffffffffffffffffffffffffffffffffffffffff16612d5484611088565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d7d5750612d7c8185612805565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612da682611957565b73ffffffffffffffffffffffffffffffffffffffff1614612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390614e3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6390614cde565b60405180910390fd5b612e778383836136b4565b612e82600082612bef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed291906151b1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f2991906150d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130b0611928565b156130f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e790614d3e565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613134612ac2565b6040516131419190614b16565b60405180910390a1565b6131658282604051806020016040528060008152506137c8565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cf90614cfe565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132c99190614b7d565b60405180910390a3505050565b6132e1848484612d86565b6132ed84848484613823565b61332c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332390614c5e565b60405180910390fd5b50505050565b6060600e8054613341906152a5565b80601f016020809104026020016040519081016040528092919081815260200182805461336d906152a5565b80156133ba5780601f1061338f576101008083540402835291602001916133ba565b820191906000526020600020905b81548152906001019060200180831161339d57829003601f168201915b5050505050905090565b6060600082141561340c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061356c565b600082905060005b6000821461343e57808061342790615308565b915050600a826134379190615126565b9150613414565b60008167ffffffffffffffff811115613480577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134b25781602001600182028036833780820191505090505b5090505b60008514613565576001826134cb91906151b1565b9150600a856134da919061537f565b60306134e691906150d0565b60f81b818381518110613522577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561355e9190615126565b94506134b6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b84518110156136a9576000858281518110613628577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161366957828160405160200161364c929190614ab9565b604051602081830303815290604052805190602001209250613695565b808360405160200161367c929190614ab9565b6040516020818303038152906040528051906020012092505b5080806136a190615308565b9150506135e4565b508091505092915050565b6136bf8383836129db565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613702576136fd816139ba565b613741565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137405761373f8382613a03565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137845761377f81613b70565b6137c3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137c2576137c18282613cb3565b5b5b505050565b6137d28383613d32565b6137df6000848484613823565b61381e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381590614c5e565b60405180910390fd5b505050565b60006138448473ffffffffffffffffffffffffffffffffffffffff166129c8565b156139ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261386d612ac2565b8786866040518563ffffffff1660e01b815260040161388f9493929190614b31565b602060405180830381600087803b1580156138a957600080fd5b505af19250505080156138da57506040513d601f19601f820116820180604052508101906138d791906144ab565b60015b61395d573d806000811461390a576040519150601f19603f3d011682016040523d82523d6000602084013e61390f565b606091505b50600081511415613955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394c90614c5e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139b2565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a1084611b25565b613a1a91906151b1565b9050600060076000848152602001908152602001600020549050818114613aff576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b8491906151b1565b9050600060096000848152602001908152602001600020549050600060088381548110613bda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613c22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613cbe83611b25565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9990614dde565b60405180910390fd5b613dab81612b83565b15613deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de290614c9e565b60405180910390fd5b613df7600083836136b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e4791906150d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613f0c906152a5565b90600052602060002090601f016020900481019282613f2e5760008555613f75565b82601f10613f4757805160ff1916838001178555613f75565b82800160010185558215613f75579182015b82811115613f74578251825591602001919060010190613f59565b5b509050613f829190613f86565b5090565b5b80821115613f9f576000816000905550600101613f87565b5090565b6000613fb6613fb184614fbe565b614f99565b90508083825260208201905082856020860282011115613fd557600080fd5b60005b858110156140055781613feb88826140f7565b845260208401935060208301925050600181019050613fd8565b5050509392505050565b600061402261401d84614fea565b614f99565b9050808382526020820190508285602086028201111561404157600080fd5b60005b8581101561407157816140578882614175565b845260208401935060208301925050600181019050614044565b5050509392505050565b600061408e61408984615016565b614f99565b9050828152602081018484840111156140a657600080fd5b6140b1848285615263565b509392505050565b60006140cc6140c784615047565b614f99565b9050828152602081018484840111156140e457600080fd5b6140ef848285615263565b509392505050565b60008135905061410681615b8c565b92915050565b600082601f83011261411d57600080fd5b813561412d848260208601613fa3565b91505092915050565b600082601f83011261414757600080fd5b813561415784826020860161400f565b91505092915050565b60008135905061416f81615ba3565b92915050565b60008135905061418481615bba565b92915050565b60008135905061419981615bd1565b92915050565b6000815190506141ae81615bd1565b92915050565b600082601f8301126141c557600080fd5b81356141d584826020860161407b565b91505092915050565b600082601f8301126141ef57600080fd5b81356141ff8482602086016140b9565b91505092915050565b60008135905061421781615be8565b92915050565b60006020828403121561422f57600080fd5b600061423d848285016140f7565b91505092915050565b6000806040838503121561425957600080fd5b6000614267858286016140f7565b9250506020614278858286016140f7565b9150509250929050565b60008060006060848603121561429757600080fd5b60006142a5868287016140f7565b93505060206142b6868287016140f7565b92505060406142c786828701614208565b9150509250925092565b600080600080608085870312156142e757600080fd5b60006142f5878288016140f7565b9450506020614306878288016140f7565b935050604061431787828801614208565b925050606085013567ffffffffffffffff81111561433457600080fd5b614340878288016141b4565b91505092959194509250565b6000806040838503121561435f57600080fd5b600061436d858286016140f7565b925050602061437e85828601614160565b9150509250929050565b6000806040838503121561439b57600080fd5b60006143a9858286016140f7565b92505060206143ba85828601614208565b9150509250929050565b6000602082840312156143d657600080fd5b600082013567ffffffffffffffff8111156143f057600080fd5b6143fc8482850161410c565b91505092915050565b6000806040838503121561441857600080fd5b600083013567ffffffffffffffff81111561443257600080fd5b61443e85828601614136565b925050602061444f85828601614208565b9150509250929050565b60006020828403121561446b57600080fd5b600061447984828501614175565b91505092915050565b60006020828403121561449457600080fd5b60006144a28482850161418a565b91505092915050565b6000602082840312156144bd57600080fd5b60006144cb8482850161419f565b91505092915050565b6000602082840312156144e657600080fd5b600082013567ffffffffffffffff81111561450057600080fd5b61450c848285016141de565b91505092915050565b60006020828403121561452757600080fd5b600061453584828501614208565b91505092915050565b614547816151e5565b82525050565b61455e614559826151e5565b615351565b82525050565b61456d816151f7565b82525050565b61457c81615203565b82525050565b61459361458e82615203565b615363565b82525050565b60006145a48261508d565b6145ae81856150a3565b93506145be818560208601615272565b6145c78161546c565b840191505092915050565b60006145dd82615098565b6145e781856150b4565b93506145f7818560208601615272565b6146008161546c565b840191505092915050565b600061461682615098565b61462081856150c5565b9350614630818560208601615272565b80840191505092915050565b60008154614649816152a5565b61465381866150c5565b9450600182166000811461466e576001811461467f576146b2565b60ff198316865281860193506146b2565b61468885615078565b60005b838110156146aa5781548189015260018201915060208101905061468b565b838801955050505b50505092915050565b60006146c86020836150b4565b91506146d38261548a565b602082019050919050565b60006146eb6014836150b4565b91506146f6826154b3565b602082019050919050565b600061470e602b836150b4565b9150614719826154dc565b604082019050919050565b60006147316032836150b4565b915061473c8261552b565b604082019050919050565b60006147546026836150b4565b915061475f8261557a565b604082019050919050565b6000614777601c836150b4565b9150614782826155c9565b602082019050919050565b600061479a6018836150b4565b91506147a5826155f2565b602082019050919050565b60006147bd6024836150b4565b91506147c88261561b565b604082019050919050565b60006147e06019836150b4565b91506147eb8261566a565b602082019050919050565b6000614803602c836150b4565b915061480e82615693565b604082019050919050565b60006148266010836150b4565b9150614831826156e2565b602082019050919050565b60006148496038836150b4565b91506148548261570b565b604082019050919050565b600061486c602a836150b4565b91506148778261575a565b604082019050919050565b600061488f6029836150b4565b915061489a826157a9565b604082019050919050565b60006148b2602f836150b4565b91506148bd826157f8565b604082019050919050565b60006148d56020836150b4565b91506148e082615847565b602082019050919050565b60006148f8602c836150b4565b915061490382615870565b604082019050919050565b600061491b6020836150b4565b9150614926826158bf565b602082019050919050565b600061493e6029836150b4565b9150614949826158e8565b604082019050919050565b6000614961602f836150b4565b915061496c82615937565b604082019050919050565b60006149846022836150b4565b915061498f82615986565b604082019050919050565b60006149a76021836150b4565b91506149b2826159d5565b604082019050919050565b60006149ca6012836150b4565b91506149d582615a24565b602082019050919050565b60006149ed602d836150b4565b91506149f882615a4d565b604082019050919050565b6000614a106031836150b4565b9150614a1b82615a9c565b604082019050919050565b6000614a33602c836150b4565b9150614a3e82615aeb565b604082019050919050565b6000614a566020836150b4565b9150614a6182615b3a565b602082019050919050565b6000614a79601f836150b4565b9150614a8482615b63565b602082019050919050565b614a9881615259565b82525050565b6000614aaa828461454d565b60148201915081905092915050565b6000614ac58285614582565b602082019150614ad58284614582565b6020820191508190509392505050565b6000614af1828661460b565b9150614afd828561460b565b9150614b09828461463c565b9150819050949350505050565b6000602082019050614b2b600083018461453e565b92915050565b6000608082019050614b46600083018761453e565b614b53602083018661453e565b614b606040830185614a8f565b8181036060830152614b728184614599565b905095945050505050565b6000602082019050614b926000830184614564565b92915050565b6000604082019050614bad6000830185614564565b614bba602083018461453e565b9392505050565b6000602082019050614bd66000830184614573565b92915050565b60006020820190508181036000830152614bf681846145d2565b905092915050565b60006020820190508181036000830152614c17816146bb565b9050919050565b60006020820190508181036000830152614c37816146de565b9050919050565b60006020820190508181036000830152614c5781614701565b9050919050565b60006020820190508181036000830152614c7781614724565b9050919050565b60006020820190508181036000830152614c9781614747565b9050919050565b60006020820190508181036000830152614cb78161476a565b9050919050565b60006020820190508181036000830152614cd78161478d565b9050919050565b60006020820190508181036000830152614cf7816147b0565b9050919050565b60006020820190508181036000830152614d17816147d3565b9050919050565b60006020820190508181036000830152614d37816147f6565b9050919050565b60006020820190508181036000830152614d5781614819565b9050919050565b60006020820190508181036000830152614d778161483c565b9050919050565b60006020820190508181036000830152614d978161485f565b9050919050565b60006020820190508181036000830152614db781614882565b9050919050565b60006020820190508181036000830152614dd7816148a5565b9050919050565b60006020820190508181036000830152614df7816148c8565b9050919050565b60006020820190508181036000830152614e17816148eb565b9050919050565b60006020820190508181036000830152614e378161490e565b9050919050565b60006020820190508181036000830152614e5781614931565b9050919050565b60006020820190508181036000830152614e7781614954565b9050919050565b60006020820190508181036000830152614e9781614977565b9050919050565b60006020820190508181036000830152614eb78161499a565b9050919050565b60006020820190508181036000830152614ed7816149bd565b9050919050565b60006020820190508181036000830152614ef7816149e0565b9050919050565b60006020820190508181036000830152614f1781614a03565b9050919050565b60006020820190508181036000830152614f3781614a26565b9050919050565b60006020820190508181036000830152614f5781614a49565b9050919050565b60006020820190508181036000830152614f7781614a6c565b9050919050565b6000602082019050614f936000830184614a8f565b92915050565b6000614fa3614fb4565b9050614faf82826152d7565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd957614fd861543d565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150055761500461543d565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150315761503061543d565b5b61503a8261546c565b9050602081019050919050565b600067ffffffffffffffff8211156150625761506161543d565b5b61506b8261546c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150db82615259565b91506150e683615259565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561511b5761511a6153b0565b5b828201905092915050565b600061513182615259565b915061513c83615259565b92508261514c5761514b6153df565b5b828204905092915050565b600061516282615259565b915061516d83615259565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151a6576151a56153b0565b5b828202905092915050565b60006151bc82615259565b91506151c783615259565b9250828210156151da576151d96153b0565b5b828203905092915050565b60006151f082615239565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615290578082015181840152602081019050615275565b8381111561529f576000848401525b50505050565b600060028204905060018216806152bd57607f821691505b602082108114156152d1576152d061540e565b5b50919050565b6152e08261546c565b810181811067ffffffffffffffff821117156152ff576152fe61543d565b5b80604052505050565b600061531382615259565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615346576153456153b0565b5b600182019050919050565b600061535c8261536d565b9050919050565b6000819050919050565b60006153788261547d565b9050919050565b600061538a82615259565b915061539583615259565b9250826153a5576153a46153df565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f63616e6e6f74206d696e74206d6f7265207468616e2074686520616d6f756e74600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d617820616d6f756e74206f66204e4654206d696e7465640000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420656c696769626c6520746f206d696e742074686960008201527f73206e756d626572206f66204e46540000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20656c6967696260008201527f6c65000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e53756666696369656e742046756e64730000000000000000000000000000600082015250565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20746865206d6160008201527f78204e465420616c6c6f77656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420656c696769626c6520666f722070726573616c65600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615b95816151e5565b8114615ba057600080fd5b50565b615bac816151f7565b8114615bb757600080fd5b50565b615bc381615203565b8114615bce57600080fd5b50565b615bda8161520d565b8114615be557600080fd5b50565b615bf181615259565b8114615bfc57600080fd5b5056fea26469706673582212201d3b09977b5bd962045b0b4ba5cd2453a4475edd9ac0fe12c99b40a0027770ba64736f6c63430008040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000013467573696f6e73427947617276656e4c616273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007465553494f4e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d53334d66537a774c41524d794479516a62547938396a4e476659465472524b7a456274746d7369554c4c4e502f000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102c85760003560e01c80636c0360eb11610175578063a22cb465116100dc578063c668286211610095578063dab5f3401161006f578063dab5f34014610b9c578063e985e9c514610bd9578063f2fde38b14610c16578063fdea8e0b14610c3f576102c8565b8063c668286214610b09578063c87b56dd14610b34578063d5abeb0114610b71576102c8565b8063a22cb465146109e7578063a2309ff814610a10578063b2bf781314610a3b578063b88d4fde14610a66578063b9209e3314610a8f578063bc660cac14610acc576102c8565b80638456cb591161012e5780638456cb59146108e25780638da5cb5b1461090d57806391b7f5ed1461093857806395d89b4114610975578063a035b1fe146109a0578063a0712d68146109cb576102c8565b80636c0360eb146107be5780636f8b44b0146107e957806370a0823114610826578063715018a6146108635780637dfdd6871461087a578063805e0b20146108a5576102c8565b806323b872dd116102345780634e41cfdb116101ed57806355f804b3116101c757806355f804b3146106f05780635c975abb146107195780635ed88ecf146107445780636352211e14610781576102c8565b80634e41cfdb1461064b5780634f6ccce71461068857806354214f69146106c5576102c8565b806323b872dd146105175780632f745c59146105405780633549345e1461057d5780633ccfd60b146105ba57806342842e0e146105e55780634d0ab1001461060e576102c8565b8063081812fc11610286578063081812fc146103f3578063081c8c4414610430578063095ea7b31461045b5780630b24bb231461048457806318160ddd146104c15780631ad2ad1a146104ec576102c8565b80620e7fa8146102cd57806301ffc9a7146102f857806304c98b2b14610335578063061a46a91461036057806306cc64fa1461038b57806306fdde03146103c8575b600080fd5b3480156102d957600080fd5b506102e2610c6a565b6040516102ef9190614f7e565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a9190614482565b610c70565b60405161032c9190614b7d565b60405180910390f35b34801561034157600080fd5b5061034a610cea565b6040516103579190614b7d565b60405180910390f35b34801561036c57600080fd5b50610375610d98565b6040516103829190614b7d565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190614405565b610e25565b6040516103bf9190614b7d565b60405180910390f35b3480156103d457600080fd5b506103dd610ff6565b6040516103ea9190614bdc565b60405180910390f35b3480156103ff57600080fd5b5061041a60048036038101906104159190614515565b611088565b6040516104279190614b16565b60405180910390f35b34801561043c57600080fd5b5061044561110d565b6040516104529190614bdc565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190614388565b61119b565b005b34801561049057600080fd5b506104ab60048036038101906104a6919061421d565b6112b3565b6040516104b89190614f7e565b60405180910390f35b3480156104cd57600080fd5b506104d66112cb565b6040516104e39190614f7e565b60405180910390f35b3480156104f857600080fd5b506105016112d8565b60405161050e9190614b7d565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190614282565b611386565b005b34801561054c57600080fd5b5061056760048036038101906105629190614388565b6113e6565b6040516105749190614f7e565b60405180910390f35b34801561058957600080fd5b506105a4600480360381019061059f9190614515565b61148b565b6040516105b19190614b7d565b60405180910390f35b3480156105c657600080fd5b506105cf611519565b6040516105dc9190614b7d565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190614282565b6115eb565b005b34801561061a57600080fd5b506106356004803603810190610630919061421d565b61160b565b6040516106429190614f7e565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d91906143c4565b611623565b60405161067f9190614b7d565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190614515565b6117e8565b6040516106bc9190614f7e565b60405180910390f35b3480156106d157600080fd5b506106da61187f565b6040516106e79190614b7d565b60405180910390f35b3480156106fc57600080fd5b50610717600480360381019061071291906144d4565b611892565b005b34801561072557600080fd5b5061072e611928565b60405161073b9190614b7d565b60405180910390f35b34801561075057600080fd5b5061076b6004803603810190610766919061421d565b61193f565b6040516107789190614f7e565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190614515565b611957565b6040516107b59190614b16565b60405180910390f35b3480156107ca57600080fd5b506107d3611a09565b6040516107e09190614bdc565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190614515565b611a97565b60405161081d9190614b7d565b60405180910390f35b34801561083257600080fd5b5061084d6004803603810190610848919061421d565b611b25565b60405161085a9190614f7e565b60405180910390f35b34801561086f57600080fd5b50610878611bdd565b005b34801561088657600080fd5b5061088f611c65565b60405161089c9190614bc1565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c79190614515565b611ceb565b6040516108d99190614b7d565b60405180910390f35b3480156108ee57600080fd5b506108f7611d79565b6040516109049190614b7d565b60405180910390f35b34801561091957600080fd5b50610922611e06565b60405161092f9190614b16565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a9190614515565b611e30565b60405161096c9190614b7d565b60405180910390f35b34801561098157600080fd5b5061098a611ebe565b6040516109979190614bdc565b60405180910390f35b3480156109ac57600080fd5b506109b5611f50565b6040516109c29190614f7e565b60405180910390f35b6109e560048036038101906109e09190614515565b611f56565b005b3480156109f357600080fd5b50610a0e6004803603810190610a09919061434c565b612572565b005b348015610a1c57600080fd5b50610a25612588565b604051610a329190614f7e565b60405180910390f35b348015610a4757600080fd5b50610a50612599565b604051610a5d9190614f7e565b60405180910390f35b348015610a7257600080fd5b50610a8d6004803603810190610a8891906142d1565b61259f565b005b348015610a9b57600080fd5b50610ab66004803603810190610ab1919061421d565b612601565b604051610ac39190614b7d565b60405180910390f35b348015610ad857600080fd5b50610af36004803603810190610aee919061421d565b612621565b604051610b009190614f7e565b60405180910390f35b348015610b1557600080fd5b50610b1e612639565b604051610b2b9190614bdc565b60405180910390f35b348015610b4057600080fd5b50610b5b6004803603810190610b569190614515565b6126c7565b604051610b689190614bdc565b60405180910390f35b348015610b7d57600080fd5b50610b86612771565b604051610b939190614f7e565b60405180910390f35b348015610ba857600080fd5b50610bc36004803603810190610bbe9190614459565b612777565b604051610bd09190614b7d565b60405180910390f35b348015610be557600080fd5b50610c006004803603810190610bfb9190614246565b612805565b604051610c0d9190614b7d565b60405180910390f35b348015610c2257600080fd5b50610c3d6004803603810190610c38919061421d565b612899565b005b348015610c4b57600080fd5b50610c54612991565b604051610c619190614b7d565b60405180910390f35b60145481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ce35750610ce2826129e0565b5b9050919050565b6000610cf4612ac2565b73ffffffffffffffffffffffffffffffffffffffff16610d12611e06565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90614e1e565b60405180910390fd5b6001601560006101000a81548160ff021916908315150217905550601560009054906101000a900460ff16905090565b6000610da2612ac2565b73ffffffffffffffffffffffffffffffffffffffff16610dc0611e06565b73ffffffffffffffffffffffffffffffffffffffff1614610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d90614e1e565b60405180910390fd5b610e1e612aca565b6001905090565b6000610e2f611928565b15610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690614d3e565b60405180910390fd5b6002600b541415610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90614f5e565b60405180910390fd5b6002600b819055506000610ec7612ac2565b604051602001610ed79190614a9e565b6040516020818303038152906040528051906020012090506000610efe8560105484612b6c565b9050600115158115151415610faa576001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555083601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f7367756b6744e408b3eaae8198e1d9929f92453e224ced244d427bd49efc16be8133604051610fdb929190614b98565b60405180910390a180925050506001600b8190555092915050565b606060008054611005906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611031906152a5565b801561107e5780601f106110535761010080835404028352916020019161107e565b820191906000526020600020905b81548152906001019060200180831161106157829003601f168201915b5050505050905090565b600061109382612b83565b6110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990614dfe565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600f805461111a906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611146906152a5565b80156111935780601f1061116857610100808354040283529160200191611193565b820191906000526020600020905b81548152906001019060200180831161117657829003601f168201915b505050505081565b60006111a682611957565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90614e9e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611236612ac2565b73ffffffffffffffffffffffffffffffffffffffff16148061126557506112648161125f612ac2565b612805565b5b6112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90614d5e565b60405180910390fd5b6112ae8383612bef565b505050565b60176020528060005260406000206000915090505481565b6000600880549050905090565b60006112e2612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611300611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134d90614e1e565b60405180910390fd5b6000601560006101000a81548160ff021916908315150217905550601560009054906101000a900460ff16905090565b611397611391612ac2565b82612ca8565b6113d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cd90614efe565b60405180910390fd5b6113e1838383612d86565b505050565b60006113f183611b25565b8210611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614c3e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000611495612ac2565b73ffffffffffffffffffffffffffffffffffffffff166114b3611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150090614e1e565b60405180910390fd5b8160148190555060019050919050565b6000611523612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611541611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e90614e1e565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115e2573d6000803e3d6000fd5b50600191505090565b6116068383836040518060200160405280600081525061259f565b505050565b60196020528060005260406000206000915090505481565b600061162d612ac2565b73ffffffffffffffffffffffffffffffffffffffff1661164b611e06565b73ffffffffffffffffffffffffffffffffffffffff16146116a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169890614e1e565b60405180910390fd5b60005b82518110156117de576001601660008584815181106116ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060125460196000858481518110611785577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806117d690615308565b9150506116a4565b5060019050919050565b60006117f26112cb565b8210611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a90614f1e565b60405180910390fd5b6008828154811061186d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b601560019054906101000a900460ff1681565b61189a612ac2565b73ffffffffffffffffffffffffffffffffffffffff166118b8611e06565b73ffffffffffffffffffffffffffffffffffffffff161461190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590614e1e565b60405180910390fd5b80600e9080519060200190611924929190613f00565b5050565b6000600a60149054906101000a900460ff16905090565b60186020528060005260406000206000915090505481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614d9e565b60405180910390fd5b80915050919050565b600e8054611a16906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a42906152a5565b8015611a8f5780601f10611a6457610100808354040283529160200191611a8f565b820191906000526020600020905b815481529060010190602001808311611a7257829003601f168201915b505050505081565b6000611aa1612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611abf611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90614e1e565b60405180910390fd5b8160118190555060019050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614d7e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611be5612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611c03611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5090614e1e565b60405180910390fd5b611c636000612fe2565b565b6000611c6f612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611c8d611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda90614e1e565b60405180910390fd5b601054905090565b6000611cf5612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611d13611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614e1e565b60405180910390fd5b8160128190555060019050919050565b6000611d83612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611da1611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611df7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dee90614e1e565b60405180910390fd5b611dff6130a8565b6001905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611e3a612ac2565b73ffffffffffffffffffffffffffffffffffffffff16611e58611e06565b73ffffffffffffffffffffffffffffffffffffffff1614611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590614e1e565b60405180910390fd5b8160138190555060019050919050565b606060018054611ecd906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef9906152a5565b8015611f465780601f10611f1b57610100808354040283529160200191611f46565b820191906000526020600020905b815481529060010190602001808311611f2957829003601f168201915b5050505050905090565b60135481565b611f5e611928565b15611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590614d3e565b60405180910390fd5b6002600b541415611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614f5e565b60405180910390fd5b6002600b81905550601154611ff9600c6129a4565b111561203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190614cbe565b60405180910390fd5b60011515601560009054906101000a900460ff1615151415612357576000816014546120669190615157565b9050803410156120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a290614ebe565b60405180910390fd5b60011515601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461213e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213590614f3e565b60405180910390fd5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156121c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b790614dbe565b60405180910390fd5b81601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461220b91906150d0565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561230f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230690614e7e565b60405180910390fd5b6000600190505b82811161235457612337612328612ac2565b612332600c6129a4565b61314b565b612341600c6129b2565b808061234c90615308565b915050612316565b50505b60001515601560009054906101000a900460ff1615151415612567576000816013546123839190615157565b9050803410156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90614ebe565b60405180910390fd5b60125482111561240d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240490614bfe565b60405180910390fd5b81601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461245891906150d0565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601254601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561251f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251690614ede565b60405180910390fd5b6000600190505b82811161256457612547612538612ac2565b612542600c6129a4565b61314b565b612551600c6129b2565b808061255c90615308565b915050612526565b50505b6001600b8190555050565b61258461257d612ac2565b8383613169565b5050565b6000612594600c6129a4565b905090565b60125481565b6125b06125aa612ac2565b83612ca8565b6125ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e690614efe565b60405180910390fd5b6125fb848484846132d6565b50505050565b60166020528060005260406000206000915054906101000a900460ff1681565b601a6020528060005260406000206000915090505481565b600d8054612646906152a5565b80601f0160208091040260200160405190810160405280929190818152602001828054612672906152a5565b80156126bf5780601f10612694576101008083540402835291602001916126bf565b820191906000526020600020905b8154815290600101906020018083116126a257829003601f168201915b505050505081565b60606126d282612b83565b612711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270890614e5e565b60405180910390fd5b600061271b613332565b9050600081511161273b5760405180602001604052806000815250612769565b80612745846133c4565b600d60405160200161275993929190614ae5565b6040516020818303038152906040525b915050919050565b60115481565b6000612781612ac2565b73ffffffffffffffffffffffffffffffffffffffff1661279f611e06565b73ffffffffffffffffffffffffffffffffffffffff16146127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec90614e1e565b60405180910390fd5b8160108190555060019050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6128a1612ac2565b73ffffffffffffffffffffffffffffffffffffffff166128bf611e06565b73ffffffffffffffffffffffffffffffffffffffff1614612915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290c90614e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297c90614c7e565b60405180910390fd5b61298e81612fe2565b50565b601560009054906101000a900460ff1681565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612aab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612abb5750612aba82613571565b5b9050919050565b600033905090565b612ad2611928565b612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890614c1e565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b55612ac2565b604051612b629190614b16565b60405180910390a1565b600082612b7985846135db565b1490509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c6283611957565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612cb382612b83565b612cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce990614d1e565b60405180910390fd5b6000612cfd83611957565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d6c57508373ffffffffffffffffffffffffffffffffffffffff16612d5484611088565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d7d5750612d7c8185612805565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612da682611957565b73ffffffffffffffffffffffffffffffffffffffff1614612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390614e3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6390614cde565b60405180910390fd5b612e778383836136b4565b612e82600082612bef565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed291906151b1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f2991906150d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130b0611928565b156130f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e790614d3e565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613134612ac2565b6040516131419190614b16565b60405180910390a1565b6131658282604051806020016040528060008152506137c8565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cf90614cfe565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132c99190614b7d565b60405180910390a3505050565b6132e1848484612d86565b6132ed84848484613823565b61332c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332390614c5e565b60405180910390fd5b50505050565b6060600e8054613341906152a5565b80601f016020809104026020016040519081016040528092919081815260200182805461336d906152a5565b80156133ba5780601f1061338f576101008083540402835291602001916133ba565b820191906000526020600020905b81548152906001019060200180831161339d57829003601f168201915b5050505050905090565b6060600082141561340c576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061356c565b600082905060005b6000821461343e57808061342790615308565b915050600a826134379190615126565b9150613414565b60008167ffffffffffffffff811115613480577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134b25781602001600182028036833780820191505090505b5090505b60008514613565576001826134cb91906151b1565b9150600a856134da919061537f565b60306134e691906150d0565b60f81b818381518110613522577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561355e9190615126565b94506134b6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b84518110156136a9576000858281518110613628577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161366957828160405160200161364c929190614ab9565b604051602081830303815290604052805190602001209250613695565b808360405160200161367c929190614ab9565b6040516020818303038152906040528051906020012092505b5080806136a190615308565b9150506135e4565b508091505092915050565b6136bf8383836129db565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613702576136fd816139ba565b613741565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137405761373f8382613a03565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137845761377f81613b70565b6137c3565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146137c2576137c18282613cb3565b5b5b505050565b6137d28383613d32565b6137df6000848484613823565b61381e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161381590614c5e565b60405180910390fd5b505050565b60006138448473ffffffffffffffffffffffffffffffffffffffff166129c8565b156139ad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261386d612ac2565b8786866040518563ffffffff1660e01b815260040161388f9493929190614b31565b602060405180830381600087803b1580156138a957600080fd5b505af19250505080156138da57506040513d601f19601f820116820180604052508101906138d791906144ab565b60015b61395d573d806000811461390a576040519150601f19603f3d011682016040523d82523d6000602084013e61390f565b606091505b50600081511415613955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394c90614c5e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139b2565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a1084611b25565b613a1a91906151b1565b9050600060076000848152602001908152602001600020549050818114613aff576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613b8491906151b1565b9050600060096000848152602001908152602001600020549050600060088381548110613bda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613c22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613c97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613cbe83611b25565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9990614dde565b60405180910390fd5b613dab81612b83565b15613deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613de290614c9e565b60405180910390fd5b613df7600083836136b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e4791906150d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613f0c906152a5565b90600052602060002090601f016020900481019282613f2e5760008555613f75565b82601f10613f4757805160ff1916838001178555613f75565b82800160010185558215613f75579182015b82811115613f74578251825591602001919060010190613f59565b5b509050613f829190613f86565b5090565b5b80821115613f9f576000816000905550600101613f87565b5090565b6000613fb6613fb184614fbe565b614f99565b90508083825260208201905082856020860282011115613fd557600080fd5b60005b858110156140055781613feb88826140f7565b845260208401935060208301925050600181019050613fd8565b5050509392505050565b600061402261401d84614fea565b614f99565b9050808382526020820190508285602086028201111561404157600080fd5b60005b8581101561407157816140578882614175565b845260208401935060208301925050600181019050614044565b5050509392505050565b600061408e61408984615016565b614f99565b9050828152602081018484840111156140a657600080fd5b6140b1848285615263565b509392505050565b60006140cc6140c784615047565b614f99565b9050828152602081018484840111156140e457600080fd5b6140ef848285615263565b509392505050565b60008135905061410681615b8c565b92915050565b600082601f83011261411d57600080fd5b813561412d848260208601613fa3565b91505092915050565b600082601f83011261414757600080fd5b813561415784826020860161400f565b91505092915050565b60008135905061416f81615ba3565b92915050565b60008135905061418481615bba565b92915050565b60008135905061419981615bd1565b92915050565b6000815190506141ae81615bd1565b92915050565b600082601f8301126141c557600080fd5b81356141d584826020860161407b565b91505092915050565b600082601f8301126141ef57600080fd5b81356141ff8482602086016140b9565b91505092915050565b60008135905061421781615be8565b92915050565b60006020828403121561422f57600080fd5b600061423d848285016140f7565b91505092915050565b6000806040838503121561425957600080fd5b6000614267858286016140f7565b9250506020614278858286016140f7565b9150509250929050565b60008060006060848603121561429757600080fd5b60006142a5868287016140f7565b93505060206142b6868287016140f7565b92505060406142c786828701614208565b9150509250925092565b600080600080608085870312156142e757600080fd5b60006142f5878288016140f7565b9450506020614306878288016140f7565b935050604061431787828801614208565b925050606085013567ffffffffffffffff81111561433457600080fd5b614340878288016141b4565b91505092959194509250565b6000806040838503121561435f57600080fd5b600061436d858286016140f7565b925050602061437e85828601614160565b9150509250929050565b6000806040838503121561439b57600080fd5b60006143a9858286016140f7565b92505060206143ba85828601614208565b9150509250929050565b6000602082840312156143d657600080fd5b600082013567ffffffffffffffff8111156143f057600080fd5b6143fc8482850161410c565b91505092915050565b6000806040838503121561441857600080fd5b600083013567ffffffffffffffff81111561443257600080fd5b61443e85828601614136565b925050602061444f85828601614208565b9150509250929050565b60006020828403121561446b57600080fd5b600061447984828501614175565b91505092915050565b60006020828403121561449457600080fd5b60006144a28482850161418a565b91505092915050565b6000602082840312156144bd57600080fd5b60006144cb8482850161419f565b91505092915050565b6000602082840312156144e657600080fd5b600082013567ffffffffffffffff81111561450057600080fd5b61450c848285016141de565b91505092915050565b60006020828403121561452757600080fd5b600061453584828501614208565b91505092915050565b614547816151e5565b82525050565b61455e614559826151e5565b615351565b82525050565b61456d816151f7565b82525050565b61457c81615203565b82525050565b61459361458e82615203565b615363565b82525050565b60006145a48261508d565b6145ae81856150a3565b93506145be818560208601615272565b6145c78161546c565b840191505092915050565b60006145dd82615098565b6145e781856150b4565b93506145f7818560208601615272565b6146008161546c565b840191505092915050565b600061461682615098565b61462081856150c5565b9350614630818560208601615272565b80840191505092915050565b60008154614649816152a5565b61465381866150c5565b9450600182166000811461466e576001811461467f576146b2565b60ff198316865281860193506146b2565b61468885615078565b60005b838110156146aa5781548189015260018201915060208101905061468b565b838801955050505b50505092915050565b60006146c86020836150b4565b91506146d38261548a565b602082019050919050565b60006146eb6014836150b4565b91506146f6826154b3565b602082019050919050565b600061470e602b836150b4565b9150614719826154dc565b604082019050919050565b60006147316032836150b4565b915061473c8261552b565b604082019050919050565b60006147546026836150b4565b915061475f8261557a565b604082019050919050565b6000614777601c836150b4565b9150614782826155c9565b602082019050919050565b600061479a6018836150b4565b91506147a5826155f2565b602082019050919050565b60006147bd6024836150b4565b91506147c88261561b565b604082019050919050565b60006147e06019836150b4565b91506147eb8261566a565b602082019050919050565b6000614803602c836150b4565b915061480e82615693565b604082019050919050565b60006148266010836150b4565b9150614831826156e2565b602082019050919050565b60006148496038836150b4565b91506148548261570b565b604082019050919050565b600061486c602a836150b4565b91506148778261575a565b604082019050919050565b600061488f6029836150b4565b915061489a826157a9565b604082019050919050565b60006148b2602f836150b4565b91506148bd826157f8565b604082019050919050565b60006148d56020836150b4565b91506148e082615847565b602082019050919050565b60006148f8602c836150b4565b915061490382615870565b604082019050919050565b600061491b6020836150b4565b9150614926826158bf565b602082019050919050565b600061493e6029836150b4565b9150614949826158e8565b604082019050919050565b6000614961602f836150b4565b915061496c82615937565b604082019050919050565b60006149846022836150b4565b915061498f82615986565b604082019050919050565b60006149a76021836150b4565b91506149b2826159d5565b604082019050919050565b60006149ca6012836150b4565b91506149d582615a24565b602082019050919050565b60006149ed602d836150b4565b91506149f882615a4d565b604082019050919050565b6000614a106031836150b4565b9150614a1b82615a9c565b604082019050919050565b6000614a33602c836150b4565b9150614a3e82615aeb565b604082019050919050565b6000614a566020836150b4565b9150614a6182615b3a565b602082019050919050565b6000614a79601f836150b4565b9150614a8482615b63565b602082019050919050565b614a9881615259565b82525050565b6000614aaa828461454d565b60148201915081905092915050565b6000614ac58285614582565b602082019150614ad58284614582565b6020820191508190509392505050565b6000614af1828661460b565b9150614afd828561460b565b9150614b09828461463c565b9150819050949350505050565b6000602082019050614b2b600083018461453e565b92915050565b6000608082019050614b46600083018761453e565b614b53602083018661453e565b614b606040830185614a8f565b8181036060830152614b728184614599565b905095945050505050565b6000602082019050614b926000830184614564565b92915050565b6000604082019050614bad6000830185614564565b614bba602083018461453e565b9392505050565b6000602082019050614bd66000830184614573565b92915050565b60006020820190508181036000830152614bf681846145d2565b905092915050565b60006020820190508181036000830152614c17816146bb565b9050919050565b60006020820190508181036000830152614c37816146de565b9050919050565b60006020820190508181036000830152614c5781614701565b9050919050565b60006020820190508181036000830152614c7781614724565b9050919050565b60006020820190508181036000830152614c9781614747565b9050919050565b60006020820190508181036000830152614cb78161476a565b9050919050565b60006020820190508181036000830152614cd78161478d565b9050919050565b60006020820190508181036000830152614cf7816147b0565b9050919050565b60006020820190508181036000830152614d17816147d3565b9050919050565b60006020820190508181036000830152614d37816147f6565b9050919050565b60006020820190508181036000830152614d5781614819565b9050919050565b60006020820190508181036000830152614d778161483c565b9050919050565b60006020820190508181036000830152614d978161485f565b9050919050565b60006020820190508181036000830152614db781614882565b9050919050565b60006020820190508181036000830152614dd7816148a5565b9050919050565b60006020820190508181036000830152614df7816148c8565b9050919050565b60006020820190508181036000830152614e17816148eb565b9050919050565b60006020820190508181036000830152614e378161490e565b9050919050565b60006020820190508181036000830152614e5781614931565b9050919050565b60006020820190508181036000830152614e7781614954565b9050919050565b60006020820190508181036000830152614e9781614977565b9050919050565b60006020820190508181036000830152614eb78161499a565b9050919050565b60006020820190508181036000830152614ed7816149bd565b9050919050565b60006020820190508181036000830152614ef7816149e0565b9050919050565b60006020820190508181036000830152614f1781614a03565b9050919050565b60006020820190508181036000830152614f3781614a26565b9050919050565b60006020820190508181036000830152614f5781614a49565b9050919050565b60006020820190508181036000830152614f7781614a6c565b9050919050565b6000602082019050614f936000830184614a8f565b92915050565b6000614fa3614fb4565b9050614faf82826152d7565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd957614fd861543d565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150055761500461543d565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156150315761503061543d565b5b61503a8261546c565b9050602081019050919050565b600067ffffffffffffffff8211156150625761506161543d565b5b61506b8261546c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150db82615259565b91506150e683615259565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561511b5761511a6153b0565b5b828201905092915050565b600061513182615259565b915061513c83615259565b92508261514c5761514b6153df565b5b828204905092915050565b600061516282615259565b915061516d83615259565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151a6576151a56153b0565b5b828202905092915050565b60006151bc82615259565b91506151c783615259565b9250828210156151da576151d96153b0565b5b828203905092915050565b60006151f082615239565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615290578082015181840152602081019050615275565b8381111561529f576000848401525b50505050565b600060028204905060018216806152bd57607f821691505b602082108114156152d1576152d061540e565b5b50919050565b6152e08261546c565b810181811067ffffffffffffffff821117156152ff576152fe61543d565b5b80604052505050565b600061531382615259565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615346576153456153b0565b5b600182019050919050565b600061535c8261536d565b9050919050565b6000819050919050565b60006153788261547d565b9050919050565b600061538a82615259565b915061539583615259565b9250826153a5576153a46153df565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f63616e6e6f74206d696e74206d6f7265207468616e2074686520616d6f756e74600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d617820616d6f756e74206f66204e4654206d696e7465640000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420656c696769626c6520746f206d696e742074686960008201527f73206e756d626572206f66204e46540000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20656c6967696260008201527f6c65000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e53756666696369656e742046756e64730000000000000000000000000000600082015250565b7f596f752063616e6e6f74206d696e74206d6f7265207468616e20746865206d6160008201527f78204e465420616c6c6f77656400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420656c696769626c6520666f722070726573616c65600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615b95816151e5565b8114615ba057600080fd5b50565b615bac816151f7565b8114615bb757600080fd5b50565b615bc381615203565b8114615bce57600080fd5b50565b615bda8161520d565b8114615be557600080fd5b50565b615bf181615259565b8114615bfc57600080fd5b5056fea26469706673582212201d3b09977b5bd962045b0b4ba5cd2453a4475edd9ac0fe12c99b40a0027770ba64736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000013467573696f6e73427947617276656e4c616273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007465553494f4e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d53334d66537a774c41524d794479516a62547938396a4e476659465472524b7a456274746d7369554c4c4e502f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): FusionsByGarvenLabs
Arg [1] : symbol (string): FUSIONS
Arg [2] : initRevealedURI (string): https://gateway.pinata.cloud/ipfs/QmS3MfSzwLARMyDyQjbTy89jNGfYFTrRKzEbttmsiULLNP/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [4] : 467573696f6e73427947617276656e4c61627300000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 465553494f4e5300000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [8] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [9] : 732f516d53334d66537a774c41524d794479516a62547938396a4e4766594654
Arg [10] : 72524b7a456274746d7369554c4c4e502f000000000000000000000000000000


Deployed Bytecode Sourcemap

54075:6036:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54599:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47421:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58526:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59174:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57015:517;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23587:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25146:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54357:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24669:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54738:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48061:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58646:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25896:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47729:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59836:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59417:175;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26306:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54851:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58766:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48251:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54658:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58313:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45180:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54801:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23281:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54329:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59696:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23011:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40455:103;;;;;;;;;;;;;:::i;:::-;;59599:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59974:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59067:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39804:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59286:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23756:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54562:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55358:1522;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25439:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58425:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54523:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26562:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54689:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54910:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54285:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57544:643;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54488:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56888:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25665:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40713:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54632:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54599:24;;;;:::o;47421:224::-;47523:4;47562:35;47547:50;;;:11;:50;;;;:90;;;;47601:36;47625:11;47601:23;:36::i;:::-;47547:90;47540:97;;47421:224;;;:::o;58526:112::-;58575:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58601:4:::1;58591:7;;:14;;;;;;;;;;;;;;;;;;58623:7;;;;;;;;;;;58616:14;;58526:112:::0;:::o;59174:104::-;59221:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59238:10:::1;:8;:10::i;:::-;59266:4;59259:11;;59174:104:::0;:::o;57015:517::-;57128:4;45506:8;:6;:8::i;:::-;45505:9;45497:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43072:1:::1;43670:7;;:19;;43662:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43072:1;43803:7;:18;;;;57164:12:::2;57206;:10;:12::i;:::-;57189:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;57179:41;;;;;;57164:56;;57231:13;57247:37;57266:5;57273:4;;57279;57247:18;:37::i;:::-;57231:53;;57331:4;57319:16;;:8;:16;;;57316:139;;;57376:4;57351:10;:22;57362:10;57351:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57430:13;57395:20;:32;57416:10;57395:32;;;;;;;;;;;;;;;:48;;;;57316:139;57470:28;57478:8;57487:10;57470:28;;;;;;;:::i;:::-;;;;;;;;57516:8;57509:15;;;;43028:1:::1;43982:7;:22;;;;57015:517:::0;;;;:::o;23587:100::-;23641:13;23674:5;23667:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23587:100;:::o;25146:221::-;25222:7;25250:16;25258:7;25250;:16::i;:::-;25242:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25335:15;:24;25351:7;25335:24;;;;;;;;;;;;;;;;;;;;;25328:31;;25146:221;;;:::o;54357:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24669:411::-;24750:13;24766:23;24781:7;24766:14;:23::i;:::-;24750:39;;24814:5;24808:11;;:2;:11;;;;24800:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24908:5;24892:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24917:37;24934:5;24941:12;:10;:12::i;:::-;24917:16;:37::i;:::-;24892:62;24870:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25051:21;25060:2;25064:7;25051:8;:21::i;:::-;24669:411;;;:::o;54738:56::-;;;;;;;;;;;;;;;;;:::o;48061:113::-;48122:7;48149:10;:17;;;;48142:24;;48061:113;:::o;58646:112::-;58694:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58720:5:::1;58710:7;;:15;;;;;;;;;;;;;;;;;;58743:7;;;;;;;;;;;58736:14;;58646:112:::0;:::o;25896:339::-;26091:41;26110:12;:10;:12::i;:::-;26124:7;26091:18;:41::i;:::-;26083:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26199:28;26209:4;26215:2;26219:7;26199:9;:28::i;:::-;25896:339;;;:::o;47729:256::-;47826:7;47862:23;47879:5;47862:16;:23::i;:::-;47854:5;:31;47846:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47951:12;:19;47964:5;47951:19;;;;;;;;;;;;;;;:26;47971:5;47951:26;;;;;;;;;;;;47944:33;;47729:256;;;;:::o;59836:130::-;59899:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59930:6:::1;59915:12;:21;;;;59954:4;59947:11;;59836:130:::0;;;:::o;59417:175::-;59465:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59482:11:::1;59496:21;59482:35;;59535:10;59527:28;;:36;59556:6;59527:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59580:4;59573:11;;;59417:175:::0;:::o;26306:185::-;26444:39;26461:4;26467:2;26471:7;26444:39;;;;;;;;;;;;:16;:39::i;:::-;26306:185;;;:::o;54851:52::-;;;;;;;;;;;;;;;;;:::o;58766:295::-;58846:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58866:6:::1;58862:160;58878:8;:15;58874:1;:19;58862:160;;;58940:4;58914:10;:23;58925:8;58934:1;58925:11;;;;;;;;;;;;;;;;;;;;;;58914:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;58995:15;;58959:20;:33;58980:8;58989:1;58980:11;;;;;;;;;;;;;;;;;;;;;;58959:33;;;;;;;;;;;;;;;:51;;;;58895:3;;;;;:::i;:::-;;;;58862:160;;;;59049:4;59042:11;;58766:295:::0;;;:::o;48251:233::-;48326:7;48362:30;:28;:30::i;:::-;48354:5;:38;48346:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48459:10;48470:5;48459:17;;;;;;;;;;;;;;;;;;;;;;;;48452:24;;48251:233;;;:::o;54658:22::-;;;;;;;;;;;;;:::o;58313:104::-;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58398:11:::1;58388:7;:21;;;;;;;;;;;;:::i;:::-;;58313:104:::0;:::o;45180:86::-;45227:4;45251:7;;;;;;;;;;;45244:14;;45180:86;:::o;54801:43::-;;;;;;;;;;;;;;;;;:::o;23281:239::-;23353:7;23373:13;23389:7;:16;23397:7;23389:16;;;;;;;;;;;;;;;;;;;;;23373:32;;23441:1;23424:19;;:5;:19;;;;23416:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23507:5;23500:12;;;23281:239;;;:::o;54329:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59696:132::-;59760:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59788:10:::1;59776:9;:22;;;;59816:4;59809:11;;59696:132:::0;;;:::o;23011:208::-;23083:7;23128:1;23111:19;;:5;:19;;;;23103:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23195:9;:16;23205:5;23195:16;;;;;;;;;;;;;;;;23188:23;;23011:208;;;:::o;40455:103::-;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40520:30:::1;40547:1;40520:18;:30::i;:::-;40455:103::o:0;59599:89::-;59649:7;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59676:4:::1;;59669:11;;59599:89:::0;:::o;59974:134::-;60038:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60072:6:::1;60054:15;:24;;;;60096:4;60089:11;;59974:134:::0;;;:::o;59067:99::-;59111:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59128:8:::1;:6;:8::i;:::-;59154:4;59147:11;;59067:99:::0;:::o;39804:87::-;39850:7;39877:6;;;;;;;;;;;39870:13;;39804:87;:::o;59286:123::-;59346:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59370:9:::1;59362:5;:17;;;;59397:4;59390:11;;59286:123:::0;;;:::o;23756:104::-;23812:13;23845:7;23838:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23756:104;:::o;54562:30::-;;;;:::o;55358:1522::-;45506:8;:6;:8::i;:::-;45505:9;45497:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43072:1:::1;43670:7;;:19;;43662:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43072:1;43803:7;:18;;;;55477:9:::2;;55454:19;:9;:17;:19::i;:::-;:32;;55446:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;55540:4;55529:15;;:7;;;;;;;;;;;:15;;;55526:736;;;55560:11;55589:10;55574:12;;:25;;;;:::i;:::-;55560:39;;55635:6;55622:9;:19;;55614:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55714:4;55687:31;;:10;:23;55698:10;55687:23;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;55679:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55791:20;:32;55812:10;55791:32;;;;;;;;;;;;;;;;55777:10;:46;;55769:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;55945:10;55917:13;:25;55931:10;55917:25;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;55889:13;:25;55903:10;55889:25;;;;;;;;;;;;;;;:66;;;;56007:20;:32;56028:10;56007:32;;;;;;;;;;;;;;;;55978:13;:25;55992:10;55978:25;;;;;;;;;;;;;;;;:61;;55970:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;56097:6;56106:1;56097:10;;56093:156;56114:10;56109:1;:15;56093:156;;56149:44;56159:12;:10;:12::i;:::-;56173:19;:9;:17;:19::i;:::-;56149:9;:44::i;:::-;56211:21;:9;:19;:21::i;:::-;56126:3;;;;;:::i;:::-;;;;56093:156;;;;55526:736;;56288:5;56277:16;;:7;;;;;;;;;;;:16;;;56274:599;;;56309:11;56331:10;56323:5;;:18;;;;:::i;:::-;56309:32;;56379:6;56366:9;:19;;56358:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56444:15;;56430:10;:29;;56422:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56564:10;56538:11;:23;56550:10;56538:23;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;56512:11;:23;56524:10;56512:23;;;;;;;;;;;;;;;:62;;;;56626:15;;56599:11;:23;56611:10;56599:23;;;;;;;;;;;;;;;;:42;;56591:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;56711:6;56720:1;56711:10;;56707:155;56728:10;56723:1;:15;56707:155;;56763:44;56773:12;:10;:12::i;:::-;56787:19;:9;:17;:19::i;:::-;56763:9;:44::i;:::-;56825:21;:9;:19;:21::i;:::-;56740:3;;;;;:::i;:::-;;;;56707:155;;;;56274:599;;43028:1:::1;43982:7;:22;;;;55358:1522:::0;:::o;25439:155::-;25534:52;25553:12;:10;:12::i;:::-;25567:8;25577;25534:18;:52::i;:::-;25439:155;;:::o;58425:93::-;58468:4;58491:19;:9;:17;:19::i;:::-;58484:26;;58425:93;:::o;54523:32::-;;;;:::o;26562:328::-;26737:41;26756:12;:10;:12::i;:::-;26770:7;26737:18;:41::i;:::-;26729:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26843:39;26857:4;26863:2;26867:7;26876:5;26843:13;:39::i;:::-;26562:328;;;;:::o;54689:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;54910:45::-;;;;;;;;;;;;;;;;;:::o;54285:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57544:643::-;57663:13;57716:16;57724:7;57716;:16::i;:::-;57694:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;57820:28;57851:10;:8;:10::i;:::-;57820:41;;57923:1;57898:14;57892:28;:32;:287;;;;;;;;;;;;;;;;;58016:14;58057:18;:7;:16;:18::i;:::-;58102:13;57973:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57892:287;57872:307;;;57544:643;;;:::o;54488:28::-;;;;:::o;56888:119::-;56947:4;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56970:7:::1;56963:4;:14;;;;56995:4;56988:11;;56888:119:::0;;;:::o;25665:164::-;25762:4;25786:18;:25;25805:5;25786:25;;;;;;;;;;;;;;;:35;25812:8;25786:35;;;;;;;;;;;;;;;;;;;;;;;;;25779:42;;25665:164;;;;:::o;40713:201::-;40035:12;:10;:12::i;:::-;40024:23;;:7;:5;:7::i;:::-;:23;;;40016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40822:1:::1;40802:22;;:8;:22;;;;40794:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40878:28;40897:8;40878:18;:28::i;:::-;40713:201:::0;:::o;54632:19::-;;;;;;;;;;;;;:::o;38109:114::-;38174:7;38201;:14;;;38194:21;;38109:114;;;:::o;38231:127::-;38338:1;38320:7;:14;;;:19;;;;;;;;;;;38231:127;:::o;10724:387::-;10784:4;10992:12;11059:7;11047:20;11039:28;;11102:1;11095:4;:8;11088:15;;;10724:387;;;:::o;34949:126::-;;;;:::o;22642:305::-;22744:4;22796:25;22781:40;;;:11;:40;;;;:105;;;;22853:33;22838:48;;;:11;:48;;;;22781:105;:158;;;;22903:36;22927:11;22903:23;:36::i;:::-;22781:158;22761:178;;22642:305;;;:::o;685:98::-;738:7;765:10;758:17;;685:98;:::o;46239:120::-;45783:8;:6;:8::i;:::-;45775:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;46308:5:::1;46298:7;;:15;;;;;;;;;;;;;;;;;;46329:22;46338:12;:10;:12::i;:::-;46329:22;;;;;;:::i;:::-;;;;;;;;46239:120::o:0;35973:190::-;36098:4;36151;36122:25;36135:5;36142:4;36122:12;:25::i;:::-;:33;36115:40;;35973:190;;;;;:::o;28400:127::-;28465:4;28517:1;28489:30;;:7;:16;28497:7;28489:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28482:37;;28400:127;;;:::o;32382:174::-;32484:2;32457:15;:24;32473:7;32457:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32540:7;32536:2;32502:46;;32511:23;32526:7;32511:14;:23::i;:::-;32502:46;;;;;;;;;;;;32382:174;;:::o;28694:348::-;28787:4;28812:16;28820:7;28812;:16::i;:::-;28804:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28888:13;28904:23;28919:7;28904:14;:23::i;:::-;28888:39;;28957:5;28946:16;;:7;:16;;;:51;;;;28990:7;28966:31;;:20;28978:7;28966:11;:20::i;:::-;:31;;;28946:51;:87;;;;29001:32;29018:5;29025:7;29001:16;:32::i;:::-;28946:87;28938:96;;;28694:348;;;;:::o;31686:578::-;31845:4;31818:31;;:23;31833:7;31818:14;:23::i;:::-;:31;;;31810:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31928:1;31914:16;;:2;:16;;;;31906:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31984:39;32005:4;32011:2;32015:7;31984:20;:39::i;:::-;32088:29;32105:1;32109:7;32088:8;:29::i;:::-;32149:1;32130:9;:15;32140:4;32130:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32178:1;32161:9;:13;32171:2;32161:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32209:2;32190:7;:16;32198:7;32190:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32248:7;32244:2;32229:27;;32238:4;32229:27;;;;;;;;;;;;31686:578;;;:::o;41074:191::-;41148:16;41167:6;;;;;;;;;;;41148:25;;41193:8;41184:6;;:17;;;;;;;;;;;;;;;;;;41248:8;41217:40;;41238:8;41217:40;;;;;;;;;;;;41074:191;;:::o;45980:118::-;45506:8;:6;:8::i;:::-;45505:9;45497:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;46050:4:::1;46040:7;;:14;;;;;;;;;;;;;;;;;;46070:20;46077:12;:10;:12::i;:::-;46070:20;;;;;;:::i;:::-;;;;;;;;45980:118::o:0;29384:110::-;29460:26;29470:2;29474:7;29460:26;;;;;;;;;;;;:9;:26::i;:::-;29384:110;;:::o;32698:315::-;32853:8;32844:17;;:5;:17;;;;32836:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32940:8;32902:18;:25;32921:5;32902:25;;;;;;;;;;;;;;;:35;32928:8;32902:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32986:8;32964:41;;32979:5;32964:41;;;32996:8;32964:41;;;;;;:::i;:::-;;;;;;;;32698:315;;;:::o;27772:::-;27929:28;27939:4;27945:2;27949:7;27929:9;:28::i;:::-;27976:48;27999:4;28005:2;28009:7;28018:5;27976:22;:48::i;:::-;27968:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27772:315;;;;:::o;58195:108::-;58255:13;58288:7;58281:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58195:108;:::o;8136:723::-;8192:13;8422:1;8413:5;:10;8409:53;;;8440:10;;;;;;;;;;;;;;;;;;;;;8409:53;8472:12;8487:5;8472:20;;8503:14;8528:78;8543:1;8535:4;:9;8528:78;;8561:8;;;;;:::i;:::-;;;;8592:2;8584:10;;;;;:::i;:::-;;;8528:78;;;8616:19;8648:6;8638:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8616:39;;8666:154;8682:1;8673:5;:10;8666:154;;8710:1;8700:11;;;;;:::i;:::-;;;8777:2;8769:5;:10;;;;:::i;:::-;8756:2;:24;;;;:::i;:::-;8743:39;;8726:6;8733;8726:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;8806:2;8797:11;;;;;:::i;:::-;;;8666:154;;;8844:6;8830:21;;;;;8136:723;;;;:::o;7604:157::-;7689:4;7728:25;7713:40;;;:11;:40;;;;7706:47;;7604:157;;;:::o;36525:701::-;36608:7;36628:20;36651:4;36628:27;;36671:9;36666:523;36690:5;:12;36686:1;:16;36666:523;;;36724:20;36747:5;36753:1;36747:8;;;;;;;;;;;;;;;;;;;;;;36724:31;;36790:12;36774;:28;36770:408;;36944:12;36958;36927:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36917:55;;;;;;36902:70;;36770:408;;;37134:12;37148;37117:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37107:55;;;;;;37092:70;;36770:408;36666:523;36704:3;;;;;:::i;:::-;;;;36666:523;;;;37206:12;37199:19;;;36525:701;;;;:::o;49097:589::-;49241:45;49268:4;49274:2;49278:7;49241:26;:45::i;:::-;49319:1;49303:18;;:4;:18;;;49299:187;;;49338:40;49370:7;49338:31;:40::i;:::-;49299:187;;;49408:2;49400:10;;:4;:10;;;49396:90;;49427:47;49460:4;49466:7;49427:32;:47::i;:::-;49396:90;49299:187;49514:1;49500:16;;:2;:16;;;49496:183;;;49533:45;49570:7;49533:36;:45::i;:::-;49496:183;;;49606:4;49600:10;;:2;:10;;;49596:83;;49627:40;49655:2;49659:7;49627:27;:40::i;:::-;49596:83;49496:183;49097:589;;;:::o;29721:321::-;29851:18;29857:2;29861:7;29851:5;:18::i;:::-;29902:54;29933:1;29937:2;29941:7;29950:5;29902:22;:54::i;:::-;29880:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29721:321;;;:::o;33578:799::-;33733:4;33754:15;:2;:13;;;:15::i;:::-;33750:620;;;33806:2;33790:36;;;33827:12;:10;:12::i;:::-;33841:4;33847:7;33856:5;33790:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33786:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34049:1;34032:6;:13;:18;34028:272;;;34075:60;;;;;;;;;;:::i;:::-;;;;;;;;34028:272;34250:6;34244:13;34235:6;34231:2;34227:15;34220:38;33786:529;33923:41;;;33913:51;;;:6;:51;;;;33906:58;;;;;33750:620;34354:4;34347:11;;33578:799;;;;;;;:::o;50409:164::-;50513:10;:17;;;;50486:15;:24;50502:7;50486:24;;;;;;;;;;;:44;;;;50541:10;50557:7;50541:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50409:164;:::o;51200:988::-;51466:22;51516:1;51491:22;51508:4;51491:16;:22::i;:::-;:26;;;;:::i;:::-;51466:51;;51528:18;51549:17;:26;51567:7;51549:26;;;;;;;;;;;;51528:47;;51696:14;51682:10;:28;51678:328;;51727:19;51749:12;:18;51762:4;51749:18;;;;;;;;;;;;;;;:34;51768:14;51749:34;;;;;;;;;;;;51727:56;;51833:11;51800:12;:18;51813:4;51800:18;;;;;;;;;;;;;;;:30;51819:10;51800:30;;;;;;;;;;;:44;;;;51950:10;51917:17;:30;51935:11;51917:30;;;;;;;;;;;:43;;;;51678:328;;52102:17;:26;52120:7;52102:26;;;;;;;;;;;52095:33;;;52146:12;:18;52159:4;52146:18;;;;;;;;;;;;;;;:34;52165:14;52146:34;;;;;;;;;;;52139:41;;;51200:988;;;;:::o;52483:1079::-;52736:22;52781:1;52761:10;:17;;;;:21;;;;:::i;:::-;52736:46;;52793:18;52814:15;:24;52830:7;52814:24;;;;;;;;;;;;52793:45;;53165:19;53187:10;53198:14;53187:26;;;;;;;;;;;;;;;;;;;;;;;;53165:48;;53251:11;53226:10;53237;53226:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;53362:10;53331:15;:28;53347:11;53331:28;;;;;;;;;;;:41;;;;53503:15;:24;53519:7;53503:24;;;;;;;;;;;53496:31;;;53538:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52483:1079;;;;:::o;49987:221::-;50072:14;50089:20;50106:2;50089:16;:20::i;:::-;50072:37;;50147:7;50120:12;:16;50133:2;50120:16;;;;;;;;;;;;;;;:24;50137:6;50120:24;;;;;;;;;;;:34;;;;50194:6;50165:17;:26;50183:7;50165:26;;;;;;;;;;;:35;;;;49987:221;;;:::o;30378:382::-;30472:1;30458:16;;:2;:16;;;;30450:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30531:16;30539:7;30531;:16::i;:::-;30530:17;30522:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30593:45;30622:1;30626:2;30630:7;30593:20;:45::i;:::-;30668:1;30651:9;:13;30661:2;30651:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30699:2;30680:7;:16;30688:7;30680:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30744:7;30740:2;30719:33;;30736:1;30719:33;;;;;;;;;;;;30378:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:303::-;2622:5;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;2689:1;2686;2679:12;2638:2;2729:6;2716:20;2754:94;2844:3;2836:6;2829:4;2821:6;2817:17;2754:94;:::i;:::-;2745:103;;2628:226;;;;;:::o;2860:133::-;2903:5;2941:6;2928:20;2919:29;;2957:30;2981:5;2957:30;:::i;:::-;2909:84;;;;:::o;2999:139::-;3045:5;3083:6;3070:20;3061:29;;3099:33;3126:5;3099:33;:::i;:::-;3051:87;;;;:::o;3144:137::-;3189:5;3227:6;3214:20;3205:29;;3243:32;3269:5;3243:32;:::i;:::-;3195:86;;;;:::o;3287:141::-;3343:5;3374:6;3368:13;3359:22;;3390:32;3416:5;3390:32;:::i;:::-;3349:79;;;;:::o;3447:271::-;3502:5;3551:3;3544:4;3536:6;3532:17;3528:27;3518:2;;3569:1;3566;3559:12;3518:2;3609:6;3596:20;3634:78;3708:3;3700:6;3693:4;3685:6;3681:17;3634:78;:::i;:::-;3625:87;;3508:210;;;;;:::o;3738:273::-;3794:5;3843:3;3836:4;3828:6;3824:17;3820:27;3810:2;;3861:1;3858;3851:12;3810:2;3901:6;3888:20;3926:79;4001:3;3993:6;3986:4;3978:6;3974:17;3926:79;:::i;:::-;3917:88;;3800:211;;;;;:::o;4017:139::-;4063:5;4101:6;4088:20;4079:29;;4117:33;4144:5;4117:33;:::i;:::-;4069:87;;;;:::o;4162:262::-;4221:6;4270:2;4258:9;4249:7;4245:23;4241:32;4238:2;;;4286:1;4283;4276:12;4238:2;4329:1;4354:53;4399:7;4390:6;4379:9;4375:22;4354:53;:::i;:::-;4344:63;;4300:117;4228:196;;;;:::o;4430:407::-;4498:6;4506;4555:2;4543:9;4534:7;4530:23;4526:32;4523:2;;;4571:1;4568;4561:12;4523:2;4614:1;4639:53;4684:7;4675:6;4664:9;4660:22;4639:53;:::i;:::-;4629:63;;4585:117;4741:2;4767:53;4812:7;4803:6;4792:9;4788:22;4767:53;:::i;:::-;4757:63;;4712:118;4513:324;;;;;:::o;4843:552::-;4920:6;4928;4936;4985:2;4973:9;4964:7;4960:23;4956:32;4953:2;;;5001:1;4998;4991:12;4953:2;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;5299:2;5325:53;5370:7;5361:6;5350:9;5346:22;5325:53;:::i;:::-;5315:63;;5270:118;4943:452;;;;;:::o;5401:809::-;5496:6;5504;5512;5520;5569:3;5557:9;5548:7;5544:23;5540:33;5537:2;;;5586:1;5583;5576:12;5537:2;5629:1;5654:53;5699:7;5690:6;5679:9;5675:22;5654:53;:::i;:::-;5644:63;;5600:117;5756:2;5782:53;5827:7;5818:6;5807:9;5803:22;5782:53;:::i;:::-;5772:63;;5727:118;5884:2;5910:53;5955:7;5946:6;5935:9;5931:22;5910:53;:::i;:::-;5900:63;;5855:118;6040:2;6029:9;6025:18;6012:32;6071:18;6063:6;6060:30;6057:2;;;6103:1;6100;6093:12;6057:2;6131:62;6185:7;6176:6;6165:9;6161:22;6131:62;:::i;:::-;6121:72;;5983:220;5527:683;;;;;;;:::o;6216:401::-;6281:6;6289;6338:2;6326:9;6317:7;6313:23;6309:32;6306:2;;;6354:1;6351;6344:12;6306:2;6397:1;6422:53;6467:7;6458:6;6447:9;6443:22;6422:53;:::i;:::-;6412:63;;6368:117;6524:2;6550:50;6592:7;6583:6;6572:9;6568:22;6550:50;:::i;:::-;6540:60;;6495:115;6296:321;;;;;:::o;6623:407::-;6691:6;6699;6748:2;6736:9;6727:7;6723:23;6719:32;6716:2;;;6764:1;6761;6754:12;6716:2;6807:1;6832:53;6877:7;6868:6;6857:9;6853:22;6832:53;:::i;:::-;6822:63;;6778:117;6934:2;6960:53;7005:7;6996:6;6985:9;6981:22;6960:53;:::i;:::-;6950:63;;6905:118;6706:324;;;;;:::o;7036:405::-;7120:6;7169:2;7157:9;7148:7;7144:23;7140:32;7137:2;;;7185:1;7182;7175:12;7137:2;7256:1;7245:9;7241:17;7228:31;7286:18;7278:6;7275:30;7272:2;;;7318:1;7315;7308:12;7272:2;7346:78;7416:7;7407:6;7396:9;7392:22;7346:78;:::i;:::-;7336:88;;7199:235;7127:314;;;;:::o;7447:550::-;7540:6;7548;7597:2;7585:9;7576:7;7572:23;7568:32;7565:2;;;7613:1;7610;7603:12;7565:2;7684:1;7673:9;7669:17;7656:31;7714:18;7706:6;7703:30;7700:2;;;7746:1;7743;7736:12;7700:2;7774:78;7844:7;7835:6;7824:9;7820:22;7774:78;:::i;:::-;7764:88;;7627:235;7901:2;7927:53;7972:7;7963:6;7952:9;7948:22;7927:53;:::i;:::-;7917:63;;7872:118;7555:442;;;;;:::o;8003:262::-;8062:6;8111:2;8099:9;8090:7;8086:23;8082:32;8079:2;;;8127:1;8124;8117:12;8079:2;8170:1;8195:53;8240:7;8231:6;8220:9;8216:22;8195:53;:::i;:::-;8185:63;;8141:117;8069:196;;;;:::o;8271:260::-;8329:6;8378:2;8366:9;8357:7;8353:23;8349:32;8346:2;;;8394:1;8391;8384:12;8346:2;8437:1;8462:52;8506:7;8497:6;8486:9;8482:22;8462:52;:::i;:::-;8452:62;;8408:116;8336:195;;;;:::o;8537:282::-;8606:6;8655:2;8643:9;8634:7;8630:23;8626:32;8623:2;;;8671:1;8668;8661:12;8623:2;8714:1;8739:63;8794:7;8785:6;8774:9;8770:22;8739:63;:::i;:::-;8729:73;;8685:127;8613:206;;;;:::o;8825:375::-;8894:6;8943:2;8931:9;8922:7;8918:23;8914:32;8911:2;;;8959:1;8956;8949:12;8911:2;9030:1;9019:9;9015:17;9002:31;9060:18;9052:6;9049:30;9046:2;;;9092:1;9089;9082:12;9046:2;9120:63;9175:7;9166:6;9155:9;9151:22;9120:63;:::i;:::-;9110:73;;8973:220;8901:299;;;;:::o;9206:262::-;9265:6;9314:2;9302:9;9293:7;9289:23;9285:32;9282:2;;;9330:1;9327;9320:12;9282:2;9373:1;9398:53;9443:7;9434:6;9423:9;9419:22;9398:53;:::i;:::-;9388:63;;9344:117;9272:196;;;;:::o;9474:118::-;9561:24;9579:5;9561:24;:::i;:::-;9556:3;9549:37;9539:53;;:::o;9598:157::-;9703:45;9723:24;9741:5;9723:24;:::i;:::-;9703:45;:::i;:::-;9698:3;9691:58;9681:74;;:::o;9761:109::-;9842:21;9857:5;9842:21;:::i;:::-;9837:3;9830:34;9820:50;;:::o;9876:118::-;9963:24;9981:5;9963:24;:::i;:::-;9958:3;9951:37;9941:53;;:::o;10000:157::-;10105:45;10125:24;10143:5;10125:24;:::i;:::-;10105:45;:::i;:::-;10100:3;10093:58;10083:74;;:::o;10163:360::-;10249:3;10277:38;10309:5;10277:38;:::i;:::-;10331:70;10394:6;10389:3;10331:70;:::i;:::-;10324:77;;10410:52;10455:6;10450:3;10443:4;10436:5;10432:16;10410:52;:::i;:::-;10487:29;10509:6;10487:29;:::i;:::-;10482:3;10478:39;10471:46;;10253:270;;;;;:::o;10529:364::-;10617:3;10645:39;10678:5;10645:39;:::i;:::-;10700:71;10764:6;10759:3;10700:71;:::i;:::-;10693:78;;10780:52;10825:6;10820:3;10813:4;10806:5;10802:16;10780:52;:::i;:::-;10857:29;10879:6;10857:29;:::i;:::-;10852:3;10848:39;10841:46;;10621:272;;;;;:::o;10899:377::-;11005:3;11033:39;11066:5;11033:39;:::i;:::-;11088:89;11170:6;11165:3;11088:89;:::i;:::-;11081:96;;11186:52;11231:6;11226:3;11219:4;11212:5;11208:16;11186:52;:::i;:::-;11263:6;11258:3;11254:16;11247:23;;11009:267;;;;;:::o;11306:845::-;11409:3;11446:5;11440:12;11475:36;11501:9;11475:36;:::i;:::-;11527:89;11609:6;11604:3;11527:89;:::i;:::-;11520:96;;11647:1;11636:9;11632:17;11663:1;11658:137;;;;11809:1;11804:341;;;;11625:520;;11658:137;11742:4;11738:9;11727;11723:25;11718:3;11711:38;11778:6;11773:3;11769:16;11762:23;;11658:137;;11804:341;11871:38;11903:5;11871:38;:::i;:::-;11931:1;11945:154;11959:6;11956:1;11953:13;11945:154;;;12033:7;12027:14;12023:1;12018:3;12014:11;12007:35;12083:1;12074:7;12070:15;12059:26;;11981:4;11978:1;11974:12;11969:17;;11945:154;;;12128:6;12123:3;12119:16;12112:23;;11811:334;;11625:520;;11413:738;;;;;;:::o;12157:366::-;12299:3;12320:67;12384:2;12379:3;12320:67;:::i;:::-;12313:74;;12396:93;12485:3;12396:93;:::i;:::-;12514:2;12509:3;12505:12;12498:19;;12303:220;;;:::o;12529:366::-;12671:3;12692:67;12756:2;12751:3;12692:67;:::i;:::-;12685:74;;12768:93;12857:3;12768:93;:::i;:::-;12886:2;12881:3;12877:12;12870:19;;12675:220;;;:::o;12901:366::-;13043:3;13064:67;13128:2;13123:3;13064:67;:::i;:::-;13057:74;;13140:93;13229:3;13140:93;:::i;:::-;13258:2;13253:3;13249:12;13242:19;;13047:220;;;:::o;13273:366::-;13415:3;13436:67;13500:2;13495:3;13436:67;:::i;:::-;13429:74;;13512:93;13601:3;13512:93;:::i;:::-;13630:2;13625:3;13621:12;13614:19;;13419:220;;;:::o;13645:366::-;13787:3;13808:67;13872:2;13867:3;13808:67;:::i;:::-;13801:74;;13884:93;13973:3;13884:93;:::i;:::-;14002:2;13997:3;13993:12;13986:19;;13791:220;;;:::o;14017:366::-;14159:3;14180:67;14244:2;14239:3;14180:67;:::i;:::-;14173:74;;14256:93;14345:3;14256:93;:::i;:::-;14374:2;14369:3;14365:12;14358:19;;14163:220;;;:::o;14389:366::-;14531:3;14552:67;14616:2;14611:3;14552:67;:::i;:::-;14545:74;;14628:93;14717:3;14628:93;:::i;:::-;14746:2;14741:3;14737:12;14730:19;;14535:220;;;:::o;14761:366::-;14903:3;14924:67;14988:2;14983:3;14924:67;:::i;:::-;14917:74;;15000:93;15089:3;15000:93;:::i;:::-;15118:2;15113:3;15109:12;15102:19;;14907:220;;;:::o;15133:366::-;15275:3;15296:67;15360:2;15355:3;15296:67;:::i;:::-;15289:74;;15372:93;15461:3;15372:93;:::i;:::-;15490:2;15485:3;15481:12;15474:19;;15279:220;;;:::o;15505:366::-;15647:3;15668:67;15732:2;15727:3;15668:67;:::i;:::-;15661:74;;15744:93;15833:3;15744:93;:::i;:::-;15862:2;15857:3;15853:12;15846:19;;15651:220;;;:::o;15877:366::-;16019:3;16040:67;16104:2;16099:3;16040:67;:::i;:::-;16033:74;;16116:93;16205:3;16116:93;:::i;:::-;16234:2;16229:3;16225:12;16218:19;;16023:220;;;:::o;16249:366::-;16391:3;16412:67;16476:2;16471:3;16412:67;:::i;:::-;16405:74;;16488:93;16577:3;16488:93;:::i;:::-;16606:2;16601:3;16597:12;16590:19;;16395:220;;;:::o;16621:366::-;16763:3;16784:67;16848:2;16843:3;16784:67;:::i;:::-;16777:74;;16860:93;16949:3;16860:93;:::i;:::-;16978:2;16973:3;16969:12;16962:19;;16767:220;;;:::o;16993:366::-;17135:3;17156:67;17220:2;17215:3;17156:67;:::i;:::-;17149:74;;17232:93;17321:3;17232:93;:::i;:::-;17350:2;17345:3;17341:12;17334:19;;17139:220;;;:::o;17365:366::-;17507:3;17528:67;17592:2;17587:3;17528:67;:::i;:::-;17521:74;;17604:93;17693:3;17604:93;:::i;:::-;17722:2;17717:3;17713:12;17706:19;;17511:220;;;:::o;17737:366::-;17879:3;17900:67;17964:2;17959:3;17900:67;:::i;:::-;17893:74;;17976:93;18065:3;17976:93;:::i;:::-;18094:2;18089:3;18085:12;18078:19;;17883:220;;;:::o;18109:366::-;18251:3;18272:67;18336:2;18331:3;18272:67;:::i;:::-;18265:74;;18348:93;18437:3;18348:93;:::i;:::-;18466:2;18461:3;18457:12;18450:19;;18255:220;;;:::o;18481:366::-;18623:3;18644:67;18708:2;18703:3;18644:67;:::i;:::-;18637:74;;18720:93;18809:3;18720:93;:::i;:::-;18838:2;18833:3;18829:12;18822:19;;18627:220;;;:::o;18853:366::-;18995:3;19016:67;19080:2;19075:3;19016:67;:::i;:::-;19009:74;;19092:93;19181:3;19092:93;:::i;:::-;19210:2;19205:3;19201:12;19194:19;;18999:220;;;:::o;19225:366::-;19367:3;19388:67;19452:2;19447:3;19388:67;:::i;:::-;19381:74;;19464:93;19553:3;19464:93;:::i;:::-;19582:2;19577:3;19573:12;19566:19;;19371:220;;;:::o;19597:366::-;19739:3;19760:67;19824:2;19819:3;19760:67;:::i;:::-;19753:74;;19836:93;19925:3;19836:93;:::i;:::-;19954:2;19949:3;19945:12;19938:19;;19743:220;;;:::o;19969:366::-;20111:3;20132:67;20196:2;20191:3;20132:67;:::i;:::-;20125:74;;20208:93;20297:3;20208:93;:::i;:::-;20326:2;20321:3;20317:12;20310:19;;20115:220;;;:::o;20341:366::-;20483:3;20504:67;20568:2;20563:3;20504:67;:::i;:::-;20497:74;;20580:93;20669:3;20580:93;:::i;:::-;20698:2;20693:3;20689:12;20682:19;;20487:220;;;:::o;20713:366::-;20855:3;20876:67;20940:2;20935:3;20876:67;:::i;:::-;20869:74;;20952:93;21041:3;20952:93;:::i;:::-;21070:2;21065:3;21061:12;21054:19;;20859:220;;;:::o;21085:366::-;21227:3;21248:67;21312:2;21307:3;21248:67;:::i;:::-;21241:74;;21324:93;21413:3;21324:93;:::i;:::-;21442:2;21437:3;21433:12;21426:19;;21231:220;;;:::o;21457:366::-;21599:3;21620:67;21684:2;21679:3;21620:67;:::i;:::-;21613:74;;21696:93;21785:3;21696:93;:::i;:::-;21814:2;21809:3;21805:12;21798:19;;21603:220;;;:::o;21829:366::-;21971:3;21992:67;22056:2;22051:3;21992:67;:::i;:::-;21985:74;;22068:93;22157:3;22068:93;:::i;:::-;22186:2;22181:3;22177:12;22170:19;;21975:220;;;:::o;22201:366::-;22343:3;22364:67;22428:2;22423:3;22364:67;:::i;:::-;22357:74;;22440:93;22529:3;22440:93;:::i;:::-;22558:2;22553:3;22549:12;22542:19;;22347:220;;;:::o;22573:118::-;22660:24;22678:5;22660:24;:::i;:::-;22655:3;22648:37;22638:53;;:::o;22697:256::-;22809:3;22824:75;22895:3;22886:6;22824:75;:::i;:::-;22924:2;22919:3;22915:12;22908:19;;22944:3;22937:10;;22813:140;;;;:::o;22959:397::-;23099:3;23114:75;23185:3;23176:6;23114:75;:::i;:::-;23214:2;23209:3;23205:12;23198:19;;23227:75;23298:3;23289:6;23227:75;:::i;:::-;23327:2;23322:3;23318:12;23311:19;;23347:3;23340:10;;23103:253;;;;;:::o;23362:589::-;23587:3;23609:95;23700:3;23691:6;23609:95;:::i;:::-;23602:102;;23721:95;23812:3;23803:6;23721:95;:::i;:::-;23714:102;;23833:92;23921:3;23912:6;23833:92;:::i;:::-;23826:99;;23942:3;23935:10;;23591:360;;;;;;:::o;23957:222::-;24050:4;24088:2;24077:9;24073:18;24065:26;;24101:71;24169:1;24158:9;24154:17;24145:6;24101:71;:::i;:::-;24055:124;;;;:::o;24185:640::-;24380:4;24418:3;24407:9;24403:19;24395:27;;24432:71;24500:1;24489:9;24485:17;24476:6;24432:71;:::i;:::-;24513:72;24581:2;24570:9;24566:18;24557:6;24513:72;:::i;:::-;24595;24663:2;24652:9;24648:18;24639:6;24595:72;:::i;:::-;24714:9;24708:4;24704:20;24699:2;24688:9;24684:18;24677:48;24742:76;24813:4;24804:6;24742:76;:::i;:::-;24734:84;;24385:440;;;;;;;:::o;24831:210::-;24918:4;24956:2;24945:9;24941:18;24933:26;;24969:65;25031:1;25020:9;25016:17;25007:6;24969:65;:::i;:::-;24923:118;;;;:::o;25047:320::-;25162:4;25200:2;25189:9;25185:18;25177:26;;25213:65;25275:1;25264:9;25260:17;25251:6;25213:65;:::i;:::-;25288:72;25356:2;25345:9;25341:18;25332:6;25288:72;:::i;:::-;25167:200;;;;;:::o;25373:222::-;25466:4;25504:2;25493:9;25489:18;25481:26;;25517:71;25585:1;25574:9;25570:17;25561:6;25517:71;:::i;:::-;25471:124;;;;:::o;25601:313::-;25714:4;25752:2;25741:9;25737:18;25729:26;;25801:9;25795:4;25791:20;25787:1;25776:9;25772:17;25765:47;25829:78;25902:4;25893:6;25829:78;:::i;:::-;25821:86;;25719:195;;;;:::o;25920:419::-;26086:4;26124:2;26113:9;26109:18;26101:26;;26173:9;26167:4;26163:20;26159:1;26148:9;26144:17;26137:47;26201:131;26327:4;26201:131;:::i;:::-;26193:139;;26091:248;;;:::o;26345:419::-;26511:4;26549:2;26538:9;26534:18;26526:26;;26598:9;26592:4;26588:20;26584:1;26573:9;26569:17;26562:47;26626:131;26752:4;26626:131;:::i;:::-;26618:139;;26516:248;;;:::o;26770:419::-;26936:4;26974:2;26963:9;26959:18;26951:26;;27023:9;27017:4;27013:20;27009:1;26998:9;26994:17;26987:47;27051:131;27177:4;27051:131;:::i;:::-;27043:139;;26941:248;;;:::o;27195:419::-;27361:4;27399:2;27388:9;27384:18;27376:26;;27448:9;27442:4;27438:20;27434:1;27423:9;27419:17;27412:47;27476:131;27602:4;27476:131;:::i;:::-;27468:139;;27366:248;;;:::o;27620:419::-;27786:4;27824:2;27813:9;27809:18;27801:26;;27873:9;27867:4;27863:20;27859:1;27848:9;27844:17;27837:47;27901:131;28027:4;27901:131;:::i;:::-;27893:139;;27791:248;;;:::o;28045:419::-;28211:4;28249:2;28238:9;28234:18;28226:26;;28298:9;28292:4;28288:20;28284:1;28273:9;28269:17;28262:47;28326:131;28452:4;28326:131;:::i;:::-;28318:139;;28216:248;;;:::o;28470:419::-;28636:4;28674:2;28663:9;28659:18;28651:26;;28723:9;28717:4;28713:20;28709:1;28698:9;28694:17;28687:47;28751:131;28877:4;28751:131;:::i;:::-;28743:139;;28641:248;;;:::o;28895:419::-;29061:4;29099:2;29088:9;29084:18;29076:26;;29148:9;29142:4;29138:20;29134:1;29123:9;29119:17;29112:47;29176:131;29302:4;29176:131;:::i;:::-;29168:139;;29066:248;;;:::o;29320:419::-;29486:4;29524:2;29513:9;29509:18;29501:26;;29573:9;29567:4;29563:20;29559:1;29548:9;29544:17;29537:47;29601:131;29727:4;29601:131;:::i;:::-;29593:139;;29491:248;;;:::o;29745:419::-;29911:4;29949:2;29938:9;29934:18;29926:26;;29998:9;29992:4;29988:20;29984:1;29973:9;29969:17;29962:47;30026:131;30152:4;30026:131;:::i;:::-;30018:139;;29916:248;;;:::o;30170:419::-;30336:4;30374:2;30363:9;30359:18;30351:26;;30423:9;30417:4;30413:20;30409:1;30398:9;30394:17;30387:47;30451:131;30577:4;30451:131;:::i;:::-;30443:139;;30341:248;;;:::o;30595:419::-;30761:4;30799:2;30788:9;30784:18;30776:26;;30848:9;30842:4;30838:20;30834:1;30823:9;30819:17;30812:47;30876:131;31002:4;30876:131;:::i;:::-;30868:139;;30766:248;;;:::o;31020:419::-;31186:4;31224:2;31213:9;31209:18;31201:26;;31273:9;31267:4;31263:20;31259:1;31248:9;31244:17;31237:47;31301:131;31427:4;31301:131;:::i;:::-;31293:139;;31191:248;;;:::o;31445:419::-;31611:4;31649:2;31638:9;31634:18;31626:26;;31698:9;31692:4;31688:20;31684:1;31673:9;31669:17;31662:47;31726:131;31852:4;31726:131;:::i;:::-;31718:139;;31616:248;;;:::o;31870:419::-;32036:4;32074:2;32063:9;32059:18;32051:26;;32123:9;32117:4;32113:20;32109:1;32098:9;32094:17;32087:47;32151:131;32277:4;32151:131;:::i;:::-;32143:139;;32041:248;;;:::o;32295:419::-;32461:4;32499:2;32488:9;32484:18;32476:26;;32548:9;32542:4;32538:20;32534:1;32523:9;32519:17;32512:47;32576:131;32702:4;32576:131;:::i;:::-;32568:139;;32466:248;;;:::o;32720:419::-;32886:4;32924:2;32913:9;32909:18;32901:26;;32973:9;32967:4;32963:20;32959:1;32948:9;32944:17;32937:47;33001:131;33127:4;33001:131;:::i;:::-;32993:139;;32891:248;;;:::o;33145:419::-;33311:4;33349:2;33338:9;33334:18;33326:26;;33398:9;33392:4;33388:20;33384:1;33373:9;33369:17;33362:47;33426:131;33552:4;33426:131;:::i;:::-;33418:139;;33316:248;;;:::o;33570:419::-;33736:4;33774:2;33763:9;33759:18;33751:26;;33823:9;33817:4;33813:20;33809:1;33798:9;33794:17;33787:47;33851:131;33977:4;33851:131;:::i;:::-;33843:139;;33741:248;;;:::o;33995:419::-;34161:4;34199:2;34188:9;34184:18;34176:26;;34248:9;34242:4;34238:20;34234:1;34223:9;34219:17;34212:47;34276:131;34402:4;34276:131;:::i;:::-;34268:139;;34166:248;;;:::o;34420:419::-;34586:4;34624:2;34613:9;34609:18;34601:26;;34673:9;34667:4;34663:20;34659:1;34648:9;34644:17;34637:47;34701:131;34827:4;34701:131;:::i;:::-;34693:139;;34591:248;;;:::o;34845:419::-;35011:4;35049:2;35038:9;35034:18;35026:26;;35098:9;35092:4;35088:20;35084:1;35073:9;35069:17;35062:47;35126:131;35252:4;35126:131;:::i;:::-;35118:139;;35016:248;;;:::o;35270:419::-;35436:4;35474:2;35463:9;35459:18;35451:26;;35523:9;35517:4;35513:20;35509:1;35498:9;35494:17;35487:47;35551:131;35677:4;35551:131;:::i;:::-;35543:139;;35441:248;;;:::o;35695:419::-;35861:4;35899:2;35888:9;35884:18;35876:26;;35948:9;35942:4;35938:20;35934:1;35923:9;35919:17;35912:47;35976:131;36102:4;35976:131;:::i;:::-;35968:139;;35866:248;;;:::o;36120:419::-;36286:4;36324:2;36313:9;36309:18;36301:26;;36373:9;36367:4;36363:20;36359:1;36348:9;36344:17;36337:47;36401:131;36527:4;36401:131;:::i;:::-;36393:139;;36291:248;;;:::o;36545:419::-;36711:4;36749:2;36738:9;36734:18;36726:26;;36798:9;36792:4;36788:20;36784:1;36773:9;36769:17;36762:47;36826:131;36952:4;36826:131;:::i;:::-;36818:139;;36716:248;;;:::o;36970:419::-;37136:4;37174:2;37163:9;37159:18;37151:26;;37223:9;37217:4;37213:20;37209:1;37198:9;37194:17;37187:47;37251:131;37377:4;37251:131;:::i;:::-;37243:139;;37141:248;;;:::o;37395:419::-;37561:4;37599:2;37588:9;37584:18;37576:26;;37648:9;37642:4;37638:20;37634:1;37623:9;37619:17;37612:47;37676:131;37802:4;37676:131;:::i;:::-;37668:139;;37566:248;;;:::o;37820:222::-;37913:4;37951:2;37940:9;37936:18;37928:26;;37964:71;38032:1;38021:9;38017:17;38008:6;37964:71;:::i;:::-;37918:124;;;;:::o;38048:129::-;38082:6;38109:20;;:::i;:::-;38099:30;;38138:33;38166:4;38158:6;38138:33;:::i;:::-;38089:88;;;:::o;38183:75::-;38216:6;38249:2;38243:9;38233:19;;38223:35;:::o;38264:311::-;38341:4;38431:18;38423:6;38420:30;38417:2;;;38453:18;;:::i;:::-;38417:2;38503:4;38495:6;38491:17;38483:25;;38563:4;38557;38553:15;38545:23;;38346:229;;;:::o;38581:311::-;38658:4;38748:18;38740:6;38737:30;38734:2;;;38770:18;;:::i;:::-;38734:2;38820:4;38812:6;38808:17;38800:25;;38880:4;38874;38870:15;38862:23;;38663:229;;;:::o;38898:307::-;38959:4;39049:18;39041:6;39038:30;39035:2;;;39071:18;;:::i;:::-;39035:2;39109:29;39131:6;39109:29;:::i;:::-;39101:37;;39193:4;39187;39183:15;39175:23;;38964:241;;;:::o;39211:308::-;39273:4;39363:18;39355:6;39352:30;39349:2;;;39385:18;;:::i;:::-;39349:2;39423:29;39445:6;39423:29;:::i;:::-;39415:37;;39507:4;39501;39497:15;39489:23;;39278:241;;;:::o;39525:141::-;39574:4;39597:3;39589:11;;39620:3;39617:1;39610:14;39654:4;39651:1;39641:18;39633:26;;39579:87;;;:::o;39672:98::-;39723:6;39757:5;39751:12;39741:22;;39730:40;;;:::o;39776:99::-;39828:6;39862:5;39856:12;39846:22;;39835:40;;;:::o;39881:168::-;39964:11;39998:6;39993:3;39986:19;40038:4;40033:3;40029:14;40014:29;;39976:73;;;;:::o;40055:169::-;40139:11;40173:6;40168:3;40161:19;40213:4;40208:3;40204:14;40189:29;;40151:73;;;;:::o;40230:148::-;40332:11;40369:3;40354:18;;40344:34;;;;:::o;40384:305::-;40424:3;40443:20;40461:1;40443:20;:::i;:::-;40438:25;;40477:20;40495:1;40477:20;:::i;:::-;40472:25;;40631:1;40563:66;40559:74;40556:1;40553:81;40550:2;;;40637:18;;:::i;:::-;40550:2;40681:1;40678;40674:9;40667:16;;40428:261;;;;:::o;40695:185::-;40735:1;40752:20;40770:1;40752:20;:::i;:::-;40747:25;;40786:20;40804:1;40786:20;:::i;:::-;40781:25;;40825:1;40815:2;;40830:18;;:::i;:::-;40815:2;40872:1;40869;40865:9;40860:14;;40737:143;;;;:::o;40886:348::-;40926:7;40949:20;40967:1;40949:20;:::i;:::-;40944:25;;40983:20;41001:1;40983:20;:::i;:::-;40978:25;;41171:1;41103:66;41099:74;41096:1;41093:81;41088:1;41081:9;41074:17;41070:105;41067:2;;;41178:18;;:::i;:::-;41067:2;41226:1;41223;41219:9;41208:20;;40934:300;;;;:::o;41240:191::-;41280:4;41300:20;41318:1;41300:20;:::i;:::-;41295:25;;41334:20;41352:1;41334:20;:::i;:::-;41329:25;;41373:1;41370;41367:8;41364:2;;;41378:18;;:::i;:::-;41364:2;41423:1;41420;41416:9;41408:17;;41285:146;;;;:::o;41437:96::-;41474:7;41503:24;41521:5;41503:24;:::i;:::-;41492:35;;41482:51;;;:::o;41539:90::-;41573:7;41616:5;41609:13;41602:21;41591:32;;41581:48;;;:::o;41635:77::-;41672:7;41701:5;41690:16;;41680:32;;;:::o;41718:149::-;41754:7;41794:66;41787:5;41783:78;41772:89;;41762:105;;;:::o;41873:126::-;41910:7;41950:42;41943:5;41939:54;41928:65;;41918:81;;;:::o;42005:77::-;42042:7;42071:5;42060:16;;42050:32;;;:::o;42088:154::-;42172:6;42167:3;42162;42149:30;42234:1;42225:6;42220:3;42216:16;42209:27;42139:103;;;:::o;42248:307::-;42316:1;42326:113;42340:6;42337:1;42334:13;42326:113;;;42425:1;42420:3;42416:11;42410:18;42406:1;42401:3;42397:11;42390:39;42362:2;42359:1;42355:10;42350:15;;42326:113;;;42457:6;42454:1;42451:13;42448:2;;;42537:1;42528:6;42523:3;42519:16;42512:27;42448:2;42297:258;;;;:::o;42561:320::-;42605:6;42642:1;42636:4;42632:12;42622:22;;42689:1;42683:4;42679:12;42710:18;42700:2;;42766:4;42758:6;42754:17;42744:27;;42700:2;42828;42820:6;42817:14;42797:18;42794:38;42791:2;;;42847:18;;:::i;:::-;42791:2;42612:269;;;;:::o;42887:281::-;42970:27;42992:4;42970:27;:::i;:::-;42962:6;42958:40;43100:6;43088:10;43085:22;43064:18;43052:10;43049:34;43046:62;43043:2;;;43111:18;;:::i;:::-;43043:2;43151:10;43147:2;43140:22;42930:238;;;:::o;43174:233::-;43213:3;43236:24;43254:5;43236:24;:::i;:::-;43227:33;;43282:66;43275:5;43272:77;43269:2;;;43352:18;;:::i;:::-;43269:2;43399:1;43392:5;43388:13;43381:20;;43217:190;;;:::o;43413:100::-;43452:7;43481:26;43501:5;43481:26;:::i;:::-;43470:37;;43460:53;;;:::o;43519:79::-;43558:7;43587:5;43576:16;;43566:32;;;:::o;43604:94::-;43643:7;43672:20;43686:5;43672:20;:::i;:::-;43661:31;;43651:47;;;:::o;43704:176::-;43736:1;43753:20;43771:1;43753:20;:::i;:::-;43748:25;;43787:20;43805:1;43787:20;:::i;:::-;43782:25;;43826:1;43816:2;;43831:18;;:::i;:::-;43816:2;43872:1;43869;43865:9;43860:14;;43738:142;;;;:::o;43886:180::-;43934:77;43931:1;43924:88;44031:4;44028:1;44021:15;44055:4;44052:1;44045:15;44072:180;44120:77;44117:1;44110:88;44217:4;44214:1;44207:15;44241:4;44238:1;44231:15;44258:180;44306:77;44303:1;44296:88;44403:4;44400:1;44393:15;44427:4;44424:1;44417:15;44444:180;44492:77;44489:1;44482:88;44589:4;44586:1;44579:15;44613:4;44610:1;44603:15;44630:102;44671:6;44722:2;44718:7;44713:2;44706:5;44702:14;44698:28;44688:38;;44678:54;;;:::o;44738:94::-;44771:8;44819:5;44815:2;44811:14;44790:35;;44780:52;;;:::o;44838:182::-;44978:34;44974:1;44966:6;44962:14;44955:58;44944:76;:::o;45026:170::-;45166:22;45162:1;45154:6;45150:14;45143:46;45132:64;:::o;45202:230::-;45342:34;45338:1;45330:6;45326:14;45319:58;45411:13;45406:2;45398:6;45394:15;45387:38;45308:124;:::o;45438:237::-;45578:34;45574:1;45566:6;45562:14;45555:58;45647:20;45642:2;45634:6;45630:15;45623:45;45544:131;:::o;45681:225::-;45821:34;45817:1;45809:6;45805:14;45798:58;45890:8;45885:2;45877:6;45873:15;45866:33;45787:119;:::o;45912:178::-;46052:30;46048:1;46040:6;46036:14;46029:54;46018:72;:::o;46096:174::-;46236:26;46232:1;46224:6;46220:14;46213:50;46202:68;:::o;46276:223::-;46416:34;46412:1;46404:6;46400:14;46393:58;46485:6;46480:2;46472:6;46468:15;46461:31;46382:117;:::o;46505:175::-;46645:27;46641:1;46633:6;46629:14;46622:51;46611:69;:::o;46686:231::-;46826:34;46822:1;46814:6;46810:14;46803:58;46895:14;46890:2;46882:6;46878:15;46871:39;46792:125;:::o;46923:166::-;47063:18;47059:1;47051:6;47047:14;47040:42;47029:60;:::o;47095:243::-;47235:34;47231:1;47223:6;47219:14;47212:58;47304:26;47299:2;47291:6;47287:15;47280:51;47201:137;:::o;47344:229::-;47484:34;47480:1;47472:6;47468:14;47461:58;47553:12;47548:2;47540:6;47536:15;47529:37;47450:123;:::o;47579:228::-;47719:34;47715:1;47707:6;47703:14;47696:58;47788:11;47783:2;47775:6;47771:15;47764:36;47685:122;:::o;47813:234::-;47953:34;47949:1;47941:6;47937:14;47930:58;48022:17;48017:2;48009:6;48005:15;47998:42;47919:128;:::o;48053:182::-;48193:34;48189:1;48181:6;48177:14;48170:58;48159:76;:::o;48241:231::-;48381:34;48377:1;48369:6;48365:14;48358:58;48450:14;48445:2;48437:6;48433:15;48426:39;48347:125;:::o;48478:182::-;48618:34;48614:1;48606:6;48602:14;48595:58;48584:76;:::o;48666:228::-;48806:34;48802:1;48794:6;48790:14;48783:58;48875:11;48870:2;48862:6;48858:15;48851:36;48772:122;:::o;48900:234::-;49040:34;49036:1;49028:6;49024:14;49017:58;49109:17;49104:2;49096:6;49092:15;49085:42;49006:128;:::o;49140:221::-;49280:34;49276:1;49268:6;49264:14;49257:58;49349:4;49344:2;49336:6;49332:15;49325:29;49246:115;:::o;49367:220::-;49507:34;49503:1;49495:6;49491:14;49484:58;49576:3;49571:2;49563:6;49559:15;49552:28;49473:114;:::o;49593:168::-;49733:20;49729:1;49721:6;49717:14;49710:44;49699:62;:::o;49767:232::-;49907:34;49903:1;49895:6;49891:14;49884:58;49976:15;49971:2;49963:6;49959:15;49952:40;49873:126;:::o;50005:236::-;50145:34;50141:1;50133:6;50129:14;50122:58;50214:19;50209:2;50201:6;50197:15;50190:44;50111:130;:::o;50247:231::-;50387:34;50383:1;50375:6;50371:14;50364:58;50456:14;50451:2;50443:6;50439:15;50432:39;50353:125;:::o;50484:182::-;50624:34;50620:1;50612:6;50608:14;50601:58;50590:76;:::o;50672:181::-;50812:33;50808:1;50800:6;50796:14;50789:57;50778:75;:::o;50859:122::-;50932:24;50950:5;50932:24;:::i;:::-;50925:5;50922:35;50912:2;;50971:1;50968;50961:12;50912:2;50902:79;:::o;50987:116::-;51057:21;51072:5;51057:21;:::i;:::-;51050:5;51047:32;51037:2;;51093:1;51090;51083:12;51037:2;51027:76;:::o;51109:122::-;51182:24;51200:5;51182:24;:::i;:::-;51175:5;51172:35;51162:2;;51221:1;51218;51211:12;51162:2;51152:79;:::o;51237:120::-;51309:23;51326:5;51309:23;:::i;:::-;51302:5;51299:34;51289:2;;51347:1;51344;51337:12;51289:2;51279:78;:::o;51363:122::-;51436:24;51454:5;51436:24;:::i;:::-;51429:5;51426:35;51416:2;;51475:1;51472;51465:12;51416:2;51406:79;:::o

Swarm Source

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