Contract 0x0a50b369f107aef88e83b79f8e437eb623ac4a0a

Contract Overview

Balance:
0 MATIC

Token:
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xaf59d38103ae359b66208929091377d17ecfe8ba79a23ee29e3a0842221fe287Start Trade272698882022-07-21 11:04:47249 days 21 hrs ago0x453b719d4e8a663c11c21cee225649527083a758 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.021748807294 29.830153966
0xd1a77c6cb0e0c4e47422dcd04519c1693491726937290ee752addf3f7c686d3aExecute Trade272595752022-07-20 16:48:00250 days 16 hrs ago0xe909c6d01f5111e1b6b6da8d1988962262b9d777 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.004865354038 31.279800686
0xfaf6c282ed3f932e009e3f206b443bef4f144e41a8e7688373d840b67076a9ecExecute Trade272595202022-07-20 16:43:25250 days 16 hrs ago0xe909c6d01f5111e1b6b6da8d1988962262b9d777 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.00766227088 34.052418429
0x5ac146360cd4f5c859dda12c24036417510c357f1b22f7964e5cc96b0f0b4db2Execute Trade272593662022-07-20 16:25:12250 days 16 hrs ago0xe909c6d01f5111e1b6b6da8d1988962262b9d777 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.005215449009 11.168702507
0x8f4c3a8c84be13d12e05cf445fc1308763eb42072da7c4d59535e2cc52cc683cExecute Trade272477412022-07-19 21:49:25251 days 11 hrs ago0xe909c6d01f5111e1b6b6da8d1988962262b9d777 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.005774488262 34.53827217
0x95c3b66adc7926928a189ac22dff8bfe43f30742be67a5e66e5e5afa050455ffExecute Trade272277682022-07-18 14:31:48252 days 18 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.05118168037 30.803334192
0x379b9c44e2f47b6ecc93382ffe70dc32814a8f47dfd0d68d70363386672a5798Execute Trade271875082022-07-15 17:21:12255 days 15 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.013924607079 36.292997871
0x2b13706b10b457d9a15f27bec3d6bb2de32930f796c61d9ad23a779abbcd290eExecute Trade271861892022-07-15 15:09:04255 days 17 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.007643762841 40.180000007
0x9512c28f92dec609d92bba51432cd037b44773986e185f50d51fe26efc8aee61Execute Trade270550332022-07-06 12:58:48264 days 19 hrs ago0x297355fd4cb505c80a41338e378fa18900214972 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.000667501277 3.675000012
0xa2b9bc7792efe563addc52e407ee7466738643c15d9efd1edc3e2da59e738b35Execute Trade270472632022-07-06 1:06:48265 days 7 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.032062469306 102.31015941
0x4e7c461ac7edcf4e8795c15fe236e79f215fec882aa85c60db824807228c0a7bExecute Trade270471002022-07-06 0:52:55265 days 7 hrs ago0xc7570cb9f815d69a7c4ceadfbb27def2fc785517 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.006692572744 37.207832016
0xd4e245f386966fad6785e11c54aabf5ea274d0ba56aad1b86f8cd1b95e989047Execute Trade270469632022-07-06 0:36:23265 days 8 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.003610765164 8.900635151
0xae792fbada3b0bf51b116a66c15f255bf691087171343061185daeffdc7c0936Execute Trade270460352022-07-05 23:13:29265 days 9 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.000339302001 2.000000011
0x98fae79cf423a4ae0bbd838e499df102be4b3a58048a2c4d950b268ee16b8d67Execute Trade270459712022-07-05 23:08:08265 days 9 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.005916722768 32.907977756
0x6a92e685290a30aff779260a74ba5f5cce7a4f6f5e96324ab3c14ad841380bb9Start Trade269889232022-07-01 16:10:37269 days 16 hrs ago0x297355fd4cb505c80a41338e378fa18900214972 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.001465473581 2.42500001
0x192d44c784cc837d92252eac5427513150f07b950172f33f25665729455c8051Execute Trade269847202022-07-01 9:47:17269 days 23 hrs ago0x3f5f68a444d4d2984196487be6c3a66d0539b7a3 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.004895419524 42.303639999
0x3639eceffc743c8475644dcee860934c1dd630bd2b7e74b034eb209c51d8957dStart Trade269846622022-07-01 9:42:26269 days 23 hrs ago0x2e8270bd26218e2e7c8c975cd99bce72dca06133 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.001259251006 2.450000013
0xe8366b85c68fc060912247a7fbc4da5a26c742505ad1b7a4bc3fd2b5c6a7c52eExecute Trade269839622022-07-01 8:38:35270 days 11 mins ago0x297355fd4cb505c80a41338e378fa18900214972 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.000360999808 2.352250007
0xdc7277f389353e9f91ce4dc0009f185f22e5c94960990f4e411a83acfdade685Start Trade269702162022-06-30 11:47:07270 days 21 hrs ago0x453b719d4e8a663c11c21cee225649527083a758 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.01649499713 31.893495872
0xa76b958541bc5e98e6cd58a7bbad9ec92232d30bcf4e22a991c208f008e5bb1eStart Trade269493902022-06-28 22:45:51272 days 10 hrs ago0xc133c9b5ad1c36f6726699d106a400ca51b41bf5 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.008133387383 16.933514987
0x5605f1f11f04bbaab3b8a50700f251fb6e5398caaef162fff1347a46d0836ab7Start Trade269493082022-06-28 22:38:59272 days 10 hrs ago0xc133c9b5ad1c36f6726699d106a400ca51b41bf5 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.004279661324 6.459729643
0x3f4949f4ea7e0245a99707e47e628dad0565739d9ed9329f60204ae4b5138f6dExecute Trade268936992022-06-24 23:15:12276 days 9 hrs ago0xc7570cb9f815d69a7c4ceadfbb27def2fc785517 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.003103186322 3.065308308
0xb485a95c2da73964f74d86a94fc1dd945e3040935401aa4fce9fa71cd7a50f46Start Trade268936872022-06-24 23:13:31276 days 9 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.008438345284 2.42500001
0x0158f6870babe9a53bf0eedd790fead38c8cfe443625ed328db7f3c3655fde5eExecute Trade268936482022-06-24 23:07:01276 days 9 hrs ago0x3ca48686212af897019a8e89140e64e8f2cc2f30 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.003500041958 8.001577341
0xb71f39985d54fd3c7d804c005ea89ec7153de05545c05e140b35fc40ceca4df6Start Trade268936412022-06-24 23:05:51276 days 9 hrs ago0xc7570cb9f815d69a7c4ceadfbb27def2fc785517 IN  0x0a50b369f107aef88e83b79f8e437eb623ac4a0a0 MATIC0.003614278213 2.425000009
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BatchWeb3Bazaar

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-06-24
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (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.
        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. 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/utils/ERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;



/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

// File: @openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @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 be 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/extensions/IERC1155MetadataURI.sol


// 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/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

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: balance query for the zero address");
        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 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: transfer caller is not 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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

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

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

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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);

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

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * 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();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * 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);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "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 `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 _beforeTokenTransfer(
        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/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

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

// File: webazaar/BatchBazaarProd.sol


pragma solidity 0.8.14;







contract MultiAccessControl {

    mapping (address => uint8) internal _owners;

    modifier isOwner() {
        require(_owners[msg.sender] == 10, "ERR_NOT_OWNER");
        _;
    }
    
    //constructor(address[] payable ownerAdress) {
    //    _owner = ownerAdress; 
    //}

    constructor() {
        _owners[msg.sender] = 10;
    }

    function addOwnership(address payable newOwner) public isOwner {
        require(newOwner != address(0), "ERR_ZERO_ADDR");
       _owners[newOwner] = 10;
    }
    
    function removeOwnership(address payable existingOwner) public isOwner {
        require(_owners[existingOwner] == 10, "ERR_ADDR_NOT_OWNER");
       _owners[existingOwner] = 0;
    }
}

contract BatchWeb3Bazaar is Context, ERC1155Holder, ERC721Holder, MultiAccessControl
{
    event NewTrade(address indexed creator, address indexed executor, uint256 tradeId);
    event FinishTrade( address indexed executor, uint256 tradeId);

    uint256 private _tradeId;
    string  private _symbol;
    mapping(uint256 => Trade) internal _transactions;
    mapping(address => uint256[]) internal _openTrades;

    uint256 public openTradeCount;
    uint256 public totalCompletedTrade;

    enum TradeStatus { NON, TRADE_CREATED, TRADE_COMPLETED, TRADE_CANCELLED  }
    enum UserStatus  { NON, OPEN, DEPOSIT, CLAIM }
    enum TradeType   { NON, ERC20, ERC1155, ERC721, NATIVE }

    struct TradeCounterpart {
        address contractAddr;
        uint256 idAsset;
        uint256 amount;
        TradeType traderType;
        UserStatus traderStatus;
    }
    struct Trade {
        address creator;
        address executor;
        uint256 id;
        mapping(address => TradeUser) _traders;
        TradeStatus tradeStatus;
    }
    struct TradeUser 
    {
         uint256[] tokenAddressIdx;
         mapping(uint256 => TradeCounterpart ) _counterpart;
    }
    constructor()
        MultiAccessControl()
    {
        openTradeCount = 0;
        totalCompletedTrade = 0;
    }
    function cancelTrade(uint256 tradeId) public  returns (bool)
    {
        Trade storage store = _transactions[tradeId];
        require(store.tradeStatus == TradeStatus.TRADE_CREATED, 'WEB3BAZAAR_ERROR: TRADE_STATUS ISNT CREATED');
        require(store.executor == msg.sender || store.creator == msg.sender , 'WEB3BAZAAR_ERROR: EXECUTER ISNT CREATOR OR EXECUTER');
        _transactions[tradeId].tradeStatus = TradeStatus.TRADE_CANCELLED;
        openTradeCount = openTradeCount - 1;
        return true;
    }
    function getTrade(uint256 tradeId) public view returns (address, address,uint8)
    {
        Trade storage store = _transactions[tradeId];
        return (store.creator, store.executor, uint8(store.tradeStatus));
    }
    function getTrade(uint256 tradeId, address userWallet) public view returns (address[] memory, uint256[] memory , uint256[] memory , uint8[] memory )
    {
        Trade storage store = _transactions[tradeId];
        uint256[] memory tokenAddressIdx = store._traders[userWallet].tokenAddressIdx;

        address[]  memory _tradeTokenAddress = new address[](tokenAddressIdx.length);
        uint256[]  memory _tradeTokenIds     = new uint256[](tokenAddressIdx.length);
        uint256[]  memory _tradeTokenAmount  = new uint256[](tokenAddressIdx.length);
        uint8[]    memory _tradeType         = new uint8[](tokenAddressIdx.length);

        for(uint y = 0; y < tokenAddressIdx.length; y++){
                TradeCounterpart memory tInfo = store._traders[userWallet]._counterpart[tokenAddressIdx[y]];
                _tradeTokenAddress[y]= tInfo.contractAddr;
                _tradeTokenIds[y] = tInfo.idAsset;
                _tradeTokenAmount[y]= tInfo.amount;
                _tradeType[y] = uint8(tInfo.traderType);
        }
        return (_tradeTokenAddress, _tradeTokenIds, _tradeTokenAmount, _tradeType  );
    }
    function verifyERC721 (address from, address tokenAddress, uint256 tokenId, bool verifyAproval) internal view returns (bool){
        require(from == ERC721(tokenAddress).ownerOf{gas:100000}(tokenId), 'WEB3BAZAAR_ERROR: ERR_NOT_OWN_ID_ERC721');
        if(verifyAproval){
            require( ERC721(tokenAddress).isApprovedForAll{gas:100000}( from, address(this) ) , 'WEB3BAZAR_ERROR: ERR_NOT_ALLOW_TO_TRANSER_ITENS_ERC721');
        }
        return true;
    }
    function verifyERC20 (address from, address tokenAddress, uint256 amount, bool verifyAproval ) internal view returns (bool){
        require(amount <= IERC20(tokenAddress).balanceOf{gas:100000}(from), 'WEB3BAZAAR_ERROR: ERR_NOT_ENOUGH_FUNDS_ERC20');
        if(verifyAproval){
            require(amount <= IERC20(tokenAddress).allowance{gas:100000}(from, address(this) ), 'WEB3BAZAR_ERROR: ERR_NOT_ALLOW_SPEND_FUNDS');
        }    
        return true;
    }
    function verifyERC1155 (address from, address tokenAddress, uint256 amount, uint256 tokenId, bool verifyAproval) internal view returns (bool){
        require(tokenId > 0, 'WEB3BAZAAR_ERROR: STAKE_ERC1155_ID_SHOULD_GREATER_THEN_0');
        require(amount > 0 && amount <= ERC1155(tokenAddress).balanceOf{gas:100000}(from, tokenId), 'WEB3BAZAAR_ERROR: ERR_NOT_ENOUGH_FUNDS_ERC1155');
        if(verifyAproval){
            require( ERC1155(tokenAddress).isApprovedForAll{gas:100000}( from, address(this) ) , 'WEB3BAZAR_ERROR: ERR_NOT_ALLOW_TO_TRANSER_ITENS_ERC1155');
        }    
        return true;
    }
    function swapERC721 (address from, address to, address tokenAddress, uint256 tokenId) internal returns (bool){
        verifyERC721(from, tokenAddress, tokenId, true);
        ERC721(tokenAddress).safeTransferFrom{gas:100000}(from, to , tokenId, '');
        return true;
    }
    function swapERC1155 (address from, address to, address tokenAddress, uint256 tokenId, uint256 amount) internal returns (bool)
    {
        verifyERC1155(from, tokenAddress, amount, tokenId, true );
        ERC1155(tokenAddress).safeTransferFrom{gas:100000}(from, to , tokenId, amount, '0x01' );
        return true;
    }
    function swapERC20 (address from, address to, address tokenAddress, uint256 amount) internal returns (bool){
        verifyERC20(from, tokenAddress, amount, true );
        IERC20(tokenAddress).transferFrom{gas:100000}(from, to , amount);
        return true;
    }
    function executeTrade(uint256 tradeId )  public returns(uint256)
    {
        Trade storage store = _transactions[tradeId];
        require(store.tradeStatus == TradeStatus.TRADE_CREATED, 'WEB3BAZAAR_ERROR: TRADE_STATUS ISNT CREATED');

        address  executer = store.executor;
        address  creator = store.creator;
        require(executer == msg.sender, 'WEB3BAZAAR_ERROR: CALLER INST THE EXECUTER');
        TradeCounterpart storage tempSwap;
        for (uint i = 0; i < store._traders[creator].tokenAddressIdx.length; i++) 
        {
            uint256 tokenAddressIdx = store._traders[creator].tokenAddressIdx[i];
            tempSwap =  store._traders[creator]._counterpart[tokenAddressIdx];
            if(tempSwap.traderType == TradeType.ERC20){
                swapERC20(creator, executer, tempSwap.contractAddr, tempSwap.amount);
            }else if(tempSwap.traderType == TradeType.ERC721){
                swapERC721(creator, executer, tempSwap.contractAddr, tempSwap.idAsset);
            }else if(tempSwap.traderType == TradeType.ERC1155){
                swapERC1155(creator, executer, tempSwap.contractAddr, tempSwap.idAsset, tempSwap.amount);
            }

        }
        for (uint i = 0; i < store._traders[executer].tokenAddressIdx.length; i++) 
        {
            uint256 tokenAddressIdx = store._traders[executer].tokenAddressIdx[i];
            tempSwap =  store._traders[executer]._counterpart[tokenAddressIdx];
             if(tempSwap.traderType == TradeType.ERC20){
                swapERC20(executer, creator,  tempSwap.contractAddr, tempSwap.amount);
            }else if(tempSwap.traderType == TradeType.ERC721){
                swapERC721(executer, creator,  tempSwap.contractAddr, tempSwap.idAsset);
            }else if(tempSwap.traderType == TradeType.ERC1155){
                swapERC1155(executer, creator,  tempSwap.contractAddr, tempSwap.idAsset, tempSwap.amount);
            }
        } 
        _transactions[_tradeId].tradeStatus = TradeStatus.TRADE_COMPLETED;
        removeTradeForUser(msg.sender, tradeId);
        removeTradeForUser(_transactions[tradeId].creator, tradeId);
        totalCompletedTrade = totalCompletedTrade + 1;
        openTradeCount      = openTradeCount - 1;
        emit FinishTrade(msg.sender, tradeId);
        return tradeId;
    }

    function verifyTradeIntegrity(address tokenAddress, uint256 tokenId,  uint256 amount, uint8 tokenType) public pure returns(bool)
    {
        require(tokenAddress != address(0), 'WEB3BAZAAR_ERROR: CREATOR_CONTRACT_NOT_VALID' );
        require(tokenType >=0 && tokenType <= uint8(TradeType.NATIVE)  , 'WEB3BAZAR_ERROR: NOT_VALID_TRADE_TYPE');
        require(tokenId > 0  , 'WEB3BAZAR_ERROR: TOKENID_MUST_POSITIVE');
        require(amount > 0  , 'WEB3BAZAR_ERROR: AMOUNT_MUST_POSITIVE');
        return true;
    }

    function startTrade( address[] memory creatorTokenAddress, uint256[] memory creatorTokenId, uint256[] memory creatorAmount, uint8[]  memory creatorTokenType,
                         address  executerAddress , address[] memory executorTokenAddress, uint256[] memory executorTokenId, uint256[] memory executorAmount, uint8[] memory executorTokenType  )  public returns(uint256)
    {
        require(executerAddress != address(0), 'WEB3BAZAAR_ERROR: EXECUTER_ADDRESS_NOT_VALID' );
        require(executerAddress != msg.sender, 'WEB3BAZAAR_ERROR: CREATOR_AND_EXECUTER_ARE_EQUAL');
        require(creatorTokenAddress.length  > 0, 'WEB3BAZAAR_ERROR: CREATOR_TOKEN_ADDRESS_EMPTY');
        require(executorTokenAddress.length > 0, 'WEB3BAZAAR_ERROR: EXECUTER_TOKEN_ADDRESS_EMPTY');

        require(creatorTokenAddress.length == creatorTokenId.length && creatorTokenAddress.length ==  creatorAmount.length 
                 && creatorTokenAddress.length == creatorTokenType.length , 'WEB3BAZAR_PARMS:CREATOR_PARMS_LEN_ERROR');
        require(executorTokenAddress.length == executorTokenId.length && executorTokenAddress.length ==  executorAmount.length 
                 && executorTokenAddress.length == executorTokenType.length , 'WEB3BAZAR_PARMS:EXECUTER_PARMS_LEN_ERROR');

        _tradeId++;
        _transactions[_tradeId].id = _tradeId;
        _transactions[_tradeId].creator = msg.sender;
        _transactions[_tradeId].executor = executerAddress;
        for (uint256 i = 0; i < creatorTokenAddress.length; i++) 
        {
            require(creatorTokenAddress[i] != address(0), 'WEB3BAZAAR_ERROR: CREATOR_TOKEN_ADDRESS_IS_ZERO' );
            verifyTradeIntegrity(creatorTokenAddress[i], creatorTokenId[i], creatorAmount[i], creatorTokenType[i] );
            if(TradeType(creatorTokenType[i]) == TradeType.ERC20){
                verifyERC20(msg.sender, creatorTokenAddress[i], creatorAmount[i], true);
            }else if(TradeType(creatorTokenType[i]) == TradeType.ERC721){
                verifyERC721(msg.sender, creatorTokenAddress[i], creatorTokenId[i], true );
            }else if(TradeType(creatorTokenType[i]) == TradeType.ERC1155){
                verifyERC1155(msg.sender, creatorTokenAddress[i], creatorAmount[i], creatorTokenId[i], true );
            }
            _transactions[_tradeId]._traders[msg.sender].tokenAddressIdx.push(i+1);
            _transactions[_tradeId]._traders[msg.sender]._counterpart[i+1].contractAddr = creatorTokenAddress[i];
            _transactions[_tradeId]._traders[msg.sender]._counterpart[i+1].idAsset = creatorTokenId[i];
            _transactions[_tradeId]._traders[msg.sender]._counterpart[i+1].amount  = creatorAmount[i];
            _transactions[_tradeId]._traders[msg.sender]._counterpart[i+1].traderType = TradeType(creatorTokenType[i]);
            _transactions[_tradeId]._traders[msg.sender]._counterpart[i+1].traderStatus = UserStatus.OPEN;
        }
        for (uint i = 0; i < executorTokenAddress.length; i++) 
        {
            require(executorTokenAddress[i] != address(0), 'WEB3BAZAAR_ERROR: EXECUTER_TOKEN_ADDRESS_IS_ZERO' );
            verifyTradeIntegrity(executorTokenAddress[i], executorTokenId[i], executorAmount[i], executorTokenType[i] );
            if(TradeType(executorTokenType[i]) == TradeType.ERC20){
                verifyERC20(executerAddress, executorTokenAddress[i], executorAmount[i], false);
            }else if(TradeType(executorTokenType[i]) == TradeType.ERC721){
                verifyERC721(executerAddress, executorTokenAddress[i], executorTokenId[i], false );
            }else if(TradeType(executorTokenType[i]) == TradeType.ERC1155){
                verifyERC1155(executerAddress, executorTokenAddress[i], executorAmount[i], executorTokenId[i], false);
            }
            _transactions[_tradeId]._traders[executerAddress].tokenAddressIdx.push(i+1);
            _transactions[_tradeId]._traders[executerAddress]._counterpart[i+1].contractAddr = executorTokenAddress[i];
            _transactions[_tradeId]._traders[executerAddress]._counterpart[i+1].idAsset = executorTokenId[i];
            _transactions[_tradeId]._traders[executerAddress]._counterpart[i+1].amount  = executorAmount[i];
            _transactions[_tradeId]._traders[executerAddress]._counterpart[i+1].traderType = TradeType(executorTokenType[i]);
            _transactions[_tradeId]._traders[executerAddress]._counterpart[i+1].traderStatus = UserStatus.OPEN;
        }
        _transactions[_tradeId].tradeStatus = TradeStatus.TRADE_CREATED;
        _openTrades[msg.sender].push(_tradeId);
        _openTrades[executerAddress].push(_tradeId);
        emit NewTrade(msg.sender, executerAddress, _tradeId );
        openTradeCount = openTradeCount + 1;
        return _tradeId;
    }

    function tradePerUser(address u) public view returns(uint256[] memory ){
        return (_openTrades[u]);
    }

    function removeTradeForUser(address u, uint256 tradeId ) private returns(bool)
    {
        uint256[] memory userTrades = _openTrades[u];

        if(_openTrades[u].length == 1){
            _openTrades[u][0] = 0;
            return true;
        }
        for (uint i = 0; i<userTrades.length-1; i++){
            if(userTrades[i] == tradeId ){
                 _openTrades[u][i] = _openTrades[u][userTrades.length-1];
                 _openTrades[u].pop();
                return true;
            }   
        }
        return false;
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"tradeId","type":"uint256"}],"name":"FinishTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"tradeId","type":"uint256"}],"name":"NewTrade","type":"event"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"addOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tradeId","type":"uint256"}],"name":"cancelTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tradeId","type":"uint256"}],"name":"executeTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tradeId","type":"uint256"}],"name":"getTrade","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tradeId","type":"uint256"},{"internalType":"address","name":"userWallet","type":"address"}],"name":"getTrade","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openTradeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"existingOwner","type":"address"}],"name":"removeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"creatorTokenAddress","type":"address[]"},{"internalType":"uint256[]","name":"creatorTokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"creatorAmount","type":"uint256[]"},{"internalType":"uint8[]","name":"creatorTokenType","type":"uint8[]"},{"internalType":"address","name":"executerAddress","type":"address"},{"internalType":"address[]","name":"executorTokenAddress","type":"address[]"},{"internalType":"uint256[]","name":"executorTokenId","type":"uint256[]"},{"internalType":"uint256[]","name":"executorAmount","type":"uint256[]"},{"internalType":"uint8[]","name":"executorTokenType","type":"uint8[]"}],"name":"startTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCompletedTrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"u","type":"address"}],"name":"tradePerUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"tokenType","type":"uint8"}],"name":"verifyTradeIntegrity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]

608060405234801561001057600080fd5b50600a6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000600581905550600060068190555061546b806100886000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80633d3a3ee411610097578063d3322d1b11610066578063d3322d1b146102fb578063e16bf05714610319578063f23a6e6114610337578063f5a55ff614610367576100f5565b80633d3a3ee41461024f578063666a34271461027f578063bc197c811461029b578063c2fa01f5146102cb576100f5565b8063150b7a02116100d3578063150b7a021461018a5780632db25e05146101ba57806332e7db1d146101ec5780633a31df8d1461021c576100f5565b806301ffc9a7146100fa57806302d2838b1461012a57806309ec6cc71461015a575b600080fd5b610114600480360381019061010f91906134f7565b610383565b604051610121919061353f565b60405180910390f35b610144600480360381019061013f9190613590565b6103fd565b60405161015191906135cc565b60405180910390f35b610174600480360381019061016f9190613590565b610b79565b604051610181919061353f565b60405180910390f35b6101a4600480360381019061019f919061378b565b610d52565b6040516101b1919061381d565b60405180910390f35b6101d460048036038101906101cf9190613590565b610d66565b6040516101e393929190613863565b60405180910390f35b6102066004803603810190610201919061389a565b610dfd565b6040516102139190613985565b60405180910390f35b610236600480360381019061023191906139a7565b610e94565b6040516102469493929190613b63565b60405180910390f35b61026960048036038101906102649190613e3e565b6112f2565b60405161027691906135cc565b60405180910390f35b61029960048036038101906102949190614026565b6125c6565b005b6102b560048036038101906102b09190614053565b612743565b6040516102c2919061381d565b60405180910390f35b6102e560048036038101906102e09190614122565b612758565b6040516102f2919061353f565b60405180910390f35b6103036128c5565b60405161031091906135cc565b60405180910390f35b6103216128cb565b60405161032e91906135cc565b60405180910390f35b610351600480360381019061034c9190614189565b6128d1565b60405161035e919061381d565b60405180910390f35b610381600480360381019061037c9190614026565b6128e6565b005b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103f657506103f582612a41565b5b9050919050565b6000806003600084815260200190815260200160002090506001600381111561042957610428614220565b5b8160040160009054906101000a900460ff16600381111561044d5761044c614220565b5b1461048d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610484906142d2565b60405180910390fd5b60008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461054d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054490614364565b60405180910390fd5b600080600090505b8460030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805490508110156107dc5760008560030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000182815481106105fc576105fb614384565b5b906000526020600020015490508560030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600082815260200190815260200160002092506001600481111561067457610673614220565b5b8360030160009054906101000a900460ff16600481111561069857610697614220565b5b036106d7576106d184868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660020154612aab565b506107c8565b600360048111156106eb576106ea614220565b5b8360030160009054906101000a900460ff16600481111561070f5761070e614220565b5b0361074e5761074884868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660010154612b4d565b506107c7565b6002600481111561076257610761614220565b5b8360030160009054906101000a900460ff16600481111561078657610785614220565b5b036107c6576107c484868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600101548760020154612bdd565b505b5b5b5080806107d4906143e2565b915050610555565b5060005b8460030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180549050811015610a675760008560030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061088757610886614384565b5b906000526020600020015490508560030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008281526020019081526020016000209250600160048111156108ff576108fe614220565b5b8360030160009054906101000a900460ff16600481111561092357610922614220565b5b036109625761095c85858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660020154612aab565b50610a53565b6003600481111561097657610975614220565b5b8360030160009054906101000a900460ff16600481111561099a57610999614220565b5b036109d9576109d385858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660010154612b4d565b50610a52565b600260048111156109ed576109ec614220565b5b8360030160009054906101000a900460ff166004811115610a1157610a10614220565b5b03610a5157610a4f85858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686600101548760020154612bdd565b505b5b5b508080610a5f906143e2565b9150506107e0565b50600260036000600154815260200190815260200160002060040160006101000a81548160ff02191690836003811115610aa457610aa3614220565b5b0217905550610ab33387612c71565b50610af46003600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687612c71565b506001600654610b04919061442a565b6006819055506001600554610b199190614480565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167f53846ec8c50c47d6bdc98e83d93c31f08be4d825f219475cd3c58022b45b075187604051610b6591906135cc565b60405180910390a285945050505050919050565b60008060036000848152602001908152602001600020905060016003811115610ba557610ba4614220565b5b8160040160009054906101000a900460ff166003811115610bc957610bc8614220565b5b14610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c00906142d2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480610cb657503373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90614526565b60405180910390fd5b600380600085815260200190815260200160002060040160006101000a81548160ff02191690836003811115610d2e57610d2d614220565b5b02179055506001600554610d429190614480565b6005819055506001915050919050565b600063150b7a0260e01b9050949350505050565b6000806000806003600086815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260040160009054906101000a900460ff166003811115610def57610dee614220565b5b935093509350509193909250565b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610e8857602002820191906000526020600020905b815481526020019060010190808311610e74575b50505050509050919050565b606080606080600060036000888152602001908152602001600020905060008160030160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015610f4157602002820191906000526020600020905b815481526020019060010190808311610f2d575b505050505090506000815167ffffffffffffffff811115610f6557610f64613660565b5b604051908082528060200260200182016040528015610f935781602001602082028036833780820191505090505b5090506000825167ffffffffffffffff811115610fb357610fb2613660565b5b604051908082528060200260200182016040528015610fe15781602001602082028036833780820191505090505b5090506000835167ffffffffffffffff81111561100157611000613660565b5b60405190808252806020026020018201604052801561102f5781602001602082028036833780820191505090505b5090506000845167ffffffffffffffff81111561104f5761104e613660565b5b60405190808252806020026020018201604052801561107d5781602001602082028036833780820191505090505b50905060005b85518110156112d65760008760030160008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008884815181106110e7576110e6614384565b5b602002602001015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff16600481111561119757611196614220565b5b60048111156111a9576111a8614220565b5b81526020016003820160019054906101000a900460ff1660038111156111d2576111d1614220565b5b60038111156111e4576111e3614220565b5b815250509050806000015186838151811061120257611201614384565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050806020015185838151811061125457611253614384565b5b602002602001018181525050806040015184838151811061127857611277614384565b5b6020026020010181815250508060600151600481111561129b5761129a614220565b5b8383815181106112ae576112ad614384565b5b602002602001019060ff16908160ff16815250505080806112ce906143e2565b915050611083565b5083838383995099509950995050505050505092959194509250565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611359906145b8565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036113d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c79061464a565b60405180910390fd5b60008a5111611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906146dc565b60405180910390fd5b6000855111611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f9061476e565b60405180910390fd5b88518a5114801561146a575087518a51145b8015611477575086518a51145b6114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad90614800565b60405180910390fd5b835185511480156114c8575082518551145b80156114d5575081518551145b611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90614892565b60405180910390fd5b60016000815480929190611527906143e2565b9190505550600154600360006001548152602001908152602001600020600201819055503360036000600154815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560036000600154815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8a51811015611d0f57600073ffffffffffffffffffffffffffffffffffffffff168b82815181106116305761162f614384565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614924565b60405180910390fd5b6117028b82815181106116a4576116a3614384565b5b60200260200101518b83815181106116bf576116be614384565b5b60200260200101518b84815181106116da576116d9614384565b5b60200260200101518b85815181106116f5576116f4614384565b5b6020026020010151612758565b506001600481111561171757611716614220565b5b88828151811061172a57611729614384565b5b602002602001015160ff16600481111561174757611746614220565b5b600481111561175957611758614220565b5b036117a55761179f338c838151811061177557611774614384565b5b60200260200101518b84815181106117905761178f614384565b5b60200260200101516001612f4b565b50611902565b600360048111156117b9576117b8614220565b5b8882815181106117cc576117cb614384565b5b602002602001015160ff1660048111156117e9576117e8614220565b5b60048111156117fb576117fa614220565b5b0361184757611841338c838151811061181757611816614384565b5b60200260200101518c848151811061183257611831614384565b5b602002602001015160016130e4565b50611901565b6002600481111561185b5761185a614220565b5b88828151811061186e5761186d614384565b5b602002602001015160ff16600481111561188b5761188a614220565b5b600481111561189d5761189c614220565b5b03611900576118fe338c83815181106118b9576118b8614384565b5b60200260200101518b84815181106118d4576118d3614384565b5b60200260200101518d85815181106118ef576118ee614384565b5b602002602001015160016132a5565b505b5b5b60036000600154815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600182611967919061442a565b90806001815401808255809150506001900390600052602060002001600090919091909150558a81815181106119a05761199f614384565b5b602002602001015160036000600154815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000600184611a0f919061442a565b815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550898181518110611a7157611a70614384565b5b602002602001015160036000600154815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000600184611ae0919061442a565b815260200190815260200160002060010181905550888181518110611b0857611b07614384565b5b602002602001015160036000600154815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000600184611b77919061442a565b815260200190815260200160002060020181905550878181518110611b9f57611b9e614384565b5b602002602001015160ff166004811115611bbc57611bbb614220565b5b60036000600154815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000600184611c23919061442a565b815260200190815260200160002060030160006101000a81548160ff02191690836004811115611c5657611c55614220565b5b0217905550600160036000600154815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000600184611cc4919061442a565b815260200190815260200160002060030160016101000a81548160ff02191690836003811115611cf757611cf6614220565b5b02179055508080611d07906143e2565b9150506115fc565b5060005b855181101561242657600073ffffffffffffffffffffffffffffffffffffffff16868281518110611d4757611d46614384565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c906149b6565b60405180910390fd5b611e19868281518110611dbb57611dba614384565b5b6020026020010151868381518110611dd657611dd5614384565b5b6020026020010151868481518110611df157611df0614384565b5b6020026020010151868581518110611e0c57611e0b614384565b5b6020026020010151612758565b5060016004811115611e2e57611e2d614220565b5b838281518110611e4157611e40614384565b5b602002602001015160ff166004811115611e5e57611e5d614220565b5b6004811115611e7057611e6f614220565b5b03611ebc57611eb687878381518110611e8c57611e8b614384565b5b6020026020010151868481518110611ea757611ea6614384565b5b60200260200101516000612f4b565b50612019565b60036004811115611ed057611ecf614220565b5b838281518110611ee357611ee2614384565b5b602002602001015160ff166004811115611f0057611eff614220565b5b6004811115611f1257611f11614220565b5b03611f5e57611f5887878381518110611f2e57611f2d614384565b5b6020026020010151878481518110611f4957611f48614384565b5b602002602001015160006130e4565b50612018565b60026004811115611f7257611f71614220565b5b838281518110611f8557611f84614384565b5b602002602001015160ff166004811115611fa257611fa1614220565b5b6004811115611fb457611fb3614220565b5b036120175761201587878381518110611fd057611fcf614384565b5b6020026020010151868481518110611feb57611fea614384565b5b602002602001015188858151811061200657612005614384565b5b602002602001015160006132a5565b505b5b5b60036000600154815260200190815260200160002060030160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160018261207e919061442a565b90806001815401808255809150506001900390600052602060002001600090919091909150558581815181106120b7576120b6614384565b5b602002602001015160036000600154815260200190815260200160002060030160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000600184612126919061442a565b815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084818151811061218857612187614384565b5b602002602001015160036000600154815260200190815260200160002060030160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006001846121f7919061442a565b81526020019081526020016000206001018190555083818151811061221f5761221e614384565b5b602002602001015160036000600154815260200190815260200160002060030160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600060018461228e919061442a565b8152602001908152602001600020600201819055508281815181106122b6576122b5614384565b5b602002602001015160ff1660048111156122d3576122d2614220565b5b60036000600154815260200190815260200160002060030160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101600060018461233a919061442a565b815260200190815260200160002060030160006101000a81548160ff0219169083600481111561236d5761236c614220565b5b0217905550600160036000600154815260200190815260200160002060030160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006001846123db919061442a565b815260200190815260200160002060030160016101000a81548160ff0219169083600381111561240e5761240d614220565b5b0217905550808061241e906143e2565b915050611d13565b50600160036000600154815260200190815260200160002060040160006101000a81548160ff0219169083600381111561246357612462614220565b5b0217905550600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001549080600181540180825580915050600190039060005260206000200160009091909190915055600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060015490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5593c8d475af51603aa57c734339c52df3afca57726170f19fdf61f2999c4ea660015460405161259791906135cc565b60405180910390a360016005546125ae919061442a565b60058190555060015490509998505050505050505050565b600a6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614612657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264e90614a22565b60405180910390fd5b600a6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16146126e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126df90614a8e565b60405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555050565b600063bc197c8160e01b905095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf90614b20565b60405180910390fd5b60008260ff16101580156127f457506004808111156127ea576127e9614220565b5b60ff168260ff1611155b612833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282a90614bb2565b60405180910390fd5b60008411612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d90614c44565b60405180910390fd5b600083116128b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b090614cd6565b60405180910390fd5b60019050949350505050565b60065481565b60055481565b600063f23a6e6160e01b905095945050505050565b600a6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1614612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e90614a22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129dd90614d42565b60405180910390fd5b600a6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000612aba8584846001612f4b565b508273ffffffffffffffffffffffffffffffffffffffff166323b872dd620186a08787866040518563ffffffff1660e01b8152600401612afc93929190614d62565b60206040518083038160008887f1158015612b1b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b409190614dc5565b5060019050949350505050565b6000612b5c85848460016130e4565b508273ffffffffffffffffffffffffffffffffffffffff1663b88d4fde620186a08787866040518563ffffffff1660e01b8152600401612b9e93929190614e29565b600060405180830381600088803b158015612bb857600080fd5b5087f1158015612bcc573d6000803e3d6000fd5b505050505060019050949350505050565b6000612bed8685848660016132a5565b508373ffffffffffffffffffffffffffffffffffffffff1663f242432a620186a0888887876040518663ffffffff1660e01b8152600401612c319493929190614ebf565b600060405180830381600088803b158015612c4b57600080fd5b5087f1158015612c5f573d6000803e3d6000fd5b50505050506001905095945050505050565b600080600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612cfd57602002820191906000526020600020905b815481526020019060010190808311612ce9575b505050505090506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905003612dba576000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548110612da257612da1614384565b5b90600052602060002001819055506001915050612f45565b60005b60018251612dcb9190614480565b811015612f3e5783828281518110612de657612de5614384565b5b602002602001015103612f2b57600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018351612e409190614480565b81548110612e5157612e50614384565b5b9060005260206000200154600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612ead57612eac614384565b5b9060005260206000200181905550600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612f0a57612f09614f17565b5b60019003818190600052602060002001600090559055600192505050612f45565b8080612f36906143e2565b915050612dbd565b5060009150505b92915050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231620186a0876040518363ffffffff1660e01b8152600401612f8a9190614f46565b6020604051808303818786fa158015612fa7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612fcc9190614f76565b83111561300e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300590615015565b60405180910390fd5b81156130d8578373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e620186a087306040518463ffffffff1660e01b8152600401613053929190615035565b6020604051808303818786fa158015613070573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130959190614f76565b8311156130d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ce906150d0565b60405180910390fd5b5b60019050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff16636352211e620186a0856040518363ffffffff1660e01b815260040161312391906135cc565b6020604051808303818786fa158015613140573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131659190615105565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146131d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c9906151a4565b60405180910390fd5b8115613299578373ffffffffffffffffffffffffffffffffffffffff1663e985e9c5620186a087306040518463ffffffff1660e01b8152600401613217929190615035565b6020604051808303818786fa158015613234573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132599190614dc5565b613298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328f90615236565b60405180910390fd5b5b60019050949350505050565b60008083116132e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e0906152c8565b60405180910390fd5b60008411801561337857508473ffffffffffffffffffffffffffffffffffffffff1662fdd58e620186a088866040518463ffffffff1660e01b81526004016133329291906152e8565b6020604051808303818786fa15801561334f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906133749190614f76565b8411155b6133b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ae90615383565b60405180910390fd5b811561347e578473ffffffffffffffffffffffffffffffffffffffff1663e985e9c5620186a088306040518463ffffffff1660e01b81526004016133fc929190615035565b6020604051808303818786fa158015613419573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061343e9190614dc5565b61347d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347490615415565b60405180910390fd5b5b6001905095945050505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134d48161349f565b81146134df57600080fd5b50565b6000813590506134f1816134cb565b92915050565b60006020828403121561350d5761350c613495565b5b600061351b848285016134e2565b91505092915050565b60008115159050919050565b61353981613524565b82525050565b60006020820190506135546000830184613530565b92915050565b6000819050919050565b61356d8161355a565b811461357857600080fd5b50565b60008135905061358a81613564565b92915050565b6000602082840312156135a6576135a5613495565b5b60006135b48482850161357b565b91505092915050565b6135c68161355a565b82525050565b60006020820190506135e160008301846135bd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613612826135e7565b9050919050565b61362281613607565b811461362d57600080fd5b50565b60008135905061363f81613619565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136988261364f565b810181811067ffffffffffffffff821117156136b7576136b6613660565b5b80604052505050565b60006136ca61348b565b90506136d6828261368f565b919050565b600067ffffffffffffffff8211156136f6576136f5613660565b5b6136ff8261364f565b9050602081019050919050565b82818337600083830152505050565b600061372e613729846136db565b6136c0565b90508281526020810184848401111561374a5761374961364a565b5b61375584828561370c565b509392505050565b600082601f83011261377257613771613645565b5b813561378284826020860161371b565b91505092915050565b600080600080608085870312156137a5576137a4613495565b5b60006137b387828801613630565b94505060206137c487828801613630565b93505060406137d58782880161357b565b925050606085013567ffffffffffffffff8111156137f6576137f561349a565b5b6138028782880161375d565b91505092959194509250565b6138178161349f565b82525050565b6000602082019050613832600083018461380e565b92915050565b61384181613607565b82525050565b600060ff82169050919050565b61385d81613847565b82525050565b60006060820190506138786000830186613838565b6138856020830185613838565b6138926040830184613854565b949350505050565b6000602082840312156138b0576138af613495565b5b60006138be84828501613630565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138fc8161355a565b82525050565b600061390e83836138f3565b60208301905092915050565b6000602082019050919050565b6000613932826138c7565b61393c81856138d2565b9350613947836138e3565b8060005b8381101561397857815161395f8882613902565b975061396a8361391a565b92505060018101905061394b565b5085935050505092915050565b6000602082019050818103600083015261399f8184613927565b905092915050565b600080604083850312156139be576139bd613495565b5b60006139cc8582860161357b565b92505060206139dd85828601613630565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a1c81613607565b82525050565b6000613a2e8383613a13565b60208301905092915050565b6000602082019050919050565b6000613a52826139e7565b613a5c81856139f2565b9350613a6783613a03565b8060005b83811015613a98578151613a7f8882613a22565b9750613a8a83613a3a565b925050600181019050613a6b565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ada81613847565b82525050565b6000613aec8383613ad1565b60208301905092915050565b6000602082019050919050565b6000613b1082613aa5565b613b1a8185613ab0565b9350613b2583613ac1565b8060005b83811015613b56578151613b3d8882613ae0565b9750613b4883613af8565b925050600181019050613b29565b5085935050505092915050565b60006080820190508181036000830152613b7d8187613a47565b90508181036020830152613b918186613927565b90508181036040830152613ba58185613927565b90508181036060830152613bb98184613b05565b905095945050505050565b600067ffffffffffffffff821115613bdf57613bde613660565b5b602082029050602081019050919050565b600080fd5b6000613c08613c0384613bc4565b6136c0565b90508083825260208201905060208402830185811115613c2b57613c2a613bf0565b5b835b81811015613c545780613c408882613630565b845260208401935050602081019050613c2d565b5050509392505050565b600082601f830112613c7357613c72613645565b5b8135613c83848260208601613bf5565b91505092915050565b600067ffffffffffffffff821115613ca757613ca6613660565b5b602082029050602081019050919050565b6000613ccb613cc684613c8c565b6136c0565b90508083825260208201905060208402830185811115613cee57613ced613bf0565b5b835b81811015613d175780613d03888261357b565b845260208401935050602081019050613cf0565b5050509392505050565b600082601f830112613d3657613d35613645565b5b8135613d46848260208601613cb8565b91505092915050565b600067ffffffffffffffff821115613d6a57613d69613660565b5b602082029050602081019050919050565b613d8481613847565b8114613d8f57600080fd5b50565b600081359050613da181613d7b565b92915050565b6000613dba613db584613d4f565b6136c0565b90508083825260208201905060208402830185811115613ddd57613ddc613bf0565b5b835b81811015613e065780613df28882613d92565b845260208401935050602081019050613ddf565b5050509392505050565b600082601f830112613e2557613e24613645565b5b8135613e35848260208601613da7565b91505092915050565b60008060008060008060008060006101208a8c031215613e6157613e60613495565b5b60008a013567ffffffffffffffff811115613e7f57613e7e61349a565b5b613e8b8c828d01613c5e565b99505060208a013567ffffffffffffffff811115613eac57613eab61349a565b5b613eb88c828d01613d21565b98505060408a013567ffffffffffffffff811115613ed957613ed861349a565b5b613ee58c828d01613d21565b97505060608a013567ffffffffffffffff811115613f0657613f0561349a565b5b613f128c828d01613e10565b9650506080613f238c828d01613630565b95505060a08a013567ffffffffffffffff811115613f4457613f4361349a565b5b613f508c828d01613c5e565b94505060c08a013567ffffffffffffffff811115613f7157613f7061349a565b5b613f7d8c828d01613d21565b93505060e08a013567ffffffffffffffff811115613f9e57613f9d61349a565b5b613faa8c828d01613d21565b9250506101008a013567ffffffffffffffff811115613fcc57613fcb61349a565b5b613fd88c828d01613e10565b9150509295985092959850929598565b6000613ff3826135e7565b9050919050565b61400381613fe8565b811461400e57600080fd5b50565b60008135905061402081613ffa565b92915050565b60006020828403121561403c5761403b613495565b5b600061404a84828501614011565b91505092915050565b600080600080600060a0868803121561406f5761406e613495565b5b600061407d88828901613630565b955050602061408e88828901613630565b945050604086013567ffffffffffffffff8111156140af576140ae61349a565b5b6140bb88828901613d21565b935050606086013567ffffffffffffffff8111156140dc576140db61349a565b5b6140e888828901613d21565b925050608086013567ffffffffffffffff8111156141095761410861349a565b5b6141158882890161375d565b9150509295509295909350565b6000806000806080858703121561413c5761413b613495565b5b600061414a87828801613630565b945050602061415b8782880161357b565b935050604061416c8782880161357b565b925050606061417d87828801613d92565b91505092959194509250565b600080600080600060a086880312156141a5576141a4613495565b5b60006141b388828901613630565b95505060206141c488828901613630565b94505060406141d58882890161357b565b93505060606141e68882890161357b565b925050608086013567ffffffffffffffff8111156142075761420661349a565b5b6142138882890161375d565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f5745423342415a4141525f4552524f523a2054524144455f535441545553204960008201527f534e542043524541544544000000000000000000000000000000000000000000602082015250565b60006142bc602b8361424f565b91506142c782614260565b604082019050919050565b600060208201905081810360008301526142eb816142af565b9050919050565b7f5745423342415a4141525f4552524f523a2043414c4c455220494e535420544860008201527f4520455845435554455200000000000000000000000000000000000000000000602082015250565b600061434e602a8361424f565b9150614359826142f2565b604082019050919050565b6000602082019050818103600083015261437d81614341565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006143ed8261355a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361441f5761441e6143b3565b5b600182019050919050565b60006144358261355a565b91506144408361355a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614475576144746143b3565b5b828201905092915050565b600061448b8261355a565b91506144968361355a565b9250828210156144a9576144a86143b3565b5b828203905092915050565b7f5745423342415a4141525f4552524f523a2045584543555445522049534e542060008201527f43524541544f52204f5220455845435554455200000000000000000000000000602082015250565b600061451060338361424f565b915061451b826144b4565b604082019050919050565b6000602082019050818103600083015261453f81614503565b9050919050565b7f5745423342415a4141525f4552524f523a2045584543555445525f414444524560008201527f53535f4e4f545f56414c49440000000000000000000000000000000000000000602082015250565b60006145a2602c8361424f565b91506145ad82614546565b604082019050919050565b600060208201905081810360008301526145d181614595565b9050919050565b7f5745423342415a4141525f4552524f523a2043524541544f525f414e445f455860008201527f4543555445525f4152455f455155414c00000000000000000000000000000000602082015250565b600061463460308361424f565b915061463f826145d8565b604082019050919050565b6000602082019050818103600083015261466381614627565b9050919050565b7f5745423342415a4141525f4552524f523a2043524541544f525f544f4b454e5f60008201527f414444524553535f454d50545900000000000000000000000000000000000000602082015250565b60006146c6602d8361424f565b91506146d18261466a565b604082019050919050565b600060208201905081810360008301526146f5816146b9565b9050919050565b7f5745423342415a4141525f4552524f523a2045584543555445525f544f4b454e60008201527f5f414444524553535f454d505459000000000000000000000000000000000000602082015250565b6000614758602e8361424f565b9150614763826146fc565b604082019050919050565b600060208201905081810360008301526147878161474b565b9050919050565b7f5745423342415a41525f5041524d533a43524541544f525f5041524d535f4c4560008201527f4e5f4552524f5200000000000000000000000000000000000000000000000000602082015250565b60006147ea60278361424f565b91506147f58261478e565b604082019050919050565b60006020820190508181036000830152614819816147dd565b9050919050565b7f5745423342415a41525f5041524d533a45584543555445525f5041524d535f4c60008201527f454e5f4552524f52000000000000000000000000000000000000000000000000602082015250565b600061487c60288361424f565b915061488782614820565b604082019050919050565b600060208201905081810360008301526148ab8161486f565b9050919050565b7f5745423342415a4141525f4552524f523a2043524541544f525f544f4b454e5f60008201527f414444524553535f49535f5a45524f0000000000000000000000000000000000602082015250565b600061490e602f8361424f565b9150614919826148b2565b604082019050919050565b6000602082019050818103600083015261493d81614901565b9050919050565b7f5745423342415a4141525f4552524f523a2045584543555445525f544f4b454e60008201527f5f414444524553535f49535f5a45524f00000000000000000000000000000000602082015250565b60006149a060308361424f565b91506149ab82614944565b604082019050919050565b600060208201905081810360008301526149cf81614993565b9050919050565b7f4552525f4e4f545f4f574e455200000000000000000000000000000000000000600082015250565b6000614a0c600d8361424f565b9150614a17826149d6565b602082019050919050565b60006020820190508181036000830152614a3b816149ff565b9050919050565b7f4552525f414444525f4e4f545f4f574e45520000000000000000000000000000600082015250565b6000614a7860128361424f565b9150614a8382614a42565b602082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b7f5745423342415a4141525f4552524f523a2043524541544f525f434f4e54524160008201527f43545f4e4f545f56414c49440000000000000000000000000000000000000000602082015250565b6000614b0a602c8361424f565b9150614b1582614aae565b604082019050919050565b60006020820190508181036000830152614b3981614afd565b9050919050565b7f5745423342415a41525f4552524f523a204e4f545f56414c49445f545241444560008201527f5f54595045000000000000000000000000000000000000000000000000000000602082015250565b6000614b9c60258361424f565b9150614ba782614b40565b604082019050919050565b60006020820190508181036000830152614bcb81614b8f565b9050919050565b7f5745423342415a41525f4552524f523a20544f4b454e49445f4d5553545f504f60008201527f5349544956450000000000000000000000000000000000000000000000000000602082015250565b6000614c2e60268361424f565b9150614c3982614bd2565b604082019050919050565b60006020820190508181036000830152614c5d81614c21565b9050919050565b7f5745423342415a41525f4552524f523a20414d4f554e545f4d5553545f504f5360008201527f4954495645000000000000000000000000000000000000000000000000000000602082015250565b6000614cc060258361424f565b9150614ccb82614c64565b604082019050919050565b60006020820190508181036000830152614cef81614cb3565b9050919050565b7f4552525f5a45524f5f4144445200000000000000000000000000000000000000600082015250565b6000614d2c600d8361424f565b9150614d3782614cf6565b602082019050919050565b60006020820190508181036000830152614d5b81614d1f565b9050919050565b6000606082019050614d776000830186613838565b614d846020830185613838565b614d9160408301846135bd565b949350505050565b614da281613524565b8114614dad57600080fd5b50565b600081519050614dbf81614d99565b92915050565b600060208284031215614ddb57614dda613495565b5b6000614de984828501614db0565b91505092915050565b600082825260208201905092915050565b50565b6000614e13600083614df2565b9150614e1e82614e03565b600082019050919050565b6000608082019050614e3e6000830186613838565b614e4b6020830185613838565b614e5860408301846135bd565b8181036060830152614e6981614e06565b9050949350505050565b7f3078303100000000000000000000000000000000000000000000000000000000600082015250565b6000614ea9600483614df2565b9150614eb482614e73565b602082019050919050565b600060a082019050614ed46000830187613838565b614ee16020830186613838565b614eee60408301856135bd565b614efb60608301846135bd565b8181036080830152614f0c81614e9c565b905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000602082019050614f5b6000830184613838565b92915050565b600081519050614f7081613564565b92915050565b600060208284031215614f8c57614f8b613495565b5b6000614f9a84828501614f61565b91505092915050565b7f5745423342415a4141525f4552524f523a204552525f4e4f545f454e4f55474860008201527f5f46554e44535f45524332300000000000000000000000000000000000000000602082015250565b6000614fff602c8361424f565b915061500a82614fa3565b604082019050919050565b6000602082019050818103600083015261502e81614ff2565b9050919050565b600060408201905061504a6000830185613838565b6150576020830184613838565b9392505050565b7f5745423342415a41525f4552524f523a204552525f4e4f545f414c4c4f575f5360008201527f50454e445f46554e445300000000000000000000000000000000000000000000602082015250565b60006150ba602a8361424f565b91506150c58261505e565b604082019050919050565b600060208201905081810360008301526150e9816150ad565b9050919050565b6000815190506150ff81613619565b92915050565b60006020828403121561511b5761511a613495565b5b6000615129848285016150f0565b91505092915050565b7f5745423342415a4141525f4552524f523a204552525f4e4f545f4f574e5f494460008201527f5f45524337323100000000000000000000000000000000000000000000000000602082015250565b600061518e60278361424f565b915061519982615132565b604082019050919050565b600060208201905081810360008301526151bd81615181565b9050919050565b7f5745423342415a41525f4552524f523a204552525f4e4f545f414c4c4f575f5460008201527f4f5f5452414e5345525f4954454e535f45524337323100000000000000000000602082015250565b600061522060368361424f565b915061522b826151c4565b604082019050919050565b6000602082019050818103600083015261524f81615213565b9050919050565b7f5745423342415a4141525f4552524f523a205354414b455f455243313135355f60008201527f49445f53484f554c445f475245415445525f5448454e5f300000000000000000602082015250565b60006152b260388361424f565b91506152bd82615256565b604082019050919050565b600060208201905081810360008301526152e1816152a5565b9050919050565b60006040820190506152fd6000830185613838565b61530a60208301846135bd565b9392505050565b7f5745423342415a4141525f4552524f523a204552525f4e4f545f454e4f55474860008201527f5f46554e44535f45524331313535000000000000000000000000000000000000602082015250565b600061536d602e8361424f565b915061537882615311565b604082019050919050565b6000602082019050818103600083015261539c81615360565b9050919050565b7f5745423342415a41525f4552524f523a204552525f4e4f545f414c4c4f575f5460008201527f4f5f5452414e5345525f4954454e535f45524331313535000000000000000000602082015250565b60006153ff60378361424f565b915061540a826153a3565b604082019050919050565b6000602082019050818103600083015261542e816153f2565b905091905056fea264697066735822122082e17772604bd13167f6b090648be4294005245e54c0858cfabc8d710ed0432c64736f6c634300080e0033

Deployed ByteCode Sourcemap

62512:14122:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37349:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68215:2360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63845:520;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3769:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64371:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;75951:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64600:1145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;71114:4829;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62320:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38087:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70583:523;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62975:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62939:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37852:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62146:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37349:223;37451:4;37490:34;37475:49;;;:11;:49;;;;:89;;;;37528:36;37552:11;37528:23;:36::i;:::-;37475:89;37468:96;;37349:223;;;:::o;68215:2360::-;68271:7;68296:19;68318:13;:22;68332:7;68318:22;;;;;;;;;;;68296:44;;68380:25;68359:46;;;;;;;;:::i;:::-;;:5;:17;;;;;;;;;;;;:46;;;;;;;;:::i;:::-;;;68351:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;68466:17;68486:5;:14;;;;;;;;;;;;68466:34;;68511:16;68530:5;:13;;;;;;;;;;;;68511:32;;68574:10;68562:22;;:8;:22;;;68554:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68642:33;68691:6;68700:1;68691:10;;68686:745;68707:5;:14;;:23;68722:7;68707:23;;;;;;;;;;;;;;;:39;;:46;;;;68703:1;:50;68686:745;;;68785:23;68811:5;:14;;:23;68826:7;68811:23;;;;;;;;;;;;;;;:39;;68851:1;68811:42;;;;;;;;:::i;:::-;;;;;;;;;;68785:68;;68880:5;:14;;:23;68895:7;68880:23;;;;;;;;;;;;;;;:36;;:53;68917:15;68880:53;;;;;;;;;;;68868:65;;68974:15;68951:38;;;;;;;;:::i;:::-;;:8;:19;;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;68948:470;;69009:68;69019:7;69028:8;69038;:21;;;;;;;;;;;;69061:8;:15;;;69009:9;:68::i;:::-;;68948:470;;;69124:16;69101:39;;;;;;;;:::i;:::-;;:8;:19;;;;;;;;;;;;:39;;;;;;;;:::i;:::-;;;69098:320;;69160:70;69171:7;69180:8;69190;:21;;;;;;;;;;;;69213:8;:16;;;69160:10;:70::i;:::-;;69098:320;;;69277:17;69254:40;;;;;;;;:::i;:::-;;:8;:19;;;;;;;;;;;;:40;;;;;;;;:::i;:::-;;;69251:167;;69314:88;69326:7;69335:8;69345;:21;;;;;;;;;;;;69368:8;:16;;;69386:8;:15;;;69314:11;:88::i;:::-;;69251:167;69098:320;68948:470;68770:661;68755:3;;;;;:::i;:::-;;;;68686:745;;;;69446:6;69441:750;69462:5;:14;;:24;69477:8;69462:24;;;;;;;;;;;;;;;:40;;:47;;;;69458:1;:51;69441:750;;;69541:23;69567:5;:14;;:24;69582:8;69567:24;;;;;;;;;;;;;;;:40;;69608:1;69567:43;;;;;;;;:::i;:::-;;;;;;;;;;69541:69;;69637:5;:14;;:24;69652:8;69637:24;;;;;;;;;;;;;;;:37;;:54;69675:15;69637:54;;;;;;;;;;;69625:66;;69733:15;69710:38;;;;;;;;:::i;:::-;;:8;:19;;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;69707:473;;69768:69;69778:8;69788:7;69798:8;:21;;;;;;;;;;;;69821:8;:15;;;69768:9;:69::i;:::-;;69707:473;;;69884:16;69861:39;;;;;;;;:::i;:::-;;:8;:19;;;;;;;;;;;;:39;;;;;;;;:::i;:::-;;;69858:322;;69920:71;69931:8;69941:7;69951:8;:21;;;;;;;;;;;;69974:8;:16;;;69920:10;:71::i;:::-;;69858:322;;;70038:17;70015:40;;;;;;;;:::i;:::-;;:8;:19;;;;;;;;;;;;:40;;;;;;;;:::i;:::-;;;70012:168;;70075:89;70087:8;70097:7;70107:8;:21;;;;;;;;;;;;70130:8;:16;;;70148:8;:15;;;70075:11;:89::i;:::-;;70012:168;69858:322;69707:473;69526:665;69511:3;;;;;:::i;:::-;;;;69441:750;;;;70240:27;70202:13;:23;70216:8;;70202:23;;;;;;;;;;;:35;;;:65;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;70278:39;70297:10;70309:7;70278:18;:39::i;:::-;;70328:59;70347:13;:22;70361:7;70347:22;;;;;;;;;;;:30;;;;;;;;;;;;70379:7;70328:18;:59::i;:::-;;70442:1;70420:19;;:23;;;;:::i;:::-;70398:19;:45;;;;70493:1;70476:14;;:18;;;;:::i;:::-;70454:14;:40;;;;70522:10;70510:32;;;70534:7;70510:32;;;;;;:::i;:::-;;;;;;;;70560:7;70553:14;;;;;;68215:2360;;;:::o;63845:520::-;63900:4;63922:19;63944:13;:22;63958:7;63944:22;;;;;;;;;;;63922:44;;64006:25;63985:46;;;;;;;;:::i;:::-;;:5;:17;;;;;;;;;;;;:46;;;;;;;;:::i;:::-;;;63977:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;64116:10;64098:28;;:5;:14;;;;;;;;;;;;:28;;;:59;;;;64147:10;64130:27;;:5;:13;;;;;;;;;;;;:27;;;64098:59;64090:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;64262:27;64225:13;:22;64239:7;64225:22;;;;;;;;;;;:34;;;:64;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;64334:1;64317:14;;:18;;;;:::i;:::-;64300:14;:35;;;;64353:4;64346:11;;;63845:520;;;:::o;3769:207::-;3912:6;3938:30;;;3931:37;;3769:207;;;;;;:::o;64371:223::-;64427:7;64436;64444:5;64467:19;64489:13;:22;64503:7;64489:22;;;;;;;;;;;64467:44;;64530:5;:13;;;;;;;;;;;;64545:5;:14;;;;;;;;;;;;64567:5;:17;;;;;;;;;;;;64561:24;;;;;;;;:::i;:::-;;64522:64;;;;;;;64371:223;;;;;:::o;75951:113::-;76004:16;76041:11;:14;76053:1;76041:14;;;;;;;;;;;;;;;76033:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75951:113;;;:::o;64600:1145::-;64676:16;64694;64713;64732:14;64765:19;64787:13;:22;64801:7;64787:22;;;;;;;;;;;64765:44;;64820:32;64855:5;:14;;:26;64870:10;64855:26;;;;;;;;;;;;;;;:42;;64820:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64910:36;64963:15;:22;64949:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64910:76;;64997:32;65050:15;:22;65036:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64997:76;;65084:35;65137:15;:22;65123:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65084:76;;65171:28;65222:15;:22;65210:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65171:74;;65262:6;65258:393;65278:15;:22;65274:1;:26;65258:393;;;65325:29;65357:5;:14;;:26;65372:10;65357:26;;;;;;;;;;;;;;;:39;;:59;65397:15;65413:1;65397:18;;;;;;;;:::i;:::-;;;;;;;;65357:59;;;;;;;;;;;65325:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;65458:5;:18;;;65435;65454:1;65435:21;;;;;;;;:::i;:::-;;;;;;;:41;;;;;;;;;;;65515:5;:13;;;65495:14;65510:1;65495:17;;;;;;;;:::i;:::-;;;;;;;:33;;;;;65569:5;:12;;;65547:17;65565:1;65547:20;;;;;;;;:::i;:::-;;;;;;;:34;;;;;65622:5;:16;;;65616:23;;;;;;;;:::i;:::-;;65600:10;65611:1;65600:13;;;;;;;;:::i;:::-;;;;;;;:39;;;;;;;;;;;65306:345;65302:3;;;;;:::i;:::-;;;;65258:393;;;;65669:18;65689:14;65705:17;65724:10;65661:76;;;;;;;;;;;;;;64600:1145;;;;;;;:::o;71114:4829::-;71483:7;71543:1;71516:29;;:15;:29;;;71508:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;71633:10;71614:29;;:15;:29;;;71606:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;71745:1;71715:19;:26;:31;71707:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;71845:1;71815:20;:27;:31;71807:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;71948:14;:21;71918:19;:26;:51;:106;;;;;72004:13;:20;71973:19;:26;:51;71918:106;:182;;;;;72077:16;:23;72047:19;:26;:53;71918:182;71910:235;;;;;;;;;;;;:::i;:::-;;;;;;;;;72195:15;:22;72164:20;:27;:53;:110;;;;;72253:14;:21;72221:20;:27;:53;72164:110;:188;;;;;72328:17;:24;72297:20;:27;:55;72164:188;72156:242;;;;;;;;;;;;:::i;:::-;;;;;;;;;72411:8;;:10;;;;;;;;;:::i;:::-;;;;;;72461:8;;72432:13;:23;72446:8;;72432:23;;;;;;;;;;;:26;;:37;;;;72514:10;72480:13;:23;72494:8;;72480:23;;;;;;;;;;;:31;;;:44;;;;;;;;;;;;;;;;;;72570:15;72535:13;:23;72549:8;;72535:23;;;;;;;;;;;:32;;;:50;;;;;;;;;;;;;;;;;;72601:9;72596:1476;72620:19;:26;72616:1;:30;72596:1476;;;72720:1;72686:36;;:19;72706:1;72686:22;;;;;;;;:::i;:::-;;;;;;;;:36;;;72678:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;72790:103;72811:19;72831:1;72811:22;;;;;;;;:::i;:::-;;;;;;;;72835:14;72850:1;72835:17;;;;;;;;:::i;:::-;;;;;;;;72854:13;72868:1;72854:16;;;;;;;;:::i;:::-;;;;;;;;72872;72889:1;72872:19;;;;;;;;:::i;:::-;;;;;;;;72790:20;:103::i;:::-;;72945:15;72911:49;;;;;;;;:::i;:::-;;72921:16;72938:1;72921:19;;;;;;;;:::i;:::-;;;;;;;;72911:30;;;;;;;;;;:::i;:::-;;:49;;;;;;;;:::i;:::-;;;72908:515;;72980:71;72992:10;73004:19;73024:1;73004:22;;;;;;;;:::i;:::-;;;;;;;;73028:13;73042:1;73028:16;;;;;;;;:::i;:::-;;;;;;;;73046:4;72980:11;:71::i;:::-;;72908:515;;;73109:16;73075:50;;;;;;;;:::i;:::-;;73085:16;73102:1;73085:19;;;;;;;;:::i;:::-;;;;;;;;73075:30;;;;;;;;;;:::i;:::-;;:50;;;;;;;;:::i;:::-;;;73072:351;;73145:74;73158:10;73170:19;73190:1;73170:22;;;;;;;;:::i;:::-;;;;;;;;73194:14;73209:1;73194:17;;;;;;;;:::i;:::-;;;;;;;;73213:4;73145:12;:74::i;:::-;;73072:351;;;73277:17;73243:51;;;;;;;;:::i;:::-;;73253:16;73270:1;73253:19;;;;;;;;:::i;:::-;;;;;;;;73243:30;;;;;;;;;;:::i;:::-;;:51;;;;;;;;:::i;:::-;;;73240:183;;73314:93;73328:10;73340:19;73360:1;73340:22;;;;;;;;:::i;:::-;;;;;;;;73364:13;73378:1;73364:16;;;;;;;;:::i;:::-;;;;;;;;73382:14;73397:1;73382:17;;;;;;;;:::i;:::-;;;;;;;;73401:4;73314:13;:93::i;:::-;;73240:183;73072:351;72908:515;73437:13;:23;73451:8;;73437:23;;;;;;;;;;;:32;;:44;73470:10;73437:44;;;;;;;;;;;;;;;:60;;73505:1;73503;:3;;;;:::i;:::-;73437:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73600:19;73620:1;73600:22;;;;;;;;:::i;:::-;;;;;;;;73522:13;:23;73536:8;;73522:23;;;;;;;;;;;:32;;:44;73555:10;73522:44;;;;;;;;;;;;;;;:57;;:62;73582:1;73580;:3;;;;:::i;:::-;73522:62;;;;;;;;;;;:75;;;:100;;;;;;;;;;;;;;;;;;73710:14;73725:1;73710:17;;;;;;;;:::i;:::-;;;;;;;;73637:13;:23;73651:8;;73637:23;;;;;;;;;;;:32;;:44;73670:10;73637:44;;;;;;;;;;;;;;;:57;;:62;73697:1;73695;:3;;;;:::i;:::-;73637:62;;;;;;;;;;;:70;;:90;;;;73815:13;73829:1;73815:16;;;;;;;;:::i;:::-;;;;;;;;73742:13;:23;73756:8;;73742:23;;;;;;;;;;;:32;;:44;73775:10;73742:44;;;;;;;;;;;;;;;:57;;:62;73802:1;73800;:3;;;;:::i;:::-;73742:62;;;;;;;;;;;:69;;:89;;;;73932:16;73949:1;73932:19;;;;;;;;:::i;:::-;;;;;;;;73922:30;;;;;;;;;;:::i;:::-;;73846:13;:23;73860:8;;73846:23;;;;;;;;;;;:32;;:44;73879:10;73846:44;;;;;;;;;;;;;;;:57;;:62;73906:1;73904;:3;;;;:::i;:::-;73846:62;;;;;;;;;;;:73;;;:106;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;74045:15;73967:13;:23;73981:8;;73967:23;;;;;;;;;;;:32;;:44;74000:10;73967:44;;;;;;;;;;;;;;;:57;;:62;74027:1;74025;:3;;;;:::i;:::-;73967:62;;;;;;;;;;;:75;;;:93;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;72648:3;;;;;:::i;:::-;;;;72596:1476;;;;74087:6;74082:1541;74103:20;:27;74099:1;:31;74082:1541;;;74205:1;74170:37;;:20;74191:1;74170:23;;;;;;;;:::i;:::-;;;;;;;;:37;;;74162:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;74276:107;74297:20;74318:1;74297:23;;;;;;;;:::i;:::-;;;;;;;;74322:15;74338:1;74322:18;;;;;;;;:::i;:::-;;;;;;;;74342:14;74357:1;74342:17;;;;;;;;:::i;:::-;;;;;;;;74361;74379:1;74361:20;;;;;;;;:::i;:::-;;;;;;;;74276;:107::i;:::-;;74436:15;74401:50;;;;;;;;:::i;:::-;;74411:17;74429:1;74411:20;;;;;;;;:::i;:::-;;;;;;;;74401:31;;;;;;;;;;:::i;:::-;;:50;;;;;;;;:::i;:::-;;;74398:542;;74471:79;74483:15;74500:20;74521:1;74500:23;;;;;;;;:::i;:::-;;;;;;;;74525:14;74540:1;74525:17;;;;;;;;:::i;:::-;;;;;;;;74544:5;74471:11;:79::i;:::-;;74398:542;;;74609:16;74574:51;;;;;;;;:::i;:::-;;74584:17;74602:1;74584:20;;;;;;;;:::i;:::-;;;;;;;;74574:31;;;;;;;;;;:::i;:::-;;:51;;;;;;;;:::i;:::-;;;74571:369;;74645:82;74658:15;74675:20;74696:1;74675:23;;;;;;;;:::i;:::-;;;;;;;;74700:15;74716:1;74700:18;;;;;;;;:::i;:::-;;;;;;;;74720:5;74645:12;:82::i;:::-;;74571:369;;;74786:17;74751:52;;;;;;;;:::i;:::-;;74761:17;74779:1;74761:20;;;;;;;;:::i;:::-;;;;;;;;74751:31;;;;;;;;;;:::i;:::-;;:52;;;;;;;;:::i;:::-;;;74748:192;;74823:101;74837:15;74854:20;74875:1;74854:23;;;;;;;;:::i;:::-;;;;;;;;74879:14;74894:1;74879:17;;;;;;;;:::i;:::-;;;;;;;;74898:15;74914:1;74898:18;;;;;;;;:::i;:::-;;;;;;;;74918:5;74823:13;:101::i;:::-;;74748:192;74571:369;74398:542;74954:13;:23;74968:8;;74954:23;;;;;;;;;;;:32;;:49;74987:15;74954:49;;;;;;;;;;;;;;;:65;;75027:1;75025;:3;;;;:::i;:::-;74954:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75127:20;75148:1;75127:23;;;;;;;;:::i;:::-;;;;;;;;75044:13;:23;75058:8;;75044:23;;;;;;;;;;;:32;;:49;75077:15;75044:49;;;;;;;;;;;;;;;:62;;:67;75109:1;75107;:3;;;;:::i;:::-;75044:67;;;;;;;;;;;:80;;;:106;;;;;;;;;;;;;;;;;;75243:15;75259:1;75243:18;;;;;;;;:::i;:::-;;;;;;;;75165:13;:23;75179:8;;75165:23;;;;;;;;;;;:32;;:49;75198:15;75165:49;;;;;;;;;;;;;;;:62;;:67;75230:1;75228;:3;;;;:::i;:::-;75165:67;;;;;;;;;;;:75;;:96;;;;75354:14;75369:1;75354:17;;;;;;;;:::i;:::-;;;;;;;;75276:13;:23;75290:8;;75276:23;;;;;;;;;;;:32;;:49;75309:15;75276:49;;;;;;;;;;;;;;;:62;;:67;75341:1;75339;:3;;;;:::i;:::-;75276:67;;;;;;;;;;;:74;;:95;;;;75477:17;75495:1;75477:20;;;;;;;;:::i;:::-;;;;;;;;75467:31;;;;;;;;;;:::i;:::-;;75386:13;:23;75400:8;;75386:23;;;;;;;;;;;:32;;:49;75419:15;75386:49;;;;;;;;;;;;;;;:62;;:67;75451:1;75449;:3;;;;:::i;:::-;75386:67;;;;;;;;;;;:78;;;:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;75596:15;75513:13;:23;75527:8;;75513:23;;;;;;;;;;;:32;;:49;75546:15;75513:49;;;;;;;;;;;;;;;:62;;:67;75578:1;75576;:3;;;;:::i;:::-;75513:67;;;;;;;;;;;:80;;;:98;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;74132:3;;;;;:::i;:::-;;;;74082:1541;;;;75671:25;75633:13;:23;75647:8;;75633:23;;;;;;;;;;;:35;;;:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;75707:11;:23;75719:10;75707:23;;;;;;;;;;;;;;;75736:8;;75707:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75756:11;:28;75768:15;75756:28;;;;;;;;;;;;;;;75790:8;;75756:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75836:15;75815:48;;75824:10;75815:48;;;75853:8;;75815:48;;;;;;:::i;:::-;;;;;;;;75908:1;75891:14;;:18;;;;:::i;:::-;75874:14;:35;;;;75927:8;;75920:15;;71114:4829;;;;;;;;;;;:::o;62320:185::-;61932:2;61909:7;:19;61917:10;61909:19;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;61901:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;62436:2:::1;62410:7;:22:::0;62418:13:::1;62410:22;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;62402:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62496:1;62471:7:::0;:22:::1;62479:13;62471:22;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;62320:185:::0;:::o;38087:255::-;38272:6;38298:36;;;38291:43;;38087:255;;;;;;;:::o;70583:523::-;70706:4;70760:1;70736:26;;:12;:26;;;70728:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;70843:1;70831:9;:13;;;;:53;;;;;70867:16;70861:23;;;;;;;;:::i;:::-;;70848:36;;:9;:36;;;;70831:53;70823:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;70957:1;70947:7;:11;70939:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;71031:1;71022:6;:10;71014:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;71094:4;71087:11;;70583:523;;;;;;:::o;62975:34::-;;;;:::o;62939:29::-;;;;:::o;37852:227::-;38014:6;38040:31;;;38033:38;;37852:227;;;;;;;:::o;62146:162::-;61932:2;61909:7;:19;61917:10;61909:19;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;61901:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;62248:1:::1;62228:22;;:8;:22;;::::0;62220:48:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62298:2;62278:7;:17:::0;62286:8:::1;62278:17;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;62146:162:::0;:::o;20484:157::-;20569:4;20608:25;20593:40;;;:11;:40;;;;20586:47;;20484:157;;;:::o;67940:269::-;68042:4;68058:46;68070:4;68076:12;68090:6;68098:4;68058:11;:46::i;:::-;;68122:12;68115:33;;;68153:6;68161:4;68167:2;68172:6;68115:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68197:4;68190:11;;67940:269;;;;;;:::o;67319:281::-;67423:4;67439:47;67452:4;67458:12;67472:7;67481:4;67439:12;:47::i;:::-;;67504:12;67497:37;;;67539:6;67547:4;67553:2;67558:7;67497:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67588:4;67581:11;;67319:281;;;;;;:::o;67606:328::-;67727:4;67749:57;67763:4;67769:12;67783:6;67791:7;67800:4;67749:13;:57::i;:::-;;67825:12;67817:38;;;67860:6;67868:4;67874:2;67879:7;67888:6;67817:87;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67922:4;67915:11;;67606:328;;;;;;;:::o;76072:559::-;76145:4;76167:27;76197:11;:14;76209:1;76197:14;;;;;;;;;;;;;;;76167:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76252:1;76227:11;:14;76239:1;76227:14;;;;;;;;;;;;;;;:21;;;;:26;76224:104;;76289:1;76269:11;:14;76281:1;76269:14;;;;;;;;;;;;;;;76284:1;76269:17;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;76312:4;76305:11;;;;;76224:104;76343:6;76338:263;76375:1;76357:10;:17;:19;;;;:::i;:::-;76355:1;:21;76338:263;;;76417:7;76400:10;76411:1;76400:13;;;;;;;;:::i;:::-;;;;;;;;:24;76397:190;;76466:11;:14;76478:1;76466:14;;;;;;;;;;;;;;;76499:1;76481:10;:17;:19;;;;:::i;:::-;76466:35;;;;;;;;:::i;:::-;;;;;;;;;;76446:11;:14;76458:1;76446:14;;;;;;;;;;;;;;;76461:1;76446:17;;;;;;;;:::i;:::-;;;;;;;;;:55;;;;76521:11;:14;76533:1;76521:14;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;76567:4;76560:11;;;;;;76397:190;76378:3;;;;;:::i;:::-;;;;76338:263;;;;76618:5;76611:12;;;76072:559;;;;;:::o;66226:466::-;66344:4;66385:12;66378:30;;;66413:6;66421:4;66378:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66368:6;:58;;66360:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;66489:13;66486:173;;;66543:12;66536:30;;;66571:6;66579:4;66593;66536:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66526:6;:74;;66518:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;66486:173;66680:4;66673:11;;66226:466;;;;;;:::o;65751:469::-;65870:4;65909:12;65902:28;;;65935:6;65943:7;65902:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65894:57;;:4;:57;;;65886:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;66009:13;66006:185;;;66054:12;66047:37;;;66089:6;66098:4;66112;66047:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66038:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;66006:185;66208:4;66201:11;;65751:469;;;;;;:::o;66698:615::-;66834:4;66868:1;66858:7;:11;66850:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;66958:1;66949:6;:10;:82;;;;;66981:12;66973:31;;;67009:6;67017:4;67023:7;66973:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66963:6;:68;;66949:82;66941:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;67096:13;67093:187;;;67142:12;67134:38;;;67177:6;67186:4;67200;67134:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67125:143;;;;;;;;;;;;:::i;:::-;;;;;;;;;67093:187;67301:4;67294:11;;66698:615;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:118::-;2296:24;2314:5;2296:24;:::i;:::-;2291:3;2284:37;2209:118;;:::o;2333:222::-;2426:4;2464:2;2453:9;2449:18;2441:26;;2477:71;2545:1;2534:9;2530:17;2521:6;2477:71;:::i;:::-;2333:222;;;;:::o;2561:126::-;2598:7;2638:42;2631:5;2627:54;2616:65;;2561:126;;;:::o;2693:96::-;2730:7;2759:24;2777:5;2759:24;:::i;:::-;2748:35;;2693:96;;;:::o;2795:122::-;2868:24;2886:5;2868:24;:::i;:::-;2861:5;2858:35;2848:63;;2907:1;2904;2897:12;2848:63;2795:122;:::o;2923:139::-;2969:5;3007:6;2994:20;2985:29;;3023:33;3050:5;3023:33;:::i;:::-;2923:139;;;;:::o;3068:117::-;3177:1;3174;3167:12;3191:117;3300:1;3297;3290:12;3314:102;3355:6;3406:2;3402:7;3397:2;3390:5;3386:14;3382:28;3372:38;;3314:102;;;:::o;3422:180::-;3470:77;3467:1;3460:88;3567:4;3564:1;3557:15;3591:4;3588:1;3581:15;3608:281;3691:27;3713:4;3691:27;:::i;:::-;3683:6;3679:40;3821:6;3809:10;3806:22;3785:18;3773:10;3770:34;3767:62;3764:88;;;3832:18;;:::i;:::-;3764:88;3872:10;3868:2;3861:22;3651:238;3608:281;;:::o;3895:129::-;3929:6;3956:20;;:::i;:::-;3946:30;;3985:33;4013:4;4005:6;3985:33;:::i;:::-;3895:129;;;:::o;4030:307::-;4091:4;4181:18;4173:6;4170:30;4167:56;;;4203:18;;:::i;:::-;4167:56;4241:29;4263:6;4241:29;:::i;:::-;4233:37;;4325:4;4319;4315:15;4307:23;;4030:307;;;:::o;4343:154::-;4427:6;4422:3;4417;4404:30;4489:1;4480:6;4475:3;4471:16;4464:27;4343:154;;;:::o;4503:410::-;4580:5;4605:65;4621:48;4662:6;4621:48;:::i;:::-;4605:65;:::i;:::-;4596:74;;4693:6;4686:5;4679:21;4731:4;4724:5;4720:16;4769:3;4760:6;4755:3;4751:16;4748:25;4745:112;;;4776:79;;:::i;:::-;4745:112;4866:41;4900:6;4895:3;4890;4866:41;:::i;:::-;4586:327;4503:410;;;;;:::o;4932:338::-;4987:5;5036:3;5029:4;5021:6;5017:17;5013:27;5003:122;;5044:79;;:::i;:::-;5003:122;5161:6;5148:20;5186:78;5260:3;5252:6;5245:4;5237:6;5233:17;5186:78;:::i;:::-;5177:87;;4993:277;4932:338;;;;:::o;5276:943::-;5371:6;5379;5387;5395;5444:3;5432:9;5423:7;5419:23;5415:33;5412:120;;;5451:79;;:::i;:::-;5412:120;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:53;5769:7;5760:6;5749:9;5745:22;5724:53;:::i;:::-;5714:63;;5669:118;5826:2;5852:53;5897:7;5888:6;5877:9;5873:22;5852:53;:::i;:::-;5842:63;;5797:118;5982:2;5971:9;5967:18;5954:32;6013:18;6005:6;6002:30;5999:117;;;6035:79;;:::i;:::-;5999:117;6140:62;6194:7;6185:6;6174:9;6170:22;6140:62;:::i;:::-;6130:72;;5925:287;5276:943;;;;;;;:::o;6225:115::-;6310:23;6327:5;6310:23;:::i;:::-;6305:3;6298:36;6225:115;;:::o;6346:218::-;6437:4;6475:2;6464:9;6460:18;6452:26;;6488:69;6554:1;6543:9;6539:17;6530:6;6488:69;:::i;:::-;6346:218;;;;:::o;6570:118::-;6657:24;6675:5;6657:24;:::i;:::-;6652:3;6645:37;6570:118;;:::o;6694:86::-;6729:7;6769:4;6762:5;6758:16;6747:27;;6694:86;;;:::o;6786:112::-;6869:22;6885:5;6869:22;:::i;:::-;6864:3;6857:35;6786:112;;:::o;6904:434::-;7049:4;7087:2;7076:9;7072:18;7064:26;;7100:71;7168:1;7157:9;7153:17;7144:6;7100:71;:::i;:::-;7181:72;7249:2;7238:9;7234:18;7225:6;7181:72;:::i;:::-;7263:68;7327:2;7316:9;7312:18;7303:6;7263:68;:::i;:::-;6904:434;;;;;;:::o;7344:329::-;7403:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7344:329;;;;:::o;7679:114::-;7746:6;7780:5;7774:12;7764:22;;7679:114;;;:::o;7799:184::-;7898:11;7932:6;7927:3;7920:19;7972:4;7967:3;7963:14;7948:29;;7799:184;;;;:::o;7989:132::-;8056:4;8079:3;8071:11;;8109:4;8104:3;8100:14;8092:22;;7989:132;;;:::o;8127:108::-;8204:24;8222:5;8204:24;:::i;:::-;8199:3;8192:37;8127:108;;:::o;8241:179::-;8310:10;8331:46;8373:3;8365:6;8331:46;:::i;:::-;8409:4;8404:3;8400:14;8386:28;;8241:179;;;;:::o;8426:113::-;8496:4;8528;8523:3;8519:14;8511:22;;8426:113;;;:::o;8575:732::-;8694:3;8723:54;8771:5;8723:54;:::i;:::-;8793:86;8872:6;8867:3;8793:86;:::i;:::-;8786:93;;8903:56;8953:5;8903:56;:::i;:::-;8982:7;9013:1;8998:284;9023:6;9020:1;9017:13;8998:284;;;9099:6;9093:13;9126:63;9185:3;9170:13;9126:63;:::i;:::-;9119:70;;9212:60;9265:6;9212:60;:::i;:::-;9202:70;;9058:224;9045:1;9042;9038:9;9033:14;;8998:284;;;9002:14;9298:3;9291:10;;8699:608;;;8575:732;;;;:::o;9313:373::-;9456:4;9494:2;9483:9;9479:18;9471:26;;9543:9;9537:4;9533:20;9529:1;9518:9;9514:17;9507:47;9571:108;9674:4;9665:6;9571:108;:::i;:::-;9563:116;;9313:373;;;;:::o;9692:474::-;9760:6;9768;9817:2;9805:9;9796:7;9792:23;9788:32;9785:119;;;9823:79;;:::i;:::-;9785:119;9943:1;9968:53;10013:7;10004:6;9993:9;9989:22;9968:53;:::i;:::-;9958:63;;9914:117;10070:2;10096:53;10141:7;10132:6;10121:9;10117:22;10096:53;:::i;:::-;10086:63;;10041:118;9692:474;;;;;:::o;10172:114::-;10239:6;10273:5;10267:12;10257:22;;10172:114;;;:::o;10292:184::-;10391:11;10425:6;10420:3;10413:19;10465:4;10460:3;10456:14;10441:29;;10292:184;;;;:::o;10482:132::-;10549:4;10572:3;10564:11;;10602:4;10597:3;10593:14;10585:22;;10482:132;;;:::o;10620:108::-;10697:24;10715:5;10697:24;:::i;:::-;10692:3;10685:37;10620:108;;:::o;10734:179::-;10803:10;10824:46;10866:3;10858:6;10824:46;:::i;:::-;10902:4;10897:3;10893:14;10879:28;;10734:179;;;;:::o;10919:113::-;10989:4;11021;11016:3;11012:14;11004:22;;10919:113;;;:::o;11068:732::-;11187:3;11216:54;11264:5;11216:54;:::i;:::-;11286:86;11365:6;11360:3;11286:86;:::i;:::-;11279:93;;11396:56;11446:5;11396:56;:::i;:::-;11475:7;11506:1;11491:284;11516:6;11513:1;11510:13;11491:284;;;11592:6;11586:13;11619:63;11678:3;11663:13;11619:63;:::i;:::-;11612:70;;11705:60;11758:6;11705:60;:::i;:::-;11695:70;;11551:224;11538:1;11535;11531:9;11526:14;;11491:284;;;11495:14;11791:3;11784:10;;11192:608;;;11068:732;;;;:::o;11806:112::-;11871:6;11905:5;11899:12;11889:22;;11806:112;;;:::o;11924:182::-;12021:11;12055:6;12050:3;12043:19;12095:4;12090:3;12086:14;12071:29;;11924:182;;;;:::o;12112:130::-;12177:4;12200:3;12192:11;;12230:4;12225:3;12221:14;12213:22;;12112:130;;;:::o;12248:102::-;12321:22;12337:5;12321:22;:::i;:::-;12316:3;12309:35;12248:102;;:::o;12356:171::-;12421:10;12442:42;12480:3;12472:6;12442:42;:::i;:::-;12516:4;12511:3;12507:14;12493:28;;12356:171;;;;:::o;12533:111::-;12601:4;12633;12628:3;12624:14;12616:22;;12533:111;;;:::o;12676:716::-;12791:3;12820:52;12866:5;12820:52;:::i;:::-;12888:84;12965:6;12960:3;12888:84;:::i;:::-;12881:91;;12996:54;13044:5;12996:54;:::i;:::-;13073:7;13104:1;13089:278;13114:6;13111:1;13108:13;13089:278;;;13190:6;13184:13;13217:59;13272:3;13257:13;13217:59;:::i;:::-;13210:66;;13299:58;13350:6;13299:58;:::i;:::-;13289:68;;13149:218;13136:1;13133;13129:9;13124:14;;13089:278;;;13093:14;13383:3;13376:10;;12796:596;;;12676:716;;;;:::o;13398:1149::-;13771:4;13809:3;13798:9;13794:19;13786:27;;13859:9;13853:4;13849:20;13845:1;13834:9;13830:17;13823:47;13887:108;13990:4;13981:6;13887:108;:::i;:::-;13879:116;;14042:9;14036:4;14032:20;14027:2;14016:9;14012:18;14005:48;14070:108;14173:4;14164:6;14070:108;:::i;:::-;14062:116;;14225:9;14219:4;14215:20;14210:2;14199:9;14195:18;14188:48;14253:108;14356:4;14347:6;14253:108;:::i;:::-;14245:116;;14408:9;14402:4;14398:20;14393:2;14382:9;14378:18;14371:48;14436:104;14535:4;14526:6;14436:104;:::i;:::-;14428:112;;13398:1149;;;;;;;:::o;14553:311::-;14630:4;14720:18;14712:6;14709:30;14706:56;;;14742:18;;:::i;:::-;14706:56;14792:4;14784:6;14780:17;14772:25;;14852:4;14846;14842:15;14834:23;;14553:311;;;:::o;14870:117::-;14979:1;14976;14969:12;15010:710;15106:5;15131:81;15147:64;15204:6;15147:64;:::i;:::-;15131:81;:::i;:::-;15122:90;;15232:5;15261:6;15254:5;15247:21;15295:4;15288:5;15284:16;15277:23;;15348:4;15340:6;15336:17;15328:6;15324:30;15377:3;15369:6;15366:15;15363:122;;;15396:79;;:::i;:::-;15363:122;15511:6;15494:220;15528:6;15523:3;15520:15;15494:220;;;15603:3;15632:37;15665:3;15653:10;15632:37;:::i;:::-;15627:3;15620:50;15699:4;15694:3;15690:14;15683:21;;15570:144;15554:4;15549:3;15545:14;15538:21;;15494:220;;;15498:21;15112:608;;15010:710;;;;;:::o;15743:370::-;15814:5;15863:3;15856:4;15848:6;15844:17;15840:27;15830:122;;15871:79;;:::i;:::-;15830:122;15988:6;15975:20;16013:94;16103:3;16095:6;16088:4;16080:6;16076:17;16013:94;:::i;:::-;16004:103;;15820:293;15743:370;;;;:::o;16119:311::-;16196:4;16286:18;16278:6;16275:30;16272:56;;;16308:18;;:::i;:::-;16272:56;16358:4;16350:6;16346:17;16338:25;;16418:4;16412;16408:15;16400:23;;16119:311;;;:::o;16453:710::-;16549:5;16574:81;16590:64;16647:6;16590:64;:::i;:::-;16574:81;:::i;:::-;16565:90;;16675:5;16704:6;16697:5;16690:21;16738:4;16731:5;16727:16;16720:23;;16791:4;16783:6;16779:17;16771:6;16767:30;16820:3;16812:6;16809:15;16806:122;;;16839:79;;:::i;:::-;16806:122;16954:6;16937:220;16971:6;16966:3;16963:15;16937:220;;;17046:3;17075:37;17108:3;17096:10;17075:37;:::i;:::-;17070:3;17063:50;17142:4;17137:3;17133:14;17126:21;;17013:144;16997:4;16992:3;16988:14;16981:21;;16937:220;;;16941:21;16555:608;;16453:710;;;;;:::o;17186:370::-;17257:5;17306:3;17299:4;17291:6;17287:17;17283:27;17273:122;;17314:79;;:::i;:::-;17273:122;17431:6;17418:20;17456:94;17546:3;17538:6;17531:4;17523:6;17519:17;17456:94;:::i;:::-;17447:103;;17263:293;17186:370;;;;:::o;17562:309::-;17637:4;17727:18;17719:6;17716:30;17713:56;;;17749:18;;:::i;:::-;17713:56;17799:4;17791:6;17787:17;17779:25;;17859:4;17853;17849:15;17841:23;;17562:309;;;:::o;17877:118::-;17948:22;17964:5;17948:22;:::i;:::-;17941:5;17938:33;17928:61;;17985:1;17982;17975:12;17928:61;17877:118;:::o;18001:135::-;18045:5;18083:6;18070:20;18061:29;;18099:31;18124:5;18099:31;:::i;:::-;18001:135;;;;:::o;18157:704::-;18251:5;18276:79;18292:62;18347:6;18292:62;:::i;:::-;18276:79;:::i;:::-;18267:88;;18375:5;18404:6;18397:5;18390:21;18438:4;18431:5;18427:16;18420:23;;18491:4;18483:6;18479:17;18471:6;18467:30;18520:3;18512:6;18509:15;18506:122;;;18539:79;;:::i;:::-;18506:122;18654:6;18637:218;18671:6;18666:3;18663:15;18637:218;;;18746:3;18775:35;18806:3;18794:10;18775:35;:::i;:::-;18770:3;18763:48;18840:4;18835:3;18831:14;18824:21;;18713:142;18697:4;18692:3;18688:14;18681:21;;18637:218;;;18641:21;18257:604;;18157:704;;;;;:::o;18882:366::-;18951:5;19000:3;18993:4;18985:6;18981:17;18977:27;18967:122;;19008:79;;:::i;:::-;18967:122;19125:6;19112:20;19150:92;19238:3;19230:6;19223:4;19215:6;19211:17;19150:92;:::i;:::-;19141:101;;18957:291;18882:366;;;;:::o;19254:3167::-;19581:6;19589;19597;19605;19613;19621;19629;19637;19645;19694:3;19682:9;19673:7;19669:23;19665:33;19662:120;;;19701:79;;:::i;:::-;19662:120;19849:1;19838:9;19834:17;19821:31;19879:18;19871:6;19868:30;19865:117;;;19901:79;;:::i;:::-;19865:117;20006:78;20076:7;20067:6;20056:9;20052:22;20006:78;:::i;:::-;19996:88;;19792:302;20161:2;20150:9;20146:18;20133:32;20192:18;20184:6;20181:30;20178:117;;;20214:79;;:::i;:::-;20178:117;20319:78;20389:7;20380:6;20369:9;20365:22;20319:78;:::i;:::-;20309:88;;20104:303;20474:2;20463:9;20459:18;20446:32;20505:18;20497:6;20494:30;20491:117;;;20527:79;;:::i;:::-;20491:117;20632:78;20702:7;20693:6;20682:9;20678:22;20632:78;:::i;:::-;20622:88;;20417:303;20787:2;20776:9;20772:18;20759:32;20818:18;20810:6;20807:30;20804:117;;;20840:79;;:::i;:::-;20804:117;20945:76;21013:7;21004:6;20993:9;20989:22;20945:76;:::i;:::-;20935:86;;20730:301;21070:3;21097:53;21142:7;21133:6;21122:9;21118:22;21097:53;:::i;:::-;21087:63;;21041:119;21227:3;21216:9;21212:19;21199:33;21259:18;21251:6;21248:30;21245:117;;;21281:79;;:::i;:::-;21245:117;21386:78;21456:7;21447:6;21436:9;21432:22;21386:78;:::i;:::-;21376:88;;21170:304;21541:3;21530:9;21526:19;21513:33;21573:18;21565:6;21562:30;21559:117;;;21595:79;;:::i;:::-;21559:117;21700:78;21770:7;21761:6;21750:9;21746:22;21700:78;:::i;:::-;21690:88;;21484:304;21855:3;21844:9;21840:19;21827:33;21887:18;21879:6;21876:30;21873:117;;;21909:79;;:::i;:::-;21873:117;22014:78;22084:7;22075:6;22064:9;22060:22;22014:78;:::i;:::-;22004:88;;21798:304;22169:3;22158:9;22154:19;22141:33;22201:18;22193:6;22190:30;22187:117;;;22223:79;;:::i;:::-;22187:117;22328:76;22396:7;22387:6;22376:9;22372:22;22328:76;:::i;:::-;22318:86;;22112:302;19254:3167;;;;;;;;;;;:::o;22427:104::-;22472:7;22501:24;22519:5;22501:24;:::i;:::-;22490:35;;22427:104;;;:::o;22537:138::-;22618:32;22644:5;22618:32;:::i;:::-;22611:5;22608:43;22598:71;;22665:1;22662;22655:12;22598:71;22537:138;:::o;22681:155::-;22735:5;22773:6;22760:20;22751:29;;22789:41;22824:5;22789:41;:::i;:::-;22681:155;;;;:::o;22842:345::-;22909:6;22958:2;22946:9;22937:7;22933:23;22929:32;22926:119;;;22964:79;;:::i;:::-;22926:119;23084:1;23109:61;23162:7;23153:6;23142:9;23138:22;23109:61;:::i;:::-;23099:71;;23055:125;22842:345;;;;:::o;23193:1509::-;23347:6;23355;23363;23371;23379;23428:3;23416:9;23407:7;23403:23;23399:33;23396:120;;;23435:79;;:::i;:::-;23396:120;23555:1;23580:53;23625:7;23616:6;23605:9;23601:22;23580:53;:::i;:::-;23570:63;;23526:117;23682:2;23708:53;23753:7;23744:6;23733:9;23729:22;23708:53;:::i;:::-;23698:63;;23653:118;23838:2;23827:9;23823:18;23810:32;23869:18;23861:6;23858:30;23855:117;;;23891:79;;:::i;:::-;23855:117;23996:78;24066:7;24057:6;24046:9;24042:22;23996:78;:::i;:::-;23986:88;;23781:303;24151:2;24140:9;24136:18;24123:32;24182:18;24174:6;24171:30;24168:117;;;24204:79;;:::i;:::-;24168:117;24309:78;24379:7;24370:6;24359:9;24355:22;24309:78;:::i;:::-;24299:88;;24094:303;24464:3;24453:9;24449:19;24436:33;24496:18;24488:6;24485:30;24482:117;;;24518:79;;:::i;:::-;24482:117;24623:62;24677:7;24668:6;24657:9;24653:22;24623:62;:::i;:::-;24613:72;;24407:288;23193:1509;;;;;;;;:::o;24708:761::-;24792:6;24800;24808;24816;24865:3;24853:9;24844:7;24840:23;24836:33;24833:120;;;24872:79;;:::i;:::-;24833:120;24992:1;25017:53;25062:7;25053:6;25042:9;25038:22;25017:53;:::i;:::-;25007:63;;24963:117;25119:2;25145:53;25190:7;25181:6;25170:9;25166:22;25145:53;:::i;:::-;25135:63;;25090:118;25247:2;25273:53;25318:7;25309:6;25298:9;25294:22;25273:53;:::i;:::-;25263:63;;25218:118;25375:2;25401:51;25444:7;25435:6;25424:9;25420:22;25401:51;:::i;:::-;25391:61;;25346:116;24708:761;;;;;;;:::o;25475:1089::-;25579:6;25587;25595;25603;25611;25660:3;25648:9;25639:7;25635:23;25631:33;25628:120;;;25667:79;;:::i;:::-;25628:120;25787:1;25812:53;25857:7;25848:6;25837:9;25833:22;25812:53;:::i;:::-;25802:63;;25758:117;25914:2;25940:53;25985:7;25976:6;25965:9;25961:22;25940:53;:::i;:::-;25930:63;;25885:118;26042:2;26068:53;26113:7;26104:6;26093:9;26089:22;26068:53;:::i;:::-;26058:63;;26013:118;26170:2;26196:53;26241:7;26232:6;26221:9;26217:22;26196:53;:::i;:::-;26186:63;;26141:118;26326:3;26315:9;26311:19;26298:33;26358:18;26350:6;26347:30;26344:117;;;26380:79;;:::i;:::-;26344:117;26485:62;26539:7;26530:6;26519:9;26515:22;26485:62;:::i;:::-;26475:72;;26269:288;25475:1089;;;;;;;;:::o;26570:180::-;26618:77;26615:1;26608:88;26715:4;26712:1;26705:15;26739:4;26736:1;26729:15;26756:169;26840:11;26874:6;26869:3;26862:19;26914:4;26909:3;26905:14;26890:29;;26756:169;;;;:::o;26931:230::-;27071:34;27067:1;27059:6;27055:14;27048:58;27140:13;27135:2;27127:6;27123:15;27116:38;26931:230;:::o;27167:366::-;27309:3;27330:67;27394:2;27389:3;27330:67;:::i;:::-;27323:74;;27406:93;27495:3;27406:93;:::i;:::-;27524:2;27519:3;27515:12;27508:19;;27167:366;;;:::o;27539:419::-;27705:4;27743:2;27732:9;27728:18;27720:26;;27792:9;27786:4;27782:20;27778:1;27767:9;27763:17;27756:47;27820:131;27946:4;27820:131;:::i;:::-;27812:139;;27539:419;;;:::o;27964:229::-;28104:34;28100:1;28092:6;28088:14;28081:58;28173:12;28168:2;28160:6;28156:15;28149:37;27964:229;:::o;28199:366::-;28341:3;28362:67;28426:2;28421:3;28362:67;:::i;:::-;28355:74;;28438:93;28527:3;28438:93;:::i;:::-;28556:2;28551:3;28547:12;28540:19;;28199:366;;;:::o;28571:419::-;28737:4;28775:2;28764:9;28760:18;28752:26;;28824:9;28818:4;28814:20;28810:1;28799:9;28795:17;28788:47;28852:131;28978:4;28852:131;:::i;:::-;28844:139;;28571:419;;;:::o;28996:180::-;29044:77;29041:1;29034:88;29141:4;29138:1;29131:15;29165:4;29162:1;29155:15;29182:180;29230:77;29227:1;29220:88;29327:4;29324:1;29317:15;29351:4;29348:1;29341:15;29368:233;29407:3;29430:24;29448:5;29430:24;:::i;:::-;29421:33;;29476:66;29469:5;29466:77;29463:103;;29546:18;;:::i;:::-;29463:103;29593:1;29586:5;29582:13;29575:20;;29368:233;;;:::o;29607:305::-;29647:3;29666:20;29684:1;29666:20;:::i;:::-;29661:25;;29700:20;29718:1;29700:20;:::i;:::-;29695:25;;29854:1;29786:66;29782:74;29779:1;29776:81;29773:107;;;29860:18;;:::i;:::-;29773:107;29904:1;29901;29897:9;29890:16;;29607:305;;;;:::o;29918:191::-;29958:4;29978:20;29996:1;29978:20;:::i;:::-;29973:25;;30012:20;30030:1;30012:20;:::i;:::-;30007:25;;30051:1;30048;30045:8;30042:34;;;30056:18;;:::i;:::-;30042:34;30101:1;30098;30094:9;30086:17;;29918:191;;;;:::o;30115:238::-;30255:34;30251:1;30243:6;30239:14;30232:58;30324:21;30319:2;30311:6;30307:15;30300:46;30115:238;:::o;30359:366::-;30501:3;30522:67;30586:2;30581:3;30522:67;:::i;:::-;30515:74;;30598:93;30687:3;30598:93;:::i;:::-;30716:2;30711:3;30707:12;30700:19;;30359:366;;;:::o;30731:419::-;30897:4;30935:2;30924:9;30920:18;30912:26;;30984:9;30978:4;30974:20;30970:1;30959:9;30955:17;30948:47;31012:131;31138:4;31012:131;:::i;:::-;31004:139;;30731:419;;;:::o;31156:231::-;31296:34;31292:1;31284:6;31280:14;31273:58;31365:14;31360:2;31352:6;31348:15;31341:39;31156:231;:::o;31393:366::-;31535:3;31556:67;31620:2;31615:3;31556:67;:::i;:::-;31549:74;;31632:93;31721:3;31632:93;:::i;:::-;31750:2;31745:3;31741:12;31734:19;;31393:366;;;:::o;31765:419::-;31931:4;31969:2;31958:9;31954:18;31946:26;;32018:9;32012:4;32008:20;32004:1;31993:9;31989:17;31982:47;32046:131;32172:4;32046:131;:::i;:::-;32038:139;;31765:419;;;:::o;32190:235::-;32330:34;32326:1;32318:6;32314:14;32307:58;32399:18;32394:2;32386:6;32382:15;32375:43;32190:235;:::o;32431:366::-;32573:3;32594:67;32658:2;32653:3;32594:67;:::i;:::-;32587:74;;32670:93;32759:3;32670:93;:::i;:::-;32788:2;32783:3;32779:12;32772:19;;32431:366;;;:::o;32803:419::-;32969:4;33007:2;32996:9;32992:18;32984:26;;33056:9;33050:4;33046:20;33042:1;33031:9;33027:17;33020:47;33084:131;33210:4;33084:131;:::i;:::-;33076:139;;32803:419;;;:::o;33228:232::-;33368:34;33364:1;33356:6;33352:14;33345:58;33437:15;33432:2;33424:6;33420:15;33413:40;33228:232;:::o;33466:366::-;33608:3;33629:67;33693:2;33688:3;33629:67;:::i;:::-;33622:74;;33705:93;33794:3;33705:93;:::i;:::-;33823:2;33818:3;33814:12;33807:19;;33466:366;;;:::o;33838:419::-;34004:4;34042:2;34031:9;34027:18;34019:26;;34091:9;34085:4;34081:20;34077:1;34066:9;34062:17;34055:47;34119:131;34245:4;34119:131;:::i;:::-;34111:139;;33838:419;;;:::o;34263:233::-;34403:34;34399:1;34391:6;34387:14;34380:58;34472:16;34467:2;34459:6;34455:15;34448:41;34263:233;:::o;34502:366::-;34644:3;34665:67;34729:2;34724:3;34665:67;:::i;:::-;34658:74;;34741:93;34830:3;34741:93;:::i;:::-;34859:2;34854:3;34850:12;34843:19;;34502:366;;;:::o;34874:419::-;35040:4;35078:2;35067:9;35063:18;35055:26;;35127:9;35121:4;35117:20;35113:1;35102:9;35098:17;35091:47;35155:131;35281:4;35155:131;:::i;:::-;35147:139;;34874:419;;;:::o;35299:226::-;35439:34;35435:1;35427:6;35423:14;35416:58;35508:9;35503:2;35495:6;35491:15;35484:34;35299:226;:::o;35531:366::-;35673:3;35694:67;35758:2;35753:3;35694:67;:::i;:::-;35687:74;;35770:93;35859:3;35770:93;:::i;:::-;35888:2;35883:3;35879:12;35872:19;;35531:366;;;:::o;35903:419::-;36069:4;36107:2;36096:9;36092:18;36084:26;;36156:9;36150:4;36146:20;36142:1;36131:9;36127:17;36120:47;36184:131;36310:4;36184:131;:::i;:::-;36176:139;;35903:419;;;:::o;36328:227::-;36468:34;36464:1;36456:6;36452:14;36445:58;36537:10;36532:2;36524:6;36520:15;36513:35;36328:227;:::o;36561:366::-;36703:3;36724:67;36788:2;36783:3;36724:67;:::i;:::-;36717:74;;36800:93;36889:3;36800:93;:::i;:::-;36918:2;36913:3;36909:12;36902:19;;36561:366;;;:::o;36933:419::-;37099:4;37137:2;37126:9;37122:18;37114:26;;37186:9;37180:4;37176:20;37172:1;37161:9;37157:17;37150:47;37214:131;37340:4;37214:131;:::i;:::-;37206:139;;36933:419;;;:::o;37358:234::-;37498:34;37494:1;37486:6;37482:14;37475:58;37567:17;37562:2;37554:6;37550:15;37543:42;37358:234;:::o;37598:366::-;37740:3;37761:67;37825:2;37820:3;37761:67;:::i;:::-;37754:74;;37837:93;37926:3;37837:93;:::i;:::-;37955:2;37950:3;37946:12;37939:19;;37598:366;;;:::o;37970:419::-;38136:4;38174:2;38163:9;38159:18;38151:26;;38223:9;38217:4;38213:20;38209:1;38198:9;38194:17;38187:47;38251:131;38377:4;38251:131;:::i;:::-;38243:139;;37970:419;;;:::o;38395:235::-;38535:34;38531:1;38523:6;38519:14;38512:58;38604:18;38599:2;38591:6;38587:15;38580:43;38395:235;:::o;38636:366::-;38778:3;38799:67;38863:2;38858:3;38799:67;:::i;:::-;38792:74;;38875:93;38964:3;38875:93;:::i;:::-;38993:2;38988:3;38984:12;38977:19;;38636:366;;;:::o;39008:419::-;39174:4;39212:2;39201:9;39197:18;39189:26;;39261:9;39255:4;39251:20;39247:1;39236:9;39232:17;39225:47;39289:131;39415:4;39289:131;:::i;:::-;39281:139;;39008:419;;;:::o;39433:163::-;39573:15;39569:1;39561:6;39557:14;39550:39;39433:163;:::o;39602:366::-;39744:3;39765:67;39829:2;39824:3;39765:67;:::i;:::-;39758:74;;39841:93;39930:3;39841:93;:::i;:::-;39959:2;39954:3;39950:12;39943:19;;39602:366;;;:::o;39974:419::-;40140:4;40178:2;40167:9;40163:18;40155:26;;40227:9;40221:4;40217:20;40213:1;40202:9;40198:17;40191:47;40255:131;40381:4;40255:131;:::i;:::-;40247:139;;39974:419;;;:::o;40399:168::-;40539:20;40535:1;40527:6;40523:14;40516:44;40399:168;:::o;40573:366::-;40715:3;40736:67;40800:2;40795:3;40736:67;:::i;:::-;40729:74;;40812:93;40901:3;40812:93;:::i;:::-;40930:2;40925:3;40921:12;40914:19;;40573:366;;;:::o;40945:419::-;41111:4;41149:2;41138:9;41134:18;41126:26;;41198:9;41192:4;41188:20;41184:1;41173:9;41169:17;41162:47;41226:131;41352:4;41226:131;:::i;:::-;41218:139;;40945:419;;;:::o;41370:231::-;41510:34;41506:1;41498:6;41494:14;41487:58;41579:14;41574:2;41566:6;41562:15;41555:39;41370:231;:::o;41607:366::-;41749:3;41770:67;41834:2;41829:3;41770:67;:::i;:::-;41763:74;;41846:93;41935:3;41846:93;:::i;:::-;41964:2;41959:3;41955:12;41948:19;;41607:366;;;:::o;41979:419::-;42145:4;42183:2;42172:9;42168:18;42160:26;;42232:9;42226:4;42222:20;42218:1;42207:9;42203:17;42196:47;42260:131;42386:4;42260:131;:::i;:::-;42252:139;;41979:419;;;:::o;42404:224::-;42544:34;42540:1;42532:6;42528:14;42521:58;42613:7;42608:2;42600:6;42596:15;42589:32;42404:224;:::o;42634:366::-;42776:3;42797:67;42861:2;42856:3;42797:67;:::i;:::-;42790:74;;42873:93;42962:3;42873:93;:::i;:::-;42991:2;42986:3;42982:12;42975:19;;42634:366;;;:::o;43006:419::-;43172:4;43210:2;43199:9;43195:18;43187:26;;43259:9;43253:4;43249:20;43245:1;43234:9;43230:17;43223:47;43287:131;43413:4;43287:131;:::i;:::-;43279:139;;43006:419;;;:::o;43431:225::-;43571:34;43567:1;43559:6;43555:14;43548:58;43640:8;43635:2;43627:6;43623:15;43616:33;43431:225;:::o;43662:366::-;43804:3;43825:67;43889:2;43884:3;43825:67;:::i;:::-;43818:74;;43901:93;43990:3;43901:93;:::i;:::-;44019:2;44014:3;44010:12;44003:19;;43662:366;;;:::o;44034:419::-;44200:4;44238:2;44227:9;44223:18;44215:26;;44287:9;44281:4;44277:20;44273:1;44262:9;44258:17;44251:47;44315:131;44441:4;44315:131;:::i;:::-;44307:139;;44034:419;;;:::o;44459:224::-;44599:34;44595:1;44587:6;44583:14;44576:58;44668:7;44663:2;44655:6;44651:15;44644:32;44459:224;:::o;44689:366::-;44831:3;44852:67;44916:2;44911:3;44852:67;:::i;:::-;44845:74;;44928:93;45017:3;44928:93;:::i;:::-;45046:2;45041:3;45037:12;45030:19;;44689:366;;;:::o;45061:419::-;45227:4;45265:2;45254:9;45250:18;45242:26;;45314:9;45308:4;45304:20;45300:1;45289:9;45285:17;45278:47;45342:131;45468:4;45342:131;:::i;:::-;45334:139;;45061:419;;;:::o;45486:163::-;45626:15;45622:1;45614:6;45610:14;45603:39;45486:163;:::o;45655:366::-;45797:3;45818:67;45882:2;45877:3;45818:67;:::i;:::-;45811:74;;45894:93;45983:3;45894:93;:::i;:::-;46012:2;46007:3;46003:12;45996:19;;45655:366;;;:::o;46027:419::-;46193:4;46231:2;46220:9;46216:18;46208:26;;46280:9;46274:4;46270:20;46266:1;46255:9;46251:17;46244:47;46308:131;46434:4;46308:131;:::i;:::-;46300:139;;46027:419;;;:::o;46452:442::-;46601:4;46639:2;46628:9;46624:18;46616:26;;46652:71;46720:1;46709:9;46705:17;46696:6;46652:71;:::i;:::-;46733:72;46801:2;46790:9;46786:18;46777:6;46733:72;:::i;:::-;46815;46883:2;46872:9;46868:18;46859:6;46815:72;:::i;:::-;46452:442;;;;;;:::o;46900:116::-;46970:21;46985:5;46970:21;:::i;:::-;46963:5;46960:32;46950:60;;47006:1;47003;46996:12;46950:60;46900:116;:::o;47022:137::-;47076:5;47107:6;47101:13;47092:22;;47123:30;47147:5;47123:30;:::i;:::-;47022:137;;;;:::o;47165:345::-;47232:6;47281:2;47269:9;47260:7;47256:23;47252:32;47249:119;;;47287:79;;:::i;:::-;47249:119;47407:1;47432:61;47485:7;47476:6;47465:9;47461:22;47432:61;:::i;:::-;47422:71;;47378:125;47165:345;;;;:::o;47516:168::-;47599:11;47633:6;47628:3;47621:19;47673:4;47668:3;47664:14;47649:29;;47516:168;;;;:::o;47690:114::-;;:::o;47810:362::-;47951:3;47972:65;48035:1;48030:3;47972:65;:::i;:::-;47965:72;;48046:93;48135:3;48046:93;:::i;:::-;48164:1;48159:3;48155:11;48148:18;;47810:362;;;:::o;48178:748::-;48427:4;48465:3;48454:9;48450:19;48442:27;;48479:71;48547:1;48536:9;48532:17;48523:6;48479:71;:::i;:::-;48560:72;48628:2;48617:9;48613:18;48604:6;48560:72;:::i;:::-;48642;48710:2;48699:9;48695:18;48686:6;48642:72;:::i;:::-;48761:9;48755:4;48751:20;48746:2;48735:9;48731:18;48724:48;48789:130;48914:4;48789:130;:::i;:::-;48781:138;;48178:748;;;;;;:::o;48932:154::-;49072:6;49068:1;49060:6;49056:14;49049:30;48932:154;:::o;49092:363::-;49233:3;49254:65;49317:1;49312:3;49254:65;:::i;:::-;49247:72;;49328:93;49417:3;49328:93;:::i;:::-;49446:2;49441:3;49437:12;49430:19;;49092:363;;;:::o;49461:859::-;49738:4;49776:3;49765:9;49761:19;49753:27;;49790:71;49858:1;49847:9;49843:17;49834:6;49790:71;:::i;:::-;49871:72;49939:2;49928:9;49924:18;49915:6;49871:72;:::i;:::-;49953;50021:2;50010:9;50006:18;49997:6;49953:72;:::i;:::-;50035;50103:2;50092:9;50088:18;50079:6;50035:72;:::i;:::-;50155:9;50149:4;50145:20;50139:3;50128:9;50124:19;50117:49;50183:130;50308:4;50183:130;:::i;:::-;50175:138;;49461:859;;;;;;;:::o;50326:180::-;50374:77;50371:1;50364:88;50471:4;50468:1;50461:15;50495:4;50492:1;50485:15;50512:222;50605:4;50643:2;50632:9;50628:18;50620:26;;50656:71;50724:1;50713:9;50709:17;50700:6;50656:71;:::i;:::-;50512:222;;;;:::o;50740:143::-;50797:5;50828:6;50822:13;50813:22;;50844:33;50871:5;50844:33;:::i;:::-;50740:143;;;;:::o;50889:351::-;50959:6;51008:2;50996:9;50987:7;50983:23;50979:32;50976:119;;;51014:79;;:::i;:::-;50976:119;51134:1;51159:64;51215:7;51206:6;51195:9;51191:22;51159:64;:::i;:::-;51149:74;;51105:128;50889:351;;;;:::o;51246:231::-;51386:34;51382:1;51374:6;51370:14;51363:58;51455:14;51450:2;51442:6;51438:15;51431:39;51246:231;:::o;51483:366::-;51625:3;51646:67;51710:2;51705:3;51646:67;:::i;:::-;51639:74;;51722:93;51811:3;51722:93;:::i;:::-;51840:2;51835:3;51831:12;51824:19;;51483:366;;;:::o;51855:419::-;52021:4;52059:2;52048:9;52044:18;52036:26;;52108:9;52102:4;52098:20;52094:1;52083:9;52079:17;52072:47;52136:131;52262:4;52136:131;:::i;:::-;52128:139;;51855:419;;;:::o;52280:332::-;52401:4;52439:2;52428:9;52424:18;52416:26;;52452:71;52520:1;52509:9;52505:17;52496:6;52452:71;:::i;:::-;52533:72;52601:2;52590:9;52586:18;52577:6;52533:72;:::i;:::-;52280:332;;;;;:::o;52618:229::-;52758:34;52754:1;52746:6;52742:14;52735:58;52827:12;52822:2;52814:6;52810:15;52803:37;52618:229;:::o;52853:366::-;52995:3;53016:67;53080:2;53075:3;53016:67;:::i;:::-;53009:74;;53092:93;53181:3;53092:93;:::i;:::-;53210:2;53205:3;53201:12;53194:19;;52853:366;;;:::o;53225:419::-;53391:4;53429:2;53418:9;53414:18;53406:26;;53478:9;53472:4;53468:20;53464:1;53453:9;53449:17;53442:47;53506:131;53632:4;53506:131;:::i;:::-;53498:139;;53225:419;;;:::o;53650:143::-;53707:5;53738:6;53732:13;53723:22;;53754:33;53781:5;53754:33;:::i;:::-;53650:143;;;;:::o;53799:351::-;53869:6;53918:2;53906:9;53897:7;53893:23;53889:32;53886:119;;;53924:79;;:::i;:::-;53886:119;54044:1;54069:64;54125:7;54116:6;54105:9;54101:22;54069:64;:::i;:::-;54059:74;;54015:128;53799:351;;;;:::o;54156:226::-;54296:34;54292:1;54284:6;54280:14;54273:58;54365:9;54360:2;54352:6;54348:15;54341:34;54156:226;:::o;54388:366::-;54530:3;54551:67;54615:2;54610:3;54551:67;:::i;:::-;54544:74;;54627:93;54716:3;54627:93;:::i;:::-;54745:2;54740:3;54736:12;54729:19;;54388:366;;;:::o;54760:419::-;54926:4;54964:2;54953:9;54949:18;54941:26;;55013:9;55007:4;55003:20;54999:1;54988:9;54984:17;54977:47;55041:131;55167:4;55041:131;:::i;:::-;55033:139;;54760:419;;;:::o;55185:241::-;55325:34;55321:1;55313:6;55309:14;55302:58;55394:24;55389:2;55381:6;55377:15;55370:49;55185:241;:::o;55432:366::-;55574:3;55595:67;55659:2;55654:3;55595:67;:::i;:::-;55588:74;;55671:93;55760:3;55671:93;:::i;:::-;55789:2;55784:3;55780:12;55773:19;;55432:366;;;:::o;55804:419::-;55970:4;56008:2;55997:9;55993:18;55985:26;;56057:9;56051:4;56047:20;56043:1;56032:9;56028:17;56021:47;56085:131;56211:4;56085:131;:::i;:::-;56077:139;;55804:419;;;:::o;56229:243::-;56369:34;56365:1;56357:6;56353:14;56346:58;56438:26;56433:2;56425:6;56421:15;56414:51;56229:243;:::o;56478:366::-;56620:3;56641:67;56705:2;56700:3;56641:67;:::i;:::-;56634:74;;56717:93;56806:3;56717:93;:::i;:::-;56835:2;56830:3;56826:12;56819:19;;56478:366;;;:::o;56850:419::-;57016:4;57054:2;57043:9;57039:18;57031:26;;57103:9;57097:4;57093:20;57089:1;57078:9;57074:17;57067:47;57131:131;57257:4;57131:131;:::i;:::-;57123:139;;56850:419;;;:::o;57275:332::-;57396:4;57434:2;57423:9;57419:18;57411:26;;57447:71;57515:1;57504:9;57500:17;57491:6;57447:71;:::i;:::-;57528:72;57596:2;57585:9;57581:18;57572:6;57528:72;:::i;:::-;57275:332;;;;;:::o;57613:233::-;57753:34;57749:1;57741:6;57737:14;57730:58;57822:16;57817:2;57809:6;57805:15;57798:41;57613:233;:::o;57852:366::-;57994:3;58015:67;58079:2;58074:3;58015:67;:::i;:::-;58008:74;;58091:93;58180:3;58091:93;:::i;:::-;58209:2;58204:3;58200:12;58193:19;;57852:366;;;:::o;58224:419::-;58390:4;58428:2;58417:9;58413:18;58405:26;;58477:9;58471:4;58467:20;58463:1;58452:9;58448:17;58441:47;58505:131;58631:4;58505:131;:::i;:::-;58497:139;;58224:419;;;:::o;58649:242::-;58789:34;58785:1;58777:6;58773:14;58766:58;58858:25;58853:2;58845:6;58841:15;58834:50;58649:242;:::o;58897:366::-;59039:3;59060:67;59124:2;59119:3;59060:67;:::i;:::-;59053:74;;59136:93;59225:3;59136:93;:::i;:::-;59254:2;59249:3;59245:12;59238:19;;58897:366;;;:::o;59269:419::-;59435:4;59473:2;59462:9;59458:18;59450:26;;59522:9;59516:4;59512:20;59508:1;59497:9;59493:17;59486:47;59550:131;59676:4;59550:131;:::i;:::-;59542:139;;59269:419;;;:::o

Swarm Source

ipfs://82e17772604bd13167f6b090648be4294005245e54c0858cfabc8d710ed0432c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading