ETH Price: $2,371.10 (-3.44%)

Token

MCP_NFT (MCP_NFT)
 

Overview

Max Total Supply

70 MCP_NFT

Holders

70

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
yusheng.eth
Balance
1 MCP_NFT
0xa97276772e9A8D5408421D60c2749C68c2e2fC3a
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:
NFTTemplateManager

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-09
*/

/**
 *Submitted for verification at Etherscan.io on 2021-09-20
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @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 MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);

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

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

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

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

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

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

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

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

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**
 * @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}.
     */
     /*
        bytes4(keccak256('supportsInterface(bytes4)'));
    */
    bytes4 constant private INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7;
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == INTERFACE_SIGNATURE_ERC165;
    }
}

/**
 * @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}.
 */
abstract contract ERC721 is ERC165, IERC721, IERC721Metadata {
    using Address for address;
    //using Strings for uint256;
    // Token name
    string internal _name;

    // Token symbol
    string internal _symbol;

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

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

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

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

    /**
     * @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 {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(msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "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 {
        require(operator != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, 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(msg.sender, 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(msg.sender, 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 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 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)
        internal returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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;
    mapping (address => bool) private _managers;
    mapping (address => bool) private _minters;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    // event AddManager(address indexed manager);
    // event RemoveManager(address indexed manager);
    // event AddMinter(address indexed minter);
    // event RemoveMinter(address indexed minter);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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");
        _;
    }
    
    modifier onlyManager() {
        require((_owner == _msgSender()) || _managers[_msgSender()], "Ownable: caller is not owner/manager");
        _;
    }
    
    function addManager(address manager) public onlyOwner {
        _managers[manager]=true;
        // emit AddManager(manager);
    }
    
    function removeManager(address manager) public onlyOwner {
        _managers[manager]=false;
        // emit RemoveManager(manager);
    }
    
    modifier onlyMinter() {
        require((_owner == _msgSender()) || _minters[_msgSender()], "Ownable: caller is not owner/minter");
        _;
    }
    
    function addMinter(address minter) public onlyOwner {
        _minters[minter]=true;
        // emit AddMinter(minter);
    }
    
    function removeMinter(address minter) public onlyOwner {
        _minters[minter]=false;
        // emit RemoveMinter(minter);
    }

    /**
     * @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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


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


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];
    }
    
     function tokenOfOwnerTotal(address owner) public view returns (uint256[] memory _ids) {
        uint256 number = ERC721.balanceOf(owner);
        uint256[] memory K = new uint256[](number);
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < number; ++i) {
            K[i] = _ownedTokens[owner][i];
        }
        
        return K;
    }

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


contract NFTTemplateManager is ERC721Enumerable ,Ownable {
    //using SafeMath for uint256;
    
    // IERC20 public ticketAddress;
    // IERC1155 public ERC1155Address;
    using SafeMath for uint256;
    using Address for address;
    
    string public _baseUri;
    mapping(uint256 => string) public _uriTemplate; // templateId => string
    mapping(uint256 => uint256) public _tokenUris; // tokenId => templateId
    mapping(uint256 => mapping (bytes32 => uint256)) internal NFTConfig;
    
    constructor (string memory name_, string memory symbol_, string memory baseUri_) {
        _name = name_;
        _symbol = symbol_;
        _baseUri = baseUri_;
    }
    
    function tokenURI(uint256 _id) external view override returns (string memory) {
        require(_exists(_id), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseUri, _uriTemplate[_tokenUris[_id]]));
    }
    
    function safeMint(uint256 _id, address _to, uint256 _uriTemplateId) public onlyMinter {
        require(_to != address(0), "ERC721: mint to the zero address");
        require(!_exists(_id), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), _to, _id);

        _balances[_to] += 1;
        _owners[_id] = _to;
        _tokenUris[_id] = _uriTemplateId;

        emit Transfer(address(0), _to, _id);
        
        if (_to.isContract()) {
            require(_checkOnERC721Received(address(0), _to, _id, ''), "ERC721: transfer to non ERC721Receiver implementer");
        }
    }
    
    // Batch mint tokens. Assign directly to _to[].
    function safeBatchMint(uint256[] calldata _id, address[] calldata _to, uint256 _uriTemplateId) external onlyMinter {
        require(_id.length == _to.length, "_ids and _to array length must match.");
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _to.length; ++i) {
            
            address to = _to[i];
            uint256 id = _id[i];
            
            safeMint(id, to, _uriTemplateId);
        }
    }
    
    //mint tokens. Assign directly to _to[].
    function safeMultipleBatchMint(uint256[] calldata _id, address[] calldata _to, uint256[] calldata _uriTemplateId) external onlyMinter {
        require(_id.length == _to.length, "_ids and _to array length must match.");
        require(_id.length == _uriTemplateId.length, "_ids and _uri array length must match.");
        for (uint256 i = 0; i < _to.length; ++i) {

            address to = _to[i];
            uint256 id = _id[i];
            uint256 uri = _uriTemplateId[i];
            
            safeMint(id, to, uri);
        }
    }
    
    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeBatchTransferFrom(address _from, address[] calldata _to, uint256[] calldata _tokenId) external {
        require(_to.length == _tokenId.length, "_to and _tokenId array length must match.");
        for (uint256 i = 0; i < _to.length; ++i) {
            address to = _to[i];
            uint256 tokenId = _tokenId[i];
            safeTransferFrom(_from, to, tokenId, "");
        }
    }
    
    function setBaseUri(string calldata newuri) external onlyOwner {
        _baseUri = newuri;
    }
    
    function setTemplateUri(uint256 templateId, string calldata uri) public {
        _uriTemplate[templateId] = uri;
        emit URI(uri, templateId);
    }
    
    function setMultipleTemplateUri(uint256[] calldata templateId, string[] calldata uri) external onlyOwner {
        for (uint256 i = 0; i < templateId.length; ++i) {
            _uriTemplate[templateId[i]] = uri[i];
            emit URI(uri[i], templateId[i]);
        }
    }

    function assignTokenTemplate(uint256 _id, uint256 _templateId) external onlyOwner {
        _tokenUris[_id] = _templateId;
    }
    
    function assignMultipleTokenTemplate(uint256[] calldata _id, uint256[] calldata _templateId) external onlyOwner {
        for (uint256 i = 0; i < _templateId.length; ++i) {
            _tokenUris[_id[i]] = _templateId[i];
        }
    }
    
    function queryMultipleTokenTemplate(uint256[] calldata _templateId) external view returns(string[] memory){
        string[] memory templateStrings = new string[](_templateId.length);
        for(uint256 n; n < _templateId.length; ++n){
            templateStrings[n] = _uriTemplate[_templateId[n]];
        }
        
        return templateStrings;
    }
    
    function setSingleProperty(bytes32 _property, uint256 _id, uint256 _value) external onlyManager {
        NFTConfig[_id][_property] = _value;
    }
    
    function setMultipleProperty(bytes32 _property, uint256[] calldata _id, uint256[] calldata _value) external onlyManager {
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            NFTConfig[_id[i]][_property] = _value[i];
        }
    }
    
    function setBatchProperty(bytes32[] calldata _property, uint256[] calldata _id, uint256[] calldata _value) external onlyManager {
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            NFTConfig[_id[i]][_property[i]] = _value[i];
        }
    }
    
    function getSingleProperty(bytes32 _property, uint256 _id) public view returns (uint256 _value) {
        return NFTConfig[_id][_property];
    }
    
    function getMultipleProperty(bytes32 _property, uint256[] calldata _id) public view returns (uint256[] memory _value) {
        uint256[] memory K = new uint256[](_id.length);
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            K[i] = NFTConfig[_id[i]][_property];
        }
        
        return K;
    }
    
    function getBatchProperty(bytes32[] calldata _property, uint256[] calldata _id) public view returns (uint256[] memory _value) {
        uint256[] memory K = new uint256[](_id.length);
        //require(msg.sender == creators[_id]);
        for (uint256 i = 0; i < _id.length; ++i) {
            K[i] = NFTConfig[_id[i]][_property[i]];
        }
        
        return K;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseUri_","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":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":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"_baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenUris","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_uriTemplate","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"uint256[]","name":"_templateId","type":"uint256[]"}],"name":"assignMultipleTokenTemplate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_templateId","type":"uint256"}],"name":"assignTokenTemplate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_property","type":"bytes32[]"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"getBatchProperty","outputs":[{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"getMultipleProperty","outputs":[{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getSingleProperty","outputs":[{"internalType":"uint256","name":"_value","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_templateId","type":"uint256[]"}],"name":"queryMultipleTokenTemplate","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256","name":"_uriTemplateId","type":"uint256"}],"name":"safeBatchMint","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":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_uriTemplateId","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_uriTemplateId","type":"uint256[]"}],"name":"safeMultipleBatchMint","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":"newuri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_property","type":"bytes32[]"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"name":"setBatchProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"},{"internalType":"uint256[]","name":"_value","type":"uint256[]"}],"name":"setMultipleProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"templateId","type":"uint256[]"},{"internalType":"string[]","name":"uri","type":"string[]"}],"name":"setMultipleTemplateUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_property","type":"bytes32"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setSingleProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"templateId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTemplateUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokenOfOwnerTotal","outputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200617538038062006175833981810160405281019062000037919062000272565b6000620000496200013c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082600090805190602001906200010092919062000144565b5081600190805190602001906200011992919062000144565b5080600d90805190602001906200013292919062000144565b50505050620004af565b600033905090565b8280546200015290620003c0565b90600052602060002090601f016020900481019282620001765760008555620001c2565b82601f106200019157805160ff1916838001178555620001c2565b82800160010185558215620001c2579182015b82811115620001c1578251825591602001919060010190620001a4565b5b509050620001d19190620001d5565b5090565b5b80821115620001f0576000816000905550600101620001d6565b5090565b60006200020b620002058462000354565b6200032b565b9050828152602081018484840111156200022a57620002296200048f565b5b620002378482856200038a565b509392505050565b600082601f8301126200025757620002566200048a565b5b815162000269848260208601620001f4565b91505092915050565b6000806000606084860312156200028e576200028d62000499565b5b600084015167ffffffffffffffff811115620002af57620002ae62000494565b5b620002bd868287016200023f565b935050602084015167ffffffffffffffff811115620002e157620002e062000494565b5b620002ef868287016200023f565b925050604084015167ffffffffffffffff81111562000313576200031262000494565b5b62000321868287016200023f565b9150509250925092565b6000620003376200034a565b9050620003458282620003f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156200037257620003716200045b565b5b6200037d826200049e565b9050602081019050919050565b60005b83811015620003aa5780820151818401526020810190506200038d565b83811115620003ba576000848401525b50505050565b60006002820490506001821680620003d957607f821691505b60208210811415620003f057620003ef6200042c565b5b50919050565b62000401826200049e565b810181811067ffffffffffffffff821117156200042357620004226200045b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615cb680620004bf6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063715018a611610151578063c15c3196116100c3578063e985e9c511610087578063e985e9c51461073a578063ec4db2831461076a578063edd864e51461079a578063f2fde38b146107ca578063f56d504f146107e6578063fb570bbf1461081657610269565b8063c15c31961461069a578063c87b56dd146106b6578063d9965572146106e6578063dc85123014610702578063e2f4030d1461071e57610269565b80639c26eb3f116101155780639c26eb3f146105f2578063a0bcfc7f1461060e578063a22cb4651461062a578063a2deefcc14610646578063ac18de4314610662578063b88d4fde1461067e57610269565b8063715018a6146105745780638da5cb5b1461057e5780639034edb51461059c57806395d89b41146105b8578063983b2d56146105d657610269565b80632d06177a116101ea57806342842e0e116101ae57806342842e0e146104905780634f6ccce7146104ac5780635ca45dd7146104dc5780635dd2ccb3146104f85780636352211e1461051457806370a082311461054457610269565b80632d06177a146103da5780632f745c59146103f65780633092afd514610426578063324e4410146104425780633e63eb2a1461047257610269565b80630b599c09116102315780630b599c091461033857806318160ddd146103545780631ee58f9714610372578063234d4386146103a257806323b872dd146103be57610269565b806301ffc9a71461026e578063052641da1461029e57806306fdde03146102ce578063081812fc146102ec578063095ea7b31461031c575b600080fd5b61028860048036038101906102839190614530565b610846565b6040516102959190614d7d565b60405180910390f35b6102b860048036038101906102b391906143a8565b6108c0565b6040516102c59190614d5b565b60405180910390f35b6102d661099a565b6040516102e39190614dbc565b60405180910390f35b610306600480360381019061030191906145d7565b610a2c565b6040516103139190614cd2565b60405180910390f35b61033660048036038101906103319190613f9b565b610ab1565b005b610352600480360381019061034d9190614657565b610bbb565b005b61035c610c1d565b60405161036991906150be565b60405180910390f35b61038c600480360381019061038791906145d7565b610c2a565b60405161039991906150be565b60405180910390f35b6103bc60048036038101906103b79190613ec6565b610c42565b005b6103d860048036038101906103d39190613df0565b610d18565b005b6103f460048036038101906103ef9190613d83565b610d71565b005b610410600480360381019061040b9190613f9b565b610e63565b60405161041d91906150be565b60405180910390f35b610440600480360381019061043b9190613d83565b610f08565b005b61045c600480360381019061045791906145d7565b610ffa565b6040516104699190614dbc565b60405180910390f35b61047a61109a565b6040516104879190614dbc565b60405180910390f35b6104aa60048036038101906104a59190613df0565b611128565b005b6104c660048036038101906104c191906145d7565b611148565b6040516104d391906150be565b60405180910390f35b6104f660048036038101906104f191906146b7565b6111b9565b005b610512600480360381019061050d9190614327565b61126c565b005b61052e600480360381019061052991906145d7565b611373565b60405161053b9190614cd2565b60405180910390f35b61055e60048036038101906105599190613d83565b611425565b60405161056b91906150be565b60405180910390f35b61057c6114dd565b005b610586611635565b6040516105939190614cd2565b60405180910390f35b6105b660048036038101906105b1919061405c565b61165f565b005b6105c06117ed565b6040516105cd9190614dbc565b60405180910390f35b6105f060048036038101906105eb9190613d83565b61187f565b005b61060c60048036038101906106079190614408565b611971565b005b6106286004803603810190610623919061458a565b611ae5565b005b610644600480360381019061063f9190613f5b565b611b92565b005b610660600480360381019061065b919061415d565b611cfe565b005b61067c60048036038101906106779190613d83565b611f1e565b005b61069860048036038101906106939190613e43565b612010565b005b6106b460048036038101906106af9190614211565b61206b565b005b6106d060048036038101906106cb91906145d7565b612223565b6040516106dd9190614dbc565b60405180910390f35b61070060048036038101906106fb91906144dd565b6122bc565b005b61071c600480360381019061071791906142a6565b6123dc565b005b61073860048036038101906107339190614604565b61256e565b005b610754600480360381019061074f9190613db0565b6128c7565b6040516107619190614d7d565b60405180910390f35b610784600480360381019061077f919061449d565b61295b565b60405161079191906150be565b60405180910390f35b6107b460048036038101906107af9190614110565b61298a565b6040516107c19190614d39565b60405180910390f35b6107e460048036038101906107df9190613d83565b612ade565b005b61080060048036038101906107fb9190613fdb565b612ca5565b60405161080d9190614d5b565b60405180910390f35b610830600480360381019061082b9190613d83565b612d99565b60405161083d9190614d5b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b957506108b882612e8c565b5b9050919050565b606060008383905067ffffffffffffffff8111156108e1576108e061551f565b5b60405190808252806020026020018201604052801561090f5781602001602082028036833780820191505090505b50905060005b8484905081101561098e5760106000868684818110610937576109366154f0565b5b905060200201358152602001908152602001600020600087815260200190815260200160002054828281518110610971576109706154f0565b5b602002602001018181525050806109879061541a565b9050610915565b50809150509392505050565b6060600080546109a9906153b7565b80601f01602080910402602001604051908101604052809291908181526020018280546109d5906153b7565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b6000610a3782612f6e565b610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90614f9e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abc82611373565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b249061501e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6d5750610b6c81336128c7565b5b610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390614ede565b60405180910390fd5b610bb68383612fda565b505050565b8181600e60008681526020019081526020016000209190610bdd929190613a44565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8383604051610c10929190614d98565b60405180910390a2505050565b6000600880549050905090565b600f6020528060005260406000206000915090505481565b818190508484905014610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614e7e565b60405180910390fd5b60005b84849050811015610d10576000858583818110610cad57610cac6154f0565b5b9050602002016020810190610cc29190613d83565b90506000848484818110610cd957610cd86154f0565b5b905060200201359050610cfd88838360405180602001604052806000815250612010565b505080610d099061541a565b9050610c8d565b505050505050565b610d223382613093565b610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061505e565b60405180910390fd5b610d6c838383613171565b505050565b610d796133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90614fbe565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000610e6e83611425565b8210610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614dde565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f106133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614fbe565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600e6020528060005260406000206000915090508054611019906153b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611045906153b7565b80156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b505050505081565b600d80546110a7906153b7565b80601f01602080910402602001604051908101604052809291908181526020018280546110d3906153b7565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b505050505081565b61114383838360405180602001604052806000815250612010565b505050565b6000611152610c1d565b8210611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a9061507e565b60405180910390fd5b600882815481106111a7576111a66154f0565b5b90600052602060002001549050919050565b6111c16133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124790614fbe565b60405180910390fd5b80600f6000848152602001908152602001600020819055505050565b6112746133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90614fbe565b60405180910390fd5b60005b8282905081101561136c57828282818110611324576113236154f0565b5b90506020020135600f6000878785818110611342576113416154f0565b5b90506020020135815260200190815260200160002081905550806113659061541a565b9050611306565b5050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141390614f1e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90614efe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e56133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b90614fbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116676133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806117125750600b60006116c96133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890614f5e565b60405180910390fd5b60005b848490508110156117e457828282818110611772576117716154f0565b5b90506020020135601060008787858181106117905761178f6154f0565b5b90506020020135815260200190815260200160002060008989858181106117ba576117b96154f0565b5b90506020020135815260200190815260200160002081905550806117dd9061541a565b9050611754565b50505050505050565b6060600180546117fc906153b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611828906153b7565b80156118755780601f1061184a57610100808354040283529160200191611875565b820191906000526020600020905b81548152906001019060200180831161185857829003601f168201915b5050505050905090565b6118876133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614fbe565b60405180910390fd5b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6119796133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a245750600b60006119db6133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90614f5e565b60405180910390fd5b60005b84849050811015611add57828282818110611a8457611a836154f0565b5b9050602002013560106000878785818110611aa257611aa16154f0565b5b90506020020135815260200190815260200160002060008881526020019081526020016000208190555080611ad69061541a565b9050611a66565b505050505050565b611aed6133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390614fbe565b60405180910390fd5b8181600d9190611b8d929190613a44565b505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614e9e565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cf29190614d7d565b60405180910390a35050565b611d066133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611db15750600c6000611d686133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de79061509e565b60405180910390fd5b838390508686905014611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90614f3e565b60405180910390fd5b818190508686905014611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e779061503e565b60405180910390fd5b60005b84849050811015611f15576000858583818110611ea357611ea26154f0565b5b9050602002016020810190611eb89190613d83565b90506000888884818110611ecf57611ece6154f0565b5b9050602002013590506000858585818110611eed57611eec6154f0565b5b905060200201359050611f0182848361256e565b50505080611f0e9061541a565b9050611e83565b50505050505050565b611f266133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fac90614fbe565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61201a3383613093565b612059576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120509061505e565b60405180910390fd5b612065848484846133d5565b50505050565b6120736133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061211e5750600c60006120d56133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61215d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121549061509e565b60405180910390fd5b8282905085859050146121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90614f3e565b60405180910390fd5b60005b8383905081101561221b5760008484838181106121c8576121c76154f0565b5b90506020020160208101906121dd9190613d83565b905060008787848181106121f4576121f36154f0565b5b90506020020135905061220881838661256e565b5050806122149061541a565b90506121a8565b505050505050565b606061222e82612f6e565b61226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614ffe565b60405180910390fd5b600d600e6000600f60008681526020019081526020016000205481526020019081526020016000206040516020016122a6929190614cae565b6040516020818303038152906040529050919050565b6122c46133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061236f5750600b60006123266133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a590614f5e565b60405180910390fd5b8060106000848152602001908152602001600020600085815260200190815260200160002081905550505050565b6123e46133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246a90614fbe565b60405180910390fd5b60005b8484905081101561256757828282818110612494576124936154f0565b5b90506020028101906124a691906150d9565b600e60008888868181106124bd576124bc6154f0565b5b90506020020135815260200190815260200160002091906124df929190613a44565b508484828181106124f3576124f26154f0565b5b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b84848481811061252e5761252d6154f0565b5b905060200281019061254091906150d9565b60405161254e929190614d98565b60405180910390a2806125609061541a565b9050612476565b5050505050565b6125766133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806126215750600c60006125d86133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612660576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126579061509e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790614f7e565b60405180910390fd5b6126d983612f6e565b15612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614e3e565b60405180910390fd5b61272560008385613431565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612775919061526d565b92505081905550816002600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f600085815260200190815260200160002081905550828273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128618273ffffffffffffffffffffffffffffffffffffffff16613545565b156128c2576128826000838560405180602001604052806000815250613558565b6128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b890614dfe565b60405180910390fd5b5b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060106000838152602001908152602001600020600084815260200190815260200160002054905092915050565b606060008383905067ffffffffffffffff8111156129ab576129aa61551f565b5b6040519080825280602002602001820160405280156129de57816020015b60608152602001906001900390816129c95790505b50905060005b84849050811015612ad357600e6000868684818110612a0657612a056154f0565b5b9050602002013581526020019081526020016000208054612a26906153b7565b80601f0160208091040260200160405190810160405280929190818152602001828054612a52906153b7565b8015612a9f5780601f10612a7457610100808354040283529160200191612a9f565b820191906000526020600020905b815481529060010190602001808311612a8257829003601f168201915b5050505050828281518110612ab757612ab66154f0565b5b602002602001018190525080612acc9061541a565b90506129e4565b508091505092915050565b612ae66133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c90614fbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdc90614e1e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008383905067ffffffffffffffff811115612cc657612cc561551f565b5b604051908082528060200260200182016040528015612cf45781602001602082028036833780820191505090505b50905060005b84849050811015612d8c5760106000868684818110612d1c57612d1b6154f0565b5b9050602002013581526020019081526020016000206000888884818110612d4657612d456154f0565b5b90506020020135815260200190815260200160002054828281518110612d6f57612d6e6154f0565b5b60200260200101818152505080612d859061541a565b9050612cfa565b5080915050949350505050565b60606000612da683611425565b905060008167ffffffffffffffff811115612dc457612dc361551f565b5b604051908082528060200260200182016040528015612df25781602001602082028036833780820191505090505b50905060005b82811015612e8157600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054828281518110612e6457612e636154f0565b5b60200260200101818152505080612e7a9061541a565b9050612df8565b508092505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f5757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f675750612f66826136e8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661304d83611373565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061309e82612f6e565b6130dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d490614ebe565b60405180910390fd5b60006130e883611373565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061315757508373ffffffffffffffffffffffffffffffffffffffff1661313f84610a2c565b73ffffffffffffffffffffffffffffffffffffffff16145b80613168575061316781856128c7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661319182611373565b73ffffffffffffffffffffffffffffffffffffffff16146131e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131de90614fde565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324e90614e5e565b60405180910390fd5b613262838383613431565b61326d600082612fda565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132bd91906152c3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613314919061526d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600033905090565b6133e0848484613171565b6133ec84848484613558565b61342b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342290614dfe565b60405180910390fd5b50505050565b61343c838383613739565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561347f5761347a8161373e565b6134be565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134bd576134bc8382613787565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613501576134fc816138f4565b613540565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461353f5761353e82826139c5565b5b5b505050565b600080823b905060008111915050919050565b60006135798473ffffffffffffffffffffffffffffffffffffffff16613545565b156136db578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016135bd9493929190614ced565b602060405180830381600087803b1580156135d757600080fd5b505af192505050801561360857506040513d601f19601f82011682018060405250810190613605919061455d565b60015b61368b573d8060008114613638576040519150601f19603f3d011682016040523d82523d6000602084013e61363d565b606091505b50600081511415613683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367a90614dfe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136e0565b600190505b949350505050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161379484611425565b61379e91906152c3565b9050600060076000848152602001908152602001600020549050818114613883576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061390891906152c3565b9050600060096000848152602001908152602001600020549050600060088381548110613938576139376154f0565b5b90600052602060002001549050806008838154811061395a576139596154f0565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139a9576139a86154c1565b5b6001900381819060005260206000200160009055905550505050565b60006139d083611425565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613a50906153b7565b90600052602060002090601f016020900481019282613a725760008555613ab9565b82601f10613a8b57803560ff1916838001178555613ab9565b82800160010185558215613ab9579182015b82811115613ab8578235825591602001919060010190613a9d565b5b509050613ac69190613aca565b5090565b5b80821115613ae3576000816000905550600101613acb565b5090565b6000613afa613af584615161565b61513c565b905082815260208101848484011115613b1657613b1561556c565b5b613b21848285615375565b509392505050565b600081359050613b3881615c0d565b92915050565b60008083601f840112613b5457613b53615553565b5b8235905067ffffffffffffffff811115613b7157613b7061554e565b5b602083019150836020820283011115613b8d57613b8c615562565b5b9250929050565b60008083601f840112613baa57613ba9615553565b5b8235905067ffffffffffffffff811115613bc757613bc661554e565b5b602083019150836020820283011115613be357613be2615562565b5b9250929050565b60008083601f840112613c0057613bff615553565b5b8235905067ffffffffffffffff811115613c1d57613c1c61554e565b5b602083019150836020820283011115613c3957613c38615562565b5b9250929050565b60008083601f840112613c5657613c55615553565b5b8235905067ffffffffffffffff811115613c7357613c7261554e565b5b602083019150836020820283011115613c8f57613c8e615562565b5b9250929050565b600081359050613ca581615c24565b92915050565b600081359050613cba81615c3b565b92915050565b600081359050613ccf81615c52565b92915050565b600081519050613ce481615c52565b92915050565b600082601f830112613cff57613cfe615553565b5b8135613d0f848260208601613ae7565b91505092915050565b60008083601f840112613d2e57613d2d615553565b5b8235905067ffffffffffffffff811115613d4b57613d4a61554e565b5b602083019150836001820283011115613d6757613d66615562565b5b9250929050565b600081359050613d7d81615c69565b92915050565b600060208284031215613d9957613d98615576565b5b6000613da784828501613b29565b91505092915050565b60008060408385031215613dc757613dc6615576565b5b6000613dd585828601613b29565b9250506020613de685828601613b29565b9150509250929050565b600080600060608486031215613e0957613e08615576565b5b6000613e1786828701613b29565b9350506020613e2886828701613b29565b9250506040613e3986828701613d6e565b9150509250925092565b60008060008060808587031215613e5d57613e5c615576565b5b6000613e6b87828801613b29565b9450506020613e7c87828801613b29565b9350506040613e8d87828801613d6e565b925050606085013567ffffffffffffffff811115613eae57613ead615571565b5b613eba87828801613cea565b91505092959194509250565b600080600080600060608688031215613ee257613ee1615576565b5b6000613ef088828901613b29565b955050602086013567ffffffffffffffff811115613f1157613f10615571565b5b613f1d88828901613b3e565b9450945050604086013567ffffffffffffffff811115613f4057613f3f615571565b5b613f4c88828901613c40565b92509250509295509295909350565b60008060408385031215613f7257613f71615576565b5b6000613f8085828601613b29565b9250506020613f9185828601613c96565b9150509250929050565b60008060408385031215613fb257613fb1615576565b5b6000613fc085828601613b29565b9250506020613fd185828601613d6e565b9150509250929050565b60008060008060408587031215613ff557613ff4615576565b5b600085013567ffffffffffffffff81111561401357614012615571565b5b61401f87828801613b94565b9450945050602085013567ffffffffffffffff81111561404257614041615571565b5b61404e87828801613c40565b925092505092959194509250565b6000806000806000806060878903121561407957614078615576565b5b600087013567ffffffffffffffff81111561409757614096615571565b5b6140a389828a01613b94565b9650965050602087013567ffffffffffffffff8111156140c6576140c5615571565b5b6140d289828a01613c40565b9450945050604087013567ffffffffffffffff8111156140f5576140f4615571565b5b61410189828a01613c40565b92509250509295509295509295565b6000806020838503121561412757614126615576565b5b600083013567ffffffffffffffff81111561414557614144615571565b5b61415185828601613c40565b92509250509250929050565b6000806000806000806060878903121561417a57614179615576565b5b600087013567ffffffffffffffff81111561419857614197615571565b5b6141a489828a01613c40565b9650965050602087013567ffffffffffffffff8111156141c7576141c6615571565b5b6141d389828a01613b3e565b9450945050604087013567ffffffffffffffff8111156141f6576141f5615571565b5b61420289828a01613c40565b92509250509295509295509295565b60008060008060006060868803121561422d5761422c615576565b5b600086013567ffffffffffffffff81111561424b5761424a615571565b5b61425788828901613c40565b9550955050602086013567ffffffffffffffff81111561427a57614279615571565b5b61428688828901613b3e565b9350935050604061429988828901613d6e565b9150509295509295909350565b600080600080604085870312156142c0576142bf615576565b5b600085013567ffffffffffffffff8111156142de576142dd615571565b5b6142ea87828801613c40565b9450945050602085013567ffffffffffffffff81111561430d5761430c615571565b5b61431987828801613bea565b925092505092959194509250565b6000806000806040858703121561434157614340615576565b5b600085013567ffffffffffffffff81111561435f5761435e615571565b5b61436b87828801613c40565b9450945050602085013567ffffffffffffffff81111561438e5761438d615571565b5b61439a87828801613c40565b925092505092959194509250565b6000806000604084860312156143c1576143c0615576565b5b60006143cf86828701613cab565b935050602084013567ffffffffffffffff8111156143f0576143ef615571565b5b6143fc86828701613c40565b92509250509250925092565b60008060008060006060868803121561442457614423615576565b5b600061443288828901613cab565b955050602086013567ffffffffffffffff81111561445357614452615571565b5b61445f88828901613c40565b9450945050604086013567ffffffffffffffff81111561448257614481615571565b5b61448e88828901613c40565b92509250509295509295909350565b600080604083850312156144b4576144b3615576565b5b60006144c285828601613cab565b92505060206144d385828601613d6e565b9150509250929050565b6000806000606084860312156144f6576144f5615576565b5b600061450486828701613cab565b935050602061451586828701613d6e565b925050604061452686828701613d6e565b9150509250925092565b60006020828403121561454657614545615576565b5b600061455484828501613cc0565b91505092915050565b60006020828403121561457357614572615576565b5b600061458184828501613cd5565b91505092915050565b600080602083850312156145a1576145a0615576565b5b600083013567ffffffffffffffff8111156145bf576145be615571565b5b6145cb85828601613d18565b92509250509250929050565b6000602082840312156145ed576145ec615576565b5b60006145fb84828501613d6e565b91505092915050565b60008060006060848603121561461d5761461c615576565b5b600061462b86828701613d6e565b935050602061463c86828701613b29565b925050604061464d86828701613d6e565b9150509250925092565b6000806000604084860312156146705761466f615576565b5b600061467e86828701613d6e565b935050602084013567ffffffffffffffff81111561469f5761469e615571565b5b6146ab86828701613d18565b92509250509250925092565b600080604083850312156146ce576146cd615576565b5b60006146dc85828601613d6e565b92505060206146ed85828601613d6e565b9150509250929050565b6000614703838361487a565b905092915050565b60006147178383614c90565b60208301905092915050565b61472c816152f7565b82525050565b600061473d826151c7565b614747818561520d565b93508360208202850161475985615192565b8060005b85811015614795578484038952815161477685826146f7565b9450614781836151f3565b925060208a0199505060018101905061475d565b50829750879550505050505092915050565b60006147b2826151d2565b6147bc818561521e565b93506147c7836151a2565b8060005b838110156147f85781516147df888261470b565b97506147ea83615200565b9250506001810190506147cb565b5085935050505092915050565b61480e81615309565b82525050565b600061481f826151dd565b614829818561522f565b9350614839818560208601615384565b6148428161557b565b840191505092915050565b60006148598385615251565b9350614866838584615375565b61486f8361557b565b840190509392505050565b6000614885826151e8565b61488f8185615240565b935061489f818560208601615384565b6148a88161557b565b840191505092915050565b60006148be826151e8565b6148c88185615251565b93506148d8818560208601615384565b6148e18161557b565b840191505092915050565b600081546148f9816153b7565b6149038186615262565b9450600182166000811461491e576001811461492f57614962565b60ff19831686528186019350614962565b614938856151b2565b60005b8381101561495a5781548189015260018201915060208101905061493b565b838801955050505b50505092915050565b6000614978602b83615251565b91506149838261558c565b604082019050919050565b600061499b603283615251565b91506149a6826155db565b604082019050919050565b60006149be602683615251565b91506149c98261562a565b604082019050919050565b60006149e1601c83615251565b91506149ec82615679565b602082019050919050565b6000614a04602483615251565b9150614a0f826156a2565b604082019050919050565b6000614a27602983615251565b9150614a32826156f1565b604082019050919050565b6000614a4a601983615251565b9150614a5582615740565b602082019050919050565b6000614a6d602c83615251565b9150614a7882615769565b604082019050919050565b6000614a90603883615251565b9150614a9b826157b8565b604082019050919050565b6000614ab3602a83615251565b9150614abe82615807565b604082019050919050565b6000614ad6602983615251565b9150614ae182615856565b604082019050919050565b6000614af9602583615251565b9150614b04826158a5565b604082019050919050565b6000614b1c602483615251565b9150614b27826158f4565b604082019050919050565b6000614b3f602083615251565b9150614b4a82615943565b602082019050919050565b6000614b62602c83615251565b9150614b6d8261596c565b604082019050919050565b6000614b85602083615251565b9150614b90826159bb565b602082019050919050565b6000614ba8602983615251565b9150614bb3826159e4565b604082019050919050565b6000614bcb602f83615251565b9150614bd682615a33565b604082019050919050565b6000614bee602183615251565b9150614bf982615a82565b604082019050919050565b6000614c11602683615251565b9150614c1c82615ad1565b604082019050919050565b6000614c34603183615251565b9150614c3f82615b20565b604082019050919050565b6000614c57602c83615251565b9150614c6282615b6f565b604082019050919050565b6000614c7a602383615251565b9150614c8582615bbe565b604082019050919050565b614c998161536b565b82525050565b614ca88161536b565b82525050565b6000614cba82856148ec565b9150614cc682846148ec565b91508190509392505050565b6000602082019050614ce76000830184614723565b92915050565b6000608082019050614d026000830187614723565b614d0f6020830186614723565b614d1c6040830185614c9f565b8181036060830152614d2e8184614814565b905095945050505050565b60006020820190508181036000830152614d538184614732565b905092915050565b60006020820190508181036000830152614d7581846147a7565b905092915050565b6000602082019050614d926000830184614805565b92915050565b60006020820190508181036000830152614db381848661484d565b90509392505050565b60006020820190508181036000830152614dd681846148b3565b905092915050565b60006020820190508181036000830152614df78161496b565b9050919050565b60006020820190508181036000830152614e178161498e565b9050919050565b60006020820190508181036000830152614e37816149b1565b9050919050565b60006020820190508181036000830152614e57816149d4565b9050919050565b60006020820190508181036000830152614e77816149f7565b9050919050565b60006020820190508181036000830152614e9781614a1a565b9050919050565b60006020820190508181036000830152614eb781614a3d565b9050919050565b60006020820190508181036000830152614ed781614a60565b9050919050565b60006020820190508181036000830152614ef781614a83565b9050919050565b60006020820190508181036000830152614f1781614aa6565b9050919050565b60006020820190508181036000830152614f3781614ac9565b9050919050565b60006020820190508181036000830152614f5781614aec565b9050919050565b60006020820190508181036000830152614f7781614b0f565b9050919050565b60006020820190508181036000830152614f9781614b32565b9050919050565b60006020820190508181036000830152614fb781614b55565b9050919050565b60006020820190508181036000830152614fd781614b78565b9050919050565b60006020820190508181036000830152614ff781614b9b565b9050919050565b6000602082019050818103600083015261501781614bbe565b9050919050565b6000602082019050818103600083015261503781614be1565b9050919050565b6000602082019050818103600083015261505781614c04565b9050919050565b6000602082019050818103600083015261507781614c27565b9050919050565b6000602082019050818103600083015261509781614c4a565b9050919050565b600060208201905081810360008301526150b781614c6d565b9050919050565b60006020820190506150d36000830184614c9f565b92915050565b600080833560016020038436030381126150f6576150f561555d565b5b80840192508235915067ffffffffffffffff82111561511857615117615558565b5b60208301925060018202360383131561513457615133615567565b5b509250929050565b6000615146615157565b905061515282826153e9565b919050565b6000604051905090565b600067ffffffffffffffff82111561517c5761517b61551f565b5b6151858261557b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152788261536b565b91506152838361536b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152b8576152b7615463565b5b828201905092915050565b60006152ce8261536b565b91506152d98361536b565b9250828210156152ec576152eb615463565b5b828203905092915050565b60006153028261534b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156153a2578082015181840152602081019050615387565b838111156153b1576000848401525b50505050565b600060028204905060018216806153cf57607f821691505b602082108114156153e3576153e2615492565b5b50919050565b6153f28261557b565b810181811067ffffffffffffffff821117156154115761541061551f565b5b80604052505050565b60006154258261536b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545857615457615463565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f746f20616e64205f746f6b656e4964206172726179206c656e677468206d7560008201527f7374206d617463682e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f746f206172726179206c656e677468206d757374206d60008201527f617463682e000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74206f776e65722f6d616e60008201527f6167657200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f757269206172726179206c656e677468206d7573742060008201527f6d617463682e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74206f776e65722f6d696e60008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b615c16816152f7565b8114615c2157600080fd5b50565b615c2d81615309565b8114615c3857600080fd5b50565b615c4481615315565b8114615c4f57600080fd5b50565b615c5b8161531f565b8114615c6657600080fd5b50565b615c728161536b565b8114615c7d57600080fd5b5056fea2646970667358221220310c10a4d2c3ab2de269556ffc52594863b706945c0ddca53b7a5e86710dc4bd64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000074d43505f4e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d43505f4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001568747470733a2f2f697066732e696f2f697066732f0000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063715018a611610151578063c15c3196116100c3578063e985e9c511610087578063e985e9c51461073a578063ec4db2831461076a578063edd864e51461079a578063f2fde38b146107ca578063f56d504f146107e6578063fb570bbf1461081657610269565b8063c15c31961461069a578063c87b56dd146106b6578063d9965572146106e6578063dc85123014610702578063e2f4030d1461071e57610269565b80639c26eb3f116101155780639c26eb3f146105f2578063a0bcfc7f1461060e578063a22cb4651461062a578063a2deefcc14610646578063ac18de4314610662578063b88d4fde1461067e57610269565b8063715018a6146105745780638da5cb5b1461057e5780639034edb51461059c57806395d89b41146105b8578063983b2d56146105d657610269565b80632d06177a116101ea57806342842e0e116101ae57806342842e0e146104905780634f6ccce7146104ac5780635ca45dd7146104dc5780635dd2ccb3146104f85780636352211e1461051457806370a082311461054457610269565b80632d06177a146103da5780632f745c59146103f65780633092afd514610426578063324e4410146104425780633e63eb2a1461047257610269565b80630b599c09116102315780630b599c091461033857806318160ddd146103545780631ee58f9714610372578063234d4386146103a257806323b872dd146103be57610269565b806301ffc9a71461026e578063052641da1461029e57806306fdde03146102ce578063081812fc146102ec578063095ea7b31461031c575b600080fd5b61028860048036038101906102839190614530565b610846565b6040516102959190614d7d565b60405180910390f35b6102b860048036038101906102b391906143a8565b6108c0565b6040516102c59190614d5b565b60405180910390f35b6102d661099a565b6040516102e39190614dbc565b60405180910390f35b610306600480360381019061030191906145d7565b610a2c565b6040516103139190614cd2565b60405180910390f35b61033660048036038101906103319190613f9b565b610ab1565b005b610352600480360381019061034d9190614657565b610bbb565b005b61035c610c1d565b60405161036991906150be565b60405180910390f35b61038c600480360381019061038791906145d7565b610c2a565b60405161039991906150be565b60405180910390f35b6103bc60048036038101906103b79190613ec6565b610c42565b005b6103d860048036038101906103d39190613df0565b610d18565b005b6103f460048036038101906103ef9190613d83565b610d71565b005b610410600480360381019061040b9190613f9b565b610e63565b60405161041d91906150be565b60405180910390f35b610440600480360381019061043b9190613d83565b610f08565b005b61045c600480360381019061045791906145d7565b610ffa565b6040516104699190614dbc565b60405180910390f35b61047a61109a565b6040516104879190614dbc565b60405180910390f35b6104aa60048036038101906104a59190613df0565b611128565b005b6104c660048036038101906104c191906145d7565b611148565b6040516104d391906150be565b60405180910390f35b6104f660048036038101906104f191906146b7565b6111b9565b005b610512600480360381019061050d9190614327565b61126c565b005b61052e600480360381019061052991906145d7565b611373565b60405161053b9190614cd2565b60405180910390f35b61055e60048036038101906105599190613d83565b611425565b60405161056b91906150be565b60405180910390f35b61057c6114dd565b005b610586611635565b6040516105939190614cd2565b60405180910390f35b6105b660048036038101906105b1919061405c565b61165f565b005b6105c06117ed565b6040516105cd9190614dbc565b60405180910390f35b6105f060048036038101906105eb9190613d83565b61187f565b005b61060c60048036038101906106079190614408565b611971565b005b6106286004803603810190610623919061458a565b611ae5565b005b610644600480360381019061063f9190613f5b565b611b92565b005b610660600480360381019061065b919061415d565b611cfe565b005b61067c60048036038101906106779190613d83565b611f1e565b005b61069860048036038101906106939190613e43565b612010565b005b6106b460048036038101906106af9190614211565b61206b565b005b6106d060048036038101906106cb91906145d7565b612223565b6040516106dd9190614dbc565b60405180910390f35b61070060048036038101906106fb91906144dd565b6122bc565b005b61071c600480360381019061071791906142a6565b6123dc565b005b61073860048036038101906107339190614604565b61256e565b005b610754600480360381019061074f9190613db0565b6128c7565b6040516107619190614d7d565b60405180910390f35b610784600480360381019061077f919061449d565b61295b565b60405161079191906150be565b60405180910390f35b6107b460048036038101906107af9190614110565b61298a565b6040516107c19190614d39565b60405180910390f35b6107e460048036038101906107df9190613d83565b612ade565b005b61080060048036038101906107fb9190613fdb565b612ca5565b60405161080d9190614d5b565b60405180910390f35b610830600480360381019061082b9190613d83565b612d99565b60405161083d9190614d5b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b957506108b882612e8c565b5b9050919050565b606060008383905067ffffffffffffffff8111156108e1576108e061551f565b5b60405190808252806020026020018201604052801561090f5781602001602082028036833780820191505090505b50905060005b8484905081101561098e5760106000868684818110610937576109366154f0565b5b905060200201358152602001908152602001600020600087815260200190815260200160002054828281518110610971576109706154f0565b5b602002602001018181525050806109879061541a565b9050610915565b50809150509392505050565b6060600080546109a9906153b7565b80601f01602080910402602001604051908101604052809291908181526020018280546109d5906153b7565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b6000610a3782612f6e565b610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d90614f9e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abc82611373565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b249061501e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6d5750610b6c81336128c7565b5b610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390614ede565b60405180910390fd5b610bb68383612fda565b505050565b8181600e60008681526020019081526020016000209190610bdd929190613a44565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8383604051610c10929190614d98565b60405180910390a2505050565b6000600880549050905090565b600f6020528060005260406000206000915090505481565b818190508484905014610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614e7e565b60405180910390fd5b60005b84849050811015610d10576000858583818110610cad57610cac6154f0565b5b9050602002016020810190610cc29190613d83565b90506000848484818110610cd957610cd86154f0565b5b905060200201359050610cfd88838360405180602001604052806000815250612010565b505080610d099061541a565b9050610c8d565b505050505050565b610d223382613093565b610d61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d589061505e565b60405180910390fd5b610d6c838383613171565b505050565b610d796133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff90614fbe565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000610e6e83611425565b8210610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614dde565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f106133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614fbe565b60405180910390fd5b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600e6020528060005260406000206000915090508054611019906153b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611045906153b7565b80156110925780601f1061106757610100808354040283529160200191611092565b820191906000526020600020905b81548152906001019060200180831161107557829003601f168201915b505050505081565b600d80546110a7906153b7565b80601f01602080910402602001604051908101604052809291908181526020018280546110d3906153b7565b80156111205780601f106110f557610100808354040283529160200191611120565b820191906000526020600020905b81548152906001019060200180831161110357829003601f168201915b505050505081565b61114383838360405180602001604052806000815250612010565b505050565b6000611152610c1d565b8210611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a9061507e565b60405180910390fd5b600882815481106111a7576111a66154f0565b5b90600052602060002001549050919050565b6111c16133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124790614fbe565b60405180910390fd5b80600f6000848152602001908152602001600020819055505050565b6112746133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90614fbe565b60405180910390fd5b60005b8282905081101561136c57828282818110611324576113236154f0565b5b90506020020135600f6000878785818110611342576113416154f0565b5b90506020020135815260200190815260200160002081905550806113659061541a565b9050611306565b5050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141390614f1e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148d90614efe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e56133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b90614fbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116676133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806117125750600b60006116c96133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174890614f5e565b60405180910390fd5b60005b848490508110156117e457828282818110611772576117716154f0565b5b90506020020135601060008787858181106117905761178f6154f0565b5b90506020020135815260200190815260200160002060008989858181106117ba576117b96154f0565b5b90506020020135815260200190815260200160002081905550806117dd9061541a565b9050611754565b50505050505050565b6060600180546117fc906153b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611828906153b7565b80156118755780601f1061184a57610100808354040283529160200191611875565b820191906000526020600020905b81548152906001019060200180831161185857829003601f168201915b5050505050905090565b6118876133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90614fbe565b60405180910390fd5b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6119796133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a245750600b60006119db6133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5a90614f5e565b60405180910390fd5b60005b84849050811015611add57828282818110611a8457611a836154f0565b5b9050602002013560106000878785818110611aa257611aa16154f0565b5b90506020020135815260200190815260200160002060008881526020019081526020016000208190555080611ad69061541a565b9050611a66565b505050505050565b611aed6133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7390614fbe565b60405180910390fd5b8181600d9190611b8d929190613a44565b505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf890614e9e565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cf29190614d7d565b60405180910390a35050565b611d066133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611db15750600c6000611d686133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de79061509e565b60405180910390fd5b838390508686905014611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f90614f3e565b60405180910390fd5b818190508686905014611e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e779061503e565b60405180910390fd5b60005b84849050811015611f15576000858583818110611ea357611ea26154f0565b5b9050602002016020810190611eb89190613d83565b90506000888884818110611ecf57611ece6154f0565b5b9050602002013590506000858585818110611eed57611eec6154f0565b5b905060200201359050611f0182848361256e565b50505080611f0e9061541a565b9050611e83565b50505050505050565b611f266133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fac90614fbe565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61201a3383613093565b612059576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120509061505e565b60405180910390fd5b612065848484846133d5565b50505050565b6120736133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061211e5750600c60006120d56133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61215d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121549061509e565b60405180910390fd5b8282905085859050146121a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219c90614f3e565b60405180910390fd5b60005b8383905081101561221b5760008484838181106121c8576121c76154f0565b5b90506020020160208101906121dd9190613d83565b905060008787848181106121f4576121f36154f0565b5b90506020020135905061220881838661256e565b5050806122149061541a565b90506121a8565b505050505050565b606061222e82612f6e565b61226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614ffe565b60405180910390fd5b600d600e6000600f60008681526020019081526020016000205481526020019081526020016000206040516020016122a6929190614cae565b6040516020818303038152906040529050919050565b6122c46133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061236f5750600b60006123266133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a590614f5e565b60405180910390fd5b8060106000848152602001908152602001600020600085815260200190815260200160002081905550505050565b6123e46133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246a90614fbe565b60405180910390fd5b60005b8484905081101561256757828282818110612494576124936154f0565b5b90506020028101906124a691906150d9565b600e60008888868181106124bd576124bc6154f0565b5b90506020020135815260200190815260200160002091906124df929190613a44565b508484828181106124f3576124f26154f0565b5b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b84848481811061252e5761252d6154f0565b5b905060200281019061254091906150d9565b60405161254e929190614d98565b60405180910390a2806125609061541a565b9050612476565b5050505050565b6125766133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806126215750600c60006125d86133cd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612660576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126579061509e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790614f7e565b60405180910390fd5b6126d983612f6e565b15612719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271090614e3e565b60405180910390fd5b61272560008385613431565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612775919061526d565b92505081905550816002600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f600085815260200190815260200160002081905550828273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128618273ffffffffffffffffffffffffffffffffffffffff16613545565b156128c2576128826000838560405180602001604052806000815250613558565b6128c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b890614dfe565b60405180910390fd5b5b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060106000838152602001908152602001600020600084815260200190815260200160002054905092915050565b606060008383905067ffffffffffffffff8111156129ab576129aa61551f565b5b6040519080825280602002602001820160405280156129de57816020015b60608152602001906001900390816129c95790505b50905060005b84849050811015612ad357600e6000868684818110612a0657612a056154f0565b5b9050602002013581526020019081526020016000208054612a26906153b7565b80601f0160208091040260200160405190810160405280929190818152602001828054612a52906153b7565b8015612a9f5780601f10612a7457610100808354040283529160200191612a9f565b820191906000526020600020905b815481529060010190602001808311612a8257829003601f168201915b5050505050828281518110612ab757612ab66154f0565b5b602002602001018190525080612acc9061541a565b90506129e4565b508091505092915050565b612ae66133cd565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6c90614fbe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdc90614e1e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008383905067ffffffffffffffff811115612cc657612cc561551f565b5b604051908082528060200260200182016040528015612cf45781602001602082028036833780820191505090505b50905060005b84849050811015612d8c5760106000868684818110612d1c57612d1b6154f0565b5b9050602002013581526020019081526020016000206000888884818110612d4657612d456154f0565b5b90506020020135815260200190815260200160002054828281518110612d6f57612d6e6154f0565b5b60200260200101818152505080612d859061541a565b9050612cfa565b5080915050949350505050565b60606000612da683611425565b905060008167ffffffffffffffff811115612dc457612dc361551f565b5b604051908082528060200260200182016040528015612df25781602001602082028036833780820191505090505b50905060005b82811015612e8157600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054828281518110612e6457612e636154f0565b5b60200260200101818152505080612e7a9061541a565b9050612df8565b508092505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f5757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f675750612f66826136e8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661304d83611373565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061309e82612f6e565b6130dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d490614ebe565b60405180910390fd5b60006130e883611373565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061315757508373ffffffffffffffffffffffffffffffffffffffff1661313f84610a2c565b73ffffffffffffffffffffffffffffffffffffffff16145b80613168575061316781856128c7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661319182611373565b73ffffffffffffffffffffffffffffffffffffffff16146131e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131de90614fde565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324e90614e5e565b60405180910390fd5b613262838383613431565b61326d600082612fda565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132bd91906152c3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613314919061526d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600033905090565b6133e0848484613171565b6133ec84848484613558565b61342b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342290614dfe565b60405180910390fd5b50505050565b61343c838383613739565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561347f5761347a8161373e565b6134be565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134bd576134bc8382613787565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613501576134fc816138f4565b613540565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461353f5761353e82826139c5565b5b5b505050565b600080823b905060008111915050919050565b60006135798473ffffffffffffffffffffffffffffffffffffffff16613545565b156136db578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016135bd9493929190614ced565b602060405180830381600087803b1580156135d757600080fd5b505af192505050801561360857506040513d601f19601f82011682018060405250810190613605919061455d565b60015b61368b573d8060008114613638576040519150601f19603f3d011682016040523d82523d6000602084013e61363d565b606091505b50600081511415613683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161367a90614dfe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136e0565b600190505b949350505050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161379484611425565b61379e91906152c3565b9050600060076000848152602001908152602001600020549050818114613883576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061390891906152c3565b9050600060096000848152602001908152602001600020549050600060088381548110613938576139376154f0565b5b90600052602060002001549050806008838154811061395a576139596154f0565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139a9576139a86154c1565b5b6001900381819060005260206000200160009055905550505050565b60006139d083611425565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613a50906153b7565b90600052602060002090601f016020900481019282613a725760008555613ab9565b82601f10613a8b57803560ff1916838001178555613ab9565b82800160010185558215613ab9579182015b82811115613ab8578235825591602001919060010190613a9d565b5b509050613ac69190613aca565b5090565b5b80821115613ae3576000816000905550600101613acb565b5090565b6000613afa613af584615161565b61513c565b905082815260208101848484011115613b1657613b1561556c565b5b613b21848285615375565b509392505050565b600081359050613b3881615c0d565b92915050565b60008083601f840112613b5457613b53615553565b5b8235905067ffffffffffffffff811115613b7157613b7061554e565b5b602083019150836020820283011115613b8d57613b8c615562565b5b9250929050565b60008083601f840112613baa57613ba9615553565b5b8235905067ffffffffffffffff811115613bc757613bc661554e565b5b602083019150836020820283011115613be357613be2615562565b5b9250929050565b60008083601f840112613c0057613bff615553565b5b8235905067ffffffffffffffff811115613c1d57613c1c61554e565b5b602083019150836020820283011115613c3957613c38615562565b5b9250929050565b60008083601f840112613c5657613c55615553565b5b8235905067ffffffffffffffff811115613c7357613c7261554e565b5b602083019150836020820283011115613c8f57613c8e615562565b5b9250929050565b600081359050613ca581615c24565b92915050565b600081359050613cba81615c3b565b92915050565b600081359050613ccf81615c52565b92915050565b600081519050613ce481615c52565b92915050565b600082601f830112613cff57613cfe615553565b5b8135613d0f848260208601613ae7565b91505092915050565b60008083601f840112613d2e57613d2d615553565b5b8235905067ffffffffffffffff811115613d4b57613d4a61554e565b5b602083019150836001820283011115613d6757613d66615562565b5b9250929050565b600081359050613d7d81615c69565b92915050565b600060208284031215613d9957613d98615576565b5b6000613da784828501613b29565b91505092915050565b60008060408385031215613dc757613dc6615576565b5b6000613dd585828601613b29565b9250506020613de685828601613b29565b9150509250929050565b600080600060608486031215613e0957613e08615576565b5b6000613e1786828701613b29565b9350506020613e2886828701613b29565b9250506040613e3986828701613d6e565b9150509250925092565b60008060008060808587031215613e5d57613e5c615576565b5b6000613e6b87828801613b29565b9450506020613e7c87828801613b29565b9350506040613e8d87828801613d6e565b925050606085013567ffffffffffffffff811115613eae57613ead615571565b5b613eba87828801613cea565b91505092959194509250565b600080600080600060608688031215613ee257613ee1615576565b5b6000613ef088828901613b29565b955050602086013567ffffffffffffffff811115613f1157613f10615571565b5b613f1d88828901613b3e565b9450945050604086013567ffffffffffffffff811115613f4057613f3f615571565b5b613f4c88828901613c40565b92509250509295509295909350565b60008060408385031215613f7257613f71615576565b5b6000613f8085828601613b29565b9250506020613f9185828601613c96565b9150509250929050565b60008060408385031215613fb257613fb1615576565b5b6000613fc085828601613b29565b9250506020613fd185828601613d6e565b9150509250929050565b60008060008060408587031215613ff557613ff4615576565b5b600085013567ffffffffffffffff81111561401357614012615571565b5b61401f87828801613b94565b9450945050602085013567ffffffffffffffff81111561404257614041615571565b5b61404e87828801613c40565b925092505092959194509250565b6000806000806000806060878903121561407957614078615576565b5b600087013567ffffffffffffffff81111561409757614096615571565b5b6140a389828a01613b94565b9650965050602087013567ffffffffffffffff8111156140c6576140c5615571565b5b6140d289828a01613c40565b9450945050604087013567ffffffffffffffff8111156140f5576140f4615571565b5b61410189828a01613c40565b92509250509295509295509295565b6000806020838503121561412757614126615576565b5b600083013567ffffffffffffffff81111561414557614144615571565b5b61415185828601613c40565b92509250509250929050565b6000806000806000806060878903121561417a57614179615576565b5b600087013567ffffffffffffffff81111561419857614197615571565b5b6141a489828a01613c40565b9650965050602087013567ffffffffffffffff8111156141c7576141c6615571565b5b6141d389828a01613b3e565b9450945050604087013567ffffffffffffffff8111156141f6576141f5615571565b5b61420289828a01613c40565b92509250509295509295509295565b60008060008060006060868803121561422d5761422c615576565b5b600086013567ffffffffffffffff81111561424b5761424a615571565b5b61425788828901613c40565b9550955050602086013567ffffffffffffffff81111561427a57614279615571565b5b61428688828901613b3e565b9350935050604061429988828901613d6e565b9150509295509295909350565b600080600080604085870312156142c0576142bf615576565b5b600085013567ffffffffffffffff8111156142de576142dd615571565b5b6142ea87828801613c40565b9450945050602085013567ffffffffffffffff81111561430d5761430c615571565b5b61431987828801613bea565b925092505092959194509250565b6000806000806040858703121561434157614340615576565b5b600085013567ffffffffffffffff81111561435f5761435e615571565b5b61436b87828801613c40565b9450945050602085013567ffffffffffffffff81111561438e5761438d615571565b5b61439a87828801613c40565b925092505092959194509250565b6000806000604084860312156143c1576143c0615576565b5b60006143cf86828701613cab565b935050602084013567ffffffffffffffff8111156143f0576143ef615571565b5b6143fc86828701613c40565b92509250509250925092565b60008060008060006060868803121561442457614423615576565b5b600061443288828901613cab565b955050602086013567ffffffffffffffff81111561445357614452615571565b5b61445f88828901613c40565b9450945050604086013567ffffffffffffffff81111561448257614481615571565b5b61448e88828901613c40565b92509250509295509295909350565b600080604083850312156144b4576144b3615576565b5b60006144c285828601613cab565b92505060206144d385828601613d6e565b9150509250929050565b6000806000606084860312156144f6576144f5615576565b5b600061450486828701613cab565b935050602061451586828701613d6e565b925050604061452686828701613d6e565b9150509250925092565b60006020828403121561454657614545615576565b5b600061455484828501613cc0565b91505092915050565b60006020828403121561457357614572615576565b5b600061458184828501613cd5565b91505092915050565b600080602083850312156145a1576145a0615576565b5b600083013567ffffffffffffffff8111156145bf576145be615571565b5b6145cb85828601613d18565b92509250509250929050565b6000602082840312156145ed576145ec615576565b5b60006145fb84828501613d6e565b91505092915050565b60008060006060848603121561461d5761461c615576565b5b600061462b86828701613d6e565b935050602061463c86828701613b29565b925050604061464d86828701613d6e565b9150509250925092565b6000806000604084860312156146705761466f615576565b5b600061467e86828701613d6e565b935050602084013567ffffffffffffffff81111561469f5761469e615571565b5b6146ab86828701613d18565b92509250509250925092565b600080604083850312156146ce576146cd615576565b5b60006146dc85828601613d6e565b92505060206146ed85828601613d6e565b9150509250929050565b6000614703838361487a565b905092915050565b60006147178383614c90565b60208301905092915050565b61472c816152f7565b82525050565b600061473d826151c7565b614747818561520d565b93508360208202850161475985615192565b8060005b85811015614795578484038952815161477685826146f7565b9450614781836151f3565b925060208a0199505060018101905061475d565b50829750879550505050505092915050565b60006147b2826151d2565b6147bc818561521e565b93506147c7836151a2565b8060005b838110156147f85781516147df888261470b565b97506147ea83615200565b9250506001810190506147cb565b5085935050505092915050565b61480e81615309565b82525050565b600061481f826151dd565b614829818561522f565b9350614839818560208601615384565b6148428161557b565b840191505092915050565b60006148598385615251565b9350614866838584615375565b61486f8361557b565b840190509392505050565b6000614885826151e8565b61488f8185615240565b935061489f818560208601615384565b6148a88161557b565b840191505092915050565b60006148be826151e8565b6148c88185615251565b93506148d8818560208601615384565b6148e18161557b565b840191505092915050565b600081546148f9816153b7565b6149038186615262565b9450600182166000811461491e576001811461492f57614962565b60ff19831686528186019350614962565b614938856151b2565b60005b8381101561495a5781548189015260018201915060208101905061493b565b838801955050505b50505092915050565b6000614978602b83615251565b91506149838261558c565b604082019050919050565b600061499b603283615251565b91506149a6826155db565b604082019050919050565b60006149be602683615251565b91506149c98261562a565b604082019050919050565b60006149e1601c83615251565b91506149ec82615679565b602082019050919050565b6000614a04602483615251565b9150614a0f826156a2565b604082019050919050565b6000614a27602983615251565b9150614a32826156f1565b604082019050919050565b6000614a4a601983615251565b9150614a5582615740565b602082019050919050565b6000614a6d602c83615251565b9150614a7882615769565b604082019050919050565b6000614a90603883615251565b9150614a9b826157b8565b604082019050919050565b6000614ab3602a83615251565b9150614abe82615807565b604082019050919050565b6000614ad6602983615251565b9150614ae182615856565b604082019050919050565b6000614af9602583615251565b9150614b04826158a5565b604082019050919050565b6000614b1c602483615251565b9150614b27826158f4565b604082019050919050565b6000614b3f602083615251565b9150614b4a82615943565b602082019050919050565b6000614b62602c83615251565b9150614b6d8261596c565b604082019050919050565b6000614b85602083615251565b9150614b90826159bb565b602082019050919050565b6000614ba8602983615251565b9150614bb3826159e4565b604082019050919050565b6000614bcb602f83615251565b9150614bd682615a33565b604082019050919050565b6000614bee602183615251565b9150614bf982615a82565b604082019050919050565b6000614c11602683615251565b9150614c1c82615ad1565b604082019050919050565b6000614c34603183615251565b9150614c3f82615b20565b604082019050919050565b6000614c57602c83615251565b9150614c6282615b6f565b604082019050919050565b6000614c7a602383615251565b9150614c8582615bbe565b604082019050919050565b614c998161536b565b82525050565b614ca88161536b565b82525050565b6000614cba82856148ec565b9150614cc682846148ec565b91508190509392505050565b6000602082019050614ce76000830184614723565b92915050565b6000608082019050614d026000830187614723565b614d0f6020830186614723565b614d1c6040830185614c9f565b8181036060830152614d2e8184614814565b905095945050505050565b60006020820190508181036000830152614d538184614732565b905092915050565b60006020820190508181036000830152614d7581846147a7565b905092915050565b6000602082019050614d926000830184614805565b92915050565b60006020820190508181036000830152614db381848661484d565b90509392505050565b60006020820190508181036000830152614dd681846148b3565b905092915050565b60006020820190508181036000830152614df78161496b565b9050919050565b60006020820190508181036000830152614e178161498e565b9050919050565b60006020820190508181036000830152614e37816149b1565b9050919050565b60006020820190508181036000830152614e57816149d4565b9050919050565b60006020820190508181036000830152614e77816149f7565b9050919050565b60006020820190508181036000830152614e9781614a1a565b9050919050565b60006020820190508181036000830152614eb781614a3d565b9050919050565b60006020820190508181036000830152614ed781614a60565b9050919050565b60006020820190508181036000830152614ef781614a83565b9050919050565b60006020820190508181036000830152614f1781614aa6565b9050919050565b60006020820190508181036000830152614f3781614ac9565b9050919050565b60006020820190508181036000830152614f5781614aec565b9050919050565b60006020820190508181036000830152614f7781614b0f565b9050919050565b60006020820190508181036000830152614f9781614b32565b9050919050565b60006020820190508181036000830152614fb781614b55565b9050919050565b60006020820190508181036000830152614fd781614b78565b9050919050565b60006020820190508181036000830152614ff781614b9b565b9050919050565b6000602082019050818103600083015261501781614bbe565b9050919050565b6000602082019050818103600083015261503781614be1565b9050919050565b6000602082019050818103600083015261505781614c04565b9050919050565b6000602082019050818103600083015261507781614c27565b9050919050565b6000602082019050818103600083015261509781614c4a565b9050919050565b600060208201905081810360008301526150b781614c6d565b9050919050565b60006020820190506150d36000830184614c9f565b92915050565b600080833560016020038436030381126150f6576150f561555d565b5b80840192508235915067ffffffffffffffff82111561511857615117615558565b5b60208301925060018202360383131561513457615133615567565b5b509250929050565b6000615146615157565b905061515282826153e9565b919050565b6000604051905090565b600067ffffffffffffffff82111561517c5761517b61551f565b5b6151858261557b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152788261536b565b91506152838361536b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152b8576152b7615463565b5b828201905092915050565b60006152ce8261536b565b91506152d98361536b565b9250828210156152ec576152eb615463565b5b828203905092915050565b60006153028261534b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156153a2578082015181840152602081019050615387565b838111156153b1576000848401525b50505050565b600060028204905060018216806153cf57607f821691505b602082108114156153e3576153e2615492565b5b50919050565b6153f28261557b565b810181811067ffffffffffffffff821117156154115761541061551f565b5b80604052505050565b60006154258261536b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561545857615457615463565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f746f20616e64205f746f6b656e4964206172726179206c656e677468206d7560008201527f7374206d617463682e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f746f206172726179206c656e677468206d757374206d60008201527f617463682e000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74206f776e65722f6d616e60008201527f6167657200000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f69647320616e64205f757269206172726179206c656e677468206d7573742060008201527f6d617463682e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74206f776e65722f6d696e60008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b615c16816152f7565b8114615c2157600080fd5b50565b615c2d81615309565b8114615c3857600080fd5b50565b615c4481615315565b8114615c4f57600080fd5b50565b615c5b8161531f565b8114615c6657600080fd5b50565b615c728161536b565b8114615c7d57600080fd5b5056fea2646970667358221220310c10a4d2c3ab2de269556ffc52594863b706945c0ddca53b7a5e86710dc4bd64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000074d43505f4e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074d43505f4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001568747470733a2f2f697066732e696f2f697066732f0000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): MCP_NFT
Arg [1] : symbol_ (string): MCP_NFT
Arg [2] : baseUri_ (string): https://ipfs.io/ipfs/

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [4] : 4d43505f4e465400000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 4d43505f4e465400000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f0000000000000000000000


Deployed Bytecode Sourcemap

44869:6277:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38348:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50366:374;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18085:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18881:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18422:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48194:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39001:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45228:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47665:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19765:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35215:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38669:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35817:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45151:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45122:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20139:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39191:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48651:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48793:241;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17779:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17509:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36303:148;;;:::i;:::-;;34746:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49889:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18254:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35677:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49582:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48083:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19174:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47037:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35361:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20361:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46516:463;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45568:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49421:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48363:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45832:619;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19534:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50207:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49046:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36606:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50752:385;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39437:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38348:237;38450:4;38489:35;38474:50;;;:11;:50;;;;:103;;;;38541:36;38565:11;38541:23;:36::i;:::-;38474:103;38467:110;;38348:237;;;:::o;50366:374::-;50459:23;50495:18;50530:3;;:10;;50516:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50495:46;;50606:9;50601:103;50625:3;;:10;;50621:1;:14;50601:103;;;50664:9;:17;50674:3;;50678:1;50674:6;;;;;;;:::i;:::-;;;;;;;;50664:17;;;;;;;;;;;:28;50682:9;50664:28;;;;;;;;;;;;50657:1;50659;50657:4;;;;;;;;:::i;:::-;;;;;;;:35;;;;;50637:3;;;;:::i;:::-;;;50601:103;;;;50731:1;50724:8;;;50366:374;;;;;:::o;18085:100::-;18139:13;18172:5;18165:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18085:100;:::o;18881:221::-;18957:7;18985:16;18993:7;18985;:16::i;:::-;18977:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19070:15;:24;19086:7;19070:24;;;;;;;;;;;;;;;;;;;;;19063:31;;18881:221;;;:::o;18422:393::-;18503:13;18519:23;18534:7;18519:14;:23::i;:::-;18503:39;;18567:5;18561:11;;:2;:11;;;;18553:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;18645:5;18631:19;;:10;:19;;;:58;;;;18654:35;18671:5;18678:10;18654:16;:35::i;:::-;18631:58;18623:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;18786:21;18795:2;18799:7;18786:8;:21::i;:::-;18492:323;18422:393;;:::o;48194:157::-;48304:3;;48277:12;:24;48290:10;48277:24;;;;;;;;;;;:30;;;;;;;:::i;:::-;;48332:10;48323:20;48327:3;;48323:20;;;;;;;:::i;:::-;;;;;;;;48194:157;;;:::o;39001:113::-;39062:7;39089:10;:17;;;;39082:24;;39001:113;:::o;45228:45::-;;;;;;;;;;;;;;;;;:::o;47665:406::-;47806:8;;:15;;47792:3;;:10;;:29;47784:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;47883:9;47878:186;47902:3;;:10;;47898:1;:14;47878:186;;;47934:10;47947:3;;47951:1;47947:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;47934:19;;47968:15;47986:8;;47995:1;47986:11;;;;;;;:::i;:::-;;;;;;;;47968:29;;48012:40;48029:5;48036:2;48040:7;48012:40;;;;;;;;;;;;:16;:40::i;:::-;47919:145;;47914:3;;;;:::i;:::-;;;47878:186;;;;47665:406;;;;;:::o;19765:303::-;19926:39;19945:10;19957:7;19926:18;:39::i;:::-;19918:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;20032:28;20042:4;20048:2;20052:7;20032:9;:28::i;:::-;19765:303;;;:::o;35215:134::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35299:4:::1;35280:9;:18;35290:7;35280:18;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;35215:134:::0;:::o;38669:256::-;38766:7;38802:23;38819:5;38802:16;:23::i;:::-;38794:5;:31;38786:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38891:12;:19;38904:5;38891:19;;;;;;;;;;;;;;;:26;38911:5;38891:26;;;;;;;;;;;;38884:33;;38669:256;;;;:::o;35817:135::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35900:5:::1;35883:8;:16;35892:6;35883:16;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;35817:135:::0;:::o;45151:46::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45122:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20139:151::-;20243:39;20260:4;20266:2;20270:7;20243:39;;;;;;;;;;;;:16;:39::i;:::-;20139:151;;;:::o;39191:233::-;39266:7;39302:30;:28;:30::i;:::-;39294:5;:38;39286:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39399:10;39410:5;39399:17;;;;;;;;:::i;:::-;;;;;;;;;;39392:24;;39191:233;;;:::o;48651:130::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48762:11:::1;48744:10;:15;48755:3;48744:15;;;;;;;;;;;:29;;;;48651:130:::0;;:::o;48793:241::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48921:9:::1;48916:111;48940:11;;:18;;48936:1;:22;48916:111;;;49001:11;;49013:1;49001:14;;;;;;;:::i;:::-;;;;;;;;48980:10;:18;48991:3;;48995:1;48991:6;;;;;;;:::i;:::-;;;;;;;;48980:18;;;;;;;;;;;:35;;;;48960:3;;;;:::i;:::-;;;48916:111;;;;48793:241:::0;;;;:::o;17779:239::-;17851:7;17871:13;17887:7;:16;17895:7;17887:16;;;;;;;;;;;;;;;;;;;;;17871:32;;17939:1;17922:19;;:5;:19;;;;17914:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18005:5;17998:12;;;17779:239;;;:::o;17509:208::-;17581:7;17626:1;17609:19;;:5;:19;;;;17601:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;17693:9;:16;17703:5;17693:16;;;;;;;;;;;;;;;;17686:23;;17509:208;;;:::o;36303:148::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36410:1:::1;36373:40;;36394:6;;;;;;;;;;;36373:40;;;;;;;;;;;;36441:1;36424:6;;:19;;;;;;;;;;;;;;;;;;36303:148::o:0;34746:79::-;34784:7;34811:6;;;;;;;;;;;34804:13;;34746:79;:::o;49889:306::-;35102:12;:10;:12::i;:::-;35092:22;;:6;;;;;;;;;;;:22;;;35091:51;;;;35119:9;:23;35129:12;:10;:12::i;:::-;35119:23;;;;;;;;;;;;;;;;;;;;;;;;;35091:51;35083:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;50082:9:::1;50077:111;50101:3;;:10;;50097:1;:14;50077:111;;;50167:6;;50174:1;50167:9;;;;;;;:::i;:::-;;;;;;;;50133;:17;50143:3;;50147:1;50143:6;;;;;;;:::i;:::-;;;;;;;;50133:17;;;;;;;;;;;:31;50151:9;;50161:1;50151:12;;;;;;;:::i;:::-;;;;;;;;50133:31;;;;;;;;;;;:43;;;;50113:3;;;;:::i;:::-;;;50077:111;;;;49889:306:::0;;;;;;:::o;18254:104::-;18310:13;18343:7;18336:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18254:104;:::o;35677:128::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35757:4:::1;35740:8;:16;35749:6;35740:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35677:128:::0;:::o;49582:295::-;35102:12;:10;:12::i;:::-;35092:22;;:6;;;;;;;;;;;:22;;;35091:51;;;;35119:9;:23;35129:12;:10;:12::i;:::-;35119:23;;;;;;;;;;;;;;;;;;;;;;;;;35091:51;35083:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;49767:9:::1;49762:108;49786:3;;:10;;49782:1;:14;49762:108;;;49849:6;;49856:1;49849:9;;;;;;;:::i;:::-;;;;;;;;49818;:17;49828:3;;49832:1;49828:6;;;;;;;:::i;:::-;;;;;;;;49818:17;;;;;;;;;;;:28;49836:9;49818:28;;;;;;;;;;;:40;;;;49798:3;;;;:::i;:::-;;;49762:108;;;;49582:295:::0;;;;;:::o;48083:99::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48168:6:::1;;48157:8;:17;;;;;;;:::i;:::-;;48083:99:::0;;:::o;19174:289::-;19289:10;19277:22;;:8;:22;;;;19269:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;19385:8;19342:18;:30;19361:10;19342:30;;;;;;;;;;;;;;;:40;19373:8;19342:40;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;19436:8;19409:46;;19424:10;19409:46;;;19446:8;19409:46;;;;;;:::i;:::-;;;;;;;;19174:289;;:::o;47037:553::-;35566:12;:10;:12::i;:::-;35556:22;;:6;;;;;;;;;;;:22;;;35555:50;;;;35583:8;:22;35592:12;:10;:12::i;:::-;35583:22;;;;;;;;;;;;;;;;;;;;;;;;;35555:50;35547:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;47204:3:::1;;:10;;47190:3;;:10;;:24;47182:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47289:14;;:21;;47275:3;;:10;;:35;47267:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;47369:9;47364:219;47388:3;;:10;;47384:1;:14;47364:219;;;47422:10;47435:3;;47439:1;47435:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;47422:19;;47456:10;47469:3;;47473:1;47469:6;;;;;;;:::i;:::-;;;;;;;;47456:19;;47490:11;47504:14;;47519:1;47504:17;;;;;;;:::i;:::-;;;;;;;;47490:31;;47550:21;47559:2;47563;47567:3;47550:8;:21::i;:::-;47405:178;;;47400:3;;;;:::i;:::-;;;47364:219;;;;47037:553:::0;;;;;;:::o;35361:141::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35448:5:::1;35429:9;:18;35439:7;35429:18;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;35361:141:::0;:::o;20361:283::-;20493:39;20512:10;20524:7;20493:18;:39::i;:::-;20485:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;20597:39;20611:4;20617:2;20621:7;20630:5;20597:13;:39::i;:::-;20361:283;;;;:::o;46516:463::-;35566:12;:10;:12::i;:::-;35556:22;;:6;;;;;;;;;;;:22;;;35555:50;;;;35583:8;:22;35592:12;:10;:12::i;:::-;35583:22;;;;;;;;;;;;;;;;;;;;;;;;;35555:50;35547:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;46664:3:::1;;:10;;46650:3;;:10;;:24;46642:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46781:9;46776:196;46800:3;;:10;;46796:1;:14;46776:196;;;46846:10;46859:3;;46863:1;46859:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;46846:19;;46880:10;46893:3;;46897:1;46893:6;;;;;;;:::i;:::-;;;;;;;;46880:19;;46928:32;46937:2;46941;46945:14;46928:8;:32::i;:::-;46817:155;;46812:3;;;;:::i;:::-;;;46776:196;;;;46516:463:::0;;;;;:::o;45568:252::-;45631:13;45665:12;45673:3;45665:7;:12::i;:::-;45657:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;45771:8;45781:12;:29;45794:10;:15;45805:3;45794:15;;;;;;;;;;;;45781:29;;;;;;;;;;;45754:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45740:72;;45568:252;;;:::o;49421:149::-;35102:12;:10;:12::i;:::-;35092:22;;:6;;;;;;;;;;;:22;;;35091:51;;;;35119:9;:23;35129:12;:10;:12::i;:::-;35119:23;;;;;;;;;;;;;;;;;;;;;;;;;35091:51;35083:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;49556:6:::1;49528:9;:14;49538:3;49528:14;;;;;;;;;;;:25;49543:9;49528:25;;;;;;;;;;;:34;;;;49421:149:::0;;;:::o;48363:280::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48484:9:::1;48479:157;48503:10;;:17;;48499:1;:21;48479:157;;;48572:3;;48576:1;48572:6;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;48542:12;:27;48555:10;;48566:1;48555:13;;;;;;;:::i;:::-;;;;;;;;48542:27;;;;;;;;;;;:36;;;;;;;:::i;:::-;;48610:10;;48621:1;48610:13;;;;;;;:::i;:::-;;;;;;;;48598:26;48602:3;;48606:1;48602:6;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;48598:26;;;;;;;:::i;:::-;;;;;;;;48522:3;;;;:::i;:::-;;;48479:157;;;;48363:280:::0;;;;:::o;45832:619::-;35566:12;:10;:12::i;:::-;35556:22;;:6;;;;;;;;;;;:22;;;35555:50;;;;35583:8;:22;35592:12;:10;:12::i;:::-;35583:22;;;;;;;;;;;;;;;;;;;;;;;;;35555:50;35547:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;45952:1:::1;45937:17;;:3;:17;;;;45929:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46011:12;46019:3;46011:7;:12::i;:::-;46010:13;46002:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;46069:42;46098:1;46102:3;46107;46069:20;:42::i;:::-;46142:1;46124:9;:14;46134:3;46124:14;;;;;;;;;;;;;;;;:19;;;;;;;:::i;:::-;;;;;;;;46169:3;46154:7;:12;46162:3;46154:12;;;;;;;;;;;;:18;;;;;;;;;;;;;;;;;;46201:14;46183:10;:15;46194:3;46183:15;;;;;;;;;;;:32;;;;46259:3;46254;46233:30;;46250:1;46233:30;;;;;;;;;;;;46288:16;:3;:14;;;:16::i;:::-;46284:160;;;46329:48;46360:1;46364:3;46369;46329:48;;;;;;;;;;;::::0;:22:::1;:48::i;:::-;46321:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;46284:160;45832:619:::0;;;:::o;19534:164::-;19631:4;19655:18;:25;19674:5;19655:25;;;;;;;;;;;;;;;:35;19681:8;19655:35;;;;;;;;;;;;;;;;;;;;;;;;;19648:42;;19534:164;;;;:::o;50207:147::-;50287:14;50321:9;:14;50331:3;50321:14;;;;;;;;;;;:25;50336:9;50321:25;;;;;;;;;;;;50314:32;;50207:147;;;;:::o;49046:363::-;49136:15;49163:31;49210:11;;:18;;49197:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49163:66;;49244:9;49240:119;49259:11;;:18;;49255:1;:22;49240:119;;;49319:12;:28;49332:11;;49344:1;49332:14;;;;;;;:::i;:::-;;;;;;;;49319:28;;;;;;;;;;;49298:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;49314:1;49298:18;;;;;;;;:::i;:::-;;;;;;;:49;;;;49279:3;;;;:::i;:::-;;;49240:119;;;;49386:15;49379:22;;;49046:363;;;;:::o;36606:244::-;34968:12;:10;:12::i;:::-;34958:22;;:6;;;;;;;;;;;:22;;;34950:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36715:1:::1;36695:22;;:8;:22;;;;36687:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36805:8;36776:38;;36797:6;;;;;;;;;;;36776:38;;;;;;;;;;;;36834:8;36825:6;;:17;;;;;;;;;;;;;;;;;;36606:244:::0;:::o;50752:385::-;50853:23;50889:18;50924:3;;:10;;50910:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50889:46;;51000:9;50995:106;51019:3;;:10;;51015:1;:14;50995:106;;;51058:9;:17;51068:3;;51072:1;51068:6;;;;;;;:::i;:::-;;;;;;;;51058:17;;;;;;;;;;;:31;51076:9;;51086:1;51076:12;;;;;;;:::i;:::-;;;;;;;;51058:31;;;;;;;;;;;;51051:1;51053;51051:4;;;;;;;;:::i;:::-;;;;;;;:38;;;;;51031:3;;;;:::i;:::-;;;50995:106;;;;51128:1;51121:8;;;50752:385;;;;;;:::o;39437:379::-;39500:21;39534:14;39551:23;39568:5;39551:16;:23::i;:::-;39534:40;;39585:18;39620:6;39606:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39585:42;;39692:9;39687:93;39711:6;39707:1;:10;39687:93;;;39746:12;:19;39759:5;39746:19;;;;;;;;;;;;;;;:22;39766:1;39746:22;;;;;;;;;;;;39739:1;39741;39739:4;;;;;;;;:::i;:::-;;;;;;;:29;;;;;39719:3;;;;:::i;:::-;;;39687:93;;;;39807:1;39800:8;;;;39437:379;;;:::o;17153:292::-;17255:4;17294:25;17279:40;;;:11;:40;;;;:105;;;;17351:33;17336:48;;;:11;:48;;;;17279:105;:158;;;;17401:36;17425:11;17401:23;:36::i;:::-;17279:158;17272:165;;17153:292;;;:::o;22111:127::-;22176:4;22228:1;22200:30;;:7;:16;22208:7;22200:16;;;;;;;;;;;;;;;;;;;;;:30;;;;22193:37;;22111:127;;;:::o;23752:174::-;23854:2;23827:15;:24;23843:7;23827:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;23910:7;23906:2;23872:46;;23881:23;23896:7;23881:14;:23::i;:::-;23872:46;;;;;;;;;;;;23752:174;;:::o;22405:348::-;22498:4;22523:16;22531:7;22523;:16::i;:::-;22515:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22599:13;22615:23;22630:7;22615:14;:23::i;:::-;22599:39;;22668:5;22657:16;;:7;:16;;;:51;;;;22701:7;22677:31;;:20;22689:7;22677:11;:20::i;:::-;:31;;;22657:51;:87;;;;22712:32;22729:5;22736:7;22712:16;:32::i;:::-;22657:87;22649:96;;;22405:348;;;;:::o;23090:544::-;23215:4;23188:31;;:23;23203:7;23188:14;:23::i;:::-;:31;;;23180:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;23298:1;23284:16;;:2;:16;;;;23276:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;23354:39;23375:4;23381:2;23385:7;23354:20;:39::i;:::-;23458:29;23475:1;23479:7;23458:8;:29::i;:::-;23519:1;23500:9;:15;23510:4;23500:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;23548:1;23531:9;:13;23541:2;23531:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;23579:2;23560:7;:16;23568:7;23560:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;23618:7;23614:2;23599:27;;23608:4;23599:27;;;;;;;;;;;;23090:544;;;:::o;33070:115::-;33123:15;33166:10;33151:26;;33070:115;:::o;21526:272::-;21640:28;21650:4;21656:2;21660:7;21640:9;:28::i;:::-;21687:48;21710:4;21716:2;21720:7;21729:5;21687:22;:48::i;:::-;21679:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;21526:272;;;;:::o;40429:555::-;40539:45;40566:4;40572:2;40576:7;40539:26;:45::i;:::-;40617:1;40601:18;;:4;:18;;;40597:187;;;40636:40;40668:7;40636:31;:40::i;:::-;40597:187;;;40706:2;40698:10;;:4;:10;;;40694:90;;40725:47;40758:4;40764:7;40725:32;:47::i;:::-;40694:90;40597:187;40812:1;40798:16;;:2;:16;;;40794:183;;;40831:45;40868:7;40831:36;:45::i;:::-;40794:183;;;40904:4;40898:10;;:2;:10;;;40894:83;;40925:40;40953:2;40957:7;40925:27;:40::i;:::-;40894:83;40794:183;40429:555;;;:::o;7887:422::-;7947:4;8155:12;8266:7;8254:20;8246:28;;8300:1;8293:4;:8;8286:15;;;7887:422;;;:::o;24491:842::-;24613:4;24639:15;:2;:13;;;:15::i;:::-;24635:691;;;24691:2;24675:36;;;24712:10;24724:4;24730:7;24739:5;24675:70;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;24671:600;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24936:1;24919:6;:13;:18;24915:341;;;24962:60;;;;;;;;;;:::i;:::-;;;;;;;;24915:341;25206:6;25200:13;25191:6;25187:2;25183:15;25176:38;24671:600;24806:45;;;24796:55;;;:6;:55;;;;24789:62;;;;;24635:691;25310:4;25303:11;;24491:842;;;;;;;:::o;15990:158::-;16075:4;15973:10;16114:26;;16099:41;;;:11;:41;;;;16092:48;;15990:158;;;:::o;25946:93::-;;;;:::o;41707:164::-;41811:10;:17;;;;41784:15;:24;41800:7;41784:24;;;;;;;;;;;:44;;;;41839:10;41855:7;41839:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41707:164;:::o;42498:988::-;42764:22;42814:1;42789:22;42806:4;42789:16;:22::i;:::-;:26;;;;:::i;:::-;42764:51;;42826:18;42847:17;:26;42865:7;42847:26;;;;;;;;;;;;42826:47;;42994:14;42980:10;:28;42976:328;;43025:19;43047:12;:18;43060:4;43047:18;;;;;;;;;;;;;;;:34;43066:14;43047:34;;;;;;;;;;;;43025:56;;43131:11;43098:12;:18;43111:4;43098:18;;;;;;;;;;;;;;;:30;43117:10;43098:30;;;;;;;;;;;:44;;;;43248:10;43215:17;:30;43233:11;43215:30;;;;;;;;;;;:43;;;;43010:294;42976:328;43400:17;:26;43418:7;43400:26;;;;;;;;;;;43393:33;;;43444:12;:18;43457:4;43444:18;;;;;;;;;;;;;;;:34;43463:14;43444:34;;;;;;;;;;;43437:41;;;42579:907;;42498:988;;:::o;43781:1079::-;44034:22;44079:1;44059:10;:17;;;;:21;;;;:::i;:::-;44034:46;;44091:18;44112:15;:24;44128:7;44112:24;;;;;;;;;;;;44091:45;;44463:19;44485:10;44496:14;44485:26;;;;;;;;:::i;:::-;;;;;;;;;;44463:48;;44549:11;44524:10;44535;44524:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44660:10;44629:15;:28;44645:11;44629:28;;;;;;;;;;;:41;;;;44801:15;:24;44817:7;44801:24;;;;;;;;;;;44794:31;;;44836:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43852:1008;;;43781:1079;:::o;41285:221::-;41370:14;41387:20;41404:2;41387:16;:20::i;:::-;41370:37;;41445:7;41418:12;:16;41431:2;41418:16;;;;;;;;;;;;;;;:24;41435:6;41418:24;;;;;;;;;;;:34;;;;41492:6;41463:17;:26;41481:7;41463:26;;;;;;;;;;;:35;;;;41359:147;41285:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1176:::-;1249:8;1259:6;1309:3;1302:4;1294:6;1290:17;1286:27;1276:122;;1317:79;;:::i;:::-;1276:122;1430:6;1417:20;1407:30;;1460:18;1452:6;1449:30;1446:117;;;1482:79;;:::i;:::-;1446:117;1596:4;1588:6;1584:17;1572:29;;1650:3;1642:4;1634:6;1630:17;1620:8;1616:32;1613:41;1610:128;;;1657:79;;:::i;:::-;1610:128;1176:568;;;;;:::o;1766:580::-;1851:8;1861:6;1911:3;1904:4;1896:6;1892:17;1888:27;1878:122;;1919:79;;:::i;:::-;1878:122;2032:6;2019:20;2009:30;;2062:18;2054:6;2051:30;2048:117;;;2084:79;;:::i;:::-;2048:117;2198:4;2190:6;2186:17;2174:29;;2252:3;2244:4;2236:6;2232:17;2222:8;2218:32;2215:41;2212:128;;;2259:79;;:::i;:::-;2212:128;1766:580;;;;;:::o;2369:568::-;2442:8;2452:6;2502:3;2495:4;2487:6;2483:17;2479:27;2469:122;;2510:79;;:::i;:::-;2469:122;2623:6;2610:20;2600:30;;2653:18;2645:6;2642:30;2639:117;;;2675:79;;:::i;:::-;2639:117;2789:4;2781:6;2777:17;2765:29;;2843:3;2835:4;2827:6;2823:17;2813:8;2809:32;2806:41;2803:128;;;2850:79;;:::i;:::-;2803:128;2369:568;;;;;:::o;2943:133::-;2986:5;3024:6;3011:20;3002:29;;3040:30;3064:5;3040:30;:::i;:::-;2943:133;;;;:::o;3082:139::-;3128:5;3166:6;3153:20;3144:29;;3182:33;3209:5;3182:33;:::i;:::-;3082:139;;;;:::o;3227:137::-;3272:5;3310:6;3297:20;3288:29;;3326:32;3352:5;3326:32;:::i;:::-;3227:137;;;;:::o;3370:141::-;3426:5;3457:6;3451:13;3442:22;;3473:32;3499:5;3473:32;:::i;:::-;3370:141;;;;:::o;3530:338::-;3585:5;3634:3;3627:4;3619:6;3615:17;3611:27;3601:122;;3642:79;;:::i;:::-;3601:122;3759:6;3746:20;3784:78;3858:3;3850:6;3843:4;3835:6;3831:17;3784:78;:::i;:::-;3775:87;;3591:277;3530:338;;;;:::o;3888:553::-;3946:8;3956:6;4006:3;3999:4;3991:6;3987:17;3983:27;3973:122;;4014:79;;:::i;:::-;3973:122;4127:6;4114:20;4104:30;;4157:18;4149:6;4146:30;4143:117;;;4179:79;;:::i;:::-;4143:117;4293:4;4285:6;4281:17;4269:29;;4347:3;4339:4;4331:6;4327:17;4317:8;4313:32;4310:41;4307:128;;;4354:79;;:::i;:::-;4307:128;3888:553;;;;;:::o;4447:139::-;4493:5;4531:6;4518:20;4509:29;;4547:33;4574:5;4547:33;:::i;:::-;4447:139;;;;:::o;4592:329::-;4651:6;4700:2;4688:9;4679:7;4675:23;4671:32;4668:119;;;4706:79;;:::i;:::-;4668:119;4826:1;4851:53;4896:7;4887:6;4876:9;4872:22;4851:53;:::i;:::-;4841:63;;4797:117;4592:329;;;;:::o;4927:474::-;4995:6;5003;5052:2;5040:9;5031:7;5027:23;5023:32;5020:119;;;5058:79;;:::i;:::-;5020:119;5178:1;5203:53;5248:7;5239:6;5228:9;5224:22;5203:53;:::i;:::-;5193:63;;5149:117;5305:2;5331:53;5376:7;5367:6;5356:9;5352:22;5331:53;:::i;:::-;5321:63;;5276:118;4927:474;;;;;:::o;5407:619::-;5484:6;5492;5500;5549:2;5537:9;5528:7;5524:23;5520:32;5517:119;;;5555:79;;:::i;:::-;5517:119;5675:1;5700:53;5745:7;5736:6;5725:9;5721:22;5700:53;:::i;:::-;5690:63;;5646:117;5802:2;5828:53;5873:7;5864:6;5853:9;5849:22;5828:53;:::i;:::-;5818:63;;5773:118;5930:2;5956:53;6001:7;5992:6;5981:9;5977:22;5956:53;:::i;:::-;5946:63;;5901:118;5407:619;;;;;:::o;6032:943::-;6127:6;6135;6143;6151;6200:3;6188:9;6179:7;6175:23;6171:33;6168:120;;;6207:79;;:::i;:::-;6168:120;6327:1;6352:53;6397:7;6388:6;6377:9;6373:22;6352:53;:::i;:::-;6342:63;;6298:117;6454:2;6480:53;6525:7;6516:6;6505:9;6501:22;6480:53;:::i;:::-;6470:63;;6425:118;6582:2;6608:53;6653:7;6644:6;6633:9;6629:22;6608:53;:::i;:::-;6598:63;;6553:118;6738:2;6727:9;6723:18;6710:32;6769:18;6761:6;6758:30;6755:117;;;6791:79;;:::i;:::-;6755:117;6896:62;6950:7;6941:6;6930:9;6926:22;6896:62;:::i;:::-;6886:72;;6681:287;6032:943;;;;;;;:::o;6981:1079::-;7112:6;7120;7128;7136;7144;7193:2;7181:9;7172:7;7168:23;7164:32;7161:119;;;7199:79;;:::i;:::-;7161:119;7319:1;7344:53;7389:7;7380:6;7369:9;7365:22;7344:53;:::i;:::-;7334:63;;7290:117;7474:2;7463:9;7459:18;7446:32;7505:18;7497:6;7494:30;7491:117;;;7527:79;;:::i;:::-;7491:117;7640:80;7712:7;7703:6;7692:9;7688:22;7640:80;:::i;:::-;7622:98;;;;7417:313;7797:2;7786:9;7782:18;7769:32;7828:18;7820:6;7817:30;7814:117;;;7850:79;;:::i;:::-;7814:117;7963:80;8035:7;8026:6;8015:9;8011:22;7963:80;:::i;:::-;7945:98;;;;7740:313;6981:1079;;;;;;;;:::o;8066:468::-;8131:6;8139;8188:2;8176:9;8167:7;8163:23;8159:32;8156:119;;;8194:79;;:::i;:::-;8156:119;8314:1;8339:53;8384:7;8375:6;8364:9;8360:22;8339:53;:::i;:::-;8329:63;;8285:117;8441:2;8467:50;8509:7;8500:6;8489:9;8485:22;8467:50;:::i;:::-;8457:60;;8412:115;8066:468;;;;;:::o;8540:474::-;8608:6;8616;8665:2;8653:9;8644:7;8640:23;8636:32;8633:119;;;8671:79;;:::i;:::-;8633:119;8791:1;8816:53;8861:7;8852:6;8841:9;8837:22;8816:53;:::i;:::-;8806:63;;8762:117;8918:2;8944:53;8989:7;8980:6;8969:9;8965:22;8944:53;:::i;:::-;8934:63;;8889:118;8540:474;;;;;:::o;9020:934::-;9142:6;9150;9158;9166;9215:2;9203:9;9194:7;9190:23;9186:32;9183:119;;;9221:79;;:::i;:::-;9183:119;9369:1;9358:9;9354:17;9341:31;9399:18;9391:6;9388:30;9385:117;;;9421:79;;:::i;:::-;9385:117;9534:80;9606:7;9597:6;9586:9;9582:22;9534:80;:::i;:::-;9516:98;;;;9312:312;9691:2;9680:9;9676:18;9663:32;9722:18;9714:6;9711:30;9708:117;;;9744:79;;:::i;:::-;9708:117;9857:80;9929:7;9920:6;9909:9;9905:22;9857:80;:::i;:::-;9839:98;;;;9634:313;9020:934;;;;;;;:::o;9960:1309::-;10118:6;10126;10134;10142;10150;10158;10207:2;10195:9;10186:7;10182:23;10178:32;10175:119;;;10213:79;;:::i;:::-;10175:119;10361:1;10350:9;10346:17;10333:31;10391:18;10383:6;10380:30;10377:117;;;10413:79;;:::i;:::-;10377:117;10526:80;10598:7;10589:6;10578:9;10574:22;10526:80;:::i;:::-;10508:98;;;;10304:312;10683:2;10672:9;10668:18;10655:32;10714:18;10706:6;10703:30;10700:117;;;10736:79;;:::i;:::-;10700:117;10849:80;10921:7;10912:6;10901:9;10897:22;10849:80;:::i;:::-;10831:98;;;;10626:313;11006:2;10995:9;10991:18;10978:32;11037:18;11029:6;11026:30;11023:117;;;11059:79;;:::i;:::-;11023:117;11172:80;11244:7;11235:6;11224:9;11220:22;11172:80;:::i;:::-;11154:98;;;;10949:313;9960:1309;;;;;;;;:::o;11275:559::-;11361:6;11369;11418:2;11406:9;11397:7;11393:23;11389:32;11386:119;;;11424:79;;:::i;:::-;11386:119;11572:1;11561:9;11557:17;11544:31;11602:18;11594:6;11591:30;11588:117;;;11624:79;;:::i;:::-;11588:117;11737:80;11809:7;11800:6;11789:9;11785:22;11737:80;:::i;:::-;11719:98;;;;11515:312;11275:559;;;;;:::o;11840:1309::-;11998:6;12006;12014;12022;12030;12038;12087:2;12075:9;12066:7;12062:23;12058:32;12055:119;;;12093:79;;:::i;:::-;12055:119;12241:1;12230:9;12226:17;12213:31;12271:18;12263:6;12260:30;12257:117;;;12293:79;;:::i;:::-;12257:117;12406:80;12478:7;12469:6;12458:9;12454:22;12406:80;:::i;:::-;12388:98;;;;12184:312;12563:2;12552:9;12548:18;12535:32;12594:18;12586:6;12583:30;12580:117;;;12616:79;;:::i;:::-;12580:117;12729:80;12801:7;12792:6;12781:9;12777:22;12729:80;:::i;:::-;12711:98;;;;12506:313;12886:2;12875:9;12871:18;12858:32;12917:18;12909:6;12906:30;12903:117;;;12939:79;;:::i;:::-;12903:117;13052:80;13124:7;13115:6;13104:9;13100:22;13052:80;:::i;:::-;13034:98;;;;12829:313;11840:1309;;;;;;;;:::o;13155:1079::-;13286:6;13294;13302;13310;13318;13367:2;13355:9;13346:7;13342:23;13338:32;13335:119;;;13373:79;;:::i;:::-;13335:119;13521:1;13510:9;13506:17;13493:31;13551:18;13543:6;13540:30;13537:117;;;13573:79;;:::i;:::-;13537:117;13686:80;13758:7;13749:6;13738:9;13734:22;13686:80;:::i;:::-;13668:98;;;;13464:312;13843:2;13832:9;13828:18;13815:32;13874:18;13866:6;13863:30;13860:117;;;13896:79;;:::i;:::-;13860:117;14009:80;14081:7;14072:6;14061:9;14057:22;14009:80;:::i;:::-;13991:98;;;;13786:313;14138:2;14164:53;14209:7;14200:6;14189:9;14185:22;14164:53;:::i;:::-;14154:63;;14109:118;13155:1079;;;;;;;;:::o;14240:958::-;14374:6;14382;14390;14398;14447:2;14435:9;14426:7;14422:23;14418:32;14415:119;;;14453:79;;:::i;:::-;14415:119;14601:1;14590:9;14586:17;14573:31;14631:18;14623:6;14620:30;14617:117;;;14653:79;;:::i;:::-;14617:117;14766:80;14838:7;14829:6;14818:9;14814:22;14766:80;:::i;:::-;14748:98;;;;14544:312;14923:2;14912:9;14908:18;14895:32;14954:18;14946:6;14943:30;14940:117;;;14976:79;;:::i;:::-;14940:117;15089:92;15173:7;15164:6;15153:9;15149:22;15089:92;:::i;:::-;15071:110;;;;14866:325;14240:958;;;;;;;:::o;15204:934::-;15326:6;15334;15342;15350;15399:2;15387:9;15378:7;15374:23;15370:32;15367:119;;;15405:79;;:::i;:::-;15367:119;15553:1;15542:9;15538:17;15525:31;15583:18;15575:6;15572:30;15569:117;;;15605:79;;:::i;:::-;15569:117;15718:80;15790:7;15781:6;15770:9;15766:22;15718:80;:::i;:::-;15700:98;;;;15496:312;15875:2;15864:9;15860:18;15847:32;15906:18;15898:6;15895:30;15892:117;;;15928:79;;:::i;:::-;15892:117;16041:80;16113:7;16104:6;16093:9;16089:22;16041:80;:::i;:::-;16023:98;;;;15818:313;15204:934;;;;;;;:::o;16144:704::-;16239:6;16247;16255;16304:2;16292:9;16283:7;16279:23;16275:32;16272:119;;;16310:79;;:::i;:::-;16272:119;16430:1;16455:53;16500:7;16491:6;16480:9;16476:22;16455:53;:::i;:::-;16445:63;;16401:117;16585:2;16574:9;16570:18;16557:32;16616:18;16608:6;16605:30;16602:117;;;16638:79;;:::i;:::-;16602:117;16751:80;16823:7;16814:6;16803:9;16799:22;16751:80;:::i;:::-;16733:98;;;;16528:313;16144:704;;;;;:::o;16854:1079::-;16985:6;16993;17001;17009;17017;17066:2;17054:9;17045:7;17041:23;17037:32;17034:119;;;17072:79;;:::i;:::-;17034:119;17192:1;17217:53;17262:7;17253:6;17242:9;17238:22;17217:53;:::i;:::-;17207:63;;17163:117;17347:2;17336:9;17332:18;17319:32;17378:18;17370:6;17367:30;17364:117;;;17400:79;;:::i;:::-;17364:117;17513:80;17585:7;17576:6;17565:9;17561:22;17513:80;:::i;:::-;17495:98;;;;17290:313;17670:2;17659:9;17655:18;17642:32;17701:18;17693:6;17690:30;17687:117;;;17723:79;;:::i;:::-;17687:117;17836:80;17908:7;17899:6;17888:9;17884:22;17836:80;:::i;:::-;17818:98;;;;17613:313;16854:1079;;;;;;;;:::o;17939:474::-;18007:6;18015;18064:2;18052:9;18043:7;18039:23;18035:32;18032:119;;;18070:79;;:::i;:::-;18032:119;18190:1;18215:53;18260:7;18251:6;18240:9;18236:22;18215:53;:::i;:::-;18205:63;;18161:117;18317:2;18343:53;18388:7;18379:6;18368:9;18364:22;18343:53;:::i;:::-;18333:63;;18288:118;17939:474;;;;;:::o;18419:619::-;18496:6;18504;18512;18561:2;18549:9;18540:7;18536:23;18532:32;18529:119;;;18567:79;;:::i;:::-;18529:119;18687:1;18712:53;18757:7;18748:6;18737:9;18733:22;18712:53;:::i;:::-;18702:63;;18658:117;18814:2;18840:53;18885:7;18876:6;18865:9;18861:22;18840:53;:::i;:::-;18830:63;;18785:118;18942:2;18968:53;19013:7;19004:6;18993:9;18989:22;18968:53;:::i;:::-;18958:63;;18913:118;18419:619;;;;;:::o;19044:327::-;19102:6;19151:2;19139:9;19130:7;19126:23;19122:32;19119:119;;;19157:79;;:::i;:::-;19119:119;19277:1;19302:52;19346:7;19337:6;19326:9;19322:22;19302:52;:::i;:::-;19292:62;;19248:116;19044:327;;;;:::o;19377:349::-;19446:6;19495:2;19483:9;19474:7;19470:23;19466:32;19463:119;;;19501:79;;:::i;:::-;19463:119;19621:1;19646:63;19701:7;19692:6;19681:9;19677:22;19646:63;:::i;:::-;19636:73;;19592:127;19377:349;;;;:::o;19732:529::-;19803:6;19811;19860:2;19848:9;19839:7;19835:23;19831:32;19828:119;;;19866:79;;:::i;:::-;19828:119;20014:1;20003:9;19999:17;19986:31;20044:18;20036:6;20033:30;20030:117;;;20066:79;;:::i;:::-;20030:117;20179:65;20236:7;20227:6;20216:9;20212:22;20179:65;:::i;:::-;20161:83;;;;19957:297;19732:529;;;;;:::o;20267:329::-;20326:6;20375:2;20363:9;20354:7;20350:23;20346:32;20343:119;;;20381:79;;:::i;:::-;20343:119;20501:1;20526:53;20571:7;20562:6;20551:9;20547:22;20526:53;:::i;:::-;20516:63;;20472:117;20267:329;;;;:::o;20602:619::-;20679:6;20687;20695;20744:2;20732:9;20723:7;20719:23;20715:32;20712:119;;;20750:79;;:::i;:::-;20712:119;20870:1;20895:53;20940:7;20931:6;20920:9;20916:22;20895:53;:::i;:::-;20885:63;;20841:117;20997:2;21023:53;21068:7;21059:6;21048:9;21044:22;21023:53;:::i;:::-;21013:63;;20968:118;21125:2;21151:53;21196:7;21187:6;21176:9;21172:22;21151:53;:::i;:::-;21141:63;;21096:118;20602:619;;;;;:::o;21227:674::-;21307:6;21315;21323;21372:2;21360:9;21351:7;21347:23;21343:32;21340:119;;;21378:79;;:::i;:::-;21340:119;21498:1;21523:53;21568:7;21559:6;21548:9;21544:22;21523:53;:::i;:::-;21513:63;;21469:117;21653:2;21642:9;21638:18;21625:32;21684:18;21676:6;21673:30;21670:117;;;21706:79;;:::i;:::-;21670:117;21819:65;21876:7;21867:6;21856:9;21852:22;21819:65;:::i;:::-;21801:83;;;;21596:298;21227:674;;;;;:::o;21907:474::-;21975:6;21983;22032:2;22020:9;22011:7;22007:23;22003:32;22000:119;;;22038:79;;:::i;:::-;22000:119;22158:1;22183:53;22228:7;22219:6;22208:9;22204:22;22183:53;:::i;:::-;22173:63;;22129:117;22285:2;22311:53;22356:7;22347:6;22336:9;22332:22;22311:53;:::i;:::-;22301:63;;22256:118;21907:474;;;;;:::o;22387:196::-;22476:10;22511:66;22573:3;22565:6;22511:66;:::i;:::-;22497:80;;22387:196;;;;:::o;22589:179::-;22658:10;22679:46;22721:3;22713:6;22679:46;:::i;:::-;22757:4;22752:3;22748:14;22734:28;;22589:179;;;;:::o;22774:118::-;22861:24;22879:5;22861:24;:::i;:::-;22856:3;22849:37;22774:118;;:::o;22926:991::-;23065:3;23094:64;23152:5;23094:64;:::i;:::-;23174:96;23263:6;23258:3;23174:96;:::i;:::-;23167:103;;23296:3;23341:4;23333:6;23329:17;23324:3;23320:27;23371:66;23431:5;23371:66;:::i;:::-;23460:7;23491:1;23476:396;23501:6;23498:1;23495:13;23476:396;;;23572:9;23566:4;23562:20;23557:3;23550:33;23623:6;23617:13;23651:84;23730:4;23715:13;23651:84;:::i;:::-;23643:92;;23758:70;23821:6;23758:70;:::i;:::-;23748:80;;23857:4;23852:3;23848:14;23841:21;;23536:336;23523:1;23520;23516:9;23511:14;;23476:396;;;23480:14;23888:4;23881:11;;23908:3;23901:10;;23070:847;;;;;22926:991;;;;:::o;23953:732::-;24072:3;24101:54;24149:5;24101:54;:::i;:::-;24171:86;24250:6;24245:3;24171:86;:::i;:::-;24164:93;;24281:56;24331:5;24281:56;:::i;:::-;24360:7;24391:1;24376:284;24401:6;24398:1;24395:13;24376:284;;;24477:6;24471:13;24504:63;24563:3;24548:13;24504:63;:::i;:::-;24497:70;;24590:60;24643:6;24590:60;:::i;:::-;24580:70;;24436:224;24423:1;24420;24416:9;24411:14;;24376:284;;;24380:14;24676:3;24669:10;;24077:608;;;23953:732;;;;:::o;24691:109::-;24772:21;24787:5;24772:21;:::i;:::-;24767:3;24760:34;24691:109;;:::o;24806:360::-;24892:3;24920:38;24952:5;24920:38;:::i;:::-;24974:70;25037:6;25032:3;24974:70;:::i;:::-;24967:77;;25053:52;25098:6;25093:3;25086:4;25079:5;25075:16;25053:52;:::i;:::-;25130:29;25152:6;25130:29;:::i;:::-;25125:3;25121:39;25114:46;;24896:270;24806:360;;;;:::o;25196:304::-;25294:3;25315:71;25379:6;25374:3;25315:71;:::i;:::-;25308:78;;25396:43;25432:6;25427:3;25420:5;25396:43;:::i;:::-;25464:29;25486:6;25464:29;:::i;:::-;25459:3;25455:39;25448:46;;25196:304;;;;;:::o;25506:344::-;25584:3;25612:39;25645:5;25612:39;:::i;:::-;25667:61;25721:6;25716:3;25667:61;:::i;:::-;25660:68;;25737:52;25782:6;25777:3;25770:4;25763:5;25759:16;25737:52;:::i;:::-;25814:29;25836:6;25814:29;:::i;:::-;25809:3;25805:39;25798:46;;25588:262;25506:344;;;;:::o;25856:364::-;25944:3;25972:39;26005:5;25972:39;:::i;:::-;26027:71;26091:6;26086:3;26027:71;:::i;:::-;26020:78;;26107:52;26152:6;26147:3;26140:4;26133:5;26129:16;26107:52;:::i;:::-;26184:29;26206:6;26184:29;:::i;:::-;26179:3;26175:39;26168:46;;25948:272;25856:364;;;;:::o;26250:845::-;26353:3;26390:5;26384:12;26419:36;26445:9;26419:36;:::i;:::-;26471:89;26553:6;26548:3;26471:89;:::i;:::-;26464:96;;26591:1;26580:9;26576:17;26607:1;26602:137;;;;26753:1;26748:341;;;;26569:520;;26602:137;26686:4;26682:9;26671;26667:25;26662:3;26655:38;26722:6;26717:3;26713:16;26706:23;;26602:137;;26748:341;26815:38;26847:5;26815:38;:::i;:::-;26875:1;26889:154;26903:6;26900:1;26897:13;26889:154;;;26977:7;26971:14;26967:1;26962:3;26958:11;26951:35;27027:1;27018:7;27014:15;27003:26;;26925:4;26922:1;26918:12;26913:17;;26889:154;;;27072:6;27067:3;27063:16;27056:23;;26755:334;;26569:520;;26357:738;;26250:845;;;;:::o;27101:366::-;27243:3;27264:67;27328:2;27323:3;27264:67;:::i;:::-;27257:74;;27340:93;27429:3;27340:93;:::i;:::-;27458:2;27453:3;27449:12;27442:19;;27101:366;;;:::o;27473:::-;27615:3;27636:67;27700:2;27695:3;27636:67;:::i;:::-;27629:74;;27712:93;27801:3;27712:93;:::i;:::-;27830:2;27825:3;27821:12;27814:19;;27473:366;;;:::o;27845:::-;27987:3;28008:67;28072:2;28067:3;28008:67;:::i;:::-;28001:74;;28084:93;28173:3;28084:93;:::i;:::-;28202:2;28197:3;28193:12;28186:19;;27845:366;;;:::o;28217:::-;28359:3;28380:67;28444:2;28439:3;28380:67;:::i;:::-;28373:74;;28456:93;28545:3;28456:93;:::i;:::-;28574:2;28569:3;28565:12;28558:19;;28217:366;;;:::o;28589:::-;28731:3;28752:67;28816:2;28811:3;28752:67;:::i;:::-;28745:74;;28828:93;28917:3;28828:93;:::i;:::-;28946:2;28941:3;28937:12;28930:19;;28589:366;;;:::o;28961:::-;29103:3;29124:67;29188:2;29183:3;29124:67;:::i;:::-;29117:74;;29200:93;29289:3;29200:93;:::i;:::-;29318:2;29313:3;29309:12;29302:19;;28961:366;;;:::o;29333:::-;29475:3;29496:67;29560:2;29555:3;29496:67;:::i;:::-;29489:74;;29572:93;29661:3;29572:93;:::i;:::-;29690:2;29685:3;29681:12;29674:19;;29333:366;;;:::o;29705:::-;29847:3;29868:67;29932:2;29927:3;29868:67;:::i;:::-;29861:74;;29944:93;30033:3;29944:93;:::i;:::-;30062:2;30057:3;30053:12;30046:19;;29705:366;;;:::o;30077:::-;30219:3;30240:67;30304:2;30299:3;30240:67;:::i;:::-;30233:74;;30316:93;30405:3;30316:93;:::i;:::-;30434:2;30429:3;30425:12;30418:19;;30077:366;;;:::o;30449:::-;30591:3;30612:67;30676:2;30671:3;30612:67;:::i;:::-;30605:74;;30688:93;30777:3;30688:93;:::i;:::-;30806:2;30801:3;30797:12;30790:19;;30449:366;;;:::o;30821:::-;30963:3;30984:67;31048:2;31043:3;30984:67;:::i;:::-;30977:74;;31060:93;31149:3;31060:93;:::i;:::-;31178:2;31173:3;31169:12;31162:19;;30821:366;;;:::o;31193:::-;31335:3;31356:67;31420:2;31415:3;31356:67;:::i;:::-;31349:74;;31432:93;31521:3;31432:93;:::i;:::-;31550:2;31545:3;31541:12;31534:19;;31193:366;;;:::o;31565:::-;31707:3;31728:67;31792:2;31787:3;31728:67;:::i;:::-;31721:74;;31804:93;31893:3;31804:93;:::i;:::-;31922:2;31917:3;31913:12;31906:19;;31565:366;;;:::o;31937:::-;32079:3;32100:67;32164:2;32159:3;32100:67;:::i;:::-;32093:74;;32176:93;32265:3;32176:93;:::i;:::-;32294:2;32289:3;32285:12;32278:19;;31937:366;;;:::o;32309:::-;32451:3;32472:67;32536:2;32531:3;32472:67;:::i;:::-;32465:74;;32548:93;32637:3;32548:93;:::i;:::-;32666:2;32661:3;32657:12;32650:19;;32309:366;;;:::o;32681:::-;32823:3;32844:67;32908:2;32903:3;32844:67;:::i;:::-;32837:74;;32920:93;33009:3;32920:93;:::i;:::-;33038:2;33033:3;33029:12;33022:19;;32681:366;;;:::o;33053:::-;33195:3;33216:67;33280:2;33275:3;33216:67;:::i;:::-;33209:74;;33292:93;33381:3;33292:93;:::i;:::-;33410:2;33405:3;33401:12;33394:19;;33053:366;;;:::o;33425:::-;33567:3;33588:67;33652:2;33647:3;33588:67;:::i;:::-;33581:74;;33664:93;33753:3;33664:93;:::i;:::-;33782:2;33777:3;33773:12;33766:19;;33425:366;;;:::o;33797:::-;33939:3;33960:67;34024:2;34019:3;33960:67;:::i;:::-;33953:74;;34036:93;34125:3;34036:93;:::i;:::-;34154:2;34149:3;34145:12;34138:19;;33797:366;;;:::o;34169:::-;34311:3;34332:67;34396:2;34391:3;34332:67;:::i;:::-;34325:74;;34408:93;34497:3;34408:93;:::i;:::-;34526:2;34521:3;34517:12;34510:19;;34169:366;;;:::o;34541:::-;34683:3;34704:67;34768:2;34763:3;34704:67;:::i;:::-;34697:74;;34780:93;34869:3;34780:93;:::i;:::-;34898:2;34893:3;34889:12;34882:19;;34541:366;;;:::o;34913:::-;35055:3;35076:67;35140:2;35135:3;35076:67;:::i;:::-;35069:74;;35152:93;35241:3;35152:93;:::i;:::-;35270:2;35265:3;35261:12;35254:19;;34913:366;;;:::o;35285:::-;35427:3;35448:67;35512:2;35507:3;35448:67;:::i;:::-;35441:74;;35524:93;35613:3;35524:93;:::i;:::-;35642:2;35637:3;35633:12;35626:19;;35285:366;;;:::o;35657:108::-;35734:24;35752:5;35734:24;:::i;:::-;35729:3;35722:37;35657:108;;:::o;35771:118::-;35858:24;35876:5;35858:24;:::i;:::-;35853:3;35846:37;35771:118;;:::o;35895:423::-;36069:3;36091:92;36179:3;36170:6;36091:92;:::i;:::-;36084:99;;36200:92;36288:3;36279:6;36200:92;:::i;:::-;36193:99;;36309:3;36302:10;;35895:423;;;;;:::o;36324:222::-;36417:4;36455:2;36444:9;36440:18;36432:26;;36468:71;36536:1;36525:9;36521:17;36512:6;36468:71;:::i;:::-;36324:222;;;;:::o;36552:640::-;36747:4;36785:3;36774:9;36770:19;36762:27;;36799:71;36867:1;36856:9;36852:17;36843:6;36799:71;:::i;:::-;36880:72;36948:2;36937:9;36933:18;36924:6;36880:72;:::i;:::-;36962;37030:2;37019:9;37015:18;37006:6;36962:72;:::i;:::-;37081:9;37075:4;37071:20;37066:2;37055:9;37051:18;37044:48;37109:76;37180:4;37171:6;37109:76;:::i;:::-;37101:84;;36552:640;;;;;;;:::o;37198:413::-;37361:4;37399:2;37388:9;37384:18;37376:26;;37448:9;37442:4;37438:20;37434:1;37423:9;37419:17;37412:47;37476:128;37599:4;37590:6;37476:128;:::i;:::-;37468:136;;37198:413;;;;:::o;37617:373::-;37760:4;37798:2;37787:9;37783:18;37775:26;;37847:9;37841:4;37837:20;37833:1;37822:9;37818:17;37811:47;37875:108;37978:4;37969:6;37875:108;:::i;:::-;37867:116;;37617:373;;;;:::o;37996:210::-;38083:4;38121:2;38110:9;38106:18;38098:26;;38134:65;38196:1;38185:9;38181:17;38172:6;38134:65;:::i;:::-;37996:210;;;;:::o;38212:333::-;38335:4;38373:2;38362:9;38358:18;38350:26;;38422:9;38416:4;38412:20;38408:1;38397:9;38393:17;38386:47;38450:88;38533:4;38524:6;38516;38450:88;:::i;:::-;38442:96;;38212:333;;;;;:::o;38551:313::-;38664:4;38702:2;38691:9;38687:18;38679:26;;38751:9;38745:4;38741:20;38737:1;38726:9;38722:17;38715:47;38779:78;38852:4;38843:6;38779:78;:::i;:::-;38771:86;;38551:313;;;;:::o;38870:419::-;39036:4;39074:2;39063:9;39059:18;39051:26;;39123:9;39117:4;39113:20;39109:1;39098:9;39094:17;39087:47;39151:131;39277:4;39151:131;:::i;:::-;39143:139;;38870:419;;;:::o;39295:::-;39461:4;39499:2;39488:9;39484:18;39476:26;;39548:9;39542:4;39538:20;39534:1;39523:9;39519:17;39512:47;39576:131;39702:4;39576:131;:::i;:::-;39568:139;;39295:419;;;:::o;39720:::-;39886:4;39924:2;39913:9;39909:18;39901:26;;39973:9;39967:4;39963:20;39959:1;39948:9;39944:17;39937:47;40001:131;40127:4;40001:131;:::i;:::-;39993:139;;39720:419;;;:::o;40145:::-;40311:4;40349:2;40338:9;40334:18;40326:26;;40398:9;40392:4;40388:20;40384:1;40373:9;40369:17;40362:47;40426:131;40552:4;40426:131;:::i;:::-;40418:139;;40145:419;;;:::o;40570:::-;40736:4;40774:2;40763:9;40759:18;40751:26;;40823:9;40817:4;40813:20;40809:1;40798:9;40794:17;40787:47;40851:131;40977:4;40851:131;:::i;:::-;40843:139;;40570:419;;;:::o;40995:::-;41161:4;41199:2;41188:9;41184:18;41176:26;;41248:9;41242:4;41238:20;41234:1;41223:9;41219:17;41212:47;41276:131;41402:4;41276:131;:::i;:::-;41268:139;;40995:419;;;:::o;41420:::-;41586:4;41624:2;41613:9;41609:18;41601:26;;41673:9;41667:4;41663:20;41659:1;41648:9;41644:17;41637:47;41701:131;41827:4;41701:131;:::i;:::-;41693:139;;41420:419;;;:::o;41845:::-;42011:4;42049:2;42038:9;42034:18;42026:26;;42098:9;42092:4;42088:20;42084:1;42073:9;42069:17;42062:47;42126:131;42252:4;42126:131;:::i;:::-;42118:139;;41845:419;;;:::o;42270:::-;42436:4;42474:2;42463:9;42459:18;42451:26;;42523:9;42517:4;42513:20;42509:1;42498:9;42494:17;42487:47;42551:131;42677:4;42551:131;:::i;:::-;42543:139;;42270:419;;;:::o;42695:::-;42861:4;42899:2;42888:9;42884:18;42876:26;;42948:9;42942:4;42938:20;42934:1;42923:9;42919:17;42912:47;42976:131;43102:4;42976:131;:::i;:::-;42968:139;;42695:419;;;:::o;43120:::-;43286:4;43324:2;43313:9;43309:18;43301:26;;43373:9;43367:4;43363:20;43359:1;43348:9;43344:17;43337:47;43401:131;43527:4;43401:131;:::i;:::-;43393:139;;43120:419;;;:::o;43545:::-;43711:4;43749:2;43738:9;43734:18;43726:26;;43798:9;43792:4;43788:20;43784:1;43773:9;43769:17;43762:47;43826:131;43952:4;43826:131;:::i;:::-;43818:139;;43545:419;;;:::o;43970:::-;44136:4;44174:2;44163:9;44159:18;44151:26;;44223:9;44217:4;44213:20;44209:1;44198:9;44194:17;44187:47;44251:131;44377:4;44251:131;:::i;:::-;44243:139;;43970:419;;;:::o;44395:::-;44561:4;44599:2;44588:9;44584:18;44576:26;;44648:9;44642:4;44638:20;44634:1;44623:9;44619:17;44612:47;44676:131;44802:4;44676:131;:::i;:::-;44668:139;;44395:419;;;:::o;44820:::-;44986:4;45024:2;45013:9;45009:18;45001:26;;45073:9;45067:4;45063:20;45059:1;45048:9;45044:17;45037:47;45101:131;45227:4;45101:131;:::i;:::-;45093:139;;44820:419;;;:::o;45245:::-;45411:4;45449:2;45438:9;45434:18;45426:26;;45498:9;45492:4;45488:20;45484:1;45473:9;45469:17;45462:47;45526:131;45652:4;45526:131;:::i;:::-;45518:139;;45245:419;;;:::o;45670:::-;45836:4;45874:2;45863:9;45859:18;45851:26;;45923:9;45917:4;45913:20;45909:1;45898:9;45894:17;45887:47;45951:131;46077:4;45951:131;:::i;:::-;45943:139;;45670:419;;;:::o;46095:::-;46261:4;46299:2;46288:9;46284:18;46276:26;;46348:9;46342:4;46338:20;46334:1;46323:9;46319:17;46312:47;46376:131;46502:4;46376:131;:::i;:::-;46368:139;;46095:419;;;:::o;46520:::-;46686:4;46724:2;46713:9;46709:18;46701:26;;46773:9;46767:4;46763:20;46759:1;46748:9;46744:17;46737:47;46801:131;46927:4;46801:131;:::i;:::-;46793:139;;46520:419;;;:::o;46945:::-;47111:4;47149:2;47138:9;47134:18;47126:26;;47198:9;47192:4;47188:20;47184:1;47173:9;47169:17;47162:47;47226:131;47352:4;47226:131;:::i;:::-;47218:139;;46945:419;;;:::o;47370:::-;47536:4;47574:2;47563:9;47559:18;47551:26;;47623:9;47617:4;47613:20;47609:1;47598:9;47594:17;47587:47;47651:131;47777:4;47651:131;:::i;:::-;47643:139;;47370:419;;;:::o;47795:::-;47961:4;47999:2;47988:9;47984:18;47976:26;;48048:9;48042:4;48038:20;48034:1;48023:9;48019:17;48012:47;48076:131;48202:4;48076:131;:::i;:::-;48068:139;;47795:419;;;:::o;48220:::-;48386:4;48424:2;48413:9;48409:18;48401:26;;48473:9;48467:4;48463:20;48459:1;48448:9;48444:17;48437:47;48501:131;48627:4;48501:131;:::i;:::-;48493:139;;48220:419;;;:::o;48645:222::-;48738:4;48776:2;48765:9;48761:18;48753:26;;48789:71;48857:1;48846:9;48842:17;48833:6;48789:71;:::i;:::-;48645:222;;;;:::o;48873:725::-;48951:4;48957:6;49013:11;49000:25;49113:1;49107:4;49103:12;49092:8;49076:14;49072:29;49068:48;49048:18;49044:73;49034:168;;49121:79;;:::i;:::-;49034:168;49233:18;49223:8;49219:33;49211:41;;49285:4;49272:18;49262:28;;49313:18;49305:6;49302:30;49299:117;;;49335:79;;:::i;:::-;49299:117;49443:2;49437:4;49433:13;49425:21;;49500:4;49492:6;49488:17;49472:14;49468:38;49462:4;49458:49;49455:136;;;49510:79;;:::i;:::-;49455:136;48964:634;48873:725;;;;;:::o;49604:129::-;49638:6;49665:20;;:::i;:::-;49655:30;;49694:33;49722:4;49714:6;49694:33;:::i;:::-;49604:129;;;:::o;49739:75::-;49772:6;49805:2;49799:9;49789:19;;49739:75;:::o;49820:307::-;49881:4;49971:18;49963:6;49960:30;49957:56;;;49993:18;;:::i;:::-;49957:56;50031:29;50053:6;50031:29;:::i;:::-;50023:37;;50115:4;50109;50105:15;50097:23;;49820:307;;;:::o;50133:142::-;50210:4;50233:3;50225:11;;50263:4;50258:3;50254:14;50246:22;;50133:142;;;:::o;50281:132::-;50348:4;50371:3;50363:11;;50401:4;50396:3;50392:14;50384:22;;50281:132;;;:::o;50419:141::-;50468:4;50491:3;50483:11;;50514:3;50511:1;50504:14;50548:4;50545:1;50535:18;50527:26;;50419:141;;;:::o;50566:124::-;50643:6;50677:5;50671:12;50661:22;;50566:124;;;:::o;50696:114::-;50763:6;50797:5;50791:12;50781:22;;50696:114;;;:::o;50816:98::-;50867:6;50901:5;50895:12;50885:22;;50816:98;;;:::o;50920:99::-;50972:6;51006:5;51000:12;50990:22;;50920:99;;;:::o;51025:123::-;51105:4;51137;51132:3;51128:14;51120:22;;51025:123;;;:::o;51154:113::-;51224:4;51256;51251:3;51247:14;51239:22;;51154:113;;;:::o;51273:194::-;51382:11;51416:6;51411:3;51404:19;51456:4;51451:3;51447:14;51432:29;;51273:194;;;;:::o;51473:184::-;51572:11;51606:6;51601:3;51594:19;51646:4;51641:3;51637:14;51622:29;;51473:184;;;;:::o;51663:168::-;51746:11;51780:6;51775:3;51768:19;51820:4;51815:3;51811:14;51796:29;;51663:168;;;;:::o;51837:159::-;51911:11;51945:6;51940:3;51933:19;51985:4;51980:3;51976:14;51961:29;;51837:159;;;;:::o;52002:169::-;52086:11;52120:6;52115:3;52108:19;52160:4;52155:3;52151:14;52136:29;;52002:169;;;;:::o;52177:148::-;52279:11;52316:3;52301:18;;52177:148;;;;:::o;52331:305::-;52371:3;52390:20;52408:1;52390:20;:::i;:::-;52385:25;;52424:20;52442:1;52424:20;:::i;:::-;52419:25;;52578:1;52510:66;52506:74;52503:1;52500:81;52497:107;;;52584:18;;:::i;:::-;52497:107;52628:1;52625;52621:9;52614:16;;52331:305;;;;:::o;52642:191::-;52682:4;52702:20;52720:1;52702:20;:::i;:::-;52697:25;;52736:20;52754:1;52736:20;:::i;:::-;52731:25;;52775:1;52772;52769:8;52766:34;;;52780:18;;:::i;:::-;52766:34;52825:1;52822;52818:9;52810:17;;52642:191;;;;:::o;52839:96::-;52876:7;52905:24;52923:5;52905:24;:::i;:::-;52894:35;;52839:96;;;:::o;52941:90::-;52975:7;53018:5;53011:13;53004:21;52993:32;;52941:90;;;:::o;53037:77::-;53074:7;53103:5;53092:16;;53037:77;;;:::o;53120:149::-;53156:7;53196:66;53189:5;53185:78;53174:89;;53120:149;;;:::o;53275:126::-;53312:7;53352:42;53345:5;53341:54;53330:65;;53275:126;;;:::o;53407:77::-;53444:7;53473:5;53462:16;;53407:77;;;:::o;53490:154::-;53574:6;53569:3;53564;53551:30;53636:1;53627:6;53622:3;53618:16;53611:27;53490:154;;;:::o;53650:307::-;53718:1;53728:113;53742:6;53739:1;53736:13;53728:113;;;53827:1;53822:3;53818:11;53812:18;53808:1;53803:3;53799:11;53792:39;53764:2;53761:1;53757:10;53752:15;;53728:113;;;53859:6;53856:1;53853:13;53850:101;;;53939:1;53930:6;53925:3;53921:16;53914:27;53850:101;53699:258;53650:307;;;:::o;53963:320::-;54007:6;54044:1;54038:4;54034:12;54024:22;;54091:1;54085:4;54081:12;54112:18;54102:81;;54168:4;54160:6;54156:17;54146:27;;54102:81;54230:2;54222:6;54219:14;54199:18;54196:38;54193:84;;;54249:18;;:::i;:::-;54193:84;54014:269;53963:320;;;:::o;54289:281::-;54372:27;54394:4;54372:27;:::i;:::-;54364:6;54360:40;54502:6;54490:10;54487:22;54466:18;54454:10;54451:34;54448:62;54445:88;;;54513:18;;:::i;:::-;54445:88;54553:10;54549:2;54542:22;54332:238;54289:281;;:::o;54576:233::-;54615:3;54638:24;54656:5;54638:24;:::i;:::-;54629:33;;54684:66;54677:5;54674:77;54671:103;;;54754:18;;:::i;:::-;54671:103;54801:1;54794:5;54790:13;54783:20;;54576:233;;;:::o;54815:180::-;54863:77;54860:1;54853:88;54960:4;54957:1;54950:15;54984:4;54981:1;54974:15;55001:180;55049:77;55046:1;55039:88;55146:4;55143:1;55136:15;55170:4;55167:1;55160:15;55187:180;55235:77;55232:1;55225:88;55332:4;55329:1;55322:15;55356:4;55353:1;55346:15;55373:180;55421:77;55418:1;55411:88;55518:4;55515:1;55508:15;55542:4;55539:1;55532:15;55559:180;55607:77;55604:1;55597:88;55704:4;55701:1;55694:15;55728:4;55725:1;55718:15;55745:117;55854:1;55851;55844:12;55868:117;55977:1;55974;55967:12;55991:117;56100:1;56097;56090:12;56114:117;56223:1;56220;56213:12;56237:117;56346:1;56343;56336:12;56360:117;56469:1;56466;56459:12;56483:117;56592:1;56589;56582:12;56606:117;56715:1;56712;56705:12;56729:117;56838:1;56835;56828:12;56852:102;56893:6;56944:2;56940:7;56935:2;56928:5;56924:14;56920:28;56910:38;;56852:102;;;:::o;56960:230::-;57100:34;57096:1;57088:6;57084:14;57077:58;57169:13;57164:2;57156:6;57152:15;57145:38;56960:230;:::o;57196:237::-;57336:34;57332:1;57324:6;57320:14;57313:58;57405:20;57400:2;57392:6;57388:15;57381:45;57196:237;:::o;57439:225::-;57579:34;57575:1;57567:6;57563:14;57556:58;57648:8;57643:2;57635:6;57631:15;57624:33;57439:225;:::o;57670:178::-;57810:30;57806:1;57798:6;57794:14;57787:54;57670:178;:::o;57854:223::-;57994:34;57990:1;57982:6;57978:14;57971:58;58063:6;58058:2;58050:6;58046:15;58039:31;57854:223;:::o;58083:228::-;58223:34;58219:1;58211:6;58207:14;58200:58;58292:11;58287:2;58279:6;58275:15;58268:36;58083:228;:::o;58317:175::-;58457:27;58453:1;58445:6;58441:14;58434:51;58317:175;:::o;58498:231::-;58638:34;58634:1;58626:6;58622:14;58615:58;58707:14;58702:2;58694:6;58690:15;58683:39;58498:231;:::o;58735:243::-;58875:34;58871:1;58863:6;58859:14;58852:58;58944:26;58939:2;58931:6;58927:15;58920:51;58735:243;:::o;58984:229::-;59124:34;59120:1;59112:6;59108:14;59101:58;59193:12;59188:2;59180:6;59176:15;59169:37;58984:229;:::o;59219:228::-;59359:34;59355:1;59347:6;59343:14;59336:58;59428:11;59423:2;59415:6;59411:15;59404:36;59219:228;:::o;59453:224::-;59593:34;59589:1;59581:6;59577:14;59570:58;59662:7;59657:2;59649:6;59645:15;59638:32;59453:224;:::o;59683:223::-;59823:34;59819:1;59811:6;59807:14;59800:58;59892:6;59887:2;59879:6;59875:15;59868:31;59683:223;:::o;59912:182::-;60052:34;60048:1;60040:6;60036:14;60029:58;59912:182;:::o;60100:231::-;60240:34;60236:1;60228:6;60224:14;60217:58;60309:14;60304:2;60296:6;60292:15;60285:39;60100:231;:::o;60337:182::-;60477:34;60473:1;60465:6;60461:14;60454:58;60337:182;:::o;60525:228::-;60665:34;60661:1;60653:6;60649:14;60642:58;60734:11;60729:2;60721:6;60717:15;60710:36;60525:228;:::o;60759:234::-;60899:34;60895:1;60887:6;60883:14;60876:58;60968:17;60963:2;60955:6;60951:15;60944:42;60759:234;:::o;60999:220::-;61139:34;61135:1;61127:6;61123:14;61116:58;61208:3;61203:2;61195:6;61191:15;61184:28;60999:220;:::o;61225:225::-;61365:34;61361:1;61353:6;61349:14;61342:58;61434:8;61429:2;61421:6;61417:15;61410:33;61225:225;:::o;61456:236::-;61596:34;61592:1;61584:6;61580:14;61573:58;61665:19;61660:2;61652:6;61648:15;61641:44;61456:236;:::o;61698:231::-;61838:34;61834:1;61826:6;61822:14;61815:58;61907:14;61902:2;61894:6;61890:15;61883:39;61698:231;:::o;61935:222::-;62075:34;62071:1;62063:6;62059:14;62052:58;62144:5;62139:2;62131:6;62127:15;62120:30;61935:222;:::o;62163:122::-;62236:24;62254:5;62236:24;:::i;:::-;62229:5;62226:35;62216:63;;62275:1;62272;62265:12;62216:63;62163:122;:::o;62291:116::-;62361:21;62376:5;62361:21;:::i;:::-;62354:5;62351:32;62341:60;;62397:1;62394;62387:12;62341:60;62291:116;:::o;62413:122::-;62486:24;62504:5;62486:24;:::i;:::-;62479:5;62476:35;62466:63;;62525:1;62522;62515:12;62466:63;62413:122;:::o;62541:120::-;62613:23;62630:5;62613:23;:::i;:::-;62606:5;62603:34;62593:62;;62651:1;62648;62641:12;62593:62;62541:120;:::o;62667:122::-;62740:24;62758:5;62740:24;:::i;:::-;62733:5;62730:35;62720:63;;62779:1;62776;62769:12;62720:63;62667:122;:::o

Swarm Source

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