ETH Price: $2,974.71 (+2.55%)
Gas: 1 Gwei

Token

Mythic Ehnancements ()
 

Overview

Max Total Supply

260

Holders

97

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xfebbb48c8f7a67dc3dcee19524a410e078e6a6a1
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:
MythicEnhancements

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-12
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.16;

/*
    _____           __  .__    .__
   /     \ ___.__._/  |_|  |__ |__| ____
  /  \ /  <   |  |\   __\  |  \|  |/ ___\
 /    Y    \___  | |  | |   Y  \  \  \___
 \____|__  / ____| |__| |___|  /__|\___  >
         \/\/                \/        \/

Standing on the shoulders of giants -- Yuga Labs & CryptoPunks
    * Written by Aleph 0ne for the ApeLiquid community *
 * Mythic Enhancements by ApeLiquid.io (OpenSea Creator Fees) *
*/

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

// File @openzeppelin/contracts/token/ERC1155/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File @openzeppelin/contracts/token/ERC1155/[email protected]

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

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC1155/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: address zero is not a valid owner"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File @openzeppelin/contracts/access/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(
                    supply >= amount,
                    "ERC1155: burn amount exceeds totalSupply"
                );
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// SafeMath
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// 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 generally not needed starting with Solidity 0.8, since 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 subtraction 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. 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;
        }
    }
}

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set)
        internal
        view
        returns (bytes32[] memory)
    {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set)
        internal
        view
        returns (address[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set)
        internal
        view
        returns (uint256[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// OPENSEA BULLSHIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator)
        external
        view
        returns (bool);

    function register(address registrant) external;

    function registerAndSubscribe(address registrant, address subscription)
        external;

    function registerAndCopyEntries(
        address registrant,
        address registrantToCopy
    ) external;

    function unregister(address addr) external;

    function updateOperator(
        address registrant,
        address operator,
        bool filtered
    ) external;

    function updateOperators(
        address registrant,
        address[] calldata operators,
        bool filtered
    ) external;

    function updateCodeHash(
        address registrant,
        bytes32 codehash,
        bool filtered
    ) external;

    function updateCodeHashes(
        address registrant,
        bytes32[] calldata codeHashes,
        bool filtered
    ) external;

    function subscribe(address registrant, address registrantToSubscribe)
        external;

    function unsubscribe(address registrant, bool copyExistingEntries) external;

    function subscriptionOf(address addr) external returns (address registrant);

    function subscribers(address registrant)
        external
        returns (address[] memory);

    function subscriberAt(address registrant, uint256 index)
        external
        returns (address);

    function copyEntriesOf(address registrant, address registrantToCopy)
        external;

    function isOperatorFiltered(address registrant, address operator)
        external
        returns (bool);

    function isCodeHashOfFiltered(address registrant, address operatorWithCode)
        external
        returns (bool);

    function isCodeHashFiltered(address registrant, bytes32 codeHash)
        external
        returns (bool);

    function filteredOperators(address addr)
        external
        returns (address[] memory);

    function filteredCodeHashes(address addr)
        external
        returns (bytes32[] memory);

    function filteredOperatorAt(address registrant, uint256 index)
        external
        returns (address);

    function filteredCodeHashAt(address registrant, uint256 index)
        external
        returns (bytes32);

    function isRegistered(address addr) external returns (bool);

    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;

//import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(
                    address(this),
                    subscriptionOrRegistrantToCopy
                );
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(
                        address(this),
                        subscriptionOrRegistrantToCopy
                    );
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    msg.sender
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    operator
                )
            ) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

pragma solidity ^0.8.0;

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(
        IERC20 indexed token,
        address to,
        uint256 amount
    );
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account)
        public
        view
        returns (uint256)
    {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) +
            totalReleased(token);
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(token, account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return
            (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

pragma solidity ^0.8.13;

//import {OperatorFilterer} from "./OperatorFilterer.sol";

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default
 *         OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION =
        address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

contract MythicEnhancements is
    Ownable,
    PaymentSplitter,
    DefaultOperatorFilterer,
    ERC1155
{
    using Strings for uint256;

    // Sale Status
    bool public saleIsActive = false;

    address public LiquidDeployer = 0x866cfDa1B7cD90Cd250485cd8b700211480845D7;
    uint256 public RandomNumberRange = 100;
    string private baseURI = "https://apeliquid.io/enhancements/json/";
    string public name = "Mythic Ehnancements";

    mapping(uint256 => bool) public validItem;
    uint256 private maxItemID = 24;

    // Liquid METL -- bang your head as you read this line of code
    address public METLToken = 0xFcbE615dEf610E806BB64427574A2c5c1fB55510;

    // Specify the IERC20 interface to the METL Token
    IERC20 METLTokenAddress = IERC20(address(METLToken));

    uint256 public mintMETLRequired = 10 ether;
    uint256 public mintETHRequired = 1000000000000000;

    event SetBaseURI(string indexed _baseURI);

    // Enumerate all the items for minting
    constructor()
        ERC1155("MythicEnhancements")
        PaymentSplitter(_payees, _shares)
    {
        validItem[1] = true;
        validItem[2] = true;
        validItem[3] = true;
        validItem[4] = true;
        validItem[5] = true;
        validItem[6] = true;
        validItem[7] = true;
        validItem[8] = true;
        validItem[9] = true;
        validItem[10] = true;
        validItem[11] = true;
        validItem[12] = true;
        validItem[13] = true;
        validItem[14] = true;
        validItem[15] = true;
        validItem[16] = true;
        validItem[17] = true;
        validItem[18] = true;
        validItem[19] = true;
        validItem[20] = true;
        validItem[21] = true;
        validItem[22] = true;
        validItem[23] = true;
        validItem[24] = true;

        emit SetBaseURI(baseURI);
    }

    // -------------------------------------------------------------------
    // Functions for setting variables and changing values (only by owner)
    // -------------------------------------------------------------------

    function setRandomNumberRange(uint256 r) external onlyOwner {
        RandomNumberRange = r;
    }

    /**
     * @notice Airdrop tokens to multiple addresses at once.
     * No strict supply is set in the contract. All methods are ownerOnly,
     * it is up to the owner to control the supply by not minting
     * past their desired number for each token.
     * @dev Airdrop tokens to each address in the calldata list,
     * setting the supply to the length of the list + previously minted (airdropped) supply.
     * Add an address once per token you would like to send.
     * @param _tokenIds The tokenIDs to send
     * @param _list address[] list of wallets to send tokens to
     * @param _qty The qty of each token we are sending
     */
    function airdrop(
        uint256[] memory _tokenIds,
        address[] calldata _list,
        uint256[] memory _qty
    ) external onlyOwner {
        for (uint256 i = 0; i < _list.length; i++) {
            _mint(_list[i], _tokenIds[i], _qty[i], "Drop-a-palooza error!");
        }
    }

    function updateBaseUri(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
        emit SetBaseURI(baseURI);
    }

    function uri(uint256 typeId) public view override returns (string memory) {
        require(validItem[typeId], "URI requested for invalid type");
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, typeId.toString()))
                : baseURI;
    }

    // -------------------------------------------------------------------------------
    // MINT and Sale details
    // -------------------------------------------------------------------------------

    event SaleActivation(bool isActive);

    function toggleSaleStatus() external onlyOwner {
        saleIsActive = !saleIsActive;
        emit SaleActivation(saleIsActive);
    }

    event ItemMinted(
        address contractAddress,
        uint256 tokenId,
        uint256 timestamp
    );

    function newMints(uint256 _count) private {
        for (uint256 i = 0; i < _count; i++) {
            uint256 randomItem = RandomNumber(maxItemID);
            _mint(msg.sender, randomItem, 1, "Mint Failed");
            emit ItemMinted(msg.sender, randomItem, block.timestamp);
        }
    }

    // @notice mint The mint function, which can be done in ETH or METL
    // @params _count How many to mint
    // @params mintInMETL Boolean that determines if mint is in METL (or ETH)
    function mint(uint256 _count, bool mintInMETL) public payable {
        require(saleIsActive, "Sale not active!");
        if (mintInMETL) {
            require(
                METLTokenAddress.allowance(msg.sender, address(this)) >=
                    mintMETLRequired * _count,
                "Error: Transfer not approved"
            );
            METLTokenAddress.transferFrom(
                msg.sender,
                address(this),
                (mintMETLRequired) * _count
            );
        } else {
            require(
                mintETHRequired * _count <= msg.value,
                "Not Enough ETH to mint!"
            );
        }

        newMints(_count);
    }

    // @notice Generate random number based on totalnumbers
    // @param totalnumbers The Maximum number to return (i.e. 100 returns 0-99)
    function RandomNumber(uint256 totalnumbers) public view returns (uint256) {
        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(
                    block.timestamp +
                        block.difficulty +
                        ((
                            uint256(keccak256(abi.encodePacked(block.coinbase)))
                        ) / (block.timestamp)) +
                        block.gaslimit +
                        ((uint256(keccak256(abi.encodePacked(msg.sender)))) /
                            (block.timestamp)) +
                        block.number
                )
            )
        );

        return seed % totalnumbers;
    }

    // -------------------------------------------------------------------------------
    // PRIVATE FUNCTIONS + ADDITIONAL REQUIREMENTS FOR CONTRACT
    // -------------------------------------------------------------------------------

    function DestroyWeapons(
        address tokenOwner,
        uint256 tokenId,
        uint256 totalToBurn
    ) external onlyOwner {
        _burn(tokenOwner, tokenId, totalToBurn);
    }

    function changeMintETH(uint256 neweth) external onlyOwner {
        mintETHRequired = neweth;
    }

    function changeMintMETL(uint256 neweth) external onlyOwner {
        mintMETLRequired = neweth;
    }

    function receiveETH() public payable {
        require(msg.value > mintETHRequired, "Not enough ETH");
    }

    // Payments using splitter go here...
    address[] public _payees = [
        0x7FDE663601A53A6953bbb98F1Ab87E86dEE81b35, // Liquid Payments
        0x867Eb0804eACA9FEeda8a0E1d2B9a32eEF58AF8f,
        0x0C07747AB98EE84971C90Fbd353eda207B737c43,
        0xfebbB48C8f7A67Dc3DcEE19524A410E078e6A6a1
    ];
    uint256[] private _shares = [5, 65, 15, 15];

    // Payments
    function claim() external {
        release(payable(msg.sender));
    }

    /**
     * @notice Withdraw all tokens from the contract (emergency function)
     */
    function removeAllMETL() public onlyOwner {
        uint256 balance = METLTokenAddress.balanceOf(address(this));
        METLTokenAddress.transfer(LiquidDeployer, balance);
    }

    // OpenSea's new bullshit requirements, which violate my moral code, but
    // are nonetheless necessary to make this all work properly.
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    // Take my love, take my land, Take me where I cannot stand.
    // I don't care, I'm still free, You can't take the sky from me.
    //
    function SelfDestruct() external onlyOwner {
        // Walk through all the keys and return them to the contract
        removeAllMETL();
        address payable os = payable(address(LiquidDeployer));
        selfdestruct(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ItemMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"_baseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","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":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"totalToBurn","type":"uint256"}],"name":"DestroyWeapons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LiquidDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METLToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalnumbers","type":"uint256"}],"name":"RandomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RandomNumberRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SelfDestruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"_list","type":"address[]"},{"internalType":"uint256[]","name":"_qty","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"neweth","type":"uint256"}],"name":"changeMintETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"neweth","type":"uint256"}],"name":"changeMintMETL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bool","name":"mintInMETL","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintETHRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMETLRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeAllMETL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setRandomNumberRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"updateBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600b60006101000a81548160ff02191690831515021790555073866cfda1b7cd90cd250485cd8b700211480845d7600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506064600c556040518060600160405280602781526020016200773460279139600d9081620000a39190620012b3565b506040518060400160405280601381526020017f4d79746869632045686e616e63656d656e747300000000000000000000000000815250600e9081620000ea9190620012b3565b50601860105573fcbe615def610e806bb64427574a2c5c1fb55510601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550678ac7230489e8000060135566038d7ea4c680006014556040518060800160405280737fde663601a53a6953bbb98f1ab87e86dee81b3573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173867eb0804eaca9feeda8a0e1d2b9a32eef58af8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730c07747ab98ee84971c90fbd353eda207b737c4373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173febbb48c8f7a67dc3dcee19524a410e078e6a6a173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506015906004620002f292919062000f34565b506040518060800160405280600560ff168152602001604160ff168152602001600f60ff168152602001600f60ff1681525060169060046200033692919062000fc3565b503480156200034457600080fd5b506040518060400160405280601281526020017f4d7974686963456e68616e63656d656e74730000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160158054806020026020016040519081016040528092919081815260200182805480156200041657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620003cb575b505050505060168054806020026020016040519081016040528092919081815260200182805480156200046957602002820191906000526020600020905b81548152602001906001019080831162000454575b50505050506200048e6200048262000c1a60201b60201c565b62000c2260201b60201c565b8051825114620004d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004cc9062001421565b60405180910390fd5b60008251116200051c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005139062001493565b60405180910390fd5b60005b82518110156200058b5762000575838281518110620005435762000542620014b5565b5b6020026020010151838381518110620005615762000560620014b5565b5b602002602001015162000ce660201b60201c565b8080620005829062001513565b9150506200051f565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200078357801562000649576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200060f929190620015a5565b600060405180830381600087803b1580156200062a57600080fd5b505af11580156200063f573d6000803e3d6000fd5b5050505062000782565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000703576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620006c9929190620015a5565b600060405180830381600087803b158015620006e457600080fd5b505af1158015620006f9573d6000803e3d6000fd5b5050505062000781565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200074c9190620015d2565b600060405180830381600087803b1580156200076757600080fd5b505af11580156200077c573d6000803e3d6000fd5b505050505b5b5b5050620007968162000f1f60201b60201c565b506001600f60006001815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006002815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006003815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006004815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006005815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006006815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006007815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006008815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006009815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600a815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600b815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600c815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600d815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600e815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600f815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006010815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006011815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006012815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006013815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006014815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006015815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006016815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006017815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006018815260200190815260200160002060006101000a81548160ff021916908315150217905550600d60405162000be0919062001689565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a2620018bd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d4f9062001718565b60405180910390fd5b6000811162000d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d95906200178a565b60405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e1a9062001822565b60405180910390fd5b6005829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060015462000eda919062001844565b6001819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac828260405162000f1392919062001890565b60405180910390a15050565b80600a908162000f309190620012b3565b5050565b82805482825590600052602060002090810192821562000fb0579160200282015b8281111562000faf5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000f55565b5b50905062000fbf91906200101a565b5090565b82805482825590600052602060002090810192821562001007579160200282015b8281111562001006578251829060ff1690559160200191906001019062000fe4565b5b5090506200101691906200101a565b5090565b5b80821115620010355760008160009055506001016200101b565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620010bb57607f821691505b602082108103620010d157620010d062001073565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200113b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620010fc565b620011478683620010fc565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620011946200118e62001188846200115f565b62001169565b6200115f565b9050919050565b6000819050919050565b620011b08362001173565b620011c8620011bf826200119b565b84845462001109565b825550505050565b600090565b620011df620011d0565b620011ec818484620011a5565b505050565b5b81811015620012145762001208600082620011d5565b600181019050620011f2565b5050565b601f82111562001263576200122d81620010d7565b6200123884620010ec565b8101602085101562001248578190505b620012606200125785620010ec565b830182620011f1565b50505b505050565b600082821c905092915050565b6000620012886000198460080262001268565b1980831691505092915050565b6000620012a3838362001275565b9150826002028217905092915050565b620012be8262001039565b67ffffffffffffffff811115620012da57620012d962001044565b5b620012e68254620010a2565b620012f382828562001218565b600060209050601f8311600181146200132b576000841562001316578287015190505b62001322858262001295565b86555062001392565b601f1984166200133b86620010d7565b60005b8281101562001365578489015182556001820191506020850194506020810190506200133e565b8683101562001385578489015162001381601f89168262001275565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b6000620014096032836200139a565b91506200141682620013ab565b604082019050919050565b600060208201905081810360008301526200143c81620013fa565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b60006200147b601a836200139a565b9150620014888262001443565b602082019050919050565b60006020820190508181036000830152620014ae816200146c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062001520826200115f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620015555762001554620014e4565b5b600182019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200158d8262001560565b9050919050565b6200159f8162001580565b82525050565b6000604082019050620015bc600083018562001594565b620015cb602083018462001594565b9392505050565b6000602082019050620015e9600083018462001594565b92915050565b600081905092915050565b600081546200160981620010a2565b620016158186620015ef565b94506001821660008114620016335760018114620016495762001680565b60ff198316865281151582028601935062001680565b6200165485620010d7565b60005b83811015620016785781548189015260018201915060208101905062001657565b838801955050505b50505092915050565b6000620016978284620015fa565b915081905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062001700602c836200139a565b91506200170d82620016a2565b604082019050919050565b600060208201905081810360008301526200173381620016f1565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062001772601d836200139a565b91506200177f826200173a565b602082019050919050565b60006020820190508181036000830152620017a58162001763565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b60006200180a602b836200139a565b91506200181782620017ac565b604082019050919050565b600060208201905081810360008301526200183d81620017fb565b9050919050565b600062001851826200115f565b91506200185e836200115f565b9250828201905080821115620018795762001878620014e4565b5b92915050565b6200188a816200115f565b82525050565b6000604082019050620018a7600083018562001594565b620018b660208301846200187f565b9392505050565b615e6780620018cd6000396000f3fe60806040526004361061025f5760003560e01c8063715018a611610144578063d10507a9116100b6578063e985e9c51161007a578063e985e9c514610914578063eb8d244414610951578063ec6cdc8e1461097c578063f242432a146109b9578063f2fde38b146109e2578063f83e092a14610a0b576102a6565b8063d10507a914610841578063d3444b7b1461086a578063d79779b214610895578063dba5e917146108d2578063e33b7de3146108e9576102a6565b80639852595c116101085780639852595c1461070d578063a22cb4651461074a578063a3c106fa14610773578063c29854221461079e578063ce7c2ac2146107db578063cf160fb014610818576102a6565b8063715018a61461063a5780637a521664146106515780638b83209b1461067a5780638da5cb5b146106b75780638dfc9b04146106e2576102a6565b806339f7e37f116101dd578063452ca574116101a1578063452ca5741461054d57806348b75044146105765780634e1273f41461059f5780634e71d92d146105dc578063500c06f4146105f357806367f68fac1461061e576102a6565b806339f7e37f146104875780633a98ef39146104b05780633ecfd51e146104db578063406072a9146104e557806341f4343414610522576102a6565b80630e89341c116102245780630e89341c1461039057806319165587146103cd57806326506ba4146103f6578063283248be146104215780632eb2c2d61461045e576102a6565b8062fdd58e146102ab57806301ffc9a7146102e8578063049c5c4914610325578063059c14fb1461033c57806306fdde0314610365576102a6565b366102a6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028d610a22565b3460405161029c929190613880565b60405180910390a1005b600080fd5b3480156102b757600080fd5b506102d260048036038101906102cd9190613915565b610a2a565b6040516102df9190613955565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906139c8565b610af3565b60405161031c9190613a10565b60405180910390f35b34801561033157600080fd5b5061033a610bd5565b005b34801561034857600080fd5b50610363600480360381019061035e9190613a2b565b610c4f565b005b34801561037157600080fd5b5061037a610c61565b6040516103879190613ae8565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b29190613a2b565b610cef565b6040516103c49190613ae8565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613b48565b610e2a565b005b34801561040257600080fd5b5061040b610fd4565b6040516104189190613b75565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613a2b565b610ffa565b6040516104559190613b75565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613d8d565b611039565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613efd565b6110da565b005b3480156104bc57600080fd5b506104c5611138565b6040516104d29190613955565b60405180910390f35b6104e3611142565b005b3480156104f157600080fd5b5061050c60048036038101906105079190613f84565b611188565b6040516105199190613955565b60405180910390f35b34801561052e57600080fd5b5061053761120f565b6040516105449190614023565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f9190613a2b565b611221565b005b34801561058257600080fd5b5061059d60048036038101906105989190613f84565b611233565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190614101565b6114eb565b6040516105d39190614237565b60405180910390f35b3480156105e857600080fd5b506105f1611604565b005b3480156105ff57600080fd5b5061060861160f565b6040516106159190613955565b60405180910390f35b61063860048036038101906106339190614285565b611615565b005b34801561064657600080fd5b5061064f61186a565b005b34801561065d57600080fd5b5061067860048036038101906106739190613a2b565b61187e565b005b34801561068657600080fd5b506106a1600480360381019061069c9190613a2b565b611890565b6040516106ae9190613b75565b60405180910390f35b3480156106c357600080fd5b506106cc6118d8565b6040516106d99190613b75565b60405180910390f35b3480156106ee57600080fd5b506106f7611901565b6040516107049190613955565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906142c5565b611907565b6040516107419190613955565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906142f2565b611950565b005b34801561077f57600080fd5b50610788611a5a565b6040516107959190613955565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613a2b565b611a60565b6040516107d29190613a10565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd91906142c5565b611a80565b60405161080f9190613955565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190614332565b611ac9565b005b34801561084d57600080fd5b50610868600480360381019061086391906143e0565b611ae1565b005b34801561087657600080fd5b5061087f611bad565b60405161088c9190613b75565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b7919061448c565b611bd3565b6040516108c99190613955565b60405180910390f35b3480156108de57600080fd5b506108e7611c1c565b005b3480156108f557600080fd5b506108fe611c6c565b60405161090b9190613955565b60405180910390f35b34801561092057600080fd5b5061093b600480360381019061093691906144b9565b611c76565b6040516109489190613a10565b60405180910390f35b34801561095d57600080fd5b50610966611d0a565b6040516109739190613a10565b60405180910390f35b34801561098857600080fd5b506109a3600480360381019061099e9190613a2b565b611d1d565b6040516109b09190613955565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db91906144f9565b611dff565b005b3480156109ee57600080fd5b50610a096004803603810190610a0491906142c5565b611ea0565b005b348015610a1757600080fd5b50610a20611f23565b005b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190614602565b60405180910390fd5b6008600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bbe57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bce5750610bcd82612091565b5b9050919050565b610bdd6120fb565b600b60009054906101000a900460ff1615600b60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600b60009054906101000a900460ff16604051610c459190613a10565b60405180910390a1565b610c576120fb565b8060138190555050565b600e8054610c6e90614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90614651565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b505050505081565b6060600f600083815260200190815260200160002060009054906101000a900460ff16610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d48906146ce565b60405180910390fd5b6000600d8054610d6090614651565b905011610df757600d8054610d7490614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610da090614651565b8015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050610e23565b600d610e0283612179565b604051602001610e139291906147c2565b6040516020818303038152906040525b9050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614858565b60405180910390fd5b6000610eb6611c6c565b47610ec191906148a7565b90506000610ed88383610ed386611907565b6122d9565b905060008103610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f149061494d565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6c91906148a7565b925050819055508060026000828254610f8591906148a7565b92505081905550610f968382612347565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fc792919061498e565b60405180910390a1505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015818154811061100a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611041610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611087575061108685611081610a22565b611c76565b5b6110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90614a29565b60405180910390fd5b6110d3858585858561243b565b5050505050565b6110e26120fb565b80600d90816110f19190614bd6565b50600d6040516111019190614ca8565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6000600154905090565b6014543411611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90614d0b565b60405180910390fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b6112296120fb565b8060148190555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac90614858565b60405180910390fd5b60006112c083611bd3565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112f99190613b75565b602060405180830381865afa158015611316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133a9190614d40565b61134491906148a7565b9050600061135c83836113578787611188565b6122d9565b9050600081036113a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113989061494d565b60405180910390fd5b80600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461142d91906148a7565b9250508190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148391906148a7565b9250508190555061149584848361275f565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516114dd929190613880565b60405180910390a250505050565b60608151835114611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890614ddf565b60405180910390fd5b6000835167ffffffffffffffff81111561154e5761154d613b95565b5b60405190808252806020026020018201604052801561157c5781602001602082028036833780820191505090505b50905060005b84518110156115f9576115c98582815181106115a1576115a0614dff565b5b60200260200101518583815181106115bc576115bb614dff565b5b6020026020010151610a2a565b8282815181106115dc576115db614dff565b5b602002602001018181525050806115f290614e2e565b9050611582565b508091505092915050565b61160d33610e2a565b565b60145481565b600b60009054906101000a900460ff16611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90614ec2565b60405180910390fd5b801561180c57816013546116789190614ee2565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116d5929190614f24565b602060405180830381865afa1580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117169190614d40565b1015611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90614f99565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856013546117a59190614ee2565b6040518463ffffffff1660e01b81526004016117c393929190614fb9565b6020604051808303816000875af11580156117e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118069190615005565b5061185d565b348260145461181b9190614ee2565b111561185c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118539061507e565b60405180910390fd5b5b611866826127e5565b5050565b6118726120fb565b61187c6000612894565b565b6118866120fb565b80600c8190555050565b6000600582815481106118a6576118a5614dff565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a4b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119c8929190614f24565b602060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a099190615005565b611a4a57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a419190613b75565b60405180910390fd5b5b611a558383612958565b505050565b600c5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ad16120fb565b611adc83838361296e565b505050565b611ae96120fb565b60005b83839050811015611ba657611b93848483818110611b0d57611b0c614dff565b5b9050602002016020810190611b2291906142c5565b868381518110611b3557611b34614dff565b5b6020026020010151848481518110611b5057611b4f614dff565b5b60200260200101516040518060400160405280601581526020017f44726f702d612d70616c6f6f7a61206572726f72210000000000000000000000815250612bb6565b8080611b9e90614e2e565b915050611aec565b5050505050565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c246120fb565b611c2c611f23565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600254905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900460ff1681565b600080434233604051602001611d3391906150e6565b6040516020818303038152906040528051906020012060001c611d569190615130565b454241604051602001611d69919061518a565b6040516020818303038152906040528051906020012060001c611d8c9190615130565b4442611d9891906148a7565b611da291906148a7565b611dac91906148a7565b611db691906148a7565b611dc091906148a7565b604051602001611dd091906151c6565b6040516020818303038152906040528051906020012060001c90508281611df791906151e1565b915050919050565b611e07610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e4d5750611e4c85611e47610a22565b611c76565b5b611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614a29565b60405180910390fd5b611e998585858585612d67565b5050505050565b611ea86120fb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90615284565b60405180910390fd5b611f2081612894565b50565b611f2b6120fb565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f889190613b75565b602060405180830381865afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190614d40565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161204a929190613880565b6020604051808303816000875af1158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190615005565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612103610a22565b73ffffffffffffffffffffffffffffffffffffffff166121216118d8565b73ffffffffffffffffffffffffffffffffffffffff1614612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e906152f0565b60405180910390fd5b565b6060600082036121c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122d4565b600082905060005b600082146121f25780806121db90614e2e565b915050600a826121eb9190615130565b91506121c8565b60008167ffffffffffffffff81111561220e5761220d613b95565b5b6040519080825280601f01601f1916602001820160405280156122405781602001600182028036833780820191505090505b5090505b600085146122cd576001826122599190615310565b9150600a8561226891906151e1565b603061227491906148a7565b60f81b81838151811061228a57612289614dff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122c69190615130565b9450612244565b8093505050505b919050565b600081600154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561232a9190614ee2565b6123349190615130565b61233e9190615310565b90509392505050565b8047101561238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190615390565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123b0906153e1565b60006040518083038185875af1925050503d80600081146123ed576040519150601f19603f3d011682016040523d82523d6000602084013e6123f2565b606091505b5050905080612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90615468565b60405180910390fd5b505050565b815183511461247f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612476906154fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e59061558c565b60405180910390fd5b60006124f8610a22565b9050612508818787878787613005565b60005b84518110156126bc57600085828151811061252957612528614dff565b5b60200260200101519050600085838151811061254857612547614dff565b5b6020026020010151905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e19061561e565b60405180910390fd5b8181036008600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a191906148a7565b92505081905550505050806126b590614e2e565b905061250b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161273392919061563e565b60405180910390a461274981878787878761300d565b612757818787878787613015565b505050505050565b6127e08363a9059cbb60e01b848460405160240161277e929190613880565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506131ec565b505050565b60005b818110156128905760006127fd601054611d1d565b9050612841338260016040518060400160405280600b81526020017f4d696e74204661696c6564000000000000000000000000000000000000000000815250612bb6565b7fd9be9c40c7e99dfc974fa3fe3b790af02afd2939b5dedfccb1ba12933eb27a8e33824260405161287493929190615675565b60405180910390a150808061288890614e2e565b9150506127e8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61296a612963610a22565b83836132b3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d49061571e565b60405180910390fd5b60006129e7610a22565b905060006129f48461341f565b90506000612a018461341f565b9050612a2183876000858560405180602001604052806000815250613005565b60006008600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab0906157b0565b60405180910390fd5b8481036008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612b879291906157d0565b60405180910390a4612bad8488600086866040518060200160405280600081525061300d565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c9061586b565b60405180910390fd5b6000612c2f610a22565b90506000612c3c8561341f565b90506000612c498561341f565b9050612c5a83600089858589613005565b846008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cba91906148a7565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612d389291906157d0565b60405180910390a4612d4f8360008985858961300d565b612d5e83600089898989613499565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcd9061558c565b60405180910390fd5b6000612de0610a22565b90506000612ded8561341f565b90506000612dfa8561341f565b9050612e0a838989858589613005565b60006008600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e999061561e565b60405180910390fd5b8581036008600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856008600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5991906148a7565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612fd69291906157d0565b60405180910390a4612fec848a8a86868a61300d565b612ffa848a8a8a8a8a613499565b505050505050505050565b505050505050565b505050505050565b6130348473ffffffffffffffffffffffffffffffffffffffff16613670565b156131e4578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161307a9594939291906158e0565b6020604051808303816000875af19250505080156130b657506040513d601f19601f820116820180604052508101906130b3919061595d565b60015b61315b576130c2615997565b806308c379a00361311e57506130d66159b9565b806130e15750613120565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131159190613ae8565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315290615abb565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d990615b4d565b60405180910390fd5b505b505050505050565b600061324e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136939092919063ffffffff16565b90506000815111156132ae578080602001905181019061326e9190615005565b6132ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a490615bdf565b60405180910390fd5b5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331890615c71565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516134129190613a10565b60405180910390a3505050565b60606000600167ffffffffffffffff81111561343e5761343d613b95565b5b60405190808252806020026020018201604052801561346c5781602001602082028036833780820191505090505b509050828160008151811061348457613483614dff565b5b60200260200101818152505080915050919050565b6134b88473ffffffffffffffffffffffffffffffffffffffff16613670565b15613668578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016134fe959493929190615c91565b6020604051808303816000875af192505050801561353a57506040513d601f19601f82011682018060405250810190613537919061595d565b60015b6135df57613546615997565b806308c379a0036135a2575061355a6159b9565b8061356557506135a4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135999190613ae8565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d690615abb565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365d90615b4d565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606136a284846000856136ab565b90509392505050565b6060824710156136f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e790615d5d565b60405180910390fd5b6136f985613670565b613738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372f90615dc9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137619190615e1a565b60006040518083038185875af1925050503d806000811461379e576040519150601f19603f3d011682016040523d82523d6000602084013e6137a3565b606091505b50915091506137b38282866137bf565b92505050949350505050565b606083156137cf5782905061381f565b6000835111156137e25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138169190613ae8565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061385182613826565b9050919050565b61386181613846565b82525050565b6000819050919050565b61387a81613867565b82525050565b60006040820190506138956000830185613858565b6138a26020830184613871565b9392505050565b6000604051905090565b600080fd5b600080fd5b6138c681613846565b81146138d157600080fd5b50565b6000813590506138e3816138bd565b92915050565b6138f281613867565b81146138fd57600080fd5b50565b60008135905061390f816138e9565b92915050565b6000806040838503121561392c5761392b6138b3565b5b600061393a858286016138d4565b925050602061394b85828601613900565b9150509250929050565b600060208201905061396a6000830184613871565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139a581613970565b81146139b057600080fd5b50565b6000813590506139c28161399c565b92915050565b6000602082840312156139de576139dd6138b3565b5b60006139ec848285016139b3565b91505092915050565b60008115159050919050565b613a0a816139f5565b82525050565b6000602082019050613a256000830184613a01565b92915050565b600060208284031215613a4157613a406138b3565b5b6000613a4f84828501613900565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a92578082015181840152602081019050613a77565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aba82613a58565b613ac48185613a63565b9350613ad4818560208601613a74565b613add81613a9e565b840191505092915050565b60006020820190508181036000830152613b028184613aaf565b905092915050565b6000613b1582613826565b9050919050565b613b2581613b0a565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060208284031215613b5e57613b5d6138b3565b5b6000613b6c84828501613b33565b91505092915050565b6000602082019050613b8a6000830184613858565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bcd82613a9e565b810181811067ffffffffffffffff82111715613bec57613beb613b95565b5b80604052505050565b6000613bff6138a9565b9050613c0b8282613bc4565b919050565b600067ffffffffffffffff821115613c2b57613c2a613b95565b5b602082029050602081019050919050565b600080fd5b6000613c54613c4f84613c10565b613bf5565b90508083825260208201905060208402830185811115613c7757613c76613c3c565b5b835b81811015613ca05780613c8c8882613900565b845260208401935050602081019050613c79565b5050509392505050565b600082601f830112613cbf57613cbe613b90565b5b8135613ccf848260208601613c41565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cf857613cf7613b95565b5b613d0182613a9e565b9050602081019050919050565b82818337600083830152505050565b6000613d30613d2b84613cdd565b613bf5565b905082815260208101848484011115613d4c57613d4b613cd8565b5b613d57848285613d0e565b509392505050565b600082601f830112613d7457613d73613b90565b5b8135613d84848260208601613d1d565b91505092915050565b600080600080600060a08688031215613da957613da86138b3565b5b6000613db7888289016138d4565b9550506020613dc8888289016138d4565b945050604086013567ffffffffffffffff811115613de957613de86138b8565b5b613df588828901613caa565b935050606086013567ffffffffffffffff811115613e1657613e156138b8565b5b613e2288828901613caa565b925050608086013567ffffffffffffffff811115613e4357613e426138b8565b5b613e4f88828901613d5f565b9150509295509295909350565b600067ffffffffffffffff821115613e7757613e76613b95565b5b613e8082613a9e565b9050602081019050919050565b6000613ea0613e9b84613e5c565b613bf5565b905082815260208101848484011115613ebc57613ebb613cd8565b5b613ec7848285613d0e565b509392505050565b600082601f830112613ee457613ee3613b90565b5b8135613ef4848260208601613e8d565b91505092915050565b600060208284031215613f1357613f126138b3565b5b600082013567ffffffffffffffff811115613f3157613f306138b8565b5b613f3d84828501613ecf565b91505092915050565b6000613f5182613846565b9050919050565b613f6181613f46565b8114613f6c57600080fd5b50565b600081359050613f7e81613f58565b92915050565b60008060408385031215613f9b57613f9a6138b3565b5b6000613fa985828601613f6f565b9250506020613fba858286016138d4565b9150509250929050565b6000819050919050565b6000613fe9613fe4613fdf84613826565b613fc4565b613826565b9050919050565b6000613ffb82613fce565b9050919050565b600061400d82613ff0565b9050919050565b61401d81614002565b82525050565b60006020820190506140386000830184614014565b92915050565b600067ffffffffffffffff82111561405957614058613b95565b5b602082029050602081019050919050565b600061407d6140788461403e565b613bf5565b905080838252602082019050602084028301858111156140a05761409f613c3c565b5b835b818110156140c957806140b588826138d4565b8452602084019350506020810190506140a2565b5050509392505050565b600082601f8301126140e8576140e7613b90565b5b81356140f884826020860161406a565b91505092915050565b60008060408385031215614118576141176138b3565b5b600083013567ffffffffffffffff811115614136576141356138b8565b5b614142858286016140d3565b925050602083013567ffffffffffffffff811115614163576141626138b8565b5b61416f85828601613caa565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141ae81613867565b82525050565b60006141c083836141a5565b60208301905092915050565b6000602082019050919050565b60006141e482614179565b6141ee8185614184565b93506141f983614195565b8060005b8381101561422a57815161421188826141b4565b975061421c836141cc565b9250506001810190506141fd565b5085935050505092915050565b6000602082019050818103600083015261425181846141d9565b905092915050565b614262816139f5565b811461426d57600080fd5b50565b60008135905061427f81614259565b92915050565b6000806040838503121561429c5761429b6138b3565b5b60006142aa85828601613900565b92505060206142bb85828601614270565b9150509250929050565b6000602082840312156142db576142da6138b3565b5b60006142e9848285016138d4565b91505092915050565b60008060408385031215614309576143086138b3565b5b6000614317858286016138d4565b925050602061432885828601614270565b9150509250929050565b60008060006060848603121561434b5761434a6138b3565b5b6000614359868287016138d4565b935050602061436a86828701613900565b925050604061437b86828701613900565b9150509250925092565b600080fd5b60008083601f8401126143a05761439f613b90565b5b8235905067ffffffffffffffff8111156143bd576143bc614385565b5b6020830191508360208202830111156143d9576143d8613c3c565b5b9250929050565b600080600080606085870312156143fa576143f96138b3565b5b600085013567ffffffffffffffff811115614418576144176138b8565b5b61442487828801613caa565b945050602085013567ffffffffffffffff811115614445576144446138b8565b5b6144518782880161438a565b9350935050604085013567ffffffffffffffff811115614474576144736138b8565b5b61448087828801613caa565b91505092959194509250565b6000602082840312156144a2576144a16138b3565b5b60006144b084828501613f6f565b91505092915050565b600080604083850312156144d0576144cf6138b3565b5b60006144de858286016138d4565b92505060206144ef858286016138d4565b9150509250929050565b600080600080600060a08688031215614515576145146138b3565b5b6000614523888289016138d4565b9550506020614534888289016138d4565b945050604061454588828901613900565b935050606061455688828901613900565b925050608086013567ffffffffffffffff811115614577576145766138b8565b5b61458388828901613d5f565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006145ec602a83613a63565b91506145f782614590565b604082019050919050565b6000602082019050818103600083015261461b816145df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061466957607f821691505b60208210810361467c5761467b614622565b5b50919050565b7f5552492072657175657374656420666f7220696e76616c696420747970650000600082015250565b60006146b8601e83613a63565b91506146c382614682565b602082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461471b81614651565b61472581866146ee565b94506001821660008114614740576001811461475557614788565b60ff1983168652811515820286019350614788565b61475e856146f9565b60005b8381101561478057815481890152600182019150602081019050614761565b838801955050505b50505092915050565b600061479c82613a58565b6147a681856146ee565b93506147b6818560208601613a74565b80840191505092915050565b60006147ce828561470e565b91506147da8284614791565b91508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614842602683613a63565b915061484d826147e6565b604082019050919050565b6000602082019050818103600083015261487181614835565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148b282613867565b91506148bd83613867565b92508282019050808211156148d5576148d4614878565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614937602b83613a63565b9150614942826148db565b604082019050919050565b600060208201905081810360008301526149668161492a565b9050919050565b600061497882613ff0565b9050919050565b6149888161496d565b82525050565b60006040820190506149a3600083018561497f565b6149b06020830184613871565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000614a13602f83613a63565b9150614a1e826149b7565b604082019050919050565b60006020820190508181036000830152614a4281614a06565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a59565b614aa08683614a59565b95508019841693508086168417925050509392505050565b6000614ad3614ace614ac984613867565b613fc4565b613867565b9050919050565b6000819050919050565b614aed83614ab8565b614b01614af982614ada565b848454614a66565b825550505050565b600090565b614b16614b09565b614b21818484614ae4565b505050565b5b81811015614b4557614b3a600082614b0e565b600181019050614b27565b5050565b601f821115614b8a57614b5b816146f9565b614b6484614a49565b81016020851015614b73578190505b614b87614b7f85614a49565b830182614b26565b50505b505050565b600082821c905092915050565b6000614bad60001984600802614b8f565b1980831691505092915050565b6000614bc68383614b9c565b9150826002028217905092915050565b614bdf82613a58565b67ffffffffffffffff811115614bf857614bf7613b95565b5b614c028254614651565b614c0d828285614b49565b600060209050601f831160018114614c405760008415614c2e578287015190505b614c388582614bba565b865550614ca0565b601f198416614c4e866146f9565b60005b82811015614c7657848901518255600182019150602085019450602081019050614c51565b86831015614c935784890151614c8f601f891682614b9c565b8355505b6001600288020188555050505b505050505050565b6000614cb4828461470e565b915081905092915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614cf5600e83613a63565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b600081519050614d3a816138e9565b92915050565b600060208284031215614d5657614d556138b3565b5b6000614d6484828501614d2b565b91505092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614dc9602983613a63565b9150614dd482614d6d565b604082019050919050565b60006020820190508181036000830152614df881614dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e3982613867565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e6b57614e6a614878565b5b600182019050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b6000614eac601083613a63565b9150614eb782614e76565b602082019050919050565b60006020820190508181036000830152614edb81614e9f565b9050919050565b6000614eed82613867565b9150614ef883613867565b9250828202614f0681613867565b91508282048414831517614f1d57614f1c614878565b5b5092915050565b6000604082019050614f396000830185613858565b614f466020830184613858565b9392505050565b7f4572726f723a205472616e73666572206e6f7420617070726f76656400000000600082015250565b6000614f83601c83613a63565b9150614f8e82614f4d565b602082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b6000606082019050614fce6000830186613858565b614fdb6020830185613858565b614fe86040830184613871565b949350505050565b600081519050614fff81614259565b92915050565b60006020828403121561501b5761501a6138b3565b5b600061502984828501614ff0565b91505092915050565b7f4e6f7420456e6f7567682045544820746f206d696e7421000000000000000000600082015250565b6000615068601783613a63565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b60008160601b9050919050565b60006150b68261509e565b9050919050565b60006150c8826150ab565b9050919050565b6150e06150db82613846565b6150bd565b82525050565b60006150f282846150cf565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513b82613867565b915061514683613867565b92508261515657615155615101565b5b828204905092915050565b600061516c826150ab565b9050919050565b61518461517f82613b0a565b615161565b82525050565b60006151968284615173565b60148201915081905092915050565b6000819050919050565b6151c06151bb82613867565b6151a5565b82525050565b60006151d282846151af565b60208201915081905092915050565b60006151ec82613867565b91506151f783613867565b92508261520757615206615101565b5b828206905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061526e602683613a63565b915061527982615212565b604082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006152da602083613a63565b91506152e5826152a4565b602082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b600061531b82613867565b915061532683613867565b925082820390508181111561533e5761533d614878565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061537a601d83613a63565b915061538582615344565b602082019050919050565b600060208201905081810360008301526153a98161536d565b9050919050565b600081905092915050565b50565b60006153cb6000836153b0565b91506153d6826153bb565b600082019050919050565b60006153ec826153be565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615452603a83613a63565b915061545d826153f6565b604082019050919050565b6000602082019050818103600083015261548181615445565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006154e4602883613a63565b91506154ef82615488565b604082019050919050565b60006020820190508181036000830152615513816154d7565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615576602583613a63565b91506155818261551a565b604082019050919050565b600060208201905081810360008301526155a581615569565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615608602a83613a63565b9150615613826155ac565b604082019050919050565b60006020820190508181036000830152615637816155fb565b9050919050565b6000604082019050818103600083015261565881856141d9565b9050818103602083015261566c81846141d9565b90509392505050565b600060608201905061568a6000830186613858565b6156976020830185613871565b6156a46040830184613871565b949350505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615708602383613a63565b9150615713826156ac565b604082019050919050565b60006020820190508181036000830152615737816156fb565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061579a602483613a63565b91506157a58261573e565b604082019050919050565b600060208201905081810360008301526157c98161578d565b9050919050565b60006040820190506157e56000830185613871565b6157f26020830184613871565b9392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615855602183613a63565b9150615860826157f9565b604082019050919050565b6000602082019050818103600083015261588481615848565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158b28261588b565b6158bc8185615896565b93506158cc818560208601613a74565b6158d581613a9e565b840191505092915050565b600060a0820190506158f56000830188613858565b6159026020830187613858565b818103604083015261591481866141d9565b9050818103606083015261592881856141d9565b9050818103608083015261593c81846158a7565b90509695505050505050565b6000815190506159578161399c565b92915050565b600060208284031215615973576159726138b3565b5b600061598184828501615948565b91505092915050565b60008160e01c9050919050565b600060033d11156159b65760046000803e6159b360005161598a565b90505b90565b600060443d10615a46576159cb6138a9565b60043d036004823e80513d602482011167ffffffffffffffff821117156159f3575050615a46565b808201805167ffffffffffffffff811115615a115750505050615a46565b80602083010160043d038501811115615a2e575050505050615a46565b615a3d82602001850186613bc4565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615aa5603483613a63565b9150615ab082615a49565b604082019050919050565b60006020820190508181036000830152615ad481615a98565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615b37602883613a63565b9150615b4282615adb565b604082019050919050565b60006020820190508181036000830152615b6681615b2a565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615bc9602a83613a63565b9150615bd482615b6d565b604082019050919050565b60006020820190508181036000830152615bf881615bbc565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615c5b602983613a63565b9150615c6682615bff565b604082019050919050565b60006020820190508181036000830152615c8a81615c4e565b9050919050565b600060a082019050615ca66000830188613858565b615cb36020830187613858565b615cc06040830186613871565b615ccd6060830185613871565b8181036080830152615cdf81846158a7565b90509695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615d47602683613a63565b9150615d5282615ceb565b604082019050919050565b60006020820190508181036000830152615d7681615d3a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615db3601d83613a63565b9150615dbe82615d7d565b602082019050919050565b60006020820190508181036000830152615de281615da6565b9050919050565b6000615df48261588b565b615dfe81856153b0565b9350615e0e818560208601613a74565b80840191505092915050565b6000615e268284615de9565b91508190509291505056fea2646970667358221220feaee25c17d3649eadfbb076780692f84385d65ed0b537a8965863b2f34a74fa64736f6c6343000811003368747470733a2f2f6170656c69717569642e696f2f656e68616e63656d656e74732f6a736f6e2f

Deployed Bytecode

0x60806040526004361061025f5760003560e01c8063715018a611610144578063d10507a9116100b6578063e985e9c51161007a578063e985e9c514610914578063eb8d244414610951578063ec6cdc8e1461097c578063f242432a146109b9578063f2fde38b146109e2578063f83e092a14610a0b576102a6565b8063d10507a914610841578063d3444b7b1461086a578063d79779b214610895578063dba5e917146108d2578063e33b7de3146108e9576102a6565b80639852595c116101085780639852595c1461070d578063a22cb4651461074a578063a3c106fa14610773578063c29854221461079e578063ce7c2ac2146107db578063cf160fb014610818576102a6565b8063715018a61461063a5780637a521664146106515780638b83209b1461067a5780638da5cb5b146106b75780638dfc9b04146106e2576102a6565b806339f7e37f116101dd578063452ca574116101a1578063452ca5741461054d57806348b75044146105765780634e1273f41461059f5780634e71d92d146105dc578063500c06f4146105f357806367f68fac1461061e576102a6565b806339f7e37f146104875780633a98ef39146104b05780633ecfd51e146104db578063406072a9146104e557806341f4343414610522576102a6565b80630e89341c116102245780630e89341c1461039057806319165587146103cd57806326506ba4146103f6578063283248be146104215780632eb2c2d61461045e576102a6565b8062fdd58e146102ab57806301ffc9a7146102e8578063049c5c4914610325578063059c14fb1461033c57806306fdde0314610365576102a6565b366102a6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028d610a22565b3460405161029c929190613880565b60405180910390a1005b600080fd5b3480156102b757600080fd5b506102d260048036038101906102cd9190613915565b610a2a565b6040516102df9190613955565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906139c8565b610af3565b60405161031c9190613a10565b60405180910390f35b34801561033157600080fd5b5061033a610bd5565b005b34801561034857600080fd5b50610363600480360381019061035e9190613a2b565b610c4f565b005b34801561037157600080fd5b5061037a610c61565b6040516103879190613ae8565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b29190613a2b565b610cef565b6040516103c49190613ae8565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613b48565b610e2a565b005b34801561040257600080fd5b5061040b610fd4565b6040516104189190613b75565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613a2b565b610ffa565b6040516104559190613b75565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613d8d565b611039565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613efd565b6110da565b005b3480156104bc57600080fd5b506104c5611138565b6040516104d29190613955565b60405180910390f35b6104e3611142565b005b3480156104f157600080fd5b5061050c60048036038101906105079190613f84565b611188565b6040516105199190613955565b60405180910390f35b34801561052e57600080fd5b5061053761120f565b6040516105449190614023565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f9190613a2b565b611221565b005b34801561058257600080fd5b5061059d60048036038101906105989190613f84565b611233565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190614101565b6114eb565b6040516105d39190614237565b60405180910390f35b3480156105e857600080fd5b506105f1611604565b005b3480156105ff57600080fd5b5061060861160f565b6040516106159190613955565b60405180910390f35b61063860048036038101906106339190614285565b611615565b005b34801561064657600080fd5b5061064f61186a565b005b34801561065d57600080fd5b5061067860048036038101906106739190613a2b565b61187e565b005b34801561068657600080fd5b506106a1600480360381019061069c9190613a2b565b611890565b6040516106ae9190613b75565b60405180910390f35b3480156106c357600080fd5b506106cc6118d8565b6040516106d99190613b75565b60405180910390f35b3480156106ee57600080fd5b506106f7611901565b6040516107049190613955565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906142c5565b611907565b6040516107419190613955565b60405180910390f35b34801561075657600080fd5b50610771600480360381019061076c91906142f2565b611950565b005b34801561077f57600080fd5b50610788611a5a565b6040516107959190613955565b60405180910390f35b3480156107aa57600080fd5b506107c560048036038101906107c09190613a2b565b611a60565b6040516107d29190613a10565b60405180910390f35b3480156107e757600080fd5b5061080260048036038101906107fd91906142c5565b611a80565b60405161080f9190613955565b60405180910390f35b34801561082457600080fd5b5061083f600480360381019061083a9190614332565b611ac9565b005b34801561084d57600080fd5b50610868600480360381019061086391906143e0565b611ae1565b005b34801561087657600080fd5b5061087f611bad565b60405161088c9190613b75565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b7919061448c565b611bd3565b6040516108c99190613955565b60405180910390f35b3480156108de57600080fd5b506108e7611c1c565b005b3480156108f557600080fd5b506108fe611c6c565b60405161090b9190613955565b60405180910390f35b34801561092057600080fd5b5061093b600480360381019061093691906144b9565b611c76565b6040516109489190613a10565b60405180910390f35b34801561095d57600080fd5b50610966611d0a565b6040516109739190613a10565b60405180910390f35b34801561098857600080fd5b506109a3600480360381019061099e9190613a2b565b611d1d565b6040516109b09190613955565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db91906144f9565b611dff565b005b3480156109ee57600080fd5b50610a096004803603810190610a0491906142c5565b611ea0565b005b348015610a1757600080fd5b50610a20611f23565b005b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190614602565b60405180910390fd5b6008600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bbe57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bce5750610bcd82612091565b5b9050919050565b610bdd6120fb565b600b60009054906101000a900460ff1615600b60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600b60009054906101000a900460ff16604051610c459190613a10565b60405180910390a1565b610c576120fb565b8060138190555050565b600e8054610c6e90614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90614651565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b505050505081565b6060600f600083815260200190815260200160002060009054906101000a900460ff16610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d48906146ce565b60405180910390fd5b6000600d8054610d6090614651565b905011610df757600d8054610d7490614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610da090614651565b8015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050610e23565b600d610e0283612179565b604051602001610e139291906147c2565b6040516020818303038152906040525b9050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614858565b60405180910390fd5b6000610eb6611c6c565b47610ec191906148a7565b90506000610ed88383610ed386611907565b6122d9565b905060008103610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f149061494d565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6c91906148a7565b925050819055508060026000828254610f8591906148a7565b92505081905550610f968382612347565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fc792919061498e565b60405180910390a1505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015818154811061100a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611041610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611087575061108685611081610a22565b611c76565b5b6110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90614a29565b60405180910390fd5b6110d3858585858561243b565b5050505050565b6110e26120fb565b80600d90816110f19190614bd6565b50600d6040516111019190614ca8565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6000600154905090565b6014543411611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117d90614d0b565b60405180910390fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b6112296120fb565b8060148190555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac90614858565b60405180910390fd5b60006112c083611bd3565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112f99190613b75565b602060405180830381865afa158015611316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133a9190614d40565b61134491906148a7565b9050600061135c83836113578787611188565b6122d9565b9050600081036113a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113989061494d565b60405180910390fd5b80600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461142d91906148a7565b9250508190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148391906148a7565b9250508190555061149584848361275f565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516114dd929190613880565b60405180910390a250505050565b60608151835114611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890614ddf565b60405180910390fd5b6000835167ffffffffffffffff81111561154e5761154d613b95565b5b60405190808252806020026020018201604052801561157c5781602001602082028036833780820191505090505b50905060005b84518110156115f9576115c98582815181106115a1576115a0614dff565b5b60200260200101518583815181106115bc576115bb614dff565b5b6020026020010151610a2a565b8282815181106115dc576115db614dff565b5b602002602001018181525050806115f290614e2e565b9050611582565b508091505092915050565b61160d33610e2a565b565b60145481565b600b60009054906101000a900460ff16611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90614ec2565b60405180910390fd5b801561180c57816013546116789190614ee2565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116d5929190614f24565b602060405180830381865afa1580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117169190614d40565b1015611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90614f99565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856013546117a59190614ee2565b6040518463ffffffff1660e01b81526004016117c393929190614fb9565b6020604051808303816000875af11580156117e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118069190615005565b5061185d565b348260145461181b9190614ee2565b111561185c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118539061507e565b60405180910390fd5b5b611866826127e5565b5050565b6118726120fb565b61187c6000612894565b565b6118866120fb565b80600c8190555050565b6000600582815481106118a6576118a5614dff565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a4b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119c8929190614f24565b602060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a099190615005565b611a4a57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a419190613b75565b60405180910390fd5b5b611a558383612958565b505050565b600c5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ad16120fb565b611adc83838361296e565b505050565b611ae96120fb565b60005b83839050811015611ba657611b93848483818110611b0d57611b0c614dff565b5b9050602002016020810190611b2291906142c5565b868381518110611b3557611b34614dff565b5b6020026020010151848481518110611b5057611b4f614dff565b5b60200260200101516040518060400160405280601581526020017f44726f702d612d70616c6f6f7a61206572726f72210000000000000000000000815250612bb6565b8080611b9e90614e2e565b915050611aec565b5050505050565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c246120fb565b611c2c611f23565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600254905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900460ff1681565b600080434233604051602001611d3391906150e6565b6040516020818303038152906040528051906020012060001c611d569190615130565b454241604051602001611d69919061518a565b6040516020818303038152906040528051906020012060001c611d8c9190615130565b4442611d9891906148a7565b611da291906148a7565b611dac91906148a7565b611db691906148a7565b611dc091906148a7565b604051602001611dd091906151c6565b6040516020818303038152906040528051906020012060001c90508281611df791906151e1565b915050919050565b611e07610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e4d5750611e4c85611e47610a22565b611c76565b5b611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614a29565b60405180910390fd5b611e998585858585612d67565b5050505050565b611ea86120fb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90615284565b60405180910390fd5b611f2081612894565b50565b611f2b6120fb565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f889190613b75565b602060405180830381865afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190614d40565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161204a929190613880565b6020604051808303816000875af1158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190615005565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612103610a22565b73ffffffffffffffffffffffffffffffffffffffff166121216118d8565b73ffffffffffffffffffffffffffffffffffffffff1614612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e906152f0565b60405180910390fd5b565b6060600082036121c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122d4565b600082905060005b600082146121f25780806121db90614e2e565b915050600a826121eb9190615130565b91506121c8565b60008167ffffffffffffffff81111561220e5761220d613b95565b5b6040519080825280601f01601f1916602001820160405280156122405781602001600182028036833780820191505090505b5090505b600085146122cd576001826122599190615310565b9150600a8561226891906151e1565b603061227491906148a7565b60f81b81838151811061228a57612289614dff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122c69190615130565b9450612244565b8093505050505b919050565b600081600154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561232a9190614ee2565b6123349190615130565b61233e9190615310565b90509392505050565b8047101561238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190615390565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123b0906153e1565b60006040518083038185875af1925050503d80600081146123ed576040519150601f19603f3d011682016040523d82523d6000602084013e6123f2565b606091505b5050905080612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90615468565b60405180910390fd5b505050565b815183511461247f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612476906154fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e59061558c565b60405180910390fd5b60006124f8610a22565b9050612508818787878787613005565b60005b84518110156126bc57600085828151811061252957612528614dff565b5b60200260200101519050600085838151811061254857612547614dff565b5b6020026020010151905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e19061561e565b60405180910390fd5b8181036008600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a191906148a7565b92505081905550505050806126b590614e2e565b905061250b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161273392919061563e565b60405180910390a461274981878787878761300d565b612757818787878787613015565b505050505050565b6127e08363a9059cbb60e01b848460405160240161277e929190613880565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506131ec565b505050565b60005b818110156128905760006127fd601054611d1d565b9050612841338260016040518060400160405280600b81526020017f4d696e74204661696c6564000000000000000000000000000000000000000000815250612bb6565b7fd9be9c40c7e99dfc974fa3fe3b790af02afd2939b5dedfccb1ba12933eb27a8e33824260405161287493929190615675565b60405180910390a150808061288890614e2e565b9150506127e8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61296a612963610a22565b83836132b3565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d49061571e565b60405180910390fd5b60006129e7610a22565b905060006129f48461341f565b90506000612a018461341f565b9050612a2183876000858560405180602001604052806000815250613005565b60006008600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab0906157b0565b60405180910390fd5b8481036008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612b879291906157d0565b60405180910390a4612bad8488600086866040518060200160405280600081525061300d565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c9061586b565b60405180910390fd5b6000612c2f610a22565b90506000612c3c8561341f565b90506000612c498561341f565b9050612c5a83600089858589613005565b846008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cba91906148a7565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612d389291906157d0565b60405180910390a4612d4f8360008985858961300d565b612d5e83600089898989613499565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcd9061558c565b60405180910390fd5b6000612de0610a22565b90506000612ded8561341f565b90506000612dfa8561341f565b9050612e0a838989858589613005565b60006008600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e999061561e565b60405180910390fd5b8581036008600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856008600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5991906148a7565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612fd69291906157d0565b60405180910390a4612fec848a8a86868a61300d565b612ffa848a8a8a8a8a613499565b505050505050505050565b505050505050565b505050505050565b6130348473ffffffffffffffffffffffffffffffffffffffff16613670565b156131e4578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161307a9594939291906158e0565b6020604051808303816000875af19250505080156130b657506040513d601f19601f820116820180604052508101906130b3919061595d565b60015b61315b576130c2615997565b806308c379a00361311e57506130d66159b9565b806130e15750613120565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131159190613ae8565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315290615abb565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d990615b4d565b60405180910390fd5b505b505050505050565b600061324e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136939092919063ffffffff16565b90506000815111156132ae578080602001905181019061326e9190615005565b6132ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a490615bdf565b60405180910390fd5b5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331890615c71565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516134129190613a10565b60405180910390a3505050565b60606000600167ffffffffffffffff81111561343e5761343d613b95565b5b60405190808252806020026020018201604052801561346c5781602001602082028036833780820191505090505b509050828160008151811061348457613483614dff565b5b60200260200101818152505080915050919050565b6134b88473ffffffffffffffffffffffffffffffffffffffff16613670565b15613668578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016134fe959493929190615c91565b6020604051808303816000875af192505050801561353a57506040513d601f19601f82011682018060405250810190613537919061595d565b60015b6135df57613546615997565b806308c379a0036135a2575061355a6159b9565b8061356557506135a4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135999190613ae8565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d690615abb565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365d90615b4d565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606136a284846000856136ab565b90509392505050565b6060824710156136f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e790615d5d565b60405180910390fd5b6136f985613670565b613738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372f90615dc9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137619190615e1a565b60006040518083038185875af1925050503d806000811461379e576040519150601f19603f3d011682016040523d82523d6000602084013e6137a3565b606091505b50915091506137b38282866137bf565b92505050949350505050565b606083156137cf5782905061381f565b6000835111156137e25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138169190613ae8565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061385182613826565b9050919050565b61386181613846565b82525050565b6000819050919050565b61387a81613867565b82525050565b60006040820190506138956000830185613858565b6138a26020830184613871565b9392505050565b6000604051905090565b600080fd5b600080fd5b6138c681613846565b81146138d157600080fd5b50565b6000813590506138e3816138bd565b92915050565b6138f281613867565b81146138fd57600080fd5b50565b60008135905061390f816138e9565b92915050565b6000806040838503121561392c5761392b6138b3565b5b600061393a858286016138d4565b925050602061394b85828601613900565b9150509250929050565b600060208201905061396a6000830184613871565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139a581613970565b81146139b057600080fd5b50565b6000813590506139c28161399c565b92915050565b6000602082840312156139de576139dd6138b3565b5b60006139ec848285016139b3565b91505092915050565b60008115159050919050565b613a0a816139f5565b82525050565b6000602082019050613a256000830184613a01565b92915050565b600060208284031215613a4157613a406138b3565b5b6000613a4f84828501613900565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a92578082015181840152602081019050613a77565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aba82613a58565b613ac48185613a63565b9350613ad4818560208601613a74565b613add81613a9e565b840191505092915050565b60006020820190508181036000830152613b028184613aaf565b905092915050565b6000613b1582613826565b9050919050565b613b2581613b0a565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060208284031215613b5e57613b5d6138b3565b5b6000613b6c84828501613b33565b91505092915050565b6000602082019050613b8a6000830184613858565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bcd82613a9e565b810181811067ffffffffffffffff82111715613bec57613beb613b95565b5b80604052505050565b6000613bff6138a9565b9050613c0b8282613bc4565b919050565b600067ffffffffffffffff821115613c2b57613c2a613b95565b5b602082029050602081019050919050565b600080fd5b6000613c54613c4f84613c10565b613bf5565b90508083825260208201905060208402830185811115613c7757613c76613c3c565b5b835b81811015613ca05780613c8c8882613900565b845260208401935050602081019050613c79565b5050509392505050565b600082601f830112613cbf57613cbe613b90565b5b8135613ccf848260208601613c41565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cf857613cf7613b95565b5b613d0182613a9e565b9050602081019050919050565b82818337600083830152505050565b6000613d30613d2b84613cdd565b613bf5565b905082815260208101848484011115613d4c57613d4b613cd8565b5b613d57848285613d0e565b509392505050565b600082601f830112613d7457613d73613b90565b5b8135613d84848260208601613d1d565b91505092915050565b600080600080600060a08688031215613da957613da86138b3565b5b6000613db7888289016138d4565b9550506020613dc8888289016138d4565b945050604086013567ffffffffffffffff811115613de957613de86138b8565b5b613df588828901613caa565b935050606086013567ffffffffffffffff811115613e1657613e156138b8565b5b613e2288828901613caa565b925050608086013567ffffffffffffffff811115613e4357613e426138b8565b5b613e4f88828901613d5f565b9150509295509295909350565b600067ffffffffffffffff821115613e7757613e76613b95565b5b613e8082613a9e565b9050602081019050919050565b6000613ea0613e9b84613e5c565b613bf5565b905082815260208101848484011115613ebc57613ebb613cd8565b5b613ec7848285613d0e565b509392505050565b600082601f830112613ee457613ee3613b90565b5b8135613ef4848260208601613e8d565b91505092915050565b600060208284031215613f1357613f126138b3565b5b600082013567ffffffffffffffff811115613f3157613f306138b8565b5b613f3d84828501613ecf565b91505092915050565b6000613f5182613846565b9050919050565b613f6181613f46565b8114613f6c57600080fd5b50565b600081359050613f7e81613f58565b92915050565b60008060408385031215613f9b57613f9a6138b3565b5b6000613fa985828601613f6f565b9250506020613fba858286016138d4565b9150509250929050565b6000819050919050565b6000613fe9613fe4613fdf84613826565b613fc4565b613826565b9050919050565b6000613ffb82613fce565b9050919050565b600061400d82613ff0565b9050919050565b61401d81614002565b82525050565b60006020820190506140386000830184614014565b92915050565b600067ffffffffffffffff82111561405957614058613b95565b5b602082029050602081019050919050565b600061407d6140788461403e565b613bf5565b905080838252602082019050602084028301858111156140a05761409f613c3c565b5b835b818110156140c957806140b588826138d4565b8452602084019350506020810190506140a2565b5050509392505050565b600082601f8301126140e8576140e7613b90565b5b81356140f884826020860161406a565b91505092915050565b60008060408385031215614118576141176138b3565b5b600083013567ffffffffffffffff811115614136576141356138b8565b5b614142858286016140d3565b925050602083013567ffffffffffffffff811115614163576141626138b8565b5b61416f85828601613caa565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141ae81613867565b82525050565b60006141c083836141a5565b60208301905092915050565b6000602082019050919050565b60006141e482614179565b6141ee8185614184565b93506141f983614195565b8060005b8381101561422a57815161421188826141b4565b975061421c836141cc565b9250506001810190506141fd565b5085935050505092915050565b6000602082019050818103600083015261425181846141d9565b905092915050565b614262816139f5565b811461426d57600080fd5b50565b60008135905061427f81614259565b92915050565b6000806040838503121561429c5761429b6138b3565b5b60006142aa85828601613900565b92505060206142bb85828601614270565b9150509250929050565b6000602082840312156142db576142da6138b3565b5b60006142e9848285016138d4565b91505092915050565b60008060408385031215614309576143086138b3565b5b6000614317858286016138d4565b925050602061432885828601614270565b9150509250929050565b60008060006060848603121561434b5761434a6138b3565b5b6000614359868287016138d4565b935050602061436a86828701613900565b925050604061437b86828701613900565b9150509250925092565b600080fd5b60008083601f8401126143a05761439f613b90565b5b8235905067ffffffffffffffff8111156143bd576143bc614385565b5b6020830191508360208202830111156143d9576143d8613c3c565b5b9250929050565b600080600080606085870312156143fa576143f96138b3565b5b600085013567ffffffffffffffff811115614418576144176138b8565b5b61442487828801613caa565b945050602085013567ffffffffffffffff811115614445576144446138b8565b5b6144518782880161438a565b9350935050604085013567ffffffffffffffff811115614474576144736138b8565b5b61448087828801613caa565b91505092959194509250565b6000602082840312156144a2576144a16138b3565b5b60006144b084828501613f6f565b91505092915050565b600080604083850312156144d0576144cf6138b3565b5b60006144de858286016138d4565b92505060206144ef858286016138d4565b9150509250929050565b600080600080600060a08688031215614515576145146138b3565b5b6000614523888289016138d4565b9550506020614534888289016138d4565b945050604061454588828901613900565b935050606061455688828901613900565b925050608086013567ffffffffffffffff811115614577576145766138b8565b5b61458388828901613d5f565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006145ec602a83613a63565b91506145f782614590565b604082019050919050565b6000602082019050818103600083015261461b816145df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061466957607f821691505b60208210810361467c5761467b614622565b5b50919050565b7f5552492072657175657374656420666f7220696e76616c696420747970650000600082015250565b60006146b8601e83613a63565b91506146c382614682565b602082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461471b81614651565b61472581866146ee565b94506001821660008114614740576001811461475557614788565b60ff1983168652811515820286019350614788565b61475e856146f9565b60005b8381101561478057815481890152600182019150602081019050614761565b838801955050505b50505092915050565b600061479c82613a58565b6147a681856146ee565b93506147b6818560208601613a74565b80840191505092915050565b60006147ce828561470e565b91506147da8284614791565b91508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614842602683613a63565b915061484d826147e6565b604082019050919050565b6000602082019050818103600083015261487181614835565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148b282613867565b91506148bd83613867565b92508282019050808211156148d5576148d4614878565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614937602b83613a63565b9150614942826148db565b604082019050919050565b600060208201905081810360008301526149668161492a565b9050919050565b600061497882613ff0565b9050919050565b6149888161496d565b82525050565b60006040820190506149a3600083018561497f565b6149b06020830184613871565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000614a13602f83613a63565b9150614a1e826149b7565b604082019050919050565b60006020820190508181036000830152614a4281614a06565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a59565b614aa08683614a59565b95508019841693508086168417925050509392505050565b6000614ad3614ace614ac984613867565b613fc4565b613867565b9050919050565b6000819050919050565b614aed83614ab8565b614b01614af982614ada565b848454614a66565b825550505050565b600090565b614b16614b09565b614b21818484614ae4565b505050565b5b81811015614b4557614b3a600082614b0e565b600181019050614b27565b5050565b601f821115614b8a57614b5b816146f9565b614b6484614a49565b81016020851015614b73578190505b614b87614b7f85614a49565b830182614b26565b50505b505050565b600082821c905092915050565b6000614bad60001984600802614b8f565b1980831691505092915050565b6000614bc68383614b9c565b9150826002028217905092915050565b614bdf82613a58565b67ffffffffffffffff811115614bf857614bf7613b95565b5b614c028254614651565b614c0d828285614b49565b600060209050601f831160018114614c405760008415614c2e578287015190505b614c388582614bba565b865550614ca0565b601f198416614c4e866146f9565b60005b82811015614c7657848901518255600182019150602085019450602081019050614c51565b86831015614c935784890151614c8f601f891682614b9c565b8355505b6001600288020188555050505b505050505050565b6000614cb4828461470e565b915081905092915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614cf5600e83613a63565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b600081519050614d3a816138e9565b92915050565b600060208284031215614d5657614d556138b3565b5b6000614d6484828501614d2b565b91505092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614dc9602983613a63565b9150614dd482614d6d565b604082019050919050565b60006020820190508181036000830152614df881614dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e3982613867565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e6b57614e6a614878565b5b600182019050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b6000614eac601083613a63565b9150614eb782614e76565b602082019050919050565b60006020820190508181036000830152614edb81614e9f565b9050919050565b6000614eed82613867565b9150614ef883613867565b9250828202614f0681613867565b91508282048414831517614f1d57614f1c614878565b5b5092915050565b6000604082019050614f396000830185613858565b614f466020830184613858565b9392505050565b7f4572726f723a205472616e73666572206e6f7420617070726f76656400000000600082015250565b6000614f83601c83613a63565b9150614f8e82614f4d565b602082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b6000606082019050614fce6000830186613858565b614fdb6020830185613858565b614fe86040830184613871565b949350505050565b600081519050614fff81614259565b92915050565b60006020828403121561501b5761501a6138b3565b5b600061502984828501614ff0565b91505092915050565b7f4e6f7420456e6f7567682045544820746f206d696e7421000000000000000000600082015250565b6000615068601783613a63565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b60008160601b9050919050565b60006150b68261509e565b9050919050565b60006150c8826150ab565b9050919050565b6150e06150db82613846565b6150bd565b82525050565b60006150f282846150cf565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513b82613867565b915061514683613867565b92508261515657615155615101565b5b828204905092915050565b600061516c826150ab565b9050919050565b61518461517f82613b0a565b615161565b82525050565b60006151968284615173565b60148201915081905092915050565b6000819050919050565b6151c06151bb82613867565b6151a5565b82525050565b60006151d282846151af565b60208201915081905092915050565b60006151ec82613867565b91506151f783613867565b92508261520757615206615101565b5b828206905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061526e602683613a63565b915061527982615212565b604082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006152da602083613a63565b91506152e5826152a4565b602082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b600061531b82613867565b915061532683613867565b925082820390508181111561533e5761533d614878565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061537a601d83613a63565b915061538582615344565b602082019050919050565b600060208201905081810360008301526153a98161536d565b9050919050565b600081905092915050565b50565b60006153cb6000836153b0565b91506153d6826153bb565b600082019050919050565b60006153ec826153be565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615452603a83613a63565b915061545d826153f6565b604082019050919050565b6000602082019050818103600083015261548181615445565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006154e4602883613a63565b91506154ef82615488565b604082019050919050565b60006020820190508181036000830152615513816154d7565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615576602583613a63565b91506155818261551a565b604082019050919050565b600060208201905081810360008301526155a581615569565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615608602a83613a63565b9150615613826155ac565b604082019050919050565b60006020820190508181036000830152615637816155fb565b9050919050565b6000604082019050818103600083015261565881856141d9565b9050818103602083015261566c81846141d9565b90509392505050565b600060608201905061568a6000830186613858565b6156976020830185613871565b6156a46040830184613871565b949350505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615708602383613a63565b9150615713826156ac565b604082019050919050565b60006020820190508181036000830152615737816156fb565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061579a602483613a63565b91506157a58261573e565b604082019050919050565b600060208201905081810360008301526157c98161578d565b9050919050565b60006040820190506157e56000830185613871565b6157f26020830184613871565b9392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615855602183613a63565b9150615860826157f9565b604082019050919050565b6000602082019050818103600083015261588481615848565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158b28261588b565b6158bc8185615896565b93506158cc818560208601613a74565b6158d581613a9e565b840191505092915050565b600060a0820190506158f56000830188613858565b6159026020830187613858565b818103604083015261591481866141d9565b9050818103606083015261592881856141d9565b9050818103608083015261593c81846158a7565b90509695505050505050565b6000815190506159578161399c565b92915050565b600060208284031215615973576159726138b3565b5b600061598184828501615948565b91505092915050565b60008160e01c9050919050565b600060033d11156159b65760046000803e6159b360005161598a565b90505b90565b600060443d10615a46576159cb6138a9565b60043d036004823e80513d602482011167ffffffffffffffff821117156159f3575050615a46565b808201805167ffffffffffffffff811115615a115750505050615a46565b80602083010160043d038501811115615a2e575050505050615a46565b615a3d82602001850186613bc4565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615aa5603483613a63565b9150615ab082615a49565b604082019050919050565b60006020820190508181036000830152615ad481615a98565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615b37602883613a63565b9150615b4282615adb565b604082019050919050565b60006020820190508181036000830152615b6681615b2a565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615bc9602a83613a63565b9150615bd482615b6d565b604082019050919050565b60006020820190508181036000830152615bf881615bbc565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615c5b602983613a63565b9150615c6682615bff565b604082019050919050565b60006020820190508181036000830152615c8a81615c4e565b9050919050565b600060a082019050615ca66000830188613858565b615cb36020830187613858565b615cc06040830186613871565b615ccd6060830185613871565b8181036080830152615cdf81846158a7565b90509695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615d47602683613a63565b9150615d5282615ceb565b604082019050919050565b60006020820190508181036000830152615d7681615d3a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615db3601d83613a63565b9150615dbe82615d7d565b602082019050919050565b60006020820190508181036000830152615de281615da6565b9050919050565b6000615df48261588b565b615dfe81856153b0565b9350615e0e818560208601613a74565b80840191505092915050565b6000615e268284615de9565b91508190509291505056fea2646970667358221220feaee25c17d3649eadfbb076780692f84385d65ed0b537a8965863b2f34a74fa64736f6c63430008110033

Deployed Bytecode Sourcemap

92075:8551:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84358:40;84374:12;:10;:12::i;:::-;84388:9;84358:40;;;;;;;:::i;:::-;;;;;;;;92075:8551;;;;;21869:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20842:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95998:138;;;;;;;;;;;;;:::i;:::-;;98905:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92487:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95430:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86176:616;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92693:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99177:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24019:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95284:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84489:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99016:110;;;:::i;:::-;;85618:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78620:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98796:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87060:704;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22352:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99518:73;;;;;;;;;;;;;:::i;:::-;;92936:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96765:718;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42902:103;;;;;;;;;;;;;:::i;:::-;;94207:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85876;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42254:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92887:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85340:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100025:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92369:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92538:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85136:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98595:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94978:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92288:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84926:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100385:238;;;;;;;;;;;;;:::i;:::-;;84674:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23245:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92247:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97633:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23535:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43160:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99692:181;;;;;;;;;;;;;:::i;:::-;;18544:98;18597:7;18624:10;18617:17;;18544:98;:::o;21869:317::-;22000:7;22066:1;22047:21;;:7;:21;;;22025:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;22156:9;:13;22166:2;22156:13;;;;;;;;;;;:22;22170:7;22156:22;;;;;;;;;;;;;;;;22149:29;;21869:317;;;;:::o;20842:360::-;20989:4;21046:26;21031:41;;;:11;:41;;;;:110;;;;21104:37;21089:52;;;:11;:52;;;;21031:110;:163;;;;21158:36;21182:11;21158:23;:36::i;:::-;21031:163;21011:183;;20842:360;;;:::o;95998:138::-;42140:13;:11;:13::i;:::-;96072:12:::1;;;;;;;;;;;96071:13;96056:12;;:28;;;;;;;;;;;;;;;;;;96100;96115:12;;;;;;;;;;;96100:28;;;;;;:::i;:::-;;;;;;;;95998:138::o:0;98905:103::-;42140:13;:11;:13::i;:::-;98994:6:::1;98975:16;:25;;;;98905:103:::0;:::o;92487:42::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;95430:308::-;95489:13;95523:9;:17;95533:6;95523:17;;;;;;;;;;;;;;;;;;;;;95515:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;95630:1;95612:7;95606:21;;;;;:::i;:::-;;;:25;:124;;95723:7;95606:124;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95675:7;95684:17;:6;:15;:17::i;:::-;95658:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;95606:124;95586:144;;95430:308;;;:::o;86176:616::-;86271:1;86252:7;:16;86260:7;86252:16;;;;;;;;;;;;;;;;:20;86244:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;86328:21;86376:15;:13;:15::i;:::-;86352:21;:39;;;;:::i;:::-;86328:63;;86402:15;86420:108;86450:7;86472:13;86500:17;86509:7;86500:8;:17::i;:::-;86420:15;:108::i;:::-;86402:126;;86560:1;86549:7;:12;86541:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;86644:7;86622:9;:18;86632:7;86622:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;86680:7;86662:14;;:25;;;;;;;:::i;:::-;;;;;;;;86700:35;86718:7;86727;86700:17;:35::i;:::-;86751:33;86767:7;86776;86751:33;;;;;;;:::i;:::-;;;;;;;;86233:559;;86176:616;:::o;92693:69::-;;;;;;;;;;;;;:::o;99177:265::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24019:439::-;24260:12;:10;:12::i;:::-;24252:20;;:4;:20;;;:60;;;;24276:36;24293:4;24299:12;:10;:12::i;:::-;24276:16;:36::i;:::-;24252:60;24230:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;24398:52;24421:4;24427:2;24431:3;24436:7;24445:4;24398:22;:52::i;:::-;24019:439;;;;;:::o;95284:138::-;42140:13;:11;:13::i;:::-;95371:8:::1;95361:7;:18;;;;;;:::i;:::-;;95406:7;95395:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;95284:138:::0;:::o;84489:91::-;84533:7;84560:12;;84553:19;;84489:91;:::o;99016:110::-;99084:15;;99072:9;:27;99064:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;99016:110::o;85618:167::-;85715:7;85747:14;:21;85762:5;85747:21;;;;;;;;;;;;;;;:30;85769:7;85747:30;;;;;;;;;;;;;;;;85740:37;;85618:167;;;;:::o;78620:143::-;78720:42;78620:143;:::o;98796:101::-;42140:13;:11;:13::i;:::-;98883:6:::1;98865:15;:24;;;;98796:101:::0;:::o;87060:704::-;87161:1;87142:7;:16;87150:7;87142:16;;;;;;;;;;;;;;;;:20;87134:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;87218:21;87288:20;87302:5;87288:13;:20::i;:::-;87242:5;:15;;;87266:4;87242:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;87218:90;;87319:15;87337:115;87367:7;87389:13;87417:24;87426:5;87433:7;87417:8;:24::i;:::-;87337:15;:115::i;:::-;87319:133;;87484:1;87473:7;:12;87465:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;87580:7;87546:14;:21;87561:5;87546:21;;;;;;;;;;;;;;;:30;87568:7;87546:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;87628:7;87598:19;:26;87618:5;87598:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;87648:47;87671:5;87678:7;87687;87648:22;:47::i;:::-;87732:5;87711:45;;;87739:7;87748;87711:45;;;;;;;:::i;:::-;;;;;;;;87123:641;;87060:704;;:::o;22352:561::-;22508:16;22583:3;:10;22564:8;:15;:29;22542:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;22675:30;22722:8;:15;22708:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22675:63;;22756:9;22751:122;22775:8;:15;22771:1;:19;22751:122;;;22831:30;22841:8;22850:1;22841:11;;;;;;;;:::i;:::-;;;;;;;;22854:3;22858:1;22854:6;;;;;;;;:::i;:::-;;;;;;;;22831:9;:30::i;:::-;22812:13;22826:1;22812:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;22792:3;;;;:::i;:::-;;;22751:122;;;;22892:13;22885:20;;;22352:561;;;;:::o;99518:73::-;99555:28;99571:10;99555:7;:28::i;:::-;99518:73::o;92936:49::-;;;;:::o;96765:718::-;96846:12;;;;;;;;;;;96838:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;96894:10;96890:557;;;97044:6;97025:16;;:25;;;;:::i;:::-;96947:16;;;;;;;;;;;:26;;;96974:10;96994:4;96947:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:103;;96921:193;;;;;;;;;;;;:::i;:::-;;;;;;;;;97129:16;;;;;;;;;;;:29;;;97177:10;97214:4;97259:6;97239:16;;97238:27;;;;:::i;:::-;97129:151;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;96890:557;;;97367:9;97357:6;97339:15;;:24;;;;:::i;:::-;:37;;97313:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;96890:557;97459:16;97468:6;97459:8;:16::i;:::-;96765:718;;:::o;42902:103::-;42140:13;:11;:13::i;:::-;42967:30:::1;42994:1;42967:18;:30::i;:::-;42902:103::o:0;94207:100::-;42140:13;:11;:13::i;:::-;94298:1:::1;94278:17;:21;;;;94207:100:::0;:::o;85876:::-;85927:7;85954;85962:5;85954:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;85947:21;;85876:100;;;:::o;42254:87::-;42300:7;42327:6;;;;;;;;;;;42320:13;;42254:87;:::o;92887:42::-;;;;:::o;85340:109::-;85396:7;85423:9;:18;85433:7;85423:18;;;;;;;;;;;;;;;;85416:25;;85340:109;;;:::o;100025:208::-;100156:8;80889:1;78720:42;80841:45;;;:49;80837:318;;;78720:42;80930;;;81003:4;81031:8;80930:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80907:237;;81119:8;81100:28;;;;;;;;;;;:::i;:::-;;;;;;;;80907:237;80837:318;100182:43:::1;100206:8;100216;100182:23;:43::i;:::-;100025:208:::0;;;:::o;92369:38::-;;;;:::o;92538:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;85136:105::-;85190:7;85217;:16;85225:7;85217:16;;;;;;;;;;;;;;;;85210:23;;85136:105;;;:::o;98595:193::-;42140:13;:11;:13::i;:::-;98741:39:::1;98747:10;98759:7;98768:11;98741:5;:39::i;:::-;98595:193:::0;;;:::o;94978:298::-;42140:13;:11;:13::i;:::-;95141:9:::1;95136:133;95160:5;;:12;;95156:1;:16;95136:133;;;95194:63;95200:5;;95206:1;95200:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;95210:9;95220:1;95210:12;;;;;;;;:::i;:::-;;;;;;;;95224:4;95229:1;95224:7;;;;;;;;:::i;:::-;;;;;;;;95194:63;;;;;;;;;;;;;;;;::::0;:5:::1;:63::i;:::-;95174:3;;;;;:::i;:::-;;;;95136:133;;;;94978:298:::0;;;;:::o;92288:74::-;;;;;;;;;;;;;:::o;84926:119::-;84984:7;85011:19;:26;85031:5;85011:26;;;;;;;;;;;;;;;;85004:33;;84926:119;;;:::o;100385:238::-;42140:13;:11;:13::i;:::-;100509:15:::1;:13;:15::i;:::-;100535:18;100572:14;;;;;;;;;;;100535:53;;100612:2;100599:16;;;84674:95:::0;84720:7;84747:14;;84740:21;;84674:95;:::o;23245:218::-;23389:4;23418:18;:27;23437:7;23418:27;;;;;;;;;;;;;;;:37;23446:8;23418:37;;;;;;;;;;;;;;;;;;;;;;;;;23411:44;;23245:218;;;;:::o;92247:32::-;;;;;;;;;;;;;:::o;97633:711::-;97698:7;97718:12;98240;98195:15;98148:10;98131:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;98121:39;;;;;;98113:48;;98112:99;;;;:::i;:::-;98069:14;98024:15;97976:14;97959:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;97949:43;;;;;;97941:52;;97910:130;;;;:::i;:::-;97865:16;97822:15;:59;;;;:::i;:::-;:219;;;;:::i;:::-;:261;;;;:::i;:::-;:390;;;;:::i;:::-;:430;;;;:::i;:::-;97783:488;;;;;;;;:::i;:::-;;;;;;;;;;;;;97755:531;;;;;;97733:564;;97718:579;;98324:12;98317:4;:19;;;;:::i;:::-;98310:26;;;97633:711;;;:::o;23535:407::-;23751:12;:10;:12::i;:::-;23743:20;;:4;:20;;;:60;;;;23767:36;23784:4;23790:12;:10;:12::i;:::-;23767:16;:36::i;:::-;23743:60;23721:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;23889:45;23907:4;23913:2;23917;23921:6;23929:4;23889:17;:45::i;:::-;23535:407;;;;;:::o;43160:238::-;42140:13;:11;:13::i;:::-;43283:1:::1;43263:22;;:8;:22;;::::0;43241:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43362:28;43381:8;43362:18;:28::i;:::-;43160:238:::0;:::o;99692:181::-;42140:13;:11;:13::i;:::-;99745:15:::1;99763:16;;;;;;;;;;;:26;;;99798:4;99763:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;99745:59;;99815:16;;;;;;;;;;;:25;;;99841:14;;;;;;;;;;;99857:7;99815:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;99734:139;99692:181::o:0;19623:207::-;19753:4;19797:25;19782:40;;;:11;:40;;;;19775:47;;19623:207;;;:::o;42419:132::-;42494:12;:10;:12::i;:::-;42483:23;;:7;:5;:7::i;:::-;:23;;;42475:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42419:132::o;38895:723::-;38951:13;39181:1;39172:5;:10;39168:53;;39199:10;;;;;;;;;;;;;;;;;;;;;39168:53;39231:12;39246:5;39231:20;;39262:14;39287:78;39302:1;39294:4;:9;39287:78;;39320:8;;;;;:::i;:::-;;;;39351:2;39343:10;;;;;:::i;:::-;;;39287:78;;;39375:19;39407:6;39397:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39375:39;;39425:154;39441:1;39432:5;:10;39425:154;;39469:1;39459:11;;;;;:::i;:::-;;;39536:2;39528:5;:10;;;;:::i;:::-;39515:2;:24;;;;:::i;:::-;39502:39;;39485:6;39492;39485:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39565:2;39556:11;;;;;:::i;:::-;;;39425:154;;;39603:6;39589:21;;;;;38895:723;;;;:::o;87942:261::-;88088:7;88180:15;88165:12;;88145:7;:16;88153:7;88145:16;;;;;;;;;;;;;;;;88129:13;:32;;;;:::i;:::-;88128:49;;;;:::i;:::-;:67;;;;:::i;:::-;88108:87;;87942:261;;;;;:::o;11337:391::-;11466:6;11441:21;:31;;11419:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;11543:12;11561:9;:14;;11583:6;11561:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11542:52;;;11627:7;11605:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11408:320;11337:391;;:::o;26291:1321::-;26532:7;:14;26518:3;:10;:28;26496:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;26647:1;26633:16;;:2;:16;;;26625:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26704:16;26723:12;:10;:12::i;:::-;26704:31;;26748:60;26769:8;26779:4;26785:2;26789:3;26794:7;26803:4;26748:20;:60::i;:::-;26826:9;26821:470;26845:3;:10;26841:1;:14;26821:470;;;26877:10;26890:3;26894:1;26890:6;;;;;;;;:::i;:::-;;;;;;;;26877:19;;26911:14;26928:7;26936:1;26928:10;;;;;;;;:::i;:::-;;;;;;;;26911:27;;26955:19;26977:9;:13;26987:2;26977:13;;;;;;;;;;;:19;26991:4;26977:19;;;;;;;;;;;;;;;;26955:41;;27052:6;27037:11;:21;;27011:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;27216:6;27202:11;:20;27180:9;:13;27190:2;27180:13;;;;;;;;;;;:19;27194:4;27180:19;;;;;;;;;;;;;;;:42;;;;27273:6;27252:9;:13;27262:2;27252:13;;;;;;;;;;;:17;27266:2;27252:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;26862:429;;;26857:3;;;;:::i;:::-;;;26821:470;;;;27338:2;27308:47;;27332:4;27308:47;;27322:8;27308:47;;;27342:3;27347:7;27308:47;;;;;;;:::i;:::-;;;;;;;;27368:59;27388:8;27398:4;27404:2;27408:3;27413:7;27422:4;27368:19;:59::i;:::-;27440:164;27490:8;27513:4;27532:2;27549:3;27567:7;27589:4;27440:35;:164::i;:::-;26485:1127;26291:1321;;;;;:::o;55777:248::-;55894:123;55928:5;55971:23;;;55996:2;56000:5;55948:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55894:19;:123::i;:::-;55777:248;;;:::o;96264:301::-;96322:9;96317:241;96341:6;96337:1;:10;96317:241;;;96369:18;96390:23;96403:9;;96390:12;:23::i;:::-;96369:44;;96428:47;96434:10;96446;96458:1;96428:47;;;;;;;;;;;;;;;;;:5;:47::i;:::-;96495:51;96506:10;96518;96530:15;96495:51;;;;;;;;:::i;:::-;;;;;;;;96354:204;96349:3;;;;;:::i;:::-;;;;96317:241;;;;96264:301;:::o;43558:191::-;43632:16;43651:6;;;;;;;;;;;43632:25;;43677:8;43668:6;;:17;;;;;;;;;;;;;;;;;;43732:8;43701:40;;43722:8;43701:40;;;;;;;;;;;;43621:128;43558:191;:::o;22986:187::-;23113:52;23132:12;:10;:12::i;:::-;23146:8;23156;23113:18;:52::i;:::-;22986:187;;:::o;31388:808::-;31531:1;31515:18;;:4;:18;;;31507:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31586:16;31605:12;:10;:12::i;:::-;31586:31;;31628:20;31651:21;31669:2;31651:17;:21::i;:::-;31628:44;;31683:24;31710:25;31728:6;31710:17;:25::i;:::-;31683:52;;31748:66;31769:8;31779:4;31793:1;31797:3;31802:7;31748:66;;;;;;;;;;;;:20;:66::i;:::-;31827:19;31849:9;:13;31859:2;31849:13;;;;;;;;;;;:19;31863:4;31849:19;;;;;;;;;;;;;;;;31827:41;;31902:6;31887:11;:21;;31879:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;32021:6;32007:11;:20;31985:9;:13;31995:2;31985:13;;;;;;;;;;;:19;31999:4;31985:19;;;;;;;;;;;;;;;:42;;;;32095:1;32056:54;;32081:4;32056:54;;32071:8;32056:54;;;32099:2;32103:6;32056:54;;;;;;;:::i;:::-;;;;;;;;32123:65;32143:8;32153:4;32167:1;32171:3;32176:7;32123:65;;;;;;;;;;;;:19;:65::i;:::-;31496:700;;;;31388:808;;;:::o;28930:818::-;29097:1;29083:16;;:2;:16;;;29075:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29150:16;29169:12;:10;:12::i;:::-;29150:31;;29192:20;29215:21;29233:2;29215:17;:21::i;:::-;29192:44;;29247:24;29274:25;29292:6;29274:17;:25::i;:::-;29247:52;;29312:66;29333:8;29351:1;29355:2;29359:3;29364:7;29373:4;29312:20;:66::i;:::-;29412:6;29391:9;:13;29401:2;29391:13;;;;;;;;;;;:17;29405:2;29391:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29471:2;29434:52;;29467:1;29434:52;;29449:8;29434:52;;;29475:2;29479:6;29434:52;;;;;;;:::i;:::-;;;;;;;;29499:65;29519:8;29537:1;29541:2;29545:3;29550:7;29559:4;29499:19;:65::i;:::-;29577:163;29622:8;29653:1;29670:2;29687;29704:6;29725:4;29577:30;:163::i;:::-;29064:684;;;28930:818;;;;:::o;24922:1011::-;25124:1;25110:16;;:2;:16;;;25102:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;25181:16;25200:12;:10;:12::i;:::-;25181:31;;25223:20;25246:21;25264:2;25246:17;:21::i;:::-;25223:44;;25278:24;25305:25;25323:6;25305:17;:25::i;:::-;25278:52;;25343:60;25364:8;25374:4;25380:2;25384:3;25389:7;25398:4;25343:20;:60::i;:::-;25416:19;25438:9;:13;25448:2;25438:13;;;;;;;;;;;:19;25452:4;25438:19;;;;;;;;;;;;;;;;25416:41;;25505:6;25490:11;:21;;25468:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;25653:6;25639:11;:20;25617:9;:13;25627:2;25617:13;;;;;;;;;;;:19;25631:4;25617:19;;;;;;;;;;;;;;;:42;;;;25702:6;25681:9;:13;25691:2;25681:13;;;;;;;;;;;:17;25695:2;25681:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;25757:2;25726:46;;25751:4;25726:46;;25741:8;25726:46;;;25761:2;25765:6;25726:46;;;;;;;:::i;:::-;;;;;;;;25785:59;25805:8;25815:4;25821:2;25825:3;25830:7;25839:4;25785:19;:59::i;:::-;25857:68;25888:8;25898:4;25904:2;25908;25912:6;25920:4;25857:30;:68::i;:::-;25091:842;;;;24922:1011;;;;;:::o;34933:221::-;;;;;;;:::o;36109:220::-;;;;;;;:::o;37243:975::-;37483:15;:2;:13;;;:15::i;:::-;37479:732;;;37553:2;37536:43;;;37602:8;37633:4;37660:3;37686:7;37716:4;37536:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37515:685;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38073:6;38066:14;;;;;;;;;;;:::i;:::-;;;;;;;;37515:685;;;38122:62;;;;;;;;;;:::i;:::-;;;;;;;;37515:685;37836:48;;;37824:60;;;:8;:60;;;;37798:199;;37927:50;;;;;;;;;;:::i;:::-;;;;;;;;37798:199;37753:259;37479:732;37243:975;;;;;;:::o;58744:802::-;59168:23;59194:106;59236:4;59194:106;;;;;;;;;;;;;;;;;59202:5;59194:27;;;;:106;;;;;:::i;:::-;59168:132;;59335:1;59315:10;:17;:21;59311:228;;;59430:10;59419:30;;;;;;;;;;;;:::i;:::-;59393:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;59311:228;58814:732;58744:802;;:::o;33644:331::-;33799:8;33790:17;;:5;:17;;;33782:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33902:8;33864:18;:25;33883:5;33864:25;;;;;;;;;;;;;;;:35;33890:8;33864:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33948:8;33926:41;;33941:5;33926:41;;;33958:8;33926:41;;;;;;:::i;:::-;;;;;;;;33644:331;;;:::o;38226:230::-;38319:16;38353:22;38392:1;38378:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38353:41;;38416:7;38405:5;38411:1;38405:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;38443:5;38436:12;;;38226:230;;;:::o;36337:898::-;36552:15;:2;:13;;;:15::i;:::-;36548:680;;;36622:2;36605:38;;;36666:8;36697:4;36724:2;36749:6;36778:4;36605:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36584:633;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37090:6;37083:14;;;;;;;;;;;:::i;:::-;;;;;;;;36584:633;;;37139:62;;;;;;;;;;:::i;:::-;;;;;;;;36584:633;36876:43;;;36864:55;;;:8;:55;;;;36860:154;;36944:50;;;;;;;;;;:::i;:::-;;;;;;;;36860:154;36815:214;36548:680;36337:898;;;;;;:::o;10076:326::-;10136:4;10393:1;10371:7;:19;;;:23;10364:30;;10076:326;;;:::o;12918:229::-;13055:12;13087:52;13109:6;13117:4;13123:1;13126:12;13087:21;:52::i;:::-;13080:59;;12918:229;;;;;:::o;14134:571::-;14304:12;14376:5;14351:21;:30;;14329:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;14466:18;14477:6;14466:10;:18::i;:::-;14458:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14532:12;14546:23;14573:6;:11;;14592:5;14613:4;14573:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14531:97;;;;14646:51;14663:7;14672:10;14684:12;14646:16;:51::i;:::-;14639:58;;;;14134:571;;;;;;:::o;17094:762::-;17244:12;17273:7;17269:580;;;17304:10;17297:17;;;;17269:580;17438:1;17418:10;:17;:21;17414:424;;;17666:10;17660:17;17727:15;17714:10;17710:2;17706:19;17699:44;17414:424;17809:12;17802:20;;;;;;;;;;;:::i;:::-;;;;;;;;17094:762;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:122;1310:24;1328:5;1310:24;:::i;:::-;1303:5;1300:35;1290:63;;1349:1;1346;1339:12;1290:63;1237:122;:::o;1365:139::-;1411:5;1449:6;1436:20;1427:29;;1465:33;1492:5;1465:33;:::i;:::-;1365:139;;;;:::o;1510:122::-;1583:24;1601:5;1583:24;:::i;:::-;1576:5;1573:35;1563:63;;1622:1;1619;1612:12;1563:63;1510:122;:::o;1638:139::-;1684:5;1722:6;1709:20;1700:29;;1738:33;1765:5;1738:33;:::i;:::-;1638:139;;;;:::o;1783:474::-;1851:6;1859;1908:2;1896:9;1887:7;1883:23;1879:32;1876:119;;;1914:79;;:::i;:::-;1876:119;2034:1;2059:53;2104:7;2095:6;2084:9;2080:22;2059:53;:::i;:::-;2049:63;;2005:117;2161:2;2187:53;2232:7;2223:6;2212:9;2208:22;2187:53;:::i;:::-;2177:63;;2132:118;1783:474;;;;;:::o;2263:222::-;2356:4;2394:2;2383:9;2379:18;2371:26;;2407:71;2475:1;2464:9;2460:17;2451:6;2407:71;:::i;:::-;2263:222;;;;:::o;2491:149::-;2527:7;2567:66;2560:5;2556:78;2545:89;;2491:149;;;:::o;2646:120::-;2718:23;2735:5;2718:23;:::i;:::-;2711:5;2708:34;2698:62;;2756:1;2753;2746:12;2698:62;2646:120;:::o;2772:137::-;2817:5;2855:6;2842:20;2833:29;;2871:32;2897:5;2871:32;:::i;:::-;2772:137;;;;:::o;2915:327::-;2973:6;3022:2;3010:9;3001:7;2997:23;2993:32;2990:119;;;3028:79;;:::i;:::-;2990:119;3148:1;3173:52;3217:7;3208:6;3197:9;3193:22;3173:52;:::i;:::-;3163:62;;3119:116;2915:327;;;;:::o;3248:90::-;3282:7;3325:5;3318:13;3311:21;3300:32;;3248:90;;;:::o;3344:109::-;3425:21;3440:5;3425:21;:::i;:::-;3420:3;3413:34;3344:109;;:::o;3459:210::-;3546:4;3584:2;3573:9;3569:18;3561:26;;3597:65;3659:1;3648:9;3644:17;3635:6;3597:65;:::i;:::-;3459:210;;;;:::o;3675:329::-;3734:6;3783:2;3771:9;3762:7;3758:23;3754:32;3751:119;;;3789:79;;:::i;:::-;3751:119;3909:1;3934:53;3979:7;3970:6;3959:9;3955:22;3934:53;:::i;:::-;3924:63;;3880:117;3675:329;;;;:::o;4010:99::-;4062:6;4096:5;4090:12;4080:22;;4010:99;;;:::o;4115:169::-;4199:11;4233:6;4228:3;4221:19;4273:4;4268:3;4264:14;4249:29;;4115:169;;;;:::o;4290:246::-;4371:1;4381:113;4395:6;4392:1;4389:13;4381:113;;;4480:1;4475:3;4471:11;4465:18;4461:1;4456:3;4452:11;4445:39;4417:2;4414:1;4410:10;4405:15;;4381:113;;;4528:1;4519:6;4514:3;4510:16;4503:27;4352:184;4290:246;;;:::o;4542:102::-;4583:6;4634:2;4630:7;4625:2;4618:5;4614:14;4610:28;4600:38;;4542:102;;;:::o;4650:377::-;4738:3;4766:39;4799:5;4766:39;:::i;:::-;4821:71;4885:6;4880:3;4821:71;:::i;:::-;4814:78;;4901:65;4959:6;4954:3;4947:4;4940:5;4936:16;4901:65;:::i;:::-;4991:29;5013:6;4991:29;:::i;:::-;4986:3;4982:39;4975:46;;4742:285;4650:377;;;;:::o;5033:313::-;5146:4;5184:2;5173:9;5169:18;5161:26;;5233:9;5227:4;5223:20;5219:1;5208:9;5204:17;5197:47;5261:78;5334:4;5325:6;5261:78;:::i;:::-;5253:86;;5033:313;;;;:::o;5352:104::-;5397:7;5426:24;5444:5;5426:24;:::i;:::-;5415:35;;5352:104;;;:::o;5462:138::-;5543:32;5569:5;5543:32;:::i;:::-;5536:5;5533:43;5523:71;;5590:1;5587;5580:12;5523:71;5462:138;:::o;5606:155::-;5660:5;5698:6;5685:20;5676:29;;5714:41;5749:5;5714:41;:::i;:::-;5606:155;;;;:::o;5767:345::-;5834:6;5883:2;5871:9;5862:7;5858:23;5854:32;5851:119;;;5889:79;;:::i;:::-;5851:119;6009:1;6034:61;6087:7;6078:6;6067:9;6063:22;6034:61;:::i;:::-;6024:71;;5980:125;5767:345;;;;:::o;6118:222::-;6211:4;6249:2;6238:9;6234:18;6226:26;;6262:71;6330:1;6319:9;6315:17;6306:6;6262:71;:::i;:::-;6118:222;;;;:::o;6346:117::-;6455:1;6452;6445:12;6469:180;6517:77;6514:1;6507:88;6614:4;6611:1;6604:15;6638:4;6635:1;6628:15;6655:281;6738:27;6760:4;6738:27;:::i;:::-;6730:6;6726:40;6868:6;6856:10;6853:22;6832:18;6820:10;6817:34;6814:62;6811:88;;;6879:18;;:::i;:::-;6811:88;6919:10;6915:2;6908:22;6698:238;6655:281;;:::o;6942:129::-;6976:6;7003:20;;:::i;:::-;6993:30;;7032:33;7060:4;7052:6;7032:33;:::i;:::-;6942:129;;;:::o;7077:311::-;7154:4;7244:18;7236:6;7233:30;7230:56;;;7266:18;;:::i;:::-;7230:56;7316:4;7308:6;7304:17;7296:25;;7376:4;7370;7366:15;7358:23;;7077:311;;;:::o;7394:117::-;7503:1;7500;7493:12;7534:710;7630:5;7655:81;7671:64;7728:6;7671:64;:::i;:::-;7655:81;:::i;:::-;7646:90;;7756:5;7785:6;7778:5;7771:21;7819:4;7812:5;7808:16;7801:23;;7872:4;7864:6;7860:17;7852:6;7848:30;7901:3;7893:6;7890:15;7887:122;;;7920:79;;:::i;:::-;7887:122;8035:6;8018:220;8052:6;8047:3;8044:15;8018:220;;;8127:3;8156:37;8189:3;8177:10;8156:37;:::i;:::-;8151:3;8144:50;8223:4;8218:3;8214:14;8207:21;;8094:144;8078:4;8073:3;8069:14;8062:21;;8018:220;;;8022:21;7636:608;;7534:710;;;;;:::o;8267:370::-;8338:5;8387:3;8380:4;8372:6;8368:17;8364:27;8354:122;;8395:79;;:::i;:::-;8354:122;8512:6;8499:20;8537:94;8627:3;8619:6;8612:4;8604:6;8600:17;8537:94;:::i;:::-;8528:103;;8344:293;8267:370;;;;:::o;8643:117::-;8752:1;8749;8742:12;8766:307;8827:4;8917:18;8909:6;8906:30;8903:56;;;8939:18;;:::i;:::-;8903:56;8977:29;8999:6;8977:29;:::i;:::-;8969:37;;9061:4;9055;9051:15;9043:23;;8766:307;;;:::o;9079:146::-;9176:6;9171:3;9166;9153:30;9217:1;9208:6;9203:3;9199:16;9192:27;9079:146;;;:::o;9231:423::-;9308:5;9333:65;9349:48;9390:6;9349:48;:::i;:::-;9333:65;:::i;:::-;9324:74;;9421:6;9414:5;9407:21;9459:4;9452:5;9448:16;9497:3;9488:6;9483:3;9479:16;9476:25;9473:112;;;9504:79;;:::i;:::-;9473:112;9594:54;9641:6;9636:3;9631;9594:54;:::i;:::-;9314:340;9231:423;;;;;:::o;9673:338::-;9728:5;9777:3;9770:4;9762:6;9758:17;9754:27;9744:122;;9785:79;;:::i;:::-;9744:122;9902:6;9889:20;9927:78;10001:3;9993:6;9986:4;9978:6;9974:17;9927:78;:::i;:::-;9918:87;;9734:277;9673:338;;;;:::o;10017:1509::-;10171:6;10179;10187;10195;10203;10252:3;10240:9;10231:7;10227:23;10223:33;10220:120;;;10259:79;;:::i;:::-;10220:120;10379:1;10404:53;10449:7;10440:6;10429:9;10425:22;10404:53;:::i;:::-;10394:63;;10350:117;10506:2;10532:53;10577:7;10568:6;10557:9;10553:22;10532:53;:::i;:::-;10522:63;;10477:118;10662:2;10651:9;10647:18;10634:32;10693:18;10685:6;10682:30;10679:117;;;10715:79;;:::i;:::-;10679:117;10820:78;10890:7;10881:6;10870:9;10866:22;10820:78;:::i;:::-;10810:88;;10605:303;10975:2;10964:9;10960:18;10947:32;11006:18;10998:6;10995:30;10992:117;;;11028:79;;:::i;:::-;10992:117;11133:78;11203:7;11194:6;11183:9;11179:22;11133:78;:::i;:::-;11123:88;;10918:303;11288:3;11277:9;11273:19;11260:33;11320:18;11312:6;11309:30;11306:117;;;11342:79;;:::i;:::-;11306:117;11447:62;11501:7;11492:6;11481:9;11477:22;11447:62;:::i;:::-;11437:72;;11231:288;10017:1509;;;;;;;;:::o;11532:308::-;11594:4;11684:18;11676:6;11673:30;11670:56;;;11706:18;;:::i;:::-;11670:56;11744:29;11766:6;11744:29;:::i;:::-;11736:37;;11828:4;11822;11818:15;11810:23;;11532:308;;;:::o;11846:425::-;11924:5;11949:66;11965:49;12007:6;11965:49;:::i;:::-;11949:66;:::i;:::-;11940:75;;12038:6;12031:5;12024:21;12076:4;12069:5;12065:16;12114:3;12105:6;12100:3;12096:16;12093:25;12090:112;;;12121:79;;:::i;:::-;12090:112;12211:54;12258:6;12253:3;12248;12211:54;:::i;:::-;11930:341;11846:425;;;;;:::o;12291:340::-;12347:5;12396:3;12389:4;12381:6;12377:17;12373:27;12363:122;;12404:79;;:::i;:::-;12363:122;12521:6;12508:20;12546:79;12621:3;12613:6;12606:4;12598:6;12594:17;12546:79;:::i;:::-;12537:88;;12353:278;12291:340;;;;:::o;12637:509::-;12706:6;12755:2;12743:9;12734:7;12730:23;12726:32;12723:119;;;12761:79;;:::i;:::-;12723:119;12909:1;12898:9;12894:17;12881:31;12939:18;12931:6;12928:30;12925:117;;;12961:79;;:::i;:::-;12925:117;13066:63;13121:7;13112:6;13101:9;13097:22;13066:63;:::i;:::-;13056:73;;12852:287;12637:509;;;;:::o;13152:111::-;13204:7;13233:24;13251:5;13233:24;:::i;:::-;13222:35;;13152:111;;;:::o;13269:152::-;13357:39;13390:5;13357:39;:::i;:::-;13350:5;13347:50;13337:78;;13411:1;13408;13401:12;13337:78;13269:152;:::o;13427:169::-;13488:5;13526:6;13513:20;13504:29;;13542:48;13584:5;13542:48;:::i;:::-;13427:169;;;;:::o;13602:504::-;13685:6;13693;13742:2;13730:9;13721:7;13717:23;13713:32;13710:119;;;13748:79;;:::i;:::-;13710:119;13868:1;13893:68;13953:7;13944:6;13933:9;13929:22;13893:68;:::i;:::-;13883:78;;13839:132;14010:2;14036:53;14081:7;14072:6;14061:9;14057:22;14036:53;:::i;:::-;14026:63;;13981:118;13602:504;;;;;:::o;14112:60::-;14140:3;14161:5;14154:12;;14112:60;;;:::o;14178:142::-;14228:9;14261:53;14279:34;14288:24;14306:5;14288:24;:::i;:::-;14279:34;:::i;:::-;14261:53;:::i;:::-;14248:66;;14178:142;;;:::o;14326:126::-;14376:9;14409:37;14440:5;14409:37;:::i;:::-;14396:50;;14326:126;;;:::o;14458:158::-;14540:9;14573:37;14604:5;14573:37;:::i;:::-;14560:50;;14458:158;;;:::o;14622:195::-;14741:69;14804:5;14741:69;:::i;:::-;14736:3;14729:82;14622:195;;:::o;14823:286::-;14948:4;14986:2;14975:9;14971:18;14963:26;;14999:103;15099:1;15088:9;15084:17;15075:6;14999:103;:::i;:::-;14823:286;;;;:::o;15115:311::-;15192:4;15282:18;15274:6;15271:30;15268:56;;;15304:18;;:::i;:::-;15268:56;15354:4;15346:6;15342:17;15334:25;;15414:4;15408;15404:15;15396:23;;15115:311;;;:::o;15449:710::-;15545:5;15570:81;15586:64;15643:6;15586:64;:::i;:::-;15570:81;:::i;:::-;15561:90;;15671:5;15700:6;15693:5;15686:21;15734:4;15727:5;15723:16;15716:23;;15787:4;15779:6;15775:17;15767:6;15763:30;15816:3;15808:6;15805:15;15802:122;;;15835:79;;:::i;:::-;15802:122;15950:6;15933:220;15967:6;15962:3;15959:15;15933:220;;;16042:3;16071:37;16104:3;16092:10;16071:37;:::i;:::-;16066:3;16059:50;16138:4;16133:3;16129:14;16122:21;;16009:144;15993:4;15988:3;15984:14;15977:21;;15933:220;;;15937:21;15551:608;;15449:710;;;;;:::o;16182:370::-;16253:5;16302:3;16295:4;16287:6;16283:17;16279:27;16269:122;;16310:79;;:::i;:::-;16269:122;16427:6;16414:20;16452:94;16542:3;16534:6;16527:4;16519:6;16515:17;16452:94;:::i;:::-;16443:103;;16259:293;16182:370;;;;:::o;16558:894::-;16676:6;16684;16733:2;16721:9;16712:7;16708:23;16704:32;16701:119;;;16739:79;;:::i;:::-;16701:119;16887:1;16876:9;16872:17;16859:31;16917:18;16909:6;16906:30;16903:117;;;16939:79;;:::i;:::-;16903:117;17044:78;17114:7;17105:6;17094:9;17090:22;17044:78;:::i;:::-;17034:88;;16830:302;17199:2;17188:9;17184:18;17171:32;17230:18;17222:6;17219:30;17216:117;;;17252:79;;:::i;:::-;17216:117;17357:78;17427:7;17418:6;17407:9;17403:22;17357:78;:::i;:::-;17347:88;;17142:303;16558:894;;;;;:::o;17458:114::-;17525:6;17559:5;17553:12;17543:22;;17458:114;;;:::o;17578:184::-;17677:11;17711:6;17706:3;17699:19;17751:4;17746:3;17742:14;17727:29;;17578:184;;;;:::o;17768:132::-;17835:4;17858:3;17850:11;;17888:4;17883:3;17879:14;17871:22;;17768:132;;;:::o;17906:108::-;17983:24;18001:5;17983:24;:::i;:::-;17978:3;17971:37;17906:108;;:::o;18020:179::-;18089:10;18110:46;18152:3;18144:6;18110:46;:::i;:::-;18188:4;18183:3;18179:14;18165:28;;18020:179;;;;:::o;18205:113::-;18275:4;18307;18302:3;18298:14;18290:22;;18205:113;;;:::o;18354:732::-;18473:3;18502:54;18550:5;18502:54;:::i;:::-;18572:86;18651:6;18646:3;18572:86;:::i;:::-;18565:93;;18682:56;18732:5;18682:56;:::i;:::-;18761:7;18792:1;18777:284;18802:6;18799:1;18796:13;18777:284;;;18878:6;18872:13;18905:63;18964:3;18949:13;18905:63;:::i;:::-;18898:70;;18991:60;19044:6;18991:60;:::i;:::-;18981:70;;18837:224;18824:1;18821;18817:9;18812:14;;18777:284;;;18781:14;19077:3;19070:10;;18478:608;;;18354:732;;;;:::o;19092:373::-;19235:4;19273:2;19262:9;19258:18;19250:26;;19322:9;19316:4;19312:20;19308:1;19297:9;19293:17;19286:47;19350:108;19453:4;19444:6;19350:108;:::i;:::-;19342:116;;19092:373;;;;:::o;19471:116::-;19541:21;19556:5;19541:21;:::i;:::-;19534:5;19531:32;19521:60;;19577:1;19574;19567:12;19521:60;19471:116;:::o;19593:133::-;19636:5;19674:6;19661:20;19652:29;;19690:30;19714:5;19690:30;:::i;:::-;19593:133;;;;:::o;19732:468::-;19797:6;19805;19854:2;19842:9;19833:7;19829:23;19825:32;19822:119;;;19860:79;;:::i;:::-;19822:119;19980:1;20005:53;20050:7;20041:6;20030:9;20026:22;20005:53;:::i;:::-;19995:63;;19951:117;20107:2;20133:50;20175:7;20166:6;20155:9;20151:22;20133:50;:::i;:::-;20123:60;;20078:115;19732:468;;;;;:::o;20206:329::-;20265:6;20314:2;20302:9;20293:7;20289:23;20285:32;20282:119;;;20320:79;;:::i;:::-;20282:119;20440:1;20465:53;20510:7;20501:6;20490:9;20486:22;20465:53;:::i;:::-;20455:63;;20411:117;20206:329;;;;:::o;20541:468::-;20606:6;20614;20663:2;20651:9;20642:7;20638:23;20634:32;20631:119;;;20669:79;;:::i;:::-;20631:119;20789:1;20814:53;20859:7;20850:6;20839:9;20835:22;20814:53;:::i;:::-;20804:63;;20760:117;20916:2;20942:50;20984:7;20975:6;20964:9;20960:22;20942:50;:::i;:::-;20932:60;;20887:115;20541:468;;;;;:::o;21015:619::-;21092:6;21100;21108;21157:2;21145:9;21136:7;21132:23;21128:32;21125:119;;;21163:79;;:::i;:::-;21125:119;21283:1;21308:53;21353:7;21344:6;21333:9;21329:22;21308:53;:::i;:::-;21298:63;;21254:117;21410:2;21436:53;21481:7;21472:6;21461:9;21457:22;21436:53;:::i;:::-;21426:63;;21381:118;21538:2;21564:53;21609:7;21600:6;21589:9;21585:22;21564:53;:::i;:::-;21554:63;;21509:118;21015:619;;;;;:::o;21640:117::-;21749:1;21746;21739:12;21780:568;21853:8;21863:6;21913:3;21906:4;21898:6;21894:17;21890:27;21880:122;;21921:79;;:::i;:::-;21880:122;22034:6;22021:20;22011:30;;22064:18;22056:6;22053:30;22050:117;;;22086:79;;:::i;:::-;22050:117;22200:4;22192:6;22188:17;22176:29;;22254:3;22246:4;22238:6;22234:17;22224:8;22220:32;22217:41;22214:128;;;22261:79;;:::i;:::-;22214:128;21780:568;;;;;:::o;22354:1269::-;22508:6;22516;22524;22532;22581:2;22569:9;22560:7;22556:23;22552:32;22549:119;;;22587:79;;:::i;:::-;22549:119;22735:1;22724:9;22720:17;22707:31;22765:18;22757:6;22754:30;22751:117;;;22787:79;;:::i;:::-;22751:117;22892:78;22962:7;22953:6;22942:9;22938:22;22892:78;:::i;:::-;22882:88;;22678:302;23047:2;23036:9;23032:18;23019:32;23078:18;23070:6;23067:30;23064:117;;;23100:79;;:::i;:::-;23064:117;23213:80;23285:7;23276:6;23265:9;23261:22;23213:80;:::i;:::-;23195:98;;;;22990:313;23370:2;23359:9;23355:18;23342:32;23401:18;23393:6;23390:30;23387:117;;;23423:79;;:::i;:::-;23387:117;23528:78;23598:7;23589:6;23578:9;23574:22;23528:78;:::i;:::-;23518:88;;23313:303;22354:1269;;;;;;;:::o;23629:359::-;23703:6;23752:2;23740:9;23731:7;23727:23;23723:32;23720:119;;;23758:79;;:::i;:::-;23720:119;23878:1;23903:68;23963:7;23954:6;23943:9;23939:22;23903:68;:::i;:::-;23893:78;;23849:132;23629:359;;;;:::o;23994:474::-;24062:6;24070;24119:2;24107:9;24098:7;24094:23;24090:32;24087:119;;;24125:79;;:::i;:::-;24087:119;24245:1;24270:53;24315:7;24306:6;24295:9;24291:22;24270:53;:::i;:::-;24260:63;;24216:117;24372:2;24398:53;24443:7;24434:6;24423:9;24419:22;24398:53;:::i;:::-;24388:63;;24343:118;23994:474;;;;;:::o;24474:1089::-;24578:6;24586;24594;24602;24610;24659:3;24647:9;24638:7;24634:23;24630:33;24627:120;;;24666:79;;:::i;:::-;24627:120;24786:1;24811:53;24856:7;24847:6;24836:9;24832:22;24811:53;:::i;:::-;24801:63;;24757:117;24913:2;24939:53;24984:7;24975:6;24964:9;24960:22;24939:53;:::i;:::-;24929:63;;24884:118;25041:2;25067:53;25112:7;25103:6;25092:9;25088:22;25067:53;:::i;:::-;25057:63;;25012:118;25169:2;25195:53;25240:7;25231:6;25220:9;25216:22;25195:53;:::i;:::-;25185:63;;25140:118;25325:3;25314:9;25310:19;25297:33;25357:18;25349:6;25346:30;25343:117;;;25379:79;;:::i;:::-;25343:117;25484:62;25538:7;25529:6;25518:9;25514:22;25484:62;:::i;:::-;25474:72;;25268:288;24474:1089;;;;;;;;:::o;25569:229::-;25709:34;25705:1;25697:6;25693:14;25686:58;25778:12;25773:2;25765:6;25761:15;25754:37;25569:229;:::o;25804:366::-;25946:3;25967:67;26031:2;26026:3;25967:67;:::i;:::-;25960:74;;26043:93;26132:3;26043:93;:::i;:::-;26161:2;26156:3;26152:12;26145:19;;25804:366;;;:::o;26176:419::-;26342:4;26380:2;26369:9;26365:18;26357:26;;26429:9;26423:4;26419:20;26415:1;26404:9;26400:17;26393:47;26457:131;26583:4;26457:131;:::i;:::-;26449:139;;26176:419;;;:::o;26601:180::-;26649:77;26646:1;26639:88;26746:4;26743:1;26736:15;26770:4;26767:1;26760:15;26787:320;26831:6;26868:1;26862:4;26858:12;26848:22;;26915:1;26909:4;26905:12;26936:18;26926:81;;26992:4;26984:6;26980:17;26970:27;;26926:81;27054:2;27046:6;27043:14;27023:18;27020:38;27017:84;;27073:18;;:::i;:::-;27017:84;26838:269;26787:320;;;:::o;27113:180::-;27253:32;27249:1;27241:6;27237:14;27230:56;27113:180;:::o;27299:366::-;27441:3;27462:67;27526:2;27521:3;27462:67;:::i;:::-;27455:74;;27538:93;27627:3;27538:93;:::i;:::-;27656:2;27651:3;27647:12;27640:19;;27299:366;;;:::o;27671:419::-;27837:4;27875:2;27864:9;27860:18;27852:26;;27924:9;27918:4;27914:20;27910:1;27899:9;27895:17;27888:47;27952:131;28078:4;27952:131;:::i;:::-;27944:139;;27671:419;;;:::o;28096:148::-;28198:11;28235:3;28220:18;;28096:148;;;;:::o;28250:141::-;28299:4;28322:3;28314:11;;28345:3;28342:1;28335:14;28379:4;28376:1;28366:18;28358:26;;28250:141;;;:::o;28421:874::-;28524:3;28561:5;28555:12;28590:36;28616:9;28590:36;:::i;:::-;28642:89;28724:6;28719:3;28642:89;:::i;:::-;28635:96;;28762:1;28751:9;28747:17;28778:1;28773:166;;;;28953:1;28948:341;;;;28740:549;;28773:166;28857:4;28853:9;28842;28838:25;28833:3;28826:38;28919:6;28912:14;28905:22;28897:6;28893:35;28888:3;28884:45;28877:52;;28773:166;;28948:341;29015:38;29047:5;29015:38;:::i;:::-;29075:1;29089:154;29103:6;29100:1;29097:13;29089:154;;;29177:7;29171:14;29167:1;29162:3;29158:11;29151:35;29227:1;29218:7;29214:15;29203:26;;29125:4;29122:1;29118:12;29113:17;;29089:154;;;29272:6;29267:3;29263:16;29256:23;;28955:334;;28740:549;;28528:767;;28421:874;;;;:::o;29301:390::-;29407:3;29435:39;29468:5;29435:39;:::i;:::-;29490:89;29572:6;29567:3;29490:89;:::i;:::-;29483:96;;29588:65;29646:6;29641:3;29634:4;29627:5;29623:16;29588:65;:::i;:::-;29678:6;29673:3;29669:16;29662:23;;29411:280;29301:390;;;;:::o;29697:429::-;29874:3;29896:92;29984:3;29975:6;29896:92;:::i;:::-;29889:99;;30005:95;30096:3;30087:6;30005:95;:::i;:::-;29998:102;;30117:3;30110:10;;29697:429;;;;;:::o;30132:225::-;30272:34;30268:1;30260:6;30256:14;30249:58;30341:8;30336:2;30328:6;30324:15;30317:33;30132:225;:::o;30363:366::-;30505:3;30526:67;30590:2;30585:3;30526:67;:::i;:::-;30519:74;;30602:93;30691:3;30602:93;:::i;:::-;30720:2;30715:3;30711:12;30704:19;;30363:366;;;:::o;30735:419::-;30901:4;30939:2;30928:9;30924:18;30916:26;;30988:9;30982:4;30978:20;30974:1;30963:9;30959:17;30952:47;31016:131;31142:4;31016:131;:::i;:::-;31008:139;;30735:419;;;:::o;31160:180::-;31208:77;31205:1;31198:88;31305:4;31302:1;31295:15;31329:4;31326:1;31319:15;31346:191;31386:3;31405:20;31423:1;31405:20;:::i;:::-;31400:25;;31439:20;31457:1;31439:20;:::i;:::-;31434:25;;31482:1;31479;31475:9;31468:16;;31503:3;31500:1;31497:10;31494:36;;;31510:18;;:::i;:::-;31494:36;31346:191;;;;:::o;31543:230::-;31683:34;31679:1;31671:6;31667:14;31660:58;31752:13;31747:2;31739:6;31735:15;31728:38;31543:230;:::o;31779:366::-;31921:3;31942:67;32006:2;32001:3;31942:67;:::i;:::-;31935:74;;32018:93;32107:3;32018:93;:::i;:::-;32136:2;32131:3;32127:12;32120:19;;31779:366;;;:::o;32151:419::-;32317:4;32355:2;32344:9;32340:18;32332:26;;32404:9;32398:4;32394:20;32390:1;32379:9;32375:17;32368:47;32432:131;32558:4;32432:131;:::i;:::-;32424:139;;32151:419;;;:::o;32576:134::-;32634:9;32667:37;32698:5;32667:37;:::i;:::-;32654:50;;32576:134;;;:::o;32716:147::-;32811:45;32850:5;32811:45;:::i;:::-;32806:3;32799:58;32716:147;;:::o;32869:348::-;32998:4;33036:2;33025:9;33021:18;33013:26;;33049:79;33125:1;33114:9;33110:17;33101:6;33049:79;:::i;:::-;33138:72;33206:2;33195:9;33191:18;33182:6;33138:72;:::i;:::-;32869:348;;;;;:::o;33223:234::-;33363:34;33359:1;33351:6;33347:14;33340:58;33432:17;33427:2;33419:6;33415:15;33408:42;33223:234;:::o;33463:366::-;33605:3;33626:67;33690:2;33685:3;33626:67;:::i;:::-;33619:74;;33702:93;33791:3;33702:93;:::i;:::-;33820:2;33815:3;33811:12;33804:19;;33463:366;;;:::o;33835:419::-;34001:4;34039:2;34028:9;34024:18;34016:26;;34088:9;34082:4;34078:20;34074:1;34063:9;34059:17;34052:47;34116:131;34242:4;34116:131;:::i;:::-;34108:139;;33835:419;;;:::o;34260:93::-;34297:6;34344:2;34339;34332:5;34328:14;34324:23;34314:33;;34260:93;;;:::o;34359:107::-;34403:8;34453:5;34447:4;34443:16;34422:37;;34359:107;;;;:::o;34472:393::-;34541:6;34591:1;34579:10;34575:18;34614:97;34644:66;34633:9;34614:97;:::i;:::-;34732:39;34762:8;34751:9;34732:39;:::i;:::-;34720:51;;34804:4;34800:9;34793:5;34789:21;34780:30;;34853:4;34843:8;34839:19;34832:5;34829:30;34819:40;;34548:317;;34472:393;;;;;:::o;34871:142::-;34921:9;34954:53;34972:34;34981:24;34999:5;34981:24;:::i;:::-;34972:34;:::i;:::-;34954:53;:::i;:::-;34941:66;;34871:142;;;:::o;35019:75::-;35062:3;35083:5;35076:12;;35019:75;;;:::o;35100:269::-;35210:39;35241:7;35210:39;:::i;:::-;35271:91;35320:41;35344:16;35320:41;:::i;:::-;35312:6;35305:4;35299:11;35271:91;:::i;:::-;35265:4;35258:105;35176:193;35100:269;;;:::o;35375:73::-;35420:3;35375:73;:::o;35454:189::-;35531:32;;:::i;:::-;35572:65;35630:6;35622;35616:4;35572:65;:::i;:::-;35507:136;35454:189;;:::o;35649:186::-;35709:120;35726:3;35719:5;35716:14;35709:120;;;35780:39;35817:1;35810:5;35780:39;:::i;:::-;35753:1;35746:5;35742:13;35733:22;;35709:120;;;35649:186;;:::o;35841:543::-;35942:2;35937:3;35934:11;35931:446;;;35976:38;36008:5;35976:38;:::i;:::-;36060:29;36078:10;36060:29;:::i;:::-;36050:8;36046:44;36243:2;36231:10;36228:18;36225:49;;;36264:8;36249:23;;36225:49;36287:80;36343:22;36361:3;36343:22;:::i;:::-;36333:8;36329:37;36316:11;36287:80;:::i;:::-;35946:431;;35931:446;35841:543;;;:::o;36390:117::-;36444:8;36494:5;36488:4;36484:16;36463:37;;36390:117;;;;:::o;36513:169::-;36557:6;36590:51;36638:1;36634:6;36626:5;36623:1;36619:13;36590:51;:::i;:::-;36586:56;36671:4;36665;36661:15;36651:25;;36564:118;36513:169;;;;:::o;36687:295::-;36763:4;36909:29;36934:3;36928:4;36909:29;:::i;:::-;36901:37;;36971:3;36968:1;36964:11;36958:4;36955:21;36947:29;;36687:295;;;;:::o;36987:1395::-;37104:37;37137:3;37104:37;:::i;:::-;37206:18;37198:6;37195:30;37192:56;;;37228:18;;:::i;:::-;37192:56;37272:38;37304:4;37298:11;37272:38;:::i;:::-;37357:67;37417:6;37409;37403:4;37357:67;:::i;:::-;37451:1;37475:4;37462:17;;37507:2;37499:6;37496:14;37524:1;37519:618;;;;38181:1;38198:6;38195:77;;;38247:9;38242:3;38238:19;38232:26;38223:35;;38195:77;38298:67;38358:6;38351:5;38298:67;:::i;:::-;38292:4;38285:81;38154:222;37489:887;;37519:618;37571:4;37567:9;37559:6;37555:22;37605:37;37637:4;37605:37;:::i;:::-;37664:1;37678:208;37692:7;37689:1;37686:14;37678:208;;;37771:9;37766:3;37762:19;37756:26;37748:6;37741:42;37822:1;37814:6;37810:14;37800:24;;37869:2;37858:9;37854:18;37841:31;;37715:4;37712:1;37708:12;37703:17;;37678:208;;;37914:6;37905:7;37902:19;37899:179;;;37972:9;37967:3;37963:19;37957:26;38015:48;38057:4;38049:6;38045:17;38034:9;38015:48;:::i;:::-;38007:6;38000:64;37922:156;37899:179;38124:1;38120;38112:6;38108:14;38104:22;38098:4;38091:36;37526:611;;;37489:887;;37079:1303;;;36987:1395;;:::o;38388:269::-;38517:3;38539:92;38627:3;38618:6;38539:92;:::i;:::-;38532:99;;38648:3;38641:10;;38388:269;;;;:::o;38663:164::-;38803:16;38799:1;38791:6;38787:14;38780:40;38663:164;:::o;38833:366::-;38975:3;38996:67;39060:2;39055:3;38996:67;:::i;:::-;38989:74;;39072:93;39161:3;39072:93;:::i;:::-;39190:2;39185:3;39181:12;39174:19;;38833:366;;;:::o;39205:419::-;39371:4;39409:2;39398:9;39394:18;39386:26;;39458:9;39452:4;39448:20;39444:1;39433:9;39429:17;39422:47;39486:131;39612:4;39486:131;:::i;:::-;39478:139;;39205:419;;;:::o;39630:143::-;39687:5;39718:6;39712:13;39703:22;;39734:33;39761:5;39734:33;:::i;:::-;39630:143;;;;:::o;39779:351::-;39849:6;39898:2;39886:9;39877:7;39873:23;39869:32;39866:119;;;39904:79;;:::i;:::-;39866:119;40024:1;40049:64;40105:7;40096:6;40085:9;40081:22;40049:64;:::i;:::-;40039:74;;39995:128;39779:351;;;;:::o;40136:228::-;40276:34;40272:1;40264:6;40260:14;40253:58;40345:11;40340:2;40332:6;40328:15;40321:36;40136:228;:::o;40370:366::-;40512:3;40533:67;40597:2;40592:3;40533:67;:::i;:::-;40526:74;;40609:93;40698:3;40609:93;:::i;:::-;40727:2;40722:3;40718:12;40711:19;;40370:366;;;:::o;40742:419::-;40908:4;40946:2;40935:9;40931:18;40923:26;;40995:9;40989:4;40985:20;40981:1;40970:9;40966:17;40959:47;41023:131;41149:4;41023:131;:::i;:::-;41015:139;;40742:419;;;:::o;41167:180::-;41215:77;41212:1;41205:88;41312:4;41309:1;41302:15;41336:4;41333:1;41326:15;41353:233;41392:3;41415:24;41433:5;41415:24;:::i;:::-;41406:33;;41461:66;41454:5;41451:77;41448:103;;41531:18;;:::i;:::-;41448:103;41578:1;41571:5;41567:13;41560:20;;41353:233;;;:::o;41592:166::-;41732:18;41728:1;41720:6;41716:14;41709:42;41592:166;:::o;41764:366::-;41906:3;41927:67;41991:2;41986:3;41927:67;:::i;:::-;41920:74;;42003:93;42092:3;42003:93;:::i;:::-;42121:2;42116:3;42112:12;42105:19;;41764:366;;;:::o;42136:419::-;42302:4;42340:2;42329:9;42325:18;42317:26;;42389:9;42383:4;42379:20;42375:1;42364:9;42360:17;42353:47;42417:131;42543:4;42417:131;:::i;:::-;42409:139;;42136:419;;;:::o;42561:410::-;42601:7;42624:20;42642:1;42624:20;:::i;:::-;42619:25;;42658:20;42676:1;42658:20;:::i;:::-;42653:25;;42713:1;42710;42706:9;42735:30;42753:11;42735:30;:::i;:::-;42724:41;;42914:1;42905:7;42901:15;42898:1;42895:22;42875:1;42868:9;42848:83;42825:139;;42944:18;;:::i;:::-;42825:139;42609:362;42561:410;;;;:::o;42977:332::-;43098:4;43136:2;43125:9;43121:18;43113:26;;43149:71;43217:1;43206:9;43202:17;43193:6;43149:71;:::i;:::-;43230:72;43298:2;43287:9;43283:18;43274:6;43230:72;:::i;:::-;42977:332;;;;;:::o;43315:178::-;43455:30;43451:1;43443:6;43439:14;43432:54;43315:178;:::o;43499:366::-;43641:3;43662:67;43726:2;43721:3;43662:67;:::i;:::-;43655:74;;43738:93;43827:3;43738:93;:::i;:::-;43856:2;43851:3;43847:12;43840:19;;43499:366;;;:::o;43871:419::-;44037:4;44075:2;44064:9;44060:18;44052:26;;44124:9;44118:4;44114:20;44110:1;44099:9;44095:17;44088:47;44152:131;44278:4;44152:131;:::i;:::-;44144:139;;43871:419;;;:::o;44296:442::-;44445:4;44483:2;44472:9;44468:18;44460:26;;44496:71;44564:1;44553:9;44549:17;44540:6;44496:71;:::i;:::-;44577:72;44645:2;44634:9;44630:18;44621:6;44577:72;:::i;:::-;44659;44727:2;44716:9;44712:18;44703:6;44659:72;:::i;:::-;44296:442;;;;;;:::o;44744:137::-;44798:5;44829:6;44823:13;44814:22;;44845:30;44869:5;44845:30;:::i;:::-;44744:137;;;;:::o;44887:345::-;44954:6;45003:2;44991:9;44982:7;44978:23;44974:32;44971:119;;;45009:79;;:::i;:::-;44971:119;45129:1;45154:61;45207:7;45198:6;45187:9;45183:22;45154:61;:::i;:::-;45144:71;;45100:125;44887:345;;;;:::o;45238:173::-;45378:25;45374:1;45366:6;45362:14;45355:49;45238:173;:::o;45417:366::-;45559:3;45580:67;45644:2;45639:3;45580:67;:::i;:::-;45573:74;;45656:93;45745:3;45656:93;:::i;:::-;45774:2;45769:3;45765:12;45758:19;;45417:366;;;:::o;45789:419::-;45955:4;45993:2;45982:9;45978:18;45970:26;;46042:9;46036:4;46032:20;46028:1;46017:9;46013:17;46006:47;46070:131;46196:4;46070:131;:::i;:::-;46062:139;;45789:419;;;:::o;46214:94::-;46247:8;46295:5;46291:2;46287:14;46266:35;;46214:94;;;:::o;46314:::-;46353:7;46382:20;46396:5;46382:20;:::i;:::-;46371:31;;46314:94;;;:::o;46414:100::-;46453:7;46482:26;46502:5;46482:26;:::i;:::-;46471:37;;46414:100;;;:::o;46520:157::-;46625:45;46645:24;46663:5;46645:24;:::i;:::-;46625:45;:::i;:::-;46620:3;46613:58;46520:157;;:::o;46683:256::-;46795:3;46810:75;46881:3;46872:6;46810:75;:::i;:::-;46910:2;46905:3;46901:12;46894:19;;46930:3;46923:10;;46683:256;;;;:::o;46945:180::-;46993:77;46990:1;46983:88;47090:4;47087:1;47080:15;47114:4;47111:1;47104:15;47131:185;47171:1;47188:20;47206:1;47188:20;:::i;:::-;47183:25;;47222:20;47240:1;47222:20;:::i;:::-;47217:25;;47261:1;47251:35;;47266:18;;:::i;:::-;47251:35;47308:1;47305;47301:9;47296:14;;47131:185;;;;:::o;47322:108::-;47369:7;47398:26;47418:5;47398:26;:::i;:::-;47387:37;;47322:108;;;:::o;47436:189::-;47557:61;47585:32;47611:5;47585:32;:::i;:::-;47557:61;:::i;:::-;47552:3;47545:74;47436:189;;:::o;47631:288::-;47759:3;47774:91;47861:3;47852:6;47774:91;:::i;:::-;47890:2;47885:3;47881:12;47874:19;;47910:3;47903:10;;47631:288;;;;:::o;47925:79::-;47964:7;47993:5;47982:16;;47925:79;;;:::o;48010:157::-;48115:45;48135:24;48153:5;48135:24;:::i;:::-;48115:45;:::i;:::-;48110:3;48103:58;48010:157;;:::o;48173:256::-;48285:3;48300:75;48371:3;48362:6;48300:75;:::i;:::-;48400:2;48395:3;48391:12;48384:19;;48420:3;48413:10;;48173:256;;;;:::o;48435:176::-;48467:1;48484:20;48502:1;48484:20;:::i;:::-;48479:25;;48518:20;48536:1;48518:20;:::i;:::-;48513:25;;48557:1;48547:35;;48562:18;;:::i;:::-;48547:35;48603:1;48600;48596:9;48591:14;;48435:176;;;;:::o;48617:225::-;48757:34;48753:1;48745:6;48741:14;48734:58;48826:8;48821:2;48813:6;48809:15;48802:33;48617:225;:::o;48848:366::-;48990:3;49011:67;49075:2;49070:3;49011:67;:::i;:::-;49004:74;;49087:93;49176:3;49087:93;:::i;:::-;49205:2;49200:3;49196:12;49189:19;;48848:366;;;:::o;49220:419::-;49386:4;49424:2;49413:9;49409:18;49401:26;;49473:9;49467:4;49463:20;49459:1;49448:9;49444:17;49437:47;49501:131;49627:4;49501:131;:::i;:::-;49493:139;;49220:419;;;:::o;49645:182::-;49785:34;49781:1;49773:6;49769:14;49762:58;49645:182;:::o;49833:366::-;49975:3;49996:67;50060:2;50055:3;49996:67;:::i;:::-;49989:74;;50072:93;50161:3;50072:93;:::i;:::-;50190:2;50185:3;50181:12;50174:19;;49833:366;;;:::o;50205:419::-;50371:4;50409:2;50398:9;50394:18;50386:26;;50458:9;50452:4;50448:20;50444:1;50433:9;50429:17;50422:47;50486:131;50612:4;50486:131;:::i;:::-;50478:139;;50205:419;;;:::o;50630:194::-;50670:4;50690:20;50708:1;50690:20;:::i;:::-;50685:25;;50724:20;50742:1;50724:20;:::i;:::-;50719:25;;50768:1;50765;50761:9;50753:17;;50792:1;50786:4;50783:11;50780:37;;;50797:18;;:::i;:::-;50780:37;50630:194;;;;:::o;50830:179::-;50970:31;50966:1;50958:6;50954:14;50947:55;50830:179;:::o;51015:366::-;51157:3;51178:67;51242:2;51237:3;51178:67;:::i;:::-;51171:74;;51254:93;51343:3;51254:93;:::i;:::-;51372:2;51367:3;51363:12;51356:19;;51015:366;;;:::o;51387:419::-;51553:4;51591:2;51580:9;51576:18;51568:26;;51640:9;51634:4;51630:20;51626:1;51615:9;51611:17;51604:47;51668:131;51794:4;51668:131;:::i;:::-;51660:139;;51387:419;;;:::o;51812:147::-;51913:11;51950:3;51935:18;;51812:147;;;;:::o;51965:114::-;;:::o;52085:398::-;52244:3;52265:83;52346:1;52341:3;52265:83;:::i;:::-;52258:90;;52357:93;52446:3;52357:93;:::i;:::-;52475:1;52470:3;52466:11;52459:18;;52085:398;;;:::o;52489:379::-;52673:3;52695:147;52838:3;52695:147;:::i;:::-;52688:154;;52859:3;52852:10;;52489:379;;;:::o;52874:245::-;53014:34;53010:1;53002:6;52998:14;52991:58;53083:28;53078:2;53070:6;53066:15;53059:53;52874:245;:::o;53125:366::-;53267:3;53288:67;53352:2;53347:3;53288:67;:::i;:::-;53281:74;;53364:93;53453:3;53364:93;:::i;:::-;53482:2;53477:3;53473:12;53466:19;;53125:366;;;:::o;53497:419::-;53663:4;53701:2;53690:9;53686:18;53678:26;;53750:9;53744:4;53740:20;53736:1;53725:9;53721:17;53714:47;53778:131;53904:4;53778:131;:::i;:::-;53770:139;;53497:419;;;:::o;53922:227::-;54062:34;54058:1;54050:6;54046:14;54039:58;54131:10;54126:2;54118:6;54114:15;54107:35;53922:227;:::o;54155:366::-;54297:3;54318:67;54382:2;54377:3;54318:67;:::i;:::-;54311:74;;54394:93;54483:3;54394:93;:::i;:::-;54512:2;54507:3;54503:12;54496:19;;54155:366;;;:::o;54527:419::-;54693:4;54731:2;54720:9;54716:18;54708:26;;54780:9;54774:4;54770:20;54766:1;54755:9;54751:17;54744:47;54808:131;54934:4;54808:131;:::i;:::-;54800:139;;54527:419;;;:::o;54952:224::-;55092:34;55088:1;55080:6;55076:14;55069:58;55161:7;55156:2;55148:6;55144:15;55137:32;54952:224;:::o;55182:366::-;55324:3;55345:67;55409:2;55404:3;55345:67;:::i;:::-;55338:74;;55421:93;55510:3;55421:93;:::i;:::-;55539:2;55534:3;55530:12;55523:19;;55182:366;;;:::o;55554:419::-;55720:4;55758:2;55747:9;55743:18;55735:26;;55807:9;55801:4;55797:20;55793:1;55782:9;55778:17;55771:47;55835:131;55961:4;55835:131;:::i;:::-;55827:139;;55554:419;;;:::o;55979:229::-;56119:34;56115:1;56107:6;56103:14;56096:58;56188:12;56183:2;56175:6;56171:15;56164:37;55979:229;:::o;56214:366::-;56356:3;56377:67;56441:2;56436:3;56377:67;:::i;:::-;56370:74;;56453:93;56542:3;56453:93;:::i;:::-;56571:2;56566:3;56562:12;56555:19;;56214:366;;;:::o;56586:419::-;56752:4;56790:2;56779:9;56775:18;56767:26;;56839:9;56833:4;56829:20;56825:1;56814:9;56810:17;56803:47;56867:131;56993:4;56867:131;:::i;:::-;56859:139;;56586:419;;;:::o;57011:634::-;57232:4;57270:2;57259:9;57255:18;57247:26;;57319:9;57313:4;57309:20;57305:1;57294:9;57290:17;57283:47;57347:108;57450:4;57441:6;57347:108;:::i;:::-;57339:116;;57502:9;57496:4;57492:20;57487:2;57476:9;57472:18;57465:48;57530:108;57633:4;57624:6;57530:108;:::i;:::-;57522:116;;57011:634;;;;;:::o;57651:442::-;57800:4;57838:2;57827:9;57823:18;57815:26;;57851:71;57919:1;57908:9;57904:17;57895:6;57851:71;:::i;:::-;57932:72;58000:2;57989:9;57985:18;57976:6;57932:72;:::i;:::-;58014;58082:2;58071:9;58067:18;58058:6;58014:72;:::i;:::-;57651:442;;;;;;:::o;58099:222::-;58239:34;58235:1;58227:6;58223:14;58216:58;58308:5;58303:2;58295:6;58291:15;58284:30;58099:222;:::o;58327:366::-;58469:3;58490:67;58554:2;58549:3;58490:67;:::i;:::-;58483:74;;58566:93;58655:3;58566:93;:::i;:::-;58684:2;58679:3;58675:12;58668:19;;58327:366;;;:::o;58699:419::-;58865:4;58903:2;58892:9;58888:18;58880:26;;58952:9;58946:4;58942:20;58938:1;58927:9;58923:17;58916:47;58980:131;59106:4;58980:131;:::i;:::-;58972:139;;58699:419;;;:::o;59124:223::-;59264:34;59260:1;59252:6;59248:14;59241:58;59333:6;59328:2;59320:6;59316:15;59309:31;59124:223;:::o;59353:366::-;59495:3;59516:67;59580:2;59575:3;59516:67;:::i;:::-;59509:74;;59592:93;59681:3;59592:93;:::i;:::-;59710:2;59705:3;59701:12;59694:19;;59353:366;;;:::o;59725:419::-;59891:4;59929:2;59918:9;59914:18;59906:26;;59978:9;59972:4;59968:20;59964:1;59953:9;59949:17;59942:47;60006:131;60132:4;60006:131;:::i;:::-;59998:139;;59725:419;;;:::o;60150:332::-;60271:4;60309:2;60298:9;60294:18;60286:26;;60322:71;60390:1;60379:9;60375:17;60366:6;60322:71;:::i;:::-;60403:72;60471:2;60460:9;60456:18;60447:6;60403:72;:::i;:::-;60150:332;;;;;:::o;60488:220::-;60628:34;60624:1;60616:6;60612:14;60605:58;60697:3;60692:2;60684:6;60680:15;60673:28;60488:220;:::o;60714:366::-;60856:3;60877:67;60941:2;60936:3;60877:67;:::i;:::-;60870:74;;60953:93;61042:3;60953:93;:::i;:::-;61071:2;61066:3;61062:12;61055:19;;60714:366;;;:::o;61086:419::-;61252:4;61290:2;61279:9;61275:18;61267:26;;61339:9;61333:4;61329:20;61325:1;61314:9;61310:17;61303:47;61367:131;61493:4;61367:131;:::i;:::-;61359:139;;61086:419;;;:::o;61511:98::-;61562:6;61596:5;61590:12;61580:22;;61511:98;;;:::o;61615:168::-;61698:11;61732:6;61727:3;61720:19;61772:4;61767:3;61763:14;61748:29;;61615:168;;;;:::o;61789:373::-;61875:3;61903:38;61935:5;61903:38;:::i;:::-;61957:70;62020:6;62015:3;61957:70;:::i;:::-;61950:77;;62036:65;62094:6;62089:3;62082:4;62075:5;62071:16;62036:65;:::i;:::-;62126:29;62148:6;62126:29;:::i;:::-;62121:3;62117:39;62110:46;;61879:283;61789:373;;;;:::o;62168:1053::-;62491:4;62529:3;62518:9;62514:19;62506:27;;62543:71;62611:1;62600:9;62596:17;62587:6;62543:71;:::i;:::-;62624:72;62692:2;62681:9;62677:18;62668:6;62624:72;:::i;:::-;62743:9;62737:4;62733:20;62728:2;62717:9;62713:18;62706:48;62771:108;62874:4;62865:6;62771:108;:::i;:::-;62763:116;;62926:9;62920:4;62916:20;62911:2;62900:9;62896:18;62889:48;62954:108;63057:4;63048:6;62954:108;:::i;:::-;62946:116;;63110:9;63104:4;63100:20;63094:3;63083:9;63079:19;63072:49;63138:76;63209:4;63200:6;63138:76;:::i;:::-;63130:84;;62168:1053;;;;;;;;:::o;63227:141::-;63283:5;63314:6;63308:13;63299:22;;63330:32;63356:5;63330:32;:::i;:::-;63227:141;;;;:::o;63374:349::-;63443:6;63492:2;63480:9;63471:7;63467:23;63463:32;63460:119;;;63498:79;;:::i;:::-;63460:119;63618:1;63643:63;63698:7;63689:6;63678:9;63674:22;63643:63;:::i;:::-;63633:73;;63589:127;63374:349;;;;:::o;63729:106::-;63773:8;63822:5;63817:3;63813:15;63792:36;;63729:106;;;:::o;63841:183::-;63876:3;63914:1;63896:16;63893:23;63890:128;;;63952:1;63949;63946;63931:23;63974:34;64005:1;63999:8;63974:34;:::i;:::-;63967:41;;63890:128;63841:183;:::o;64030:711::-;64069:3;64107:4;64089:16;64086:26;64115:5;64083:39;64144:20;;:::i;:::-;64219:1;64201:16;64197:24;64194:1;64188:4;64173:49;64252:4;64246:11;64351:16;64344:4;64336:6;64332:17;64329:39;64296:18;64288:6;64285:30;64269:113;64266:146;;;64397:5;;;;64266:146;64443:6;64437:4;64433:17;64479:3;64473:10;64506:18;64498:6;64495:30;64492:43;;;64528:5;;;;;;64492:43;64576:6;64569:4;64564:3;64560:14;64556:27;64635:1;64617:16;64613:24;64607:4;64603:35;64598:3;64595:44;64592:57;;;64642:5;;;;;;;64592:57;64659;64707:6;64701:4;64697:17;64689:6;64685:30;64679:4;64659:57;:::i;:::-;64732:3;64725:10;;64073:668;;;;;64030:711;;:::o;64747:239::-;64887:34;64883:1;64875:6;64871:14;64864:58;64956:22;64951:2;64943:6;64939:15;64932:47;64747:239;:::o;64992:366::-;65134:3;65155:67;65219:2;65214:3;65155:67;:::i;:::-;65148:74;;65231:93;65320:3;65231:93;:::i;:::-;65349:2;65344:3;65340:12;65333:19;;64992:366;;;:::o;65364:419::-;65530:4;65568:2;65557:9;65553:18;65545:26;;65617:9;65611:4;65607:20;65603:1;65592:9;65588:17;65581:47;65645:131;65771:4;65645:131;:::i;:::-;65637:139;;65364:419;;;:::o;65789:227::-;65929:34;65925:1;65917:6;65913:14;65906:58;65998:10;65993:2;65985:6;65981:15;65974:35;65789:227;:::o;66022:366::-;66164:3;66185:67;66249:2;66244:3;66185:67;:::i;:::-;66178:74;;66261:93;66350:3;66261:93;:::i;:::-;66379:2;66374:3;66370:12;66363:19;;66022:366;;;:::o;66394:419::-;66560:4;66598:2;66587:9;66583:18;66575:26;;66647:9;66641:4;66637:20;66633:1;66622:9;66618:17;66611:47;66675:131;66801:4;66675:131;:::i;:::-;66667:139;;66394:419;;;:::o;66819:229::-;66959:34;66955:1;66947:6;66943:14;66936:58;67028:12;67023:2;67015:6;67011:15;67004:37;66819:229;:::o;67054:366::-;67196:3;67217:67;67281:2;67276:3;67217:67;:::i;:::-;67210:74;;67293:93;67382:3;67293:93;:::i;:::-;67411:2;67406:3;67402:12;67395:19;;67054:366;;;:::o;67426:419::-;67592:4;67630:2;67619:9;67615:18;67607:26;;67679:9;67673:4;67669:20;67665:1;67654:9;67650:17;67643:47;67707:131;67833:4;67707:131;:::i;:::-;67699:139;;67426:419;;;:::o;67851:228::-;67991:34;67987:1;67979:6;67975:14;67968:58;68060:11;68055:2;68047:6;68043:15;68036:36;67851:228;:::o;68085:366::-;68227:3;68248:67;68312:2;68307:3;68248:67;:::i;:::-;68241:74;;68324:93;68413:3;68324:93;:::i;:::-;68442:2;68437:3;68433:12;68426:19;;68085:366;;;:::o;68457:419::-;68623:4;68661:2;68650:9;68646:18;68638:26;;68710:9;68704:4;68700:20;68696:1;68685:9;68681:17;68674:47;68738:131;68864:4;68738:131;:::i;:::-;68730:139;;68457:419;;;:::o;68882:751::-;69105:4;69143:3;69132:9;69128:19;69120:27;;69157:71;69225:1;69214:9;69210:17;69201:6;69157:71;:::i;:::-;69238:72;69306:2;69295:9;69291:18;69282:6;69238:72;:::i;:::-;69320;69388:2;69377:9;69373:18;69364:6;69320:72;:::i;:::-;69402;69470:2;69459:9;69455:18;69446:6;69402:72;:::i;:::-;69522:9;69516:4;69512:20;69506:3;69495:9;69491:19;69484:49;69550:76;69621:4;69612:6;69550:76;:::i;:::-;69542:84;;68882:751;;;;;;;;:::o;69639:225::-;69779:34;69775:1;69767:6;69763:14;69756:58;69848:8;69843:2;69835:6;69831:15;69824:33;69639:225;:::o;69870:366::-;70012:3;70033:67;70097:2;70092:3;70033:67;:::i;:::-;70026:74;;70109:93;70198:3;70109:93;:::i;:::-;70227:2;70222:3;70218:12;70211:19;;69870:366;;;:::o;70242:419::-;70408:4;70446:2;70435:9;70431:18;70423:26;;70495:9;70489:4;70485:20;70481:1;70470:9;70466:17;70459:47;70523:131;70649:4;70523:131;:::i;:::-;70515:139;;70242:419;;;:::o;70667:179::-;70807:31;70803:1;70795:6;70791:14;70784:55;70667:179;:::o;70852:366::-;70994:3;71015:67;71079:2;71074:3;71015:67;:::i;:::-;71008:74;;71091:93;71180:3;71091:93;:::i;:::-;71209:2;71204:3;71200:12;71193:19;;70852:366;;;:::o;71224:419::-;71390:4;71428:2;71417:9;71413:18;71405:26;;71477:9;71471:4;71467:20;71463:1;71452:9;71448:17;71441:47;71505:131;71631:4;71505:131;:::i;:::-;71497:139;;71224:419;;;:::o;71649:386::-;71753:3;71781:38;71813:5;71781:38;:::i;:::-;71835:88;71916:6;71911:3;71835:88;:::i;:::-;71828:95;;71932:65;71990:6;71985:3;71978:4;71971:5;71967:16;71932:65;:::i;:::-;72022:6;72017:3;72013:16;72006:23;;71757:278;71649:386;;;;:::o;72041:271::-;72171:3;72193:93;72282:3;72273:6;72193:93;:::i;:::-;72186:100;;72303:3;72296:10;;72041:271;;;;:::o

Swarm Source

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