ETH Price: $2,598.12 (-2.34%)
Gas: 1 Gwei

Token

WorstCaseDecisionSeasonOne ()
 

Overview

Max Total Supply

509

Holders

36

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x3514980793dCEAe1b34d0144e3ae725beE084A70
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WorstCaseDecisionSeasonOne

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 100000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Dependency file: node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT
// 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);
}


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC1155/IERC1155.sol

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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

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


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";

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


// Dependency file: node_modules/@openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

// pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}


// Dependency file: node_modules/@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;
    }
}


// Dependency file: node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC1155/ERC1155.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
// import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
// import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
// import "@openzeppelin/contracts/utils/Address.sol";
// import "@openzeppelin/contracts/utils/Context.sol";
// import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

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

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

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


// Dependency file: node_modules/@openzeppelin/contracts/utils/math/Math.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

// pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}


// Dependency file: node_modules/@openzeppelin/contracts/utils/Strings.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/math/Math.sol";

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

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


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
// import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
// import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
// import "@openzeppelin/contracts/utils/Address.sol";
// import "@openzeppelin/contracts/utils/Context.sol";
// import "@openzeppelin/contracts/utils/Strings.sol";
// import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}


// Dependency file: node_modules/@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

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

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

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

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

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

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


// Dependency file: node_modules/@openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Context.sol";

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

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

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

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

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

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

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

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

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


// Root file: contracts/WorstCaseDecisionSeasonOne.sol


/*
 *
 * Worst Case Decision: Season One
 * Website: https://www.worstcasedecision.com
 *
 * Contract by Matt Casanova [Twitter: @DevGuyThings]
 * Hashku: https://www.hashku.com
 *
 */

pragma solidity 0.8.18;

// import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
// import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
// import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/Strings.sol";

contract WorstCaseDecisionSeasonOne is Ownable, ERC1155Supply {
  struct TokenType {
    string uri;
    uint256 price;
    uint256 max;
    uint256 trailerRequired;
    uint256 end;
    bool isOpen;
    bool isSet;
  }

  constructor() ERC1155("https://storage.hashku.com/api/wcd/season1/{id}.json") {
    baseURI = "https://storage.hashku.com/api/wcd/season1/{id}.json";
  }

  // keep track of all token data
  mapping(uint256 => TokenType) public tokenTypes;

  // last transferred token for any given index will be tracked
  // primarily useful for tokens that will only have 1 in existence
  // allows ownerOf functionality for those NFTs
  mapping(uint256 => address) public recentOwners;

  // setup token data and rules
  function setTokenType(
    uint256 _tokenId,
    string calldata _uri,
    uint256 _price,
    uint256 _max,
    uint256 _trailerRequired,
    uint256 _end,
    bool _isOpen,
    bool _isSet
  ) public onlyOwner {
    tokenTypes[_tokenId] = TokenType(_uri, _price, _max, _trailerRequired, _end, _isOpen, _isSet);
  }

  // shortcut for admin setup of series of tokens (primarily the PFPs)
  function setTokenTypeMulti(
    uint256 _tokenIdStart,
    uint256 _tokenIdEnd,
    string calldata _uriStart,
    string calldata _uriEnd,
    uint256 _price,
    uint256 _max,
    uint256 _trailerRequired,
    uint256 _end,
    bool _isOpen,
    bool _isSet
  ) public onlyOwner {
    for (uint256 i = _tokenIdStart; i <= _tokenIdEnd; ++i) {
      tokenTypes[i] = TokenType(
        string.concat(string.concat(_uriStart, Strings.toString(i)), _uriEnd),
        _price,
        _max,
        _trailerRequired,
        _end,
        _isOpen,
        _isSet
      );
    }
  }

  // fallback base URI
  string public baseURI;

  // is minting open
  bool public isOpen = true;

  // address of the trailer contract for checking balance requirements
  // zora trailer 1 contract, mainnet: 0x24A7b986793bCA0c8c5b04DC2AaFfE9E8DF921ad
  ERC721 public trailerContract;

  // array of addresses that can withdraw
  address[] public withdrawalAddresses;

  // percentage amounts to split withdrawals
  mapping(address => uint256) public withdrawalSplits;

  // amounts actually available for addresses to withdraw
  mapping(address => uint256) public withdrawalAmounts;

  // reserved amount
  uint256 public withdrawalReserved;

  event Withdrawal(string _type, address _to, uint256 _amount);

  // if this is set, then will give gift for every mint
  uint256 public mintGift = 68;

  function uri(uint256 _tokenId) public view override returns (string memory) {
    if (tokenTypes[_tokenId].isSet) {
      return tokenTypes[_tokenId].uri;
    }

    return baseURI;
  }

  function price(uint256 _tokenId) public view returns (uint256) {
    if (tokenTypes[_tokenId].isSet) {
      return tokenTypes[_tokenId].price;
    }

    return 0;
  }

  function setUri(string calldata _uri) external onlyOwner {
    baseURI = _uri;
  }

  function setIsOpen(bool _open) external onlyOwner {
    isOpen = _open;
  }

  function setTrailerContract(ERC721 _address) external onlyOwner {
    trailerContract = _address;
  }

  // owner sends NFTs to addresses
  function send(
    uint256 _tokenId,
    address[] calldata _addresses,
    uint256[] calldata _amounts
  ) external onlyOwner {
    require(tokenTypes[_tokenId].isSet, "Token has not been set up");

    require(_addresses.length == _amounts.length, "Amounts do not match");

    for (uint256 i = 0; i < _addresses.length; ++i) {
      _mint(_addresses[i], _tokenId, _amounts[i], "");
    }
  }

  function shop(uint256 _index, uint256 _amount) external payable {
    TokenType storage tokentype = tokenTypes[_index];

    require(tokentype.isSet, "Item not set");

    if (!isOpen) {
      require(tokentype.isOpen, "Item not open for sale");
    }

    require(tokentype.price * _amount == msg.value, "Incorrect payment amount");

    if (tokentype.end > 0) {
      require(block.timestamp < tokentype.end, "Minting has ended for this item");
    }

    if (tokentype.trailerRequired > 0) {
      require(address(trailerContract) != address(0), "Trailer contract not set");

      require(
        trailerContract.balanceOf(_msgSender()) >= tokentype.trailerRequired,
        "You must own more trailer tokens"
      );
    }

    if (tokentype.max > 0) {
      require(totalSupply(_index) + _amount <= tokentype.max, "Not enough tokens left");
    }

    _mint(_msgSender(), _index, _amount, "");

    if (mintGift > 0) {
      TokenType storage gifttype = tokenTypes[mintGift];

      if (gifttype.trailerRequired > 0) {
        require(address(trailerContract) != address(0), "Trailer contract not set");
        if (trailerContract.balanceOf(_msgSender()) > gifttype.trailerRequired) {
          _mint(_msgSender(), mintGift, 1, "");
        }
      } else {
        _mint(_msgSender(), mintGift, 1, "");
      }
    }

    splitPayment(msg.value);
  }

  // withdrawal address convenience method for pulling balance of contract
  function seeBalance(address _address) public view returns (uint256) {
    // if the owner has some split amount, will need to empty the split before accessing non-reserved amount
    if (withdrawalAmounts[_address] > 0) {
      return withdrawalAmounts[_address];
    }

    if (_address == owner() && address(this).balance > withdrawalReserved) {
      return address(this).balance - withdrawalReserved;
    }

    return 0;
  }

  // see the total balance on the contract
  function seeContractBalance() public view returns (uint256) {
    return address(this).balance;
  }

  // withdrawal address send an amount to an address
  function withdraw(address payable _to, uint256 _amount) external returns (bool) {
    uint256 amountAllowed = seeBalance(_msgSender());
    require(_amount <= amountAllowed, "Insufficient funds");

    // if the address has some in the reserved amount, must extract that first
    if (withdrawalAmounts[_msgSender()] > 0 && _amount <= seeContractBalance()) {
      // deduct amount available for msgSender and total reserved
      withdrawalAmounts[_msgSender()] -= _amount;
      withdrawalReserved -= _amount;

      _to.transfer(_amount);

      emit Withdrawal("split", _to, _amount);

      return true;
    }

    // if withdrawalAddresses are NOT set, then cannot withdraw unless you are the owner
    require(_msgSender() == owner(), "Must be owner");

    _to.transfer(_amount);
    emit Withdrawal("owner", _to, _amount);
    return true;
  }

  // splits must add to 100
  // splits allow each payment for shop to add up to an
  // allowable withdrawal amount for each split address
  function setWithdrawalSplits(address[] calldata _addresses, uint256[] calldata _amounts)
    public
    onlyOwner
  {
    require(_addresses.length == _amounts.length, "amount_mismatch");

    uint256 total;

    for (uint256 t = 0; t < _amounts.length; ++t) {
      total += _amounts[t];
    }

    require(total == 100, "Total must be 100");

    withdrawalAddresses = _addresses;

    for (uint256 t = 0; t < _amounts.length; ++t) {
      withdrawalSplits[_addresses[t]] = _amounts[t];
    }
  }

  // if there are withdrawal addresses set, ensure the payment amounts
  function splitPayment(uint256 _paymentAmount) internal returns (bool) {
    if (withdrawalAddresses.length == 0) {
      return true;
    }

    // if there are withdrawal addresses then need to ensure reserve balance
    withdrawalReserved += _paymentAmount;

    // first address in the array will always get the remainder
    uint256 tempTotal;
    uint256 tempAmount;

    for (uint256 t = 1; t < withdrawalAddresses.length; ++t) {
      tempAmount = (_paymentAmount * withdrawalSplits[withdrawalAddresses[t]]) / 100;
      withdrawalAmounts[withdrawalAddresses[t]] += tempAmount;
      tempTotal += tempAmount;
    }

    uint256 amountForFirstAddress = _paymentAmount - tempTotal;
    withdrawalAmounts[withdrawalAddresses[0]] += amountForFirstAddress;

    return true;
  }

  // safety function to ensure can always withdraw from the contract
  // I do NOT expect to use this, but am adding just in case my math
  // and tests for the split above somehow were not comprehensive
  // this would be visible and easy to tie to me, so not worried about
  // potential concerns for a function like this existing
  function forceWithdrawal(address payable _to, uint256 _amount) external onlyOwner returns (bool) {
    require(_amount <= seeContractBalance(), "insuffient_balance");
    _to.transfer(_amount);
    emit Withdrawal("force", _to, _amount);
    return true;
  }

  // overriding default to allow tracking the recent non-zero address owner of token ids
  function _beforeTokenTransfer(
    address operator,
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) internal virtual override {
    super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

    for (uint256 i = 0; i < ids.length; ++i) {
      if (to != address(0)) {
        recentOwners[ids[i]] = to;
      }
    }
  }

  // returnt the most recent owner for a token id
  // for the NFTs this will mimic ERC721 functionality
  function ownerOf(uint256 _index) public view returns (address) {
    return recentOwners[_index];
  }

  // shortcut for getting the number of trailers owned by caller
  function trailerCount() public view returns (uint256) {
    require(address(trailerContract) != address(0), "Trailer contract not set");
    return trailerContract.balanceOf(_msgSender());
  }

  function setupDefaultTokens() public onlyOwner {
    // SO AP
    // to be given out as gift
    tokenTypes[68] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/68.json",
      5000000000000000000,
      0,
      1,
      0,
      false,
      true
    );

    // Episodes
    // no max, no trailers required, ends feb 23 8am utc
    for (uint256 i = 1; i < 10; ++i) {
      tokenTypes[i] = TokenType(
        string.concat(
          string.concat("https://storage.hashku.com/api/wcd/season1/", Strings.toString(i)),
          ".json"
        ),
        10000000000000000,
        0,
        0,
        1677139200,
        false,
        true
      );
    }

    // all episodes
    // 100 max, 3 trailers required, ends feb 23 8am utc
    tokenTypes[10] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/10.json",
      50000000000000000,
      100,
      3,
      1677139200,
      false,
      true
    );

    // exec producer
    // 1 each, no trailers required
    for (uint256 i = 11; i < 15; ++i) {
      tokenTypes[i] = TokenType(
        string.concat(
          string.concat("https://storage.hashku.com/api/wcd/season1/", Strings.toString(i)),
          ".json"
        ),
        3141592650000000000,
        1,
        0,
        0,
        true,
        true
      );
    }

    // parrot
    // 1, 33 trailers required
    tokenTypes[21] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/21.json",
      40000000000000000,
      1,
      33,
      0,
      false,
      true
    );

    // steve 1
    // 1, 22 trailers required
    tokenTypes[31] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/31.json",
      40000000000000000,
      1,
      22,
      0,
      false,
      true
    );

    // steve 2
    // 1, 22 trailers required
    tokenTypes[32] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/32.json",
      40000000000000000,
      1,
      22,
      0,
      false,
      true
    );

    // dr bob 1
    // 1, 11 trailers required
    tokenTypes[41] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/41.json",
      40000000000000000,
      1,
      11,
      0,
      false,
      true
    );

    // dr bob 2
    // 1, 11 trailers required
    tokenTypes[42] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/42.json",
      40000000000000000,
      1,
      11,
      0,
      false,
      true
    );

    // dr bob 3
    // 1, 11 trailers required
    tokenTypes[43] = TokenType(
      "https://storage.hashku.com/api/wcd/season1/43.json",
      40000000000000000,
      1,
      11,
      0,
      false,
      true
    );
  }

  function setupPfpTokensPartOne() public onlyOwner {
    // Setup for first half of PFPs
    for (uint256 i = 100; i < 135; ++i) {
      tokenTypes[i] = TokenType(
        string.concat(
          string.concat("https://storage.hashku.com/api/wcd/season1/", Strings.toString(i)),
          ".json"
        ),
        40000000000000000,
        1,
        2,
        0,
        true,
        true
      );
    }
  }

  function setupPfpTokensPartTwo() public onlyOwner {
    // Setup for remaining PFPs
    for (uint256 i = 135; i < 165; ++i) {
      tokenTypes[i] = TokenType(
        string.concat(
          string.concat("https://storage.hashku.com/api/wcd/season1/", Strings.toString(i)),
          ".json"
        ),
        40000000000000000,
        1,
        2,
        0,
        true,
        true
      );
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_type","type":"string"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"forceWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintGift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recentOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"seeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seeContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"}],"name":"setIsOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_trailerRequired","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bool","name":"_isOpen","type":"bool"},{"internalType":"bool","name":"_isSet","type":"bool"}],"name":"setTokenType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenIdStart","type":"uint256"},{"internalType":"uint256","name":"_tokenIdEnd","type":"uint256"},{"internalType":"string","name":"_uriStart","type":"string"},{"internalType":"string","name":"_uriEnd","type":"string"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"},{"internalType":"uint256","name":"_trailerRequired","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bool","name":"_isOpen","type":"bool"},{"internalType":"bool","name":"_isSet","type":"bool"}],"name":"setTokenTypeMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC721","name":"_address","type":"address"}],"name":"setTrailerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setWithdrawalSplits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setupDefaultTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setupPfpTokensPartOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setupPfpTokensPartTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"shop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTypes","outputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"uint256","name":"trailerRequired","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bool","name":"isOpen","type":"bool"},{"internalType":"bool","name":"isSet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trailerContract","outputs":[{"internalType":"contract ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trailerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawalAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawalAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawalSplits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526008805460ff191660011790556044600d553480156200002357600080fd5b5060405180606001604052806034815260200162005b4160349139620000493362000085565b6200005481620000d5565b5060405180606001604052806034815260200162005b41603491396007906200007e90826200018c565b5062000258565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6003620000e382826200018c565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011257607f821691505b6020821081036200013357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200018757600081815260208120601f850160051c81016020861015620001625750805b601f850160051c820191505b8181101562000183578281556001016200016e565b5050505b505050565b81516001600160401b03811115620001a857620001a8620000e7565b620001c081620001b98454620000fd565b8462000139565b602080601f831160018114620001f85760008415620001df5750858301515b600019600386901b1c1916600185901b17855562000183565b600085815260208120601f198616915b82811015620002295788860151825594840194600190910190840162000208565b5085821015620002485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6158d980620002686000396000f3fe6080604052600436106102c55760003560e01c806373e30ec711610179578063bd85b039116100d6578063e308bd521161008a578063f242432a11610064578063f242432a1461085a578063f2fde38b1461087a578063f3fef3a31461089a57600080fd5b8063e308bd52146107c4578063e985e9c5146107e4578063efbd105c1461083a57600080fd5b8063d4ebd180116100bb578063d4ebd18014610786578063d68f81121461079c578063e0a1ce8f146107af57600080fd5b8063bd85b0391461072c578063d37998781461075957600080fd5b80639d7751391161012d578063a376075811610112578063a3760758146106ad578063ac2698c5146106da578063bc9d5994146106fa57600080fd5b80639d77513914610678578063a22cb4651461068d57600080fd5b80638da5cb5b1161015e5780638da5cb5b1461060d578063903e9c68146106385780639b642de11461065857600080fd5b806373e30ec7146105d75780638aeb8707146105ed57600080fd5b8063411f9f39116102275780634e1273f4116101db5780636352211e116101c05780636352211e1461056a5780636c0360eb146105ad578063715018a6146105c257600080fd5b80634e1273f41461050e5780634f558e791461053b57600080fd5b806347535d7b1161020c57806347535d7b146104b45780634912499f146104ce5780634d79c2f3146104ee57600080fd5b8063411f9f391461045c578063432f87621461047157600080fd5b80632cf08ffe1161027e5780632f26ef13116102635780632f26ef13146103cf57806333f6832a146103e45780633caaa09f1461041757600080fd5b80632cf08ffe1461039c5780632eb2c2d6146103af57600080fd5b8063085a10cf116102af578063085a10cf1461032d5780630e89341c1461034f57806326a49e371461037c57600080fd5b8062fdd58e146102ca57806301ffc9a7146102fd575b600080fd5b3480156102d657600080fd5b506102ea6102e536600461472c565b6108ba565b6040519081526020015b60405180910390f35b34801561030957600080fd5b5061031d610318366004614786565b61099c565b60405190151581526020016102f4565b34801561033957600080fd5b5061034d6103483660046147bf565b610a7f565b005b34801561035b57600080fd5b5061036f61036a3660046147da565b610ab8565b6040516102f49190614861565b34801561038857600080fd5b506102ea6103973660046147da565b610b86565b3480156103a857600080fd5b50476102ea565b3480156103bb57600080fd5b5061034d6103ca366004614a15565b610bc3565b3480156103db57600080fd5b5061034d610c8c565b3480156103f057600080fd5b506104046103ff3660046147da565b610e24565b6040516102f49796959493929190614ac3565b34801561042357600080fd5b506104376104323660046147da565b610eed565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f4565b34801561046857600080fd5b5061034d610f24565b34801561047d57600080fd5b5061043761048c3660046147da565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156104c057600080fd5b5060085461031d9060ff1681565b3480156104da57600080fd5b5061034d6104e9366004614b54565b611b95565b3480156104fa57600080fd5b5061034d610509366004614c2d565b611cc7565b34801561051a57600080fd5b5061052e610529366004614c99565b611e80565b6040516102f49190614da1565b34801561054757600080fd5b5061031d6105563660046147da565b600090815260046020526040902054151590565b34801561057657600080fd5b506104376105853660046147da565b60009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156105b957600080fd5b5061036f611fd8565b3480156105ce57600080fd5b5061034d612066565b3480156105e357600080fd5b506102ea600c5481565b3480156105f957600080fd5b506102ea610608366004614db4565b61207a565b34801561061957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610437565b34801561064457600080fd5b5061034d610653366004614dd1565b61210b565b34801561066457600080fd5b5061034d610673366004614ea5565b612298565b34801561068457600080fd5b506102ea6122b2565b34801561069957600080fd5b5061034d6106a8366004614ee7565b6123ef565b3480156106b957600080fd5b506102ea6106c8366004614db4565b600b6020526000908152604090205481565b3480156106e657600080fd5b5061031d6106f536600461472c565b6123fe565b34801561070657600080fd5b5060085461043790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561073857600080fd5b506102ea6107473660046147da565b60009081526004602052604090205490565b34801561076557600080fd5b506102ea610774366004614db4565b600a6020526000908152604090205481565b34801561079257600080fd5b506102ea600d5481565b61034d6107aa366004614f1c565b612543565b3480156107bb57600080fd5b5061034d612b26565b3480156107d057600080fd5b5061034d6107df366004614f3e565b612cbb565b3480156107f057600080fd5b5061031d6107ff366004614fb8565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561084657600080fd5b5061034d610855366004614db4565b612e21565b34801561086657600080fd5b5061034d610875366004614ff1565b612e75565b34801561088657600080fd5b5061034d610895366004614db4565b612f37565b3480156108a657600080fd5b5061031d6108b536600461472c565b612feb565b600073ffffffffffffffffffffffffffffffffffffffff8316610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480610a2f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061099657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610996565b610a876132e8565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526005602081905260409091200154606090610100900460ff1615610b795760008281526005602052604090208054610af49061505a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b209061505a565b8015610b6d5780601f10610b4257610100808354040283529160200191610b6d565b820191906000526020600020905b815481529060010190602001808311610b5057829003601f168201915b50505050509050919050565b60078054610af49061505a565b600081815260056020819052604082200154610100900460ff1615610bbb575060009081526005602052604090206001015490565b506000919050565b73ffffffffffffffffffffffffffffffffffffffff8516331480610bec5750610bec85336107ff565b610c78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161095b565b610c858585858585613369565b5050505050565b610c946132e8565b60645b6087811015610e21576040518060e00160405280610cb4836136ac565b604051602001610cc491906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610cff91602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252668e1bc9bf04000060208381019190915260018383018190526002606085015260006080850181905260a0850182905260c09094015284835260059052902081518190610d7d908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055610e1a816152e8565b9050610c97565b50565b600560205260009081526040902080548190610e3f9061505a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6b9061505a565b8015610eb85780601f10610e8d57610100808354040283529160200191610eb8565b820191906000526020600020905b815481529060010190602001808311610e9b57829003601f168201915b505050600184015460028501546003860154600487015460059097015495969295919450925060ff8082169161010090041687565b60098181548110610efd57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f2c6132e8565b604080516101408101909152603260e0820181815282916157146101008401398152674563918244f400006020808301919091526000604083018190526001606084018190526080840182905260a0840182905260c09093019290925260449091526005905280517f03eb07f93538319a7c066f99124d4f598669465a92b898712329bbdc56e27361908190610fc2908261519f565b50602082015160018083019190915560408301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff931515939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090941693909317919091179091555b600a8110156111ef576040518060e0016040528061107c836136ac565b60405160200161108c91906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526110c791602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252662386f26fc100006020838101919091526000838301819052606084018190526363f71d00608085015260a08401819052600160c0909401939093528483526005905290208151819061114b908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092171790556111e8816152e8565b905061105f565b50604080516101408101909152603260e082018181528291615872610100840139815266b1a2bc2ec5000060208083019190915260646040830152600360608301526363f71d006080830152600060a08301819052600160c090930192909252600a9091526005905280517fa18b128af1c8fc61ff46f02d146e54546f34d340574cf2cef6a753cba6b6701d908190611288908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055600b5b600f8110156114aa576040518060e0016040528061133c836136ac565b60405160200161134c91906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261138791602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252672b992ddecc3a640060208381019190915260018383018190526000606085018190526080850181905260a0850182905260c09094015284835260059052902081518190611406908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092171790556114a3816152e8565b905061131f565b50604080516101408101909152603260e0820181815282916157dc6101008401398152668e1bc9bf0400006020808301919091526001604083018190526021606084015260006080840181905260a0840181905260c09093015260159091526005905280517fdcae836ed36bf3d20474cfcca00229d5b3b00239a2a956d8ca4bf29e25a7143c90819061153d908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e082018181529192839291906157aa908401398152668e1bc9bf0400006020808301919091526001604083018190526016606084015260006080840181905260a0840181905260c090930152601f9091526005905280517ff0566fba57f394cfd00b7b328d5cff9d096b0b4609f559321788bcbb79ff612c908190611664908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e0820181815291928392919061580e908401398152668e1bc9bf0400006020808301919091526001604083018190526016606084015260006080840181905260a0840181905260c090930152908190526005905280517f071e9cfece6dd892566e0eb3e2a591eadf7d95b3a63c4bb6c30897234d67d5cc90819061178a908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e08201818152919283929190615778908401398152668e1bc9bf040000602080830191909152600160408301819052600b606084015260006080840181905260a0840181905260c09093015260299091526005905280517f3b07644517d2f667e1f84d4fb6c23df68138cb298509f38ac23f8d4d0fa756f49081906118b1908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e08201818152919283929190615746908401398152668e1bc9bf040000602080830191909152600160408301819052600b606084015260006080840181905260a0840181905260c090930152602a9091526005905280517fd3e7a847b0e4be9f2ff1f88564b0a771bb9789c2c82f98679296a6042483791d9081906119d8908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e08201818152919283929190615840908401398152668e1bc9bf040000602080830191909152600160408301819052600b606084015260006080840181905260a0840181905260c090930152602b9091526005905280517feba08e2c8348651115080ff16aec63b0e8f9b0c03ed2a6ca5b8b4f7e25945edf908190611aff908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055565b611b9d6132e8565b6040518060e0016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018a905260408084018a9052606084018990526080840188905286151560a085015285151560c0909401939093528c8252600590522081518190611c28908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055505050505050505050565b611ccf6132e8565b828114611d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616d6f756e745f6d69736d617463680000000000000000000000000000000000604482015260640161095b565b6000805b82811015611d7a57838382818110611d5657611d56615320565b9050602002013582611d68919061534f565b9150611d73816152e8565b9050611d3c565b5080606414611de5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f546f74616c206d75737420626520313030000000000000000000000000000000604482015260640161095b565b611df16009868661466d565b5060005b82811015611e7857838382818110611e0f57611e0f615320565b90506020020135600a6000888885818110611e2c57611e2c615320565b9050602002016020810190611e419190614db4565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002055611e71816152e8565b9050611df5565b505050505050565b60608151835114611f13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161095b565b6000835167ffffffffffffffff811115611f2f57611f2f614874565b604051908082528060200260200182016040528015611f58578160200160208202803683370190505b50905060005b8451811015611fd057611fa3858281518110611f7c57611f7c615320565b6020026020010151858381518110611f9657611f96615320565b60200260200101516108ba565b828281518110611fb557611fb5615320565b6020908102919091010152611fc9816152e8565b9050611f5e565b509392505050565b60078054611fe59061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546120119061505a565b801561205e5780601f106120335761010080835404028352916020019161205e565b820191906000526020600020905b81548152906001019060200180831161204157829003601f168201915b505050505081565b61206e6132e8565b612078600061376a565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040812054156120ce575073ffffffffffffffffffffffffffffffffffffffff166000908152600b602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff83811691161480156120f95750600c5447115b15610bbb57600c546109969047615362565b6121136132e8565b8b5b8b8111612289576040518060e001604052808c8c612132856136ac565b60405160200161214493929190615375565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612183918d908d9060200161539c565b604051602081830303815290604052815260200188815260200187815260200186815260200185815260200184151581526020018315158152506005600083815260200190815260200160002060008201518160000190816121e5919061519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055612282816152e8565b9050612115565b50505050505050505050505050565b6122a06132e8565b60076122ad8284836153c4565b505050565b600854600090610100900473ffffffffffffffffffffffffffffffffffffffff16612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f547261696c657220636f6e7472616374206e6f74207365740000000000000000604482015260640161095b565b600854610100900473ffffffffffffffffffffffffffffffffffffffff166370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea91906154de565b905090565b6123fa3383836137df565b5050565b60006124086132e8565b47821115612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e7375666669656e745f62616c616e63650000000000000000000000000000604482015260640161095b565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f193505050501580156124b5573d6000803e3d6000fd5b506040805160608082526005908201527f666f726365000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a00160405180910390a150600192915050565b600082815260056020819052604090912090810154610100900460ff166125c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4974656d206e6f74207365740000000000000000000000000000000000000000604482015260640161095b565b60085460ff1661263e57600581015460ff1661263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4974656d206e6f74206f70656e20666f722073616c6500000000000000000000604482015260640161095b565b3482826001015461264f91906154f7565b146126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e636f7272656374207061796d656e7420616d6f756e740000000000000000604482015260640161095b565b60048101541561272d578060040154421061272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e74696e672068617320656e64656420666f722074686973206974656d00604482015260640161095b565b6003810154156128d957600854610100900473ffffffffffffffffffffffffffffffffffffffff166127bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f547261696c657220636f6e7472616374206e6f74207365740000000000000000604482015260640161095b565b6003810154600854610100900473ffffffffffffffffffffffffffffffffffffffff166370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561284d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287191906154de565b10156128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f596f75206d757374206f776e206d6f726520747261696c657220746f6b656e73604482015260640161095b565b60028101541561296a57600281015460008481526004602052604090205461290290849061534f565b111561296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000604482015260640161095b565b61298533848460405180602001604052806000815250613932565b600d5415612b1757600d546000908152600560205260409020600381015415612b0c57600854610100900473ffffffffffffffffffffffffffffffffffffffff16612a2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f547261696c657220636f6e7472616374206e6f74207365740000000000000000604482015260640161095b565b6003810154600854610100900473ffffffffffffffffffffffffffffffffffffffff166370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015612abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae291906154de565b1115612b0757612b07335b600d54600160405180602001604052806000815250613932565b612b15565b612b1533612aed565b505b612b2034613ab4565b50505050565b612b2e6132e8565b60875b60a5811015610e21576040518060e00160405280612b4e836136ac565b604051602001612b5e91906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612b9991602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252668e1bc9bf04000060208381019190915260018383018190526002606085015260006080850181905260a0850182905260c09094015284835260059052902081518190612c17908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055612cb4816152e8565b9050612b31565b612cc36132e8565b60008581526005602081905260409091200154610100900460ff16612d44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546f6b656e20686173206e6f74206265656e2073657420757000000000000000604482015260640161095b565b828114612dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f416d6f756e747320646f206e6f74206d61746368000000000000000000000000604482015260640161095b565b60005b83811015611e7857612e11858583818110612dcd57612dcd615320565b9050602002016020810190612de29190614db4565b87858585818110612df557612df5615320565b9050602002013560405180602001604052806000815250613932565b612e1a816152e8565b9050612db0565b612e296132e8565b6008805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8516331480612e9e5750612e9e85336107ff565b612f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161095b565b610c858585858585613c45565b612f3f6132e8565b73ffffffffffffffffffffffffffffffffffffffff8116612fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161095b565b610e218161376a565b600080612ff73361207a565b905080831115613063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742066756e64730000000000000000000000000000604482015260640161095b565b336000908152600b6020526040902054158015906130815750478311155b1561319557336000908152600b6020526040812080548592906130a5908490615362565b9250508190555082600c60008282546130be9190615362565b909155505060405173ffffffffffffffffffffffffffffffffffffffff85169084156108fc029085906000818181858888f19350505050158015613106573d6000803e3d6000fd5b506040805160608082526005908201527f73706c6974000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff861660208201529081018490527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a00160405180910390a16001915050610996565b60005473ffffffffffffffffffffffffffffffffffffffff163314613216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015260640161095b565b60405173ffffffffffffffffffffffffffffffffffffffff85169084156108fc029085906000818181858888f19350505050158015613259573d6000803e3d6000fd5b506040805160608082526005908201527f6f776e6572000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff861660208201529081018490527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a00160405180910390a15060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095b565b81518351146133fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161095b565b73ffffffffffffffffffffffffffffffffffffffff841661349d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161095b565b336134ac818787878787613e95565b60005b845181101561361f5760008582815181106134cc576134cc615320565b6020026020010151905060008583815181106134ea576134ea615320565b602090810291909101810151600084815260018352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156135b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161095b565b600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061360490849061534f565b9250508190555050505080613618906152e8565b90506134af565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161369692919061550e565b60405180910390a4611e78818787878787613f47565b606060006136b9836141d1565b600101905060008167ffffffffffffffff8111156136d9576136d9614874565b6040519080825280601f01601f191660200182016040528015613703576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461370d57509392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361389a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161095b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff84166139d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161095b565b3360006139e1856142b3565b905060006139ee856142b3565b90506139ff83600089858589613e95565b600086815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845290915281208054879290613a3e90849061534f565b9091555050604080518781526020810187905273ffffffffffffffffffffffffffffffffffffffff808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613aab836000898989896142fe565b50505050505050565b6009546000908103613ac857506001919050565b81600c6000828254613ada919061534f565b90915550600090508060015b600954811015613bcc576064600a600060098481548110613b0957613b09615320565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054613b4590876154f7565b613b4f919061553c565b915081600b600060098481548110613b6957613b69615320565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190613baa90849061534f565b90915550613bba9050828461534f565b9250613bc5816152e8565b9050613ae6565b506000613bd98386615362565b905080600b60006009600081548110613bf457613bf4615320565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190613c3590849061534f565b9091555060019695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416613ce8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161095b565b336000613cf4856142b3565b90506000613d01856142b3565b9050613d11838989858589613e95565b600086815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205485811015613dd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161095b565b600087815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d8116855292528083208985039055908a16825281208054889290613e1d90849061534f565b9091555050604080518881526020810188905273ffffffffffffffffffffffffffffffffffffffff808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613e8a848a8a8a8a8a6142fe565b505050505050505050565b613ea38686868686866144ab565b60005b8351811015613aab5773ffffffffffffffffffffffffffffffffffffffff851615613f37578460066000868481518110613ee257613ee2615320565b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b613f40816152e8565b9050613ea6565b73ffffffffffffffffffffffffffffffffffffffff84163b15611e78576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190613fbe9089908990889088908890600401615577565b6020604051808303816000875af1925050508015614017575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252614014918101906155e2565b60015b614100576140236155ff565b806308c379a003614076575061403761561b565b806140425750614078565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b9190614861565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161095b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613aab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161095b565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061421a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614246576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061426457662386f26fc10000830492506010015b6305f5e100831061427c576305f5e100830492506008015b612710831061429057612710830492506004015b606483106142a2576064830492506002015b600a83106109965760010192915050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106142ed576142ed615320565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611e78576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e619061437590899089908890889088906004016156c3565b6020604051808303816000875af19250505080156143ce575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526143cb918101906155e2565b60015b6143da576140236155ff565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613aab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161095b565b73ffffffffffffffffffffffffffffffffffffffff851661453f5760005b835181101561453d578281815181106144e4576144e4615320565b60200260200101516004600086848151811061450257614502615320565b602002602001015181526020019081526020016000206000828254614527919061534f565b909155506145369050816152e8565b90506144c9565b505b73ffffffffffffffffffffffffffffffffffffffff8416611e785760005b8351811015613aab57600084828151811061457a5761457a615320565b60200260200101519050600084838151811061459857614598615320565b602002602001015190506000600460008481526020019081526020016000205490508181101561464a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c79000000000000000000000000000000000000000000000000606482015260840161095b565b60009283526004602052604090922091039055614666816152e8565b905061455d565b8280548282559060005260206000209081019282156146e5579160200282015b828111156146e55781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061468d565b506146f19291506146f5565b5090565b5b808211156146f157600081556001016146f6565b73ffffffffffffffffffffffffffffffffffffffff81168114610e2157600080fd5b6000806040838503121561473f57600080fd5b823561474a8161470a565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2157600080fd5b60006020828403121561479857600080fd5b81356147a381614758565b9392505050565b803580151581146147ba57600080fd5b919050565b6000602082840312156147d157600080fd5b6147a3826147aa565b6000602082840312156147ec57600080fd5b5035919050565b60005b8381101561480e5781810151838201526020016147f6565b50506000910152565b6000815180845261482f8160208601602086016147f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006147a36020830184614817565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff821117156148e7576148e7614874565b6040525050565b600067ffffffffffffffff82111561490857614908614874565b5060051b60200190565b600082601f83011261492357600080fd5b81356020614930826148ee565b60405161493d82826148a3565b83815260059390931b850182019282810191508684111561495d57600080fd5b8286015b848110156149785780358352918301918301614961565b509695505050505050565b600082601f83011261499457600080fd5b813567ffffffffffffffff8111156149ae576149ae614874565b6040516149e360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601826148a3565b8181528460208386010111156149f857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215614a2d57600080fd5b8535614a388161470a565b94506020860135614a488161470a565b9350604086013567ffffffffffffffff80821115614a6557600080fd5b614a7189838a01614912565b94506060880135915080821115614a8757600080fd5b614a9389838a01614912565b93506080880135915080821115614aa957600080fd5b50614ab688828901614983565b9150509295509295909350565b60e081526000614ad660e083018a614817565b602083019890985250604081019590955260608501939093526080840191909152151560a0830152151560c090910152919050565b60008083601f840112614b1d57600080fd5b50813567ffffffffffffffff811115614b3557600080fd5b602083019150836020828501011115614b4d57600080fd5b9250929050565b60008060008060008060008060006101008a8c031215614b7357600080fd5b8935985060208a013567ffffffffffffffff811115614b9157600080fd5b614b9d8c828d01614b0b565b90995097505060408a0135955060608a0135945060808a0135935060a08a01359250614bcb60c08b016147aa565b9150614bd960e08b016147aa565b90509295985092959850929598565b60008083601f840112614bfa57600080fd5b50813567ffffffffffffffff811115614c1257600080fd5b6020830191508360208260051b8501011115614b4d57600080fd5b60008060008060408587031215614c4357600080fd5b843567ffffffffffffffff80821115614c5b57600080fd5b614c6788838901614be8565b90965094506020870135915080821115614c8057600080fd5b50614c8d87828801614be8565b95989497509550505050565b60008060408385031215614cac57600080fd5b823567ffffffffffffffff80821115614cc457600080fd5b818501915085601f830112614cd857600080fd5b81356020614ce5826148ee565b604051614cf282826148a3565b83815260059390931b8501820192828101915089841115614d1257600080fd5b948201945b83861015614d39578535614d2a8161470a565b82529482019490820190614d17565b96505086013592505080821115614d4f57600080fd5b50614d5c85828601614912565b9150509250929050565b600081518084526020808501945080840160005b83811015614d9657815187529582019590820190600101614d7a565b509495945050505050565b6020815260006147a36020830184614d66565b600060208284031215614dc657600080fd5b81356147a38161470a565b6000806000806000806000806000806000806101408d8f031215614df457600080fd5b8c359b5060208d01359a5067ffffffffffffffff60408e01351115614e1857600080fd5b614e288e60408f01358f01614b0b565b909a50985067ffffffffffffffff60608e01351115614e4657600080fd5b614e568e60608f01358f01614b0b565b909850965060808d0135955060a08d0135945060c08d0135935060e08d01359250614e846101008e016147aa565b9150614e936101208e016147aa565b90509295989b509295989b509295989b565b60008060208385031215614eb857600080fd5b823567ffffffffffffffff811115614ecf57600080fd5b614edb85828601614b0b565b90969095509350505050565b60008060408385031215614efa57600080fd5b8235614f058161470a565b9150614f13602084016147aa565b90509250929050565b60008060408385031215614f2f57600080fd5b50508035926020909101359150565b600080600080600060608688031215614f5657600080fd5b85359450602086013567ffffffffffffffff80821115614f7557600080fd5b614f8189838a01614be8565b90965094506040880135915080821115614f9a57600080fd5b50614fa788828901614be8565b969995985093965092949392505050565b60008060408385031215614fcb57600080fd5b8235614fd68161470a565b91506020830135614fe68161470a565b809150509250929050565b600080600080600060a0868803121561500957600080fd5b85356150148161470a565b945060208601356150248161470a565b93506040860135925060608601359150608086013567ffffffffffffffff81111561504e57600080fd5b614ab688828901614983565b600181811c9082168061506e57607f821691505b6020821081036150a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7781527f63642f736561736f6e312f00000000000000000000000000000000000000000060208201526000825161510b81602b8501602087016147f3565b91909101602b0192915050565b6000825161512a8184602087016147f3565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b601f8211156122ad57600081815260208120601f850160051c810160208610156151805750805b601f850160051c820191505b81811015611e785782815560010161518c565b815167ffffffffffffffff8111156151b9576151b9614874565b6151cd816151c7845461505a565b84615159565b602080601f83116001811461522057600084156151ea5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611e78565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561526d5788860151825594840194600190910190840161524e565b50858210156152a957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615319576153196152b9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610996576109966152b9565b81810381811115610996576109966152b9565b8284823760008382016000815283516153928183602088016147f3565b0195945050505050565b600084516153ae8184602089016147f3565b8201838582376000930192835250909392505050565b67ffffffffffffffff8311156153dc576153dc614874565b6153f0836153ea835461505a565b83615159565b6000601f841160018114615442576000851561540c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610c85565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156154915786850135825560209485019460019092019101615471565b50868210156154cc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156154f057600080fd5b5051919050565b8082028115828204841417610996576109966152b9565b6040815260006155216040830185614d66565b82810360208401526155338185614d66565b95945050505050565b600082615572577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526155b060a0830186614d66565b82810360608401526155c28186614d66565b905082810360808401526155d68185614817565b98975050505050505050565b6000602082840312156155f457600080fd5b81516147a381614758565b600060033d11156156185760046000803e5060005160e01c5b90565b600060443d10156156295790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561567757505050505090565b828501915081518181111561568f5750505050505090565b843d87010160208285010111156156a95750505050505090565b6156b8602082860101876148a3565b509095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261570860a0830184614817565b97965050505050505056fe68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f36382e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f34322e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f34312e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f33312e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f32312e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f33322e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f34332e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f31302e6a736f6ea2646970667358221220adbc8d1e3af294c59414cfa5b1b5890f9326877c4afdb72eefa219fb4f84a64764736f6c6343000812003368747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f7b69647d2e6a736f6e

Deployed Bytecode

0x6080604052600436106102c55760003560e01c806373e30ec711610179578063bd85b039116100d6578063e308bd521161008a578063f242432a11610064578063f242432a1461085a578063f2fde38b1461087a578063f3fef3a31461089a57600080fd5b8063e308bd52146107c4578063e985e9c5146107e4578063efbd105c1461083a57600080fd5b8063d4ebd180116100bb578063d4ebd18014610786578063d68f81121461079c578063e0a1ce8f146107af57600080fd5b8063bd85b0391461072c578063d37998781461075957600080fd5b80639d7751391161012d578063a376075811610112578063a3760758146106ad578063ac2698c5146106da578063bc9d5994146106fa57600080fd5b80639d77513914610678578063a22cb4651461068d57600080fd5b80638da5cb5b1161015e5780638da5cb5b1461060d578063903e9c68146106385780639b642de11461065857600080fd5b806373e30ec7146105d75780638aeb8707146105ed57600080fd5b8063411f9f39116102275780634e1273f4116101db5780636352211e116101c05780636352211e1461056a5780636c0360eb146105ad578063715018a6146105c257600080fd5b80634e1273f41461050e5780634f558e791461053b57600080fd5b806347535d7b1161020c57806347535d7b146104b45780634912499f146104ce5780634d79c2f3146104ee57600080fd5b8063411f9f391461045c578063432f87621461047157600080fd5b80632cf08ffe1161027e5780632f26ef13116102635780632f26ef13146103cf57806333f6832a146103e45780633caaa09f1461041757600080fd5b80632cf08ffe1461039c5780632eb2c2d6146103af57600080fd5b8063085a10cf116102af578063085a10cf1461032d5780630e89341c1461034f57806326a49e371461037c57600080fd5b8062fdd58e146102ca57806301ffc9a7146102fd575b600080fd5b3480156102d657600080fd5b506102ea6102e536600461472c565b6108ba565b6040519081526020015b60405180910390f35b34801561030957600080fd5b5061031d610318366004614786565b61099c565b60405190151581526020016102f4565b34801561033957600080fd5b5061034d6103483660046147bf565b610a7f565b005b34801561035b57600080fd5b5061036f61036a3660046147da565b610ab8565b6040516102f49190614861565b34801561038857600080fd5b506102ea6103973660046147da565b610b86565b3480156103a857600080fd5b50476102ea565b3480156103bb57600080fd5b5061034d6103ca366004614a15565b610bc3565b3480156103db57600080fd5b5061034d610c8c565b3480156103f057600080fd5b506104046103ff3660046147da565b610e24565b6040516102f49796959493929190614ac3565b34801561042357600080fd5b506104376104323660046147da565b610eed565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f4565b34801561046857600080fd5b5061034d610f24565b34801561047d57600080fd5b5061043761048c3660046147da565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156104c057600080fd5b5060085461031d9060ff1681565b3480156104da57600080fd5b5061034d6104e9366004614b54565b611b95565b3480156104fa57600080fd5b5061034d610509366004614c2d565b611cc7565b34801561051a57600080fd5b5061052e610529366004614c99565b611e80565b6040516102f49190614da1565b34801561054757600080fd5b5061031d6105563660046147da565b600090815260046020526040902054151590565b34801561057657600080fd5b506104376105853660046147da565b60009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156105b957600080fd5b5061036f611fd8565b3480156105ce57600080fd5b5061034d612066565b3480156105e357600080fd5b506102ea600c5481565b3480156105f957600080fd5b506102ea610608366004614db4565b61207a565b34801561061957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610437565b34801561064457600080fd5b5061034d610653366004614dd1565b61210b565b34801561066457600080fd5b5061034d610673366004614ea5565b612298565b34801561068457600080fd5b506102ea6122b2565b34801561069957600080fd5b5061034d6106a8366004614ee7565b6123ef565b3480156106b957600080fd5b506102ea6106c8366004614db4565b600b6020526000908152604090205481565b3480156106e657600080fd5b5061031d6106f536600461472c565b6123fe565b34801561070657600080fd5b5060085461043790610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561073857600080fd5b506102ea6107473660046147da565b60009081526004602052604090205490565b34801561076557600080fd5b506102ea610774366004614db4565b600a6020526000908152604090205481565b34801561079257600080fd5b506102ea600d5481565b61034d6107aa366004614f1c565b612543565b3480156107bb57600080fd5b5061034d612b26565b3480156107d057600080fd5b5061034d6107df366004614f3e565b612cbb565b3480156107f057600080fd5b5061031d6107ff366004614fb8565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561084657600080fd5b5061034d610855366004614db4565b612e21565b34801561086657600080fd5b5061034d610875366004614ff1565b612e75565b34801561088657600080fd5b5061034d610895366004614db4565b612f37565b3480156108a657600080fd5b5061031d6108b536600461472c565b612feb565b600073ffffffffffffffffffffffffffffffffffffffff8316610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a26000000000000000000000000000000000000000000000000000000001480610a2f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061099657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610996565b610a876132e8565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526005602081905260409091200154606090610100900460ff1615610b795760008281526005602052604090208054610af49061505a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b209061505a565b8015610b6d5780601f10610b4257610100808354040283529160200191610b6d565b820191906000526020600020905b815481529060010190602001808311610b5057829003601f168201915b50505050509050919050565b60078054610af49061505a565b600081815260056020819052604082200154610100900460ff1615610bbb575060009081526005602052604090206001015490565b506000919050565b73ffffffffffffffffffffffffffffffffffffffff8516331480610bec5750610bec85336107ff565b610c78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161095b565b610c858585858585613369565b5050505050565b610c946132e8565b60645b6087811015610e21576040518060e00160405280610cb4836136ac565b604051602001610cc491906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610cff91602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252668e1bc9bf04000060208381019190915260018383018190526002606085015260006080850181905260a0850182905260c09094015284835260059052902081518190610d7d908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055610e1a816152e8565b9050610c97565b50565b600560205260009081526040902080548190610e3f9061505a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6b9061505a565b8015610eb85780601f10610e8d57610100808354040283529160200191610eb8565b820191906000526020600020905b815481529060010190602001808311610e9b57829003601f168201915b505050600184015460028501546003860154600487015460059097015495969295919450925060ff8082169161010090041687565b60098181548110610efd57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b610f2c6132e8565b604080516101408101909152603260e0820181815282916157146101008401398152674563918244f400006020808301919091526000604083018190526001606084018190526080840182905260a0840182905260c09093019290925260449091526005905280517f03eb07f93538319a7c066f99124d4f598669465a92b898712329bbdc56e27361908190610fc2908261519f565b50602082015160018083019190915560408301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff931515939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090941693909317919091179091555b600a8110156111ef576040518060e0016040528061107c836136ac565b60405160200161108c91906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526110c791602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252662386f26fc100006020838101919091526000838301819052606084018190526363f71d00608085015260a08401819052600160c0909401939093528483526005905290208151819061114b908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092171790556111e8816152e8565b905061105f565b50604080516101408101909152603260e082018181528291615872610100840139815266b1a2bc2ec5000060208083019190915260646040830152600360608301526363f71d006080830152600060a08301819052600160c090930192909252600a9091526005905280517fa18b128af1c8fc61ff46f02d146e54546f34d340574cf2cef6a753cba6b6701d908190611288908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055600b5b600f8110156114aa576040518060e0016040528061133c836136ac565b60405160200161134c91906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261138791602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252672b992ddecc3a640060208381019190915260018383018190526000606085018190526080850181905260a0850182905260c09094015284835260059052902081518190611406908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092171790556114a3816152e8565b905061131f565b50604080516101408101909152603260e0820181815282916157dc6101008401398152668e1bc9bf0400006020808301919091526001604083018190526021606084015260006080840181905260a0840181905260c09093015260159091526005905280517fdcae836ed36bf3d20474cfcca00229d5b3b00239a2a956d8ca4bf29e25a7143c90819061153d908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e082018181529192839291906157aa908401398152668e1bc9bf0400006020808301919091526001604083018190526016606084015260006080840181905260a0840181905260c090930152601f9091526005905280517ff0566fba57f394cfd00b7b328d5cff9d096b0b4609f559321788bcbb79ff612c908190611664908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e0820181815291928392919061580e908401398152668e1bc9bf0400006020808301919091526001604083018190526016606084015260006080840181905260a0840181905260c090930152908190526005905280517f071e9cfece6dd892566e0eb3e2a591eadf7d95b3a63c4bb6c30897234d67d5cc90819061178a908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e08201818152919283929190615778908401398152668e1bc9bf040000602080830191909152600160408301819052600b606084015260006080840181905260a0840181905260c09093015260299091526005905280517f3b07644517d2f667e1f84d4fb6c23df68138cb298509f38ac23f8d4d0fa756f49081906118b1908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e08201818152919283929190615746908401398152668e1bc9bf040000602080830191909152600160408301819052600b606084015260006080840181905260a0840181905260c090930152602a9091526005905280517fd3e7a847b0e4be9f2ff1f88564b0a771bb9789c2c82f98679296a6042483791d9081906119d8908261519f565b50602082015160018201556040808301516002830155606083015160038301556080830151600483015560a08301516005909201805460c0909401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169290921761010093151584021790915580516101408101909152603260e08201818152919283929190615840908401398152668e1bc9bf040000602080830191909152600160408301819052600b606084015260006080840181905260a0840181905260c090930152602b9091526005905280517feba08e2c8348651115080ff16aec63b0e8f9b0c03ed2a6ca5b8b4f7e25945edf908190611aff908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055565b611b9d6132e8565b6040518060e0016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060208083018a905260408084018a9052606084018990526080840188905286151560a085015285151560c0909401939093528c8252600590522081518190611c28908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055505050505050505050565b611ccf6132e8565b828114611d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616d6f756e745f6d69736d617463680000000000000000000000000000000000604482015260640161095b565b6000805b82811015611d7a57838382818110611d5657611d56615320565b9050602002013582611d68919061534f565b9150611d73816152e8565b9050611d3c565b5080606414611de5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f546f74616c206d75737420626520313030000000000000000000000000000000604482015260640161095b565b611df16009868661466d565b5060005b82811015611e7857838382818110611e0f57611e0f615320565b90506020020135600a6000888885818110611e2c57611e2c615320565b9050602002016020810190611e419190614db4565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002055611e71816152e8565b9050611df5565b505050505050565b60608151835114611f13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161095b565b6000835167ffffffffffffffff811115611f2f57611f2f614874565b604051908082528060200260200182016040528015611f58578160200160208202803683370190505b50905060005b8451811015611fd057611fa3858281518110611f7c57611f7c615320565b6020026020010151858381518110611f9657611f96615320565b60200260200101516108ba565b828281518110611fb557611fb5615320565b6020908102919091010152611fc9816152e8565b9050611f5e565b509392505050565b60078054611fe59061505a565b80601f01602080910402602001604051908101604052809291908181526020018280546120119061505a565b801561205e5780601f106120335761010080835404028352916020019161205e565b820191906000526020600020905b81548152906001019060200180831161204157829003601f168201915b505050505081565b61206e6132e8565b612078600061376a565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040812054156120ce575073ffffffffffffffffffffffffffffffffffffffff166000908152600b602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff83811691161480156120f95750600c5447115b15610bbb57600c546109969047615362565b6121136132e8565b8b5b8b8111612289576040518060e001604052808c8c612132856136ac565b60405160200161214493929190615375565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612183918d908d9060200161539c565b604051602081830303815290604052815260200188815260200187815260200186815260200185815260200184151581526020018315158152506005600083815260200190815260200160002060008201518160000190816121e5919061519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055612282816152e8565b9050612115565b50505050505050505050505050565b6122a06132e8565b60076122ad8284836153c4565b505050565b600854600090610100900473ffffffffffffffffffffffffffffffffffffffff16612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f547261696c657220636f6e7472616374206e6f74207365740000000000000000604482015260640161095b565b600854610100900473ffffffffffffffffffffffffffffffffffffffff166370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156123c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ea91906154de565b905090565b6123fa3383836137df565b5050565b60006124086132e8565b47821115612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e7375666669656e745f62616c616e63650000000000000000000000000000604482015260640161095b565b60405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f193505050501580156124b5573d6000803e3d6000fd5b506040805160608082526005908201527f666f726365000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff851660208201529081018390527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a00160405180910390a150600192915050565b600082815260056020819052604090912090810154610100900460ff166125c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4974656d206e6f74207365740000000000000000000000000000000000000000604482015260640161095b565b60085460ff1661263e57600581015460ff1661263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4974656d206e6f74206f70656e20666f722073616c6500000000000000000000604482015260640161095b565b3482826001015461264f91906154f7565b146126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e636f7272656374207061796d656e7420616d6f756e740000000000000000604482015260640161095b565b60048101541561272d578060040154421061272d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e74696e672068617320656e64656420666f722074686973206974656d00604482015260640161095b565b6003810154156128d957600854610100900473ffffffffffffffffffffffffffffffffffffffff166127bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f547261696c657220636f6e7472616374206e6f74207365740000000000000000604482015260640161095b565b6003810154600854610100900473ffffffffffffffffffffffffffffffffffffffff166370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561284d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287191906154de565b10156128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f596f75206d757374206f776e206d6f726520747261696c657220746f6b656e73604482015260640161095b565b60028101541561296a57600281015460008481526004602052604090205461290290849061534f565b111561296a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000604482015260640161095b565b61298533848460405180602001604052806000815250613932565b600d5415612b1757600d546000908152600560205260409020600381015415612b0c57600854610100900473ffffffffffffffffffffffffffffffffffffffff16612a2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f547261696c657220636f6e7472616374206e6f74207365740000000000000000604482015260640161095b565b6003810154600854610100900473ffffffffffffffffffffffffffffffffffffffff166370a08231336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015612abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae291906154de565b1115612b0757612b07335b600d54600160405180602001604052806000815250613932565b612b15565b612b1533612aed565b505b612b2034613ab4565b50505050565b612b2e6132e8565b60875b60a5811015610e21576040518060e00160405280612b4e836136ac565b604051602001612b5e91906150ad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052612b9991602001615118565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152908252668e1bc9bf04000060208381019190915260018383018190526002606085015260006080850181905260a0850182905260c09094015284835260059052902081518190612c17908261519f565b506020820151600182015560408201516002820155606082015160038201556080820151600482015560a08201516005909101805460c0909301511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931692909217179055612cb4816152e8565b9050612b31565b612cc36132e8565b60008581526005602081905260409091200154610100900460ff16612d44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546f6b656e20686173206e6f74206265656e2073657420757000000000000000604482015260640161095b565b828114612dad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f416d6f756e747320646f206e6f74206d61746368000000000000000000000000604482015260640161095b565b60005b83811015611e7857612e11858583818110612dcd57612dcd615320565b9050602002016020810190612de29190614db4565b87858585818110612df557612df5615320565b9050602002013560405180602001604052806000815250613932565b612e1a816152e8565b9050612db0565b612e296132e8565b6008805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8516331480612e9e5750612e9e85336107ff565b612f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161095b565b610c858585858585613c45565b612f3f6132e8565b73ffffffffffffffffffffffffffffffffffffffff8116612fe2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161095b565b610e218161376a565b600080612ff73361207a565b905080831115613063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742066756e64730000000000000000000000000000604482015260640161095b565b336000908152600b6020526040902054158015906130815750478311155b1561319557336000908152600b6020526040812080548592906130a5908490615362565b9250508190555082600c60008282546130be9190615362565b909155505060405173ffffffffffffffffffffffffffffffffffffffff85169084156108fc029085906000818181858888f19350505050158015613106573d6000803e3d6000fd5b506040805160608082526005908201527f73706c6974000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff861660208201529081018490527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a00160405180910390a16001915050610996565b60005473ffffffffffffffffffffffffffffffffffffffff163314613216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4d757374206265206f776e657200000000000000000000000000000000000000604482015260640161095b565b60405173ffffffffffffffffffffffffffffffffffffffff85169084156108fc029085906000818181858888f19350505050158015613259573d6000803e3d6000fd5b506040805160608082526005908201527f6f776e6572000000000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff861660208201529081018490527fd0cfd60d55acd3226ac0fafab52ad35f0ab2fb6eedb946f7d8405108d71df46d9060a00160405180910390a15060019392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095b565b81518351146133fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161095b565b73ffffffffffffffffffffffffffffffffffffffff841661349d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161095b565b336134ac818787878787613e95565b60005b845181101561361f5760008582815181106134cc576134cc615320565b6020026020010151905060008583815181106134ea576134ea615320565b602090810291909101810151600084815260018352604080822073ffffffffffffffffffffffffffffffffffffffff8e1683529093529190912054909150818110156135b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161095b565b600083815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e8116855292528083208585039055908b1682528120805484929061360490849061534f565b9250508190555050505080613618906152e8565b90506134af565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161369692919061550e565b60405180910390a4611e78818787878787613f47565b606060006136b9836141d1565b600101905060008167ffffffffffffffff8111156136d9576136d9614874565b6040519080825280601f01601f191660200182016040528015613703576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461370d57509392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361389a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161095b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff84166139d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161095b565b3360006139e1856142b3565b905060006139ee856142b3565b90506139ff83600089858589613e95565b600086815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845290915281208054879290613a3e90849061534f565b9091555050604080518781526020810187905273ffffffffffffffffffffffffffffffffffffffff808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613aab836000898989896142fe565b50505050505050565b6009546000908103613ac857506001919050565b81600c6000828254613ada919061534f565b90915550600090508060015b600954811015613bcc576064600a600060098481548110613b0957613b09615320565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054613b4590876154f7565b613b4f919061553c565b915081600b600060098481548110613b6957613b69615320565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190613baa90849061534f565b90915550613bba9050828461534f565b9250613bc5816152e8565b9050613ae6565b506000613bd98386615362565b905080600b60006009600081548110613bf457613bf4615320565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190613c3590849061534f565b9091555060019695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416613ce8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161095b565b336000613cf4856142b3565b90506000613d01856142b3565b9050613d11838989858589613e95565b600086815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205485811015613dd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161095b565b600087815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d8116855292528083208985039055908a16825281208054889290613e1d90849061534f565b9091555050604080518881526020810188905273ffffffffffffffffffffffffffffffffffffffff808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613e8a848a8a8a8a8a6142fe565b505050505050505050565b613ea38686868686866144ab565b60005b8351811015613aab5773ffffffffffffffffffffffffffffffffffffffff851615613f37578460066000868481518110613ee257613ee2615320565b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b613f40816152e8565b9050613ea6565b73ffffffffffffffffffffffffffffffffffffffff84163b15611e78576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190613fbe9089908990889088908890600401615577565b6020604051808303816000875af1925050508015614017575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252614014918101906155e2565b60015b614100576140236155ff565b806308c379a003614076575061403761561b565b806140425750614078565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b9190614861565b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161095b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613aab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161095b565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061421a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614246576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061426457662386f26fc10000830492506010015b6305f5e100831061427c576305f5e100830492506008015b612710831061429057612710830492506004015b606483106142a2576064830492506002015b600a83106109965760010192915050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106142ed576142ed615320565b602090810291909101015292915050565b73ffffffffffffffffffffffffffffffffffffffff84163b15611e78576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e619061437590899089908890889088906004016156c3565b6020604051808303816000875af19250505080156143ce575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526143cb918101906155e2565b60015b6143da576140236155ff565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613aab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161095b565b73ffffffffffffffffffffffffffffffffffffffff851661453f5760005b835181101561453d578281815181106144e4576144e4615320565b60200260200101516004600086848151811061450257614502615320565b602002602001015181526020019081526020016000206000828254614527919061534f565b909155506145369050816152e8565b90506144c9565b505b73ffffffffffffffffffffffffffffffffffffffff8416611e785760005b8351811015613aab57600084828151811061457a5761457a615320565b60200260200101519050600084838151811061459857614598615320565b602002602001015190506000600460008481526020019081526020016000205490508181101561464a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c79000000000000000000000000000000000000000000000000606482015260840161095b565b60009283526004602052604090922091039055614666816152e8565b905061455d565b8280548282559060005260206000209081019282156146e5579160200282015b828111156146e55781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061468d565b506146f19291506146f5565b5090565b5b808211156146f157600081556001016146f6565b73ffffffffffffffffffffffffffffffffffffffff81168114610e2157600080fd5b6000806040838503121561473f57600080fd5b823561474a8161470a565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610e2157600080fd5b60006020828403121561479857600080fd5b81356147a381614758565b9392505050565b803580151581146147ba57600080fd5b919050565b6000602082840312156147d157600080fd5b6147a3826147aa565b6000602082840312156147ec57600080fd5b5035919050565b60005b8381101561480e5781810151838201526020016147f6565b50506000910152565b6000815180845261482f8160208601602086016147f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006147a36020830184614817565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff821117156148e7576148e7614874565b6040525050565b600067ffffffffffffffff82111561490857614908614874565b5060051b60200190565b600082601f83011261492357600080fd5b81356020614930826148ee565b60405161493d82826148a3565b83815260059390931b850182019282810191508684111561495d57600080fd5b8286015b848110156149785780358352918301918301614961565b509695505050505050565b600082601f83011261499457600080fd5b813567ffffffffffffffff8111156149ae576149ae614874565b6040516149e360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011601826148a3565b8181528460208386010111156149f857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215614a2d57600080fd5b8535614a388161470a565b94506020860135614a488161470a565b9350604086013567ffffffffffffffff80821115614a6557600080fd5b614a7189838a01614912565b94506060880135915080821115614a8757600080fd5b614a9389838a01614912565b93506080880135915080821115614aa957600080fd5b50614ab688828901614983565b9150509295509295909350565b60e081526000614ad660e083018a614817565b602083019890985250604081019590955260608501939093526080840191909152151560a0830152151560c090910152919050565b60008083601f840112614b1d57600080fd5b50813567ffffffffffffffff811115614b3557600080fd5b602083019150836020828501011115614b4d57600080fd5b9250929050565b60008060008060008060008060006101008a8c031215614b7357600080fd5b8935985060208a013567ffffffffffffffff811115614b9157600080fd5b614b9d8c828d01614b0b565b90995097505060408a0135955060608a0135945060808a0135935060a08a01359250614bcb60c08b016147aa565b9150614bd960e08b016147aa565b90509295985092959850929598565b60008083601f840112614bfa57600080fd5b50813567ffffffffffffffff811115614c1257600080fd5b6020830191508360208260051b8501011115614b4d57600080fd5b60008060008060408587031215614c4357600080fd5b843567ffffffffffffffff80821115614c5b57600080fd5b614c6788838901614be8565b90965094506020870135915080821115614c8057600080fd5b50614c8d87828801614be8565b95989497509550505050565b60008060408385031215614cac57600080fd5b823567ffffffffffffffff80821115614cc457600080fd5b818501915085601f830112614cd857600080fd5b81356020614ce5826148ee565b604051614cf282826148a3565b83815260059390931b8501820192828101915089841115614d1257600080fd5b948201945b83861015614d39578535614d2a8161470a565b82529482019490820190614d17565b96505086013592505080821115614d4f57600080fd5b50614d5c85828601614912565b9150509250929050565b600081518084526020808501945080840160005b83811015614d9657815187529582019590820190600101614d7a565b509495945050505050565b6020815260006147a36020830184614d66565b600060208284031215614dc657600080fd5b81356147a38161470a565b6000806000806000806000806000806000806101408d8f031215614df457600080fd5b8c359b5060208d01359a5067ffffffffffffffff60408e01351115614e1857600080fd5b614e288e60408f01358f01614b0b565b909a50985067ffffffffffffffff60608e01351115614e4657600080fd5b614e568e60608f01358f01614b0b565b909850965060808d0135955060a08d0135945060c08d0135935060e08d01359250614e846101008e016147aa565b9150614e936101208e016147aa565b90509295989b509295989b509295989b565b60008060208385031215614eb857600080fd5b823567ffffffffffffffff811115614ecf57600080fd5b614edb85828601614b0b565b90969095509350505050565b60008060408385031215614efa57600080fd5b8235614f058161470a565b9150614f13602084016147aa565b90509250929050565b60008060408385031215614f2f57600080fd5b50508035926020909101359150565b600080600080600060608688031215614f5657600080fd5b85359450602086013567ffffffffffffffff80821115614f7557600080fd5b614f8189838a01614be8565b90965094506040880135915080821115614f9a57600080fd5b50614fa788828901614be8565b969995985093965092949392505050565b60008060408385031215614fcb57600080fd5b8235614fd68161470a565b91506020830135614fe68161470a565b809150509250929050565b600080600080600060a0868803121561500957600080fd5b85356150148161470a565b945060208601356150248161470a565b93506040860135925060608601359150608086013567ffffffffffffffff81111561504e57600080fd5b614ab688828901614983565b600181811c9082168061506e57607f821691505b6020821081036150a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7781527f63642f736561736f6e312f00000000000000000000000000000000000000000060208201526000825161510b81602b8501602087016147f3565b91909101602b0192915050565b6000825161512a8184602087016147f3565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000920191825250600501919050565b601f8211156122ad57600081815260208120601f850160051c810160208610156151805750805b601f850160051c820191505b81811015611e785782815560010161518c565b815167ffffffffffffffff8111156151b9576151b9614874565b6151cd816151c7845461505a565b84615159565b602080601f83116001811461522057600084156151ea5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611e78565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561526d5788860151825594840194600190910190840161524e565b50858210156152a957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615319576153196152b9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610996576109966152b9565b81810381811115610996576109966152b9565b8284823760008382016000815283516153928183602088016147f3565b0195945050505050565b600084516153ae8184602089016147f3565b8201838582376000930192835250909392505050565b67ffffffffffffffff8311156153dc576153dc614874565b6153f0836153ea835461505a565b83615159565b6000601f841160018114615442576000851561540c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355610c85565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156154915786850135825560209485019460019092019101615471565b50868210156154cc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156154f057600080fd5b5051919050565b8082028115828204841417610996576109966152b9565b6040815260006155216040830185614d66565b82810360208401526155338185614d66565b95945050505050565b600082615572577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526155b060a0830186614d66565b82810360608401526155c28186614d66565b905082810360808401526155d68185614817565b98975050505050505050565b6000602082840312156155f457600080fd5b81516147a381614758565b600060033d11156156185760046000803e5060005160e01c5b90565b600060443d10156156295790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff816024840111818411171561567757505050505090565b828501915081518181111561568f5750505050505090565b843d87010160208285010111156156a95750505050505090565b6156b8602082860101876148a3565b509095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261570860a0830184614817565b97965050505050505056fe68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f36382e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f34322e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f34312e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f33312e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f32312e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f33322e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f34332e6a736f6e68747470733a2f2f73746f726167652e686173686b752e636f6d2f6170692f7763642f736561736f6e312f31302e6a736f6ea2646970667358221220adbc8d1e3af294c59414cfa5b1b5890f9326877c4afdb72eefa219fb4f84a64764736f6c63430008120033

Deployed Bytecode Sourcemap

84020:13521:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22717:230;;;;;;;;;;-1:-1:-1;22717:230:0;;;;;:::i;:::-;;:::i;:::-;;;639:25:1;;;627:2;612:18;22717:230:0;;;;;;;;21740:310;;;;;;;;;;-1:-1:-1;21740:310:0;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;21740:310:0;1107:187:1;87078:77:0;;;;;;;;;;-1:-1:-1;87078:77:0;;;;;:::i;:::-;;:::i;:::-;;86611:191;;;;;;;;;;-1:-1:-1;86611:191:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;86808:174::-;;;;;;;;;;-1:-1:-1;86808:174:0;;;;;:::i;:::-;;:::i;89694:101::-;;;;;;;;;;-1:-1:-1;89768:21:0;89694:101;;24660:438;;;;;;;;;;-1:-1:-1;24660:438:0;;;;;:::i;:::-;;:::i;96678:429::-;;;;;;;;;;;;;:::i;84450:47::-;;;;;;;;;;-1:-1:-1;84450:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;86125:36::-;;;;;;;;;;-1:-1:-1;86125:36:0;;;;;:::i;:::-;;:::i;:::-;;;6615:42:1;6603:55;;;6585:74;;6573:2;6558:18;86125:36:0;6439:226:1;93882:2790:0;;;;;;;;;;;;;:::i;84688:47::-;;;;;;;;;;-1:-1:-1;84688:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;85859:25;;;;;;;;;;-1:-1:-1;85859:25:0;;;;;;;;84775:327;;;;;;;;;;-1:-1:-1;84775:327:0;;;;;:::i;:::-;;:::i;90879:517::-;;;;;;;;;;-1:-1:-1;90879:517:0;;;;;:::i;:::-;;:::i;23113:524::-;;;;;;;;;;-1:-1:-1;23113:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;79495:122::-;;;;;;;;;;-1:-1:-1;79495:122:0;;;;;:::i;:::-;79552:4;79373:16;;;:12;:16;;;;;;-1:-1:-1;;;79495:122:0;93506:103;;;;;;;;;;-1:-1:-1;93506:103:0;;;;;:::i;:::-;93560:7;93583:20;;;:12;:20;;;;;;;;;93506:103;85809:21;;;;;;;;;;;;;:::i;82596:103::-;;;;;;;;;;;;;:::i;86412:33::-;;;;;;;;;;;;;;;;89204:440;;;;;;;;;;-1:-1:-1;89204:440:0;;;;;:::i;:::-;;:::i;81948:87::-;;;;;;;;;;-1:-1:-1;81994:7:0;82021:6;;;81948:87;;85180:599;;;;;;;;;;-1:-1:-1;85180:599:0;;;;;:::i;:::-;;:::i;86988:84::-;;;;;;;;;;-1:-1:-1;86988:84:0;;;;;:::i;:::-;;:::i;93681:195::-;;;;;;;;;;;;;:::i;23710:155::-;;;;;;;;;;-1:-1:-1;23710:155:0;;;;;:::i;:::-;;:::i;86331:52::-;;;;;;;;;;-1:-1:-1;86331:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;92620:263;;;;;;;;;;-1:-1:-1;92620:263:0;;;;;:::i;:::-;;:::i;86046:29::-;;;;;;;;;;-1:-1:-1;86046:29:0;;;;;;;;;;;79284:113;;;;;;;;;;-1:-1:-1;79284:113:0;;;;;:::i;:::-;79346:7;79373:16;;;:12;:16;;;;;;;79284:113;86214:51;;;;;;;;;;-1:-1:-1;86214:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;86576:28;;;;;;;;;;;;;;;;87718:1404;;;;;;:::i;:::-;;:::i;97113:425::-;;;;;;;;;;;;;:::i;87306:406::-;;;;;;;;;;-1:-1:-1;87306:406:0;;;;;:::i;:::-;;:::i;23937:168::-;;;;;;;;;;-1:-1:-1;23937:168:0;;;;;:::i;:::-;24060:27;;;;24036:4;24060:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;23937:168;87161:103;;;;;;;;;;-1:-1:-1;87161:103:0;;;;;:::i;:::-;;:::i;24177:406::-;;;;;;;;;;-1:-1:-1;24177:406:0;;;;;:::i;:::-;;:::i;82854:201::-;;;;;;;;;;-1:-1:-1;82854:201:0;;;;;:::i;:::-;;:::i;89855:875::-;;;;;;;;;;-1:-1:-1;89855:875:0;;;;;:::i;:::-;;:::i;22717:230::-;22803:7;22831:21;;;22823:76;;;;;;;16584:2:1;22823:76:0;;;16566:21:1;16623:2;16603:18;;;16596:30;16662:34;16642:18;;;16635:62;16733:12;16713:18;;;16706:40;16763:19;;22823:76:0;;;;;;;;;-1:-1:-1;22917:13:0;;;;:9;:13;;;;;;;;:22;;;;;;;;;;;22717:230;;;;;:::o;21740:310::-;21842:4;21879:41;;;21894:26;21879:41;;:110;;-1:-1:-1;21937:52:0;;;21952:37;21937:52;21879:110;:163;;;-1:-1:-1;20185:25:0;20170:40;;;;22006:36;20061:157;87078:77;81834:13;:11;:13::i;:::-;87135:6:::1;:14:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;87078:77::o;86611:191::-;86698:20;;;;:10;:20;;;;;;;;:26;;86672:13;;86698:26;;;;;86694:80;;;86742:20;;;;:10;:20;;;;;86735:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86611:191;;;:::o;86694:80::-;86789:7;86782:14;;;;;:::i;86808:174::-;86862:7;86882:20;;;:10;:20;;;;;;;:26;;;;;;;86878:82;;;-1:-1:-1;86926:20:0;;;;:10;:20;;;;;:26;;;;86808:174::o;86878:82::-;-1:-1:-1;86975:1:0;;86808:174;-1:-1:-1;86808:174:0:o;24660:438::-;24893:20;;;18965:10;24893:20;;:60;;-1:-1:-1;24917:36:0;24934:4;18965:10;23937:168;:::i;24917:36::-;24871:156;;;;;;;17437:2:1;24871:156:0;;;17419:21:1;17476:2;17456:18;;;17449:30;17515:34;17495:18;;;17488:62;17586:16;17566:18;;;17559:44;17620:19;;24871:156:0;17235:410:1;24871:156:0;25038:52;25061:4;25067:2;25071:3;25076:7;25085:4;25038:22;:52::i;:::-;24660:438;;;;;:::o;96678:429::-;81834:13;:11;:13::i;:::-;96789:3:::1;96772:330;96798:3;96794:1;:7;96772:330;;;96833:261;;;;;;;;96940:19;96957:1;96940:16;:19::i;:::-;96879:81;;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;;96853:138:::1;::::0;96879:81:::1;96853:138;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;96833:261;;;97002:17:::1;96853:138;96833:261:::0;;::::1;::::0;;;;97030:1:::1;96833:261:::0;;;;;;97042:1:::1;96833:261:::0;;;;-1:-1:-1;96833:261:0;;;;;;;;;;;;;;;;;96817:13;;;:10:::1;:13:::0;;;;:277;;:13;;:277:::1;::::0;:13;:277:::1;:::i;:::-;-1:-1:-1::0;96817:277:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;96803:3:::1;::::0;::::1;:::i;:::-;;;96772:330;;;;96678:429::o:0;84450:47::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;84450:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;84450:47:0;-1:-1:-1;84450:47:0;;;;;;;;;;:::o;86125:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86125:36:0;:::o;93882:2790::-;81834:13;:11;:13::i;:::-;93999:162:::1;::::0;;;;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;94078:19:::1;93999:162;::::0;;::::1;::::0;;;;-1:-1:-1;93999:162:0;;;;;;94116:1:::1;93999:162:::0;;;;;;;;;;;;;;;;;;;;;;;;;;93993:2:::1;93982:14:::0;;;:10:::1;:14:::0;;:179;;:14;;;;:179:::1;::::0;:14;:179:::1;:::i;:::-;-1:-1:-1::0;93982:179:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;;;;::::1;::::0;;;94245:337:::1;94269:2;94265:1;:6;94245:337;;;94303:271;;;;;;;;94410:19;94427:1;94410:16;:19::i;:::-;94349:81;;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;;94323:138:::1;::::0;94349:81:::1;94323:138;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;94303:271;;;94472:17:::1;94323:138;94303:271:::0;;::::1;::::0;;;;-1:-1:-1;94303:271:0;;;;;;;;;;;;94524:10:::1;94303:271:::0;;;;;;;;;;;;;;;;;;;94287:13;;;:10:::1;:13:::0;;;;:287;;:13;;:287:::1;::::0;:13;:287:::1;:::i;:::-;-1:-1:-1::0;94287:287:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;94273:3:::1;::::0;::::1;:::i;:::-;;;94245:337;;;-1:-1:-1::0;94686:171:0::1;::::0;;;;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;94765:17:::1;94686:171;::::0;;::::1;::::0;;;;94791:3:::1;94686:171:::0;;;;94803:1:::1;94686:171:::0;;;;94813:10:::1;94686:171:::0;;;;-1:-1:-1;94686:171:0;;;;;;;;;;;;;;;94680:2:::1;94669:14:::0;;;:10:::1;:14:::0;;:188;;:14;;;;:188:::1;::::0;:14;:188:::1;:::i;:::-;-1:-1:-1::0;94669:188:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;94942:2:::1;94925:330;94950:2;94946:1;:6;94925:330;;;94984:263;;;;;;;;95091:19;95108:1;95091:16;:19::i;:::-;95030:81;;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;;95004:138:::1;::::0;95030:81:::1;95004:138;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;94984:263;;;95153:19:::1;95004:138;94984:263:::0;;::::1;::::0;;;;95183:1:::1;94984:263:::0;;;;;;-1:-1:-1;94984:263:0;;;;;;;;;;;;;;;;;;;;;;;94968:13;;;:10:::1;:13:::0;;;;:279;;:13;;:279:::1;::::0;:13;:279:::1;:::i;:::-;-1:-1:-1::0;94968:279:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;94954:3:::1;::::0;::::1;:::i;:::-;;;94925:330;;;-1:-1:-1::0;95327:161:0::1;::::0;;;;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;95406:17:::1;95327:161;::::0;;::::1;::::0;;;;95432:1:::1;95327:161:::0;;;;;;95442:2:::1;95327:161:::0;;;;-1:-1:-1;95327:161:0;;;;;;;;;;;;;;;;;95321:2:::1;95310:14:::0;;;:10:::1;:14:::0;;:178;;:14;;;;:178:::1;::::0;:14;:178:::1;:::i;:::-;-1:-1:-1::0;95310:178:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;::::1;::::0;::::1;;::::0;::::1;;::::0;;;95562:161;;;;;;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;95641:17:::1;95562:161;::::0;;::::1;::::0;;;;95667:1:::1;95562:161:::0;;;;;;95677:2:::1;95562:161:::0;;;;-1:-1:-1;95562:161:0;;;;;;;;;;;;;;;;;95556:2:::1;95545:14:::0;;;:10:::1;:14:::0;;:178;;:14;;;;:178:::1;::::0;:14;:178:::1;:::i;:::-;-1:-1:-1::0;95545:178:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;::::1;::::0;::::1;;::::0;::::1;;::::0;;;95797:161;;;;;;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;95876:17:::1;95797:161;::::0;;::::1;::::0;;;;95902:1:::1;95797:161:::0;;;;;;95912:2:::1;95797:161:::0;;;;-1:-1:-1;95797:161:0;;;;;;;;;;;;;;;;;95780:14;;;;:10:::1;:14:::0;;:178;;:14;;;;:178:::1;::::0;:14;:178:::1;:::i;:::-;-1:-1:-1::0;95780:178:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;::::1;::::0;::::1;;::::0;::::1;;::::0;;;96033:161;;;;;;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;96112:17:::1;96033:161;::::0;;::::1;::::0;;;;96138:1:::1;96033:161:::0;;;;;;96148:2:::1;96033:161:::0;;;;-1:-1:-1;96033:161:0;;;;;;;;;;;;;;;;;96027:2:::1;96016:14:::0;;;:10:::1;:14:::0;;:178;;:14;;;;:178:::1;::::0;:14;:178:::1;:::i;:::-;-1:-1:-1::0;96016:178:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;::::1;::::0;::::1;;::::0;::::1;;::::0;;;96269:161;;;;;;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;96348:17:::1;96269:161;::::0;;::::1;::::0;;;;96374:1:::1;96269:161:::0;;;;;;96384:2:::1;96269:161:::0;;;;-1:-1:-1;96269:161:0;;;;;;;;;;;;;;;;;96263:2:::1;96252:14:::0;;;:10:::1;:14:::0;;:178;;:14;;;;:178:::1;::::0;:14;:178:::1;:::i;:::-;-1:-1:-1::0;96252:178:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;::::1;::::0;::::1;;::::0;::::1;;::::0;;;96505:161;;;;;;;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;96584:17:::1;96505:161;::::0;;::::1;::::0;;;;96610:1:::1;96505:161:::0;;;;;;96620:2:::1;96505:161:::0;;;;-1:-1:-1;96505:161:0;;;;;;;;;;;;;;;;;96499:2:::1;96488:14:::0;;;:10:::1;:14:::0;;:178;;:14;;;;:178:::1;::::0;:14;:178:::1;:::i;:::-;-1:-1:-1::0;96488:178:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;93882:2790::o;84775:327::-;81834:13;:11;:13::i;:::-;85026:70:::1;;;;;;;;85036:4;;85026:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;85026:70:0;;;-1:-1:-1;;;85026:70:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;::::1;;::::0;;;;;::::1;;::::0;;;;;;;;85003:20;;;:10:::1;:20:::0;;;:93;;:20;;:93:::1;::::0;:20;:93:::1;:::i;:::-;-1:-1:-1::0;85003:93:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;;;;84775:327:0:o;90879:517::-;81834:13;:11;:13::i;:::-;91013:36;;::::1;91005:64;;;::::0;::::1;::::0;;21585:2:1;91005:64:0::1;::::0;::::1;21567:21:1::0;21624:2;21604:18;;;21597:30;21663:17;21643:18;;;21636:45;21698:18;;91005:64:0::1;21383:339:1::0;91005:64:0::1;91078:13;::::0;91100:83:::1;91120:19:::0;;::::1;91100:83;;;91164:8;;91173:1;91164:11;;;;;;;:::i;:::-;;;;;;;91155:20;;;;;:::i;:::-;::::0;-1:-1:-1;91141:3:0::1;::::0;::::1;:::i;:::-;;;91100:83;;;;91199:5;91208:3;91199:12;91191:42;;;::::0;::::1;::::0;;22248:2:1;91191:42:0::1;::::0;::::1;22230:21:1::0;22287:2;22267:18;;;22260:30;22326:19;22306:18;;;22299:47;22363:18;;91191:42:0::1;22046:341:1::0;91191:42:0::1;91242:32;:19;91264:10:::0;;91242:32:::1;:::i;:::-;;91288:9;91283:108;91303:19:::0;;::::1;91283:108;;;91372:8;;91381:1;91372:11;;;;;;;:::i;:::-;;;;;;;91338:16;:31;91355:10;;91366:1;91355:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;91338:31;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;91338:31:0;:45;91324:3:::1;::::0;::::1;:::i;:::-;;;91283:108;;;;90998:398;90879:517:::0;;;;:::o;23113:524::-;23269:16;23330:3;:10;23311:8;:15;:29;23303:83;;;;;;;22594:2:1;23303:83:0;;;22576:21:1;22633:2;22613:18;;;22606:30;22672:34;22652:18;;;22645:62;22743:11;22723:18;;;22716:39;22772:19;;23303:83:0;22392:405:1;23303:83:0;23399:30;23446:8;:15;23432:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23432:30:0;;23399:63;;23480:9;23475:122;23499:8;:15;23495:1;:19;23475:122;;;23555:30;23565:8;23574:1;23565:11;;;;;;;;:::i;:::-;;;;;;;23578:3;23582:1;23578:6;;;;;;;;:::i;:::-;;;;;;;23555:9;:30::i;:::-;23536:13;23550:1;23536:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;23516:3;;;:::i;:::-;;;23475:122;;;-1:-1:-1;23616:13:0;23113:524;-1:-1:-1;;;23113:524:0:o;85809:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;82596:103::-;81834:13;:11;:13::i;:::-;82661:30:::1;82688:1;82661:18;:30::i;:::-;82596:103::o:0;89204:440::-;89393:27;;;89263:7;89393:27;;;:17;:27;;;;;;:31;89389:88;;-1:-1:-1;89442:27:0;;;;;;:17;:27;;;;;;;89204:440::o;89389:88::-;81994:7;82021:6;;89489:19;;;82021:6;;89489:19;:65;;;;;89536:18;;89512:21;:42;89489:65;89485:137;;;89596:18;;89572:42;;:21;:42;:::i;85180:599::-;81834:13;:11;:13::i;:::-;85496;85479:295:::1;85516:11;85511:1;:16;85479:295;;85559:207;;;;;;;;85607:9;;85618:19;85635:1;85618:16;:19::i;:::-;85593:45;;;;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;;85579:69:::1;::::0;85640:7;;;;85593:45:::1;85579:69;;:::i;:::-;;;;;;;;;;;;;85559:207;;;;85659:6;85559:207;;;;85676:4;85559:207;;;;85691:16;85559:207;;;;85718:4;85559:207;;;;85733:7;85559:207;;;;;;85751:6;85559:207;;;;::::0;85543:10:::1;:13;85554:1;85543:13;;;;;;;;;;;:223;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;85543:223:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;85529:3:::1;::::0;::::1;:::i;:::-;;;85479:295;;;;85180:599:::0;;;;;;;;;;;;:::o;86988:84::-;81834:13;:11;:13::i;:::-;87052:7:::1;:14;87062:4:::0;;87052:7;:14:::1;:::i;:::-;;86988:84:::0;;:::o;93681:195::-;93758:15;;93726:7;;93758:15;;;93750:38;93758:15;93742:75;;;;;;;25395:2:1;93742:75:0;;;25377:21:1;25434:2;25414:18;;;25407:30;25473:26;25453:18;;;25446:54;25517:18;;93742:75:0;25193:348:1;93742:75:0;93831:15;;;;;;;:25;18965:10;93831:39;;;;;;;;;;6615:42:1;6603:55;;;93831:39:0;;;6585:74:1;6558:18;;93831:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;93824:46;;93681:195;:::o;23710:155::-;23805:52;18965:10;23838:8;23848;23805:18;:52::i;:::-;23710:155;;:::o;92620:263::-;92711:4;81834:13;:11;:13::i;:::-;89768:21;92732:7:::1;:31;;92724:62;;;::::0;::::1;::::0;;25937:2:1;92724:62:0::1;::::0;::::1;25919:21:1::0;25976:2;25956:18;;;25949:30;26015:20;25995:18;;;25988:48;26053:18;;92724:62:0::1;25735:342:1::0;92724:62:0::1;92793:21;::::0;:12:::1;::::0;::::1;::::0;:21;::::1;;;::::0;92806:7;;92793:21:::1;::::0;;;92806:7;92793:12;:21;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;92826:33:0::1;::::0;;26348:2:1;26330:21;;;26387:1;26367:18;;;26360:29;26426:7;26420:3;26405:19;;26398:36;26520:42;26508:55;;26501:4;26486:20;;26479:85;26580:18;;;26573:34;;;92826:33:0::1;::::0;26466:3:1;26451:19;92826:33:0::1;;;;;;;-1:-1:-1::0;92873:4:0::1;92620:263:::0;;;;:::o;87718:1404::-;87789:27;87819:18;;;:10;:18;;;;;;;;87854:15;;;;;;;;;87846:40;;;;;;;26820:2:1;87846:40:0;;;26802:21:1;26859:2;26839:18;;;26832:30;26898:14;26878:18;;;26871:42;26930:18;;87846:40:0;26618:336:1;87846:40:0;87900:6;;;;87895:81;;87925:16;;;;;;87917:51;;;;;;;27161:2:1;87917:51:0;;;27143:21:1;27200:2;27180:18;;;27173:30;27239:24;27219:18;;;27212:52;27281:18;;87917:51:0;26959:346:1;87917:51:0;88021:9;88010:7;87992:9;:15;;;:25;;;;:::i;:::-;:38;87984:75;;;;;;;27685:2:1;87984:75:0;;;27667:21:1;27724:2;27704:18;;;27697:30;27763:26;27743:18;;;27736:54;27807:18;;87984:75:0;27483:348:1;87984:75:0;88072:13;;;;:17;88068:115;;88126:9;:13;;;88108:15;:31;88100:75;;;;;;;28038:2:1;88100:75:0;;;28020:21:1;28077:2;28057:18;;;28050:30;28116:33;28096:18;;;28089:61;28167:18;;88100:75:0;27836:355:1;88100:75:0;88195:25;;;;:29;88191:278;;88251:15;;;;;88243:38;88251:15;88235:75;;;;;;;25395:2:1;88235:75:0;;;25377:21:1;25434:2;25414:18;;;25407:30;25473:26;25453:18;;;25446:54;25517:18;;88235:75:0;25193:348:1;88235:75:0;88382:25;;;;88339:15;;;;;;;:25;18965:10;88339:39;;;;;;;;;;6615:42:1;6603:55;;;88339:39:0;;;6585:74:1;6558:18;;88339:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;88321:140;;;;;;;28398:2:1;88321:140:0;;;28380:21:1;;;28417:18;;;28410:30;28476:34;28456:18;;;28449:62;28528:18;;88321:140:0;28196:356:1;88321:140:0;88481:13;;;;:17;88477:121;;88550:13;;;;79346:7;79373:16;;;:12;:16;;;;;;88517:29;;88539:7;;88517:29;:::i;:::-;:46;;88509:81;;;;;;;28759:2:1;88509:81:0;;;28741:21:1;28798:2;28778:18;;;28771:30;28837:24;28817:18;;;28810:52;28879:18;;88509:81:0;28557:346:1;88509:81:0;88606:40;18965:10;88626:6;88634:7;88606:40;;;;;;;;;;;;:5;:40::i;:::-;88659:8;;:12;88655:430;;88722:8;;88682:26;88711:20;;;:10;:20;;;;;88746:24;;;;:28;88742:336;;88803:15;;;;;88795:38;88803:15;88787:75;;;;;;;25395:2:1;88787:75:0;;;25377:21:1;25434:2;25414:18;;;25407:30;25473:26;25453:18;;;25446:54;25517:18;;88787:75:0;25193:348:1;88787:75:0;88919:24;;;;88877:15;;;;;;;:25;18965:10;88877:39;;;;;;;;;;6615:42:1;6603:55;;;88877:39:0;;;6585:74:1;6558:18;;88877:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;88873:133;;;88958:36;18965:10;88964:12;88978:8;;88988:1;88958:36;;;;;;;;;;;;:5;:36::i;:::-;88742:336;;;89032:36;18965:10;89038:12;18885:98;89032:36;88673:412;88655:430;89093:23;89106:9;89093:12;:23::i;:::-;;87782:1340;87718:1404;;:::o;97113:425::-;81834:13;:11;:13::i;:::-;97220:3:::1;97203:330;97229:3;97225:1;:7;97203:330;;;97264:261;;;;;;;;97371:19;97388:1;97371:16;:19::i;:::-;97310:81;;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;;97284:138:::1;::::0;97310:81:::1;97284:138;;:::i;:::-;;::::0;;;;;::::1;::::0;;;;;;97264:261;;;97433:17:::1;97284:138;97264:261:::0;;::::1;::::0;;;;97461:1:::1;97264:261:::0;;;;;;97473:1:::1;97264:261:::0;;;;-1:-1:-1;97264:261:0;;;;;;;;;;;;;;;;;97248:13;;;:10:::1;:13:::0;;;;:277;;:13;;:277:::1;::::0;:13;:277:::1;:::i;:::-;-1:-1:-1::0;97248:277:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;::::1;;::::0;;;;;;;;;;;;::::1;::::0;;97234:3:::1;::::0;::::1;:::i;:::-;;;97203:330;;87306:406:::0;81834:13;:11;:13::i;:::-;87452:20:::1;::::0;;;:10:::1;:20;::::0;;;;;;;:26:::1;::::0;::::1;::::0;::::1;;;87444:64;;;::::0;::::1;::::0;;29110:2:1;87444:64:0::1;::::0;::::1;29092:21:1::0;29149:2;29129:18;;;29122:30;29188:27;29168:18;;;29161:55;29233:18;;87444:64:0::1;28908:349:1::0;87444:64:0::1;87525:36:::0;;::::1;87517:69;;;::::0;::::1;::::0;;29464:2:1;87517:69:0::1;::::0;::::1;29446:21:1::0;29503:2;29483:18;;;29476:30;29542:22;29522:18;;;29515:50;29582:18;;87517:69:0::1;29262:344:1::0;87517:69:0::1;87600:9;87595:112;87615:21:::0;;::::1;87595:112;;;87652:47;87658:10;;87669:1;87658:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;87673:8;87683;;87692:1;87683:11;;;;;;;:::i;:::-;;;;;;;87652:47;;;;;;;;;;;::::0;:5:::1;:47::i;:::-;87638:3;::::0;::::1;:::i;:::-;;;87595:112;;87161:103:::0;81834:13;:11;:13::i;:::-;87232:15:::1;:26:::0;;::::1;::::0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;87161:103::o;24177:406::-;24385:20;;;18965:10;24385:20;;:60;;-1:-1:-1;24409:36:0;24426:4;18965:10;23937:168;:::i;24409:36::-;24363:156;;;;;;;17437:2:1;24363:156:0;;;17419:21:1;17476:2;17456:18;;;17449:30;17515:34;17495:18;;;17488:62;17586:16;17566:18;;;17559:44;17620:19;;24363:156:0;17235:410:1;24363:156:0;24530:45;24548:4;24554:2;24558;24562:6;24570:4;24530:17;:45::i;82854:201::-;81834:13;:11;:13::i;:::-;82943:22:::1;::::0;::::1;82935:73;;;::::0;::::1;::::0;;29813:2:1;82935:73:0::1;::::0;::::1;29795:21:1::0;29852:2;29832:18;;;29825:30;29891:34;29871:18;;;29864:62;29962:8;29942:18;;;29935:36;29988:19;;82935:73:0::1;29611:402:1::0;82935:73:0::1;83019:28;83038:8;83019:18;:28::i;89855:875::-:0;89929:4;;89966:24;18965:10;89204:440;:::i;89966:24::-;89942:48;;90016:13;90005:7;:24;;89997:55;;;;;;;30220:2:1;89997:55:0;;;30202:21:1;30259:2;30239:18;;;30232:30;30298:20;30278:18;;;30271:48;30336:18;;89997:55:0;30018:342:1;89997:55:0;18965:10;90179:1;90145:31;;;:17;:31;;;;;;:35;;;;:70;;-1:-1:-1;89768:21:0;90184:7;:31;;90145:70;90141:343;;;18965:10;90293:31;;;;:17;:31;;;;;:42;;90328:7;;90293:31;:42;;90328:7;;90293:42;:::i;:::-;;;;;;;;90366:7;90344:18;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;90384:21:0;;:12;;;;:21;;;;;90397:7;;90384:21;;;;90397:7;90384:12;:21;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90421:33:0;;;30631:2:1;30613:21;;;30670:1;30650:18;;;30643:29;30709:7;30703:3;30688:19;;30681:36;30803:42;30791:55;;30784:4;30769:20;;30762:85;30863:18;;;30856:34;;;90421:33:0;;30749:3:1;30734:19;90421:33:0;;;;;;;90472:4;90465:11;;;;;90141:343;81994:7;82021:6;;;18965:10;90590:23;90582:49;;;;;;;31103:2:1;90582:49:0;;;31085:21:1;31142:2;31122:18;;;31115:30;31181:15;31161:18;;;31154:43;31214:18;;90582:49:0;30901:337:1;90582:49:0;90640:21;;:12;;;;:21;;;;;90653:7;;90640:21;;;;90653:7;90640:12;:21;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90673:33:0;;;31509:2:1;31491:21;;;31548:1;31528:18;;;31521:29;31587:7;31581:3;31566:19;;31559:36;31681:42;31669:55;;31662:4;31647:20;;31640:85;31741:18;;;31734:34;;;90673:33:0;;31627:3:1;31612:19;90673:33:0;;;;;;;-1:-1:-1;90720:4:0;;89855:875;-1:-1:-1;;;89855:875:0:o;82113:132::-;81994:7;82021:6;82177:23;82021:6;18965:10;82177:23;82169:68;;;;;;;31981:2:1;82169:68:0;;;31963:21:1;;;32000:18;;;31993:30;32059:34;32039:18;;;32032:62;32111:18;;82169:68:0;31779:356:1;26894:1146:0;27121:7;:14;27107:3;:10;:28;27099:81;;;;;;;32342:2:1;27099:81:0;;;32324:21:1;32381:2;32361:18;;;32354:30;32420:34;32400:18;;;32393:62;32491:10;32471:18;;;32464:38;32519:19;;27099:81:0;32140:404:1;27099:81:0;27199:16;;;27191:66;;;;;;;32751:2:1;27191:66:0;;;32733:21:1;32790:2;32770:18;;;32763:30;32829:34;32809:18;;;32802:62;32900:7;32880:18;;;32873:35;32925:19;;27191:66:0;32549:401:1;27191:66:0;18965:10;27314:60;18965:10;27345:4;27351:2;27355:3;27360:7;27369:4;27314:20;:60::i;:::-;27392:9;27387:421;27411:3;:10;27407:1;:14;27387:421;;;27443:10;27456:3;27460:1;27456:6;;;;;;;;:::i;:::-;;;;;;;27443:19;;27477:14;27494:7;27502:1;27494:10;;;;;;;;:::i;:::-;;;;;;;;;;;;27521:19;27543:13;;;:9;:13;;;;;;:19;;;;;;;;;;;;;27494:10;;-1:-1:-1;27585:21:0;;;;27577:76;;;;;;;33157:2:1;27577:76:0;;;33139:21:1;33196:2;33176:18;;;33169:30;33235:34;33215:18;;;33208:62;33306:12;33286:18;;;33279:40;33336:19;;27577:76:0;32955:406:1;27577:76:0;27697:13;;;;:9;:13;;;;;;;;:19;;;;;;;;;;;27719:20;;;27697:42;;27769:17;;;;;;;:27;;27719:20;;27697:13;27769:27;;27719:20;;27769:27;:::i;:::-;;;;;;;;27428:380;;;27423:3;;;;:::i;:::-;;;27387:421;;;;27855:2;27825:47;;27849:4;27825:47;;27839:8;27825:47;;;27859:3;27864:7;27825:47;;;;;;;:::i;:::-;;;;;;;;27957:75;27993:8;28003:4;28009:2;28013:3;28018:7;28027:4;27957:35;:75::i;58844:716::-;58900:13;58951:14;58968:17;58979:5;58968:10;:17::i;:::-;58988:1;58968:21;58951:38;;59004:20;59038:6;59027:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59027:18:0;-1:-1:-1;59004:41:0;-1:-1:-1;59169:28:0;;;59185:2;59169:28;59226:288;59258:5;;59400:8;59395:2;59384:14;;59379:30;59258:5;59366:44;59456:2;59447:11;;;-1:-1:-1;59477:21:0;59226:288;59477:21;-1:-1:-1;59535:6:0;58844:716;-1:-1:-1;;;58844:716:0:o;83215:191::-;83289:16;83308:6;;;83325:17;;;;;;;;;;83358:40;;83308:6;;;;;;;83358:40;;83289:16;83358:40;83278:128;83215:191;:::o;33771:331::-;33926:8;33917:17;;:5;:17;;;33909:71;;;;;;;34227:2:1;33909:71:0;;;34209:21:1;34266:2;34246:18;;;34239:30;34305:34;34285:18;;;34278:62;34376:11;34356:18;;;34349:39;34405:19;;33909:71:0;34025:405:1;33909:71:0;33991:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;34053:41;;1247::1;;;34053::0;;1220:18:1;34053:41:0;;;;;;;33771:331;;;:::o;29358:729::-;29511:16;;;29503:62;;;;;;;34637:2:1;29503:62:0;;;34619:21:1;34676:2;34656:18;;;34649:30;34715:34;34695:18;;;34688:62;34786:3;34766:18;;;34759:31;34807:19;;29503:62:0;34435:397:1;29503:62:0;18965:10;29578:16;29643:21;29661:2;29643:17;:21::i;:::-;29620:44;;29675:24;29702:25;29720:6;29702:17;:25::i;:::-;29675:52;;29740:66;29761:8;29779:1;29783:2;29787:3;29792:7;29801:4;29740:20;:66::i;:::-;29819:13;;;;:9;:13;;;;;;;;:17;;;;;;;;;;:27;;29840:6;;29819:13;:27;;29840:6;;29819:27;:::i;:::-;;;;-1:-1:-1;;29862:52:0;;;35011:25:1;;;35067:2;35052:18;;35045:34;;;29862:52:0;;;;;29895:1;;29862:52;;;;;;34984:18:1;29862:52:0;;;;;;;30005:74;30036:8;30054:1;30058:2;30062;30066:6;30074:4;30005:30;:74::i;:::-;29492:595;;;29358:729;;;;:::o;91474:802::-;91555:19;:26;91538:4;;91555:31;;91551:65;;-1:-1:-1;91604:4:0;;91474:802;-1:-1:-1;91474:802:0:o;91551:65::-;91724:14;91702:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;91812:17:0;;-1:-1:-1;91812:17:0;91880:1;91863:248;91887:19;:26;91883:30;;91863:248;;;92004:3;91960:16;:40;91977:19;91997:1;91977:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;91960:40;;;;;;;;;;;;;91943:57;;:14;:57;:::i;:::-;91942:65;;;;:::i;:::-;91929:78;;92061:10;92016:17;:41;92034:19;92054:1;92034:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;92016:41;;;;;;;;;;;;:55;;:41;;92034:22;92016:55;;;;;:::i;:::-;;;;-1:-1:-1;92080:23:0;;-1:-1:-1;92093:10:0;92080:23;;:::i;:::-;;-1:-1:-1;91915:3:0;;;:::i;:::-;;;91863:248;;;-1:-1:-1;92119:29:0;92151:26;92168:9;92151:14;:26;:::i;:::-;92119:58;;92229:21;92184:17;:41;92202:19;92222:1;92202:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;92184:41;;;;;;;;;;;;:66;;:41;;92202:22;92184:66;;;;;:::i;:::-;;;;-1:-1:-1;92266:4:0;;91474:802;-1:-1:-1;;;;;;91474:802:0:o;25562:974::-;25750:16;;;25742:66;;;;;;;32751:2:1;25742:66:0;;;32733:21:1;32790:2;32770:18;;;32763:30;32829:34;32809:18;;;32802:62;32900:7;32880:18;;;32873:35;32925:19;;25742:66:0;32549:401:1;25742:66:0;18965:10;25821:16;25886:21;25904:2;25886:17;:21::i;:::-;25863:44;;25918:24;25945:25;25963:6;25945:17;:25::i;:::-;25918:52;;25983:60;26004:8;26014:4;26020:2;26024:3;26029:7;26038:4;25983:20;:60::i;:::-;26056:19;26078:13;;;:9;:13;;;;;;;;:19;;;;;;;;;;;26116:21;;;;26108:76;;;;;;;33157:2:1;26108:76:0;;;33139:21:1;33196:2;33176:18;;;33169:30;33235:34;33215:18;;;33208:62;33306:12;33286:18;;;33279:40;33336:19;;26108:76:0;32955:406:1;26108:76:0;26220:13;;;;:9;:13;;;;;;;;:19;;;;;;;;;;;26242:20;;;26220:42;;26284:17;;;;;;;:27;;26242:20;;26220:13;26284:27;;26242:20;;26284:27;:::i;:::-;;;;-1:-1:-1;;26329:46:0;;;35011:25:1;;;35067:2;35052:18;;35045:34;;;26329:46:0;;;;;;;;;;;;;;;34984:18:1;26329:46:0;;;;;;;26460:68;26491:8;26501:4;26507:2;26511;26515:6;26523:4;26460:30;:68::i;:::-;25731:805;;;;25562:974;;;;;:::o;92979:414::-;93188:66;93215:8;93225:4;93231:2;93235:3;93240:7;93249:4;93188:26;:66::i;:::-;93268:9;93263:125;93287:3;:10;93283:1;:14;93263:125;;;93317:16;;;;93313:68;;93369:2;93346:12;:20;93359:3;93363:1;93359:6;;;;;;;;:::i;:::-;;;;;;;93346:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;93313:68;93299:3;;;:::i;:::-;;;93263:125;;37216:813;37456:13;;;10279:19;:23;37452:570;;37492:79;;;;;:43;;;;;;:79;;37536:8;;37546:4;;37552:3;;37557:7;;37566:4;;37492:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37492:79:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37488:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37884:6;37877:14;;;;;;;;;;;:::i;37488:523::-;;;37933:62;;;;;37600:2:1;37933:62:0;;;37582:21:1;37639:2;37619:18;;;37612:30;37678:34;37658:18;;;37651:62;37749:22;37729:18;;;37722:50;37789:19;;37933:62:0;37398:416:1;37488:523:0;37653:60;;;37665:48;37653:60;37649:159;;37738:50;;;;;38021:2:1;37738:50:0;;;38003:21:1;38060:2;38040:18;;;38033:30;38099:34;38079:18;;;38072:62;38170:10;38150:18;;;38143:38;38198:19;;37738:50:0;37819:404:1;55625:922:0;55678:7;;55765:6;55756:15;;55752:102;;55801:6;55792:15;;;-1:-1:-1;55836:2:0;55826:12;55752:102;55881:6;55872:5;:15;55868:102;;55917:6;55908:15;;;-1:-1:-1;55952:2:0;55942:12;55868:102;55997:6;55988:5;:15;55984:102;;56033:6;56024:15;;;-1:-1:-1;56068:2:0;56058:12;55984:102;56113:5;56104;:14;56100:99;;56148:5;56139:14;;;-1:-1:-1;56182:1:0;56172:11;56100:99;56226:5;56217;:14;56213:99;;56261:5;56252:14;;;-1:-1:-1;56295:1:0;56285:11;56213:99;56339:5;56330;:14;56326:99;;56374:5;56365:14;;;-1:-1:-1;56408:1:0;56398:11;56326:99;56452:5;56443;:14;56439:66;;56488:1;56478:11;56533:6;55625:922;-1:-1:-1;;55625:922:0:o;38037:198::-;38157:16;;;38171:1;38157:16;;;;;;;;;38103;;38132:22;;38157:16;;;;;;;;;;;;-1:-1:-1;38157:16:0;38132:41;;38195:7;38184:5;38190:1;38184:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;38222:5;38037:198;-1:-1:-1;;38037:198:0:o;36464:744::-;36679:13;;;10279:19;:23;36675:526;;36715:72;;;;;:38;;;;;;:72;;36754:8;;36764:4;;36770:2;;36774:6;;36782:4;;36715:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36715:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36711:479;;;;:::i;:::-;36837:55;;;36849:43;36837:55;36833:154;;36917:50;;;;;38021:2:1;36917:50:0;;;38003:21:1;38060:2;38040:18;;;38033:30;38099:34;38079:18;;;38072:62;38170:10;38150:18;;;38143:38;38198:19;;36917:50:0;37819:404:1;79692:931:0;80014:18;;;80010:160;;80054:9;80049:110;80073:3;:10;80069:1;:14;80049:110;;;80133:7;80141:1;80133:10;;;;;;;;:::i;:::-;;;;;;;80109:12;:20;80122:3;80126:1;80122:6;;;;;;;;:::i;:::-;;;;;;;80109:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;80085:3:0;;-1:-1:-1;80085:3:0;;:::i;:::-;;;80049:110;;;;80010:160;80186:16;;;80182:434;;80224:9;80219:386;80243:3;:10;80239:1;:14;80219:386;;;80279:10;80292:3;80296:1;80292:6;;;;;;;;:::i;:::-;;;;;;;80279:19;;80317:14;80334:7;80342:1;80334:10;;;;;;;;:::i;:::-;;;;;;;80317:27;;80363:14;80380:12;:16;80393:2;80380:16;;;;;;;;;;;;80363:33;;80433:6;80423;:16;;80415:69;;;;;;;39019:2:1;80415:69:0;;;39001:21:1;39058:2;39038:18;;;39031:30;39097:34;39077:18;;;39070:62;39168:10;39148:18;;;39141:38;39196:19;;80415:69:0;38817:404:1;80415:69:0;80536:16;;;;:12;:16;;;;;;80555:15;;80536:34;;80255:3;;;:::i;:::-;;;80219:386;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:154:1;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:315;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;:::-;426:5;478:2;463:18;;;;450:32;;-1:-1:-1;;;173:315:1:o;675:177::-;760:66;753:5;749:78;742:5;739:89;729:117;;842:1;839;832:12;857:245;915:6;968:2;956:9;947:7;943:23;939:32;936:52;;;984:1;981;974:12;936:52;1023:9;1010:23;1042:30;1066:5;1042:30;:::i;:::-;1091:5;857:245;-1:-1:-1;;;857:245:1:o;1299:160::-;1364:20;;1420:13;;1413:21;1403:32;;1393:60;;1449:1;1446;1439:12;1393:60;1299:160;;;:::o;1464:180::-;1520:6;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;1612:26;1628:9;1612:26;:::i;1649:180::-;1708:6;1761:2;1749:9;1740:7;1736:23;1732:32;1729:52;;;1777:1;1774;1767:12;1729:52;-1:-1:-1;1800:23:1;;1649:180;-1:-1:-1;1649:180:1:o;1834:250::-;1919:1;1929:113;1943:6;1940:1;1937:13;1929:113;;;2019:11;;;2013:18;2000:11;;;1993:39;1965:2;1958:10;1929:113;;;-1:-1:-1;;2076:1:1;2058:16;;2051:27;1834:250::o;2089:330::-;2131:3;2169:5;2163:12;2196:6;2191:3;2184:19;2212:76;2281:6;2274:4;2269:3;2265:14;2258:4;2251:5;2247:16;2212:76;:::i;:::-;2333:2;2321:15;2338:66;2317:88;2308:98;;;;2408:4;2304:109;;2089:330;-1:-1:-1;;2089:330:1:o;2424:220::-;2573:2;2562:9;2555:21;2536:4;2593:45;2634:2;2623:9;2619:18;2611:6;2593:45;:::i;2649:184::-;2701:77;2698:1;2691:88;2798:4;2795:1;2788:15;2822:4;2819:1;2812:15;2838:308;2944:66;2939:2;2933:4;2929:13;2925:86;2917:6;2913:99;3078:6;3066:10;3063:22;3042:18;3030:10;3027:34;3024:62;3021:88;;;3089:18;;:::i;:::-;3125:2;3118:22;-1:-1:-1;;2838:308:1:o;3151:183::-;3211:4;3244:18;3236:6;3233:30;3230:56;;;3266:18;;:::i;:::-;-1:-1:-1;3311:1:1;3307:14;3323:4;3303:25;;3151:183::o;3339:724::-;3393:5;3446:3;3439:4;3431:6;3427:17;3423:27;3413:55;;3464:1;3461;3454:12;3413:55;3500:6;3487:20;3526:4;3549:43;3589:2;3549:43;:::i;:::-;3621:2;3615:9;3633:31;3661:2;3653:6;3633:31;:::i;:::-;3699:18;;;3791:1;3787:10;;;;3775:23;;3771:32;;;3733:15;;;;-1:-1:-1;3815:15:1;;;3812:35;;;3843:1;3840;3833:12;3812:35;3879:2;3871:6;3867:15;3891:142;3907:6;3902:3;3899:15;3891:142;;;3973:17;;3961:30;;4011:12;;;;3924;;3891:142;;;-1:-1:-1;4051:6:1;3339:724;-1:-1:-1;;;;;;3339:724:1:o;4068:614::-;4110:5;4163:3;4156:4;4148:6;4144:17;4140:27;4130:55;;4181:1;4178;4171:12;4130:55;4217:6;4204:20;4243:18;4239:2;4236:26;4233:52;;;4265:18;;:::i;:::-;4314:2;4308:9;4326:126;4446:4;4377:66;4370:4;4366:2;4362:13;4358:86;4354:97;4346:6;4326:126;:::i;:::-;4476:2;4468:6;4461:18;4522:3;4515:4;4510:2;4502:6;4498:15;4494:26;4491:35;4488:55;;;4539:1;4536;4529:12;4488:55;4603:2;4596:4;4588:6;4584:17;4577:4;4569:6;4565:17;4552:54;4650:1;4626:15;;;4643:4;4622:26;4615:37;;;;4630:6;4068:614;-1:-1:-1;;;4068:614:1:o;4687:1071::-;4841:6;4849;4857;4865;4873;4926:3;4914:9;4905:7;4901:23;4897:33;4894:53;;;4943:1;4940;4933:12;4894:53;4982:9;4969:23;5001:31;5026:5;5001:31;:::i;:::-;5051:5;-1:-1:-1;5108:2:1;5093:18;;5080:32;5121:33;5080:32;5121:33;:::i;:::-;5173:7;-1:-1:-1;5231:2:1;5216:18;;5203:32;5254:18;5284:14;;;5281:34;;;5311:1;5308;5301:12;5281:34;5334:61;5387:7;5378:6;5367:9;5363:22;5334:61;:::i;:::-;5324:71;;5448:2;5437:9;5433:18;5420:32;5404:48;;5477:2;5467:8;5464:16;5461:36;;;5493:1;5490;5483:12;5461:36;5516:63;5571:7;5560:8;5549:9;5545:24;5516:63;:::i;:::-;5506:73;;5632:3;5621:9;5617:19;5604:33;5588:49;;5662:2;5652:8;5649:16;5646:36;;;5678:1;5675;5668:12;5646:36;;5701:51;5744:7;5733:8;5722:9;5718:24;5701:51;:::i;:::-;5691:61;;;4687:1071;;;;;;;;:::o;5763:671::-;6068:3;6057:9;6050:22;6031:4;6089:46;6130:3;6119:9;6115:19;6107:6;6089:46;:::i;:::-;6166:2;6151:18;;6144:34;;;;-1:-1:-1;6209:2:1;6194:18;;6187:34;;;;6252:2;6237:18;;6230:34;;;;6295:3;6280:19;;6273:35;;;;6352:14;6345:22;6339:3;6324:19;;6317:51;6412:14;6405:22;6399:3;6384:19;;;6377:51;6081:54;5763:671;-1:-1:-1;5763:671:1:o;6670:348::-;6722:8;6732:6;6786:3;6779:4;6771:6;6767:17;6763:27;6753:55;;6804:1;6801;6794:12;6753:55;-1:-1:-1;6827:20:1;;6870:18;6859:30;;6856:50;;;6902:1;6899;6892:12;6856:50;6939:4;6931:6;6927:17;6915:29;;6991:3;6984:4;6975:6;6967;6963:19;6959:30;6956:39;6953:59;;;7008:1;7005;6998:12;6953:59;6670:348;;;;;:::o;7023:892::-;7151:6;7159;7167;7175;7183;7191;7199;7207;7215;7268:3;7256:9;7247:7;7243:23;7239:33;7236:53;;;7285:1;7282;7275:12;7236:53;7321:9;7308:23;7298:33;;7382:2;7371:9;7367:18;7354:32;7409:18;7401:6;7398:30;7395:50;;;7441:1;7438;7431:12;7395:50;7480:59;7531:7;7522:6;7511:9;7507:22;7480:59;:::i;:::-;7558:8;;-1:-1:-1;7454:85:1;-1:-1:-1;;7640:2:1;7625:18;;7612:32;;-1:-1:-1;7691:2:1;7676:18;;7663:32;;-1:-1:-1;7742:3:1;7727:19;;7714:33;;-1:-1:-1;7794:3:1;7779:19;;7766:33;;-1:-1:-1;7818:36:1;7849:3;7834:19;;7818:36;:::i;:::-;7808:46;;7873:36;7904:3;7893:9;7889:19;7873:36;:::i;:::-;7863:46;;7023:892;;;;;;;;;;;:::o;7920:367::-;7983:8;7993:6;8047:3;8040:4;8032:6;8028:17;8024:27;8014:55;;8065:1;8062;8055:12;8014:55;-1:-1:-1;8088:20:1;;8131:18;8120:30;;8117:50;;;8163:1;8160;8153:12;8117:50;8200:4;8192:6;8188:17;8176:29;;8260:3;8253:4;8243:6;8240:1;8236:14;8228:6;8224:27;8220:38;8217:47;8214:67;;;8277:1;8274;8267:12;8292:773;8414:6;8422;8430;8438;8491:2;8479:9;8470:7;8466:23;8462:32;8459:52;;;8507:1;8504;8497:12;8459:52;8547:9;8534:23;8576:18;8617:2;8609:6;8606:14;8603:34;;;8633:1;8630;8623:12;8603:34;8672:70;8734:7;8725:6;8714:9;8710:22;8672:70;:::i;:::-;8761:8;;-1:-1:-1;8646:96:1;-1:-1:-1;8849:2:1;8834:18;;8821:32;;-1:-1:-1;8865:16:1;;;8862:36;;;8894:1;8891;8884:12;8862:36;;8933:72;8997:7;8986:8;8975:9;8971:24;8933:72;:::i;:::-;8292:773;;;;-1:-1:-1;9024:8:1;-1:-1:-1;;;;8292:773:1:o;9070:1277::-;9188:6;9196;9249:2;9237:9;9228:7;9224:23;9220:32;9217:52;;;9265:1;9262;9255:12;9217:52;9305:9;9292:23;9334:18;9375:2;9367:6;9364:14;9361:34;;;9391:1;9388;9381:12;9361:34;9429:6;9418:9;9414:22;9404:32;;9474:7;9467:4;9463:2;9459:13;9455:27;9445:55;;9496:1;9493;9486:12;9445:55;9532:2;9519:16;9554:4;9577:43;9617:2;9577:43;:::i;:::-;9649:2;9643:9;9661:31;9689:2;9681:6;9661:31;:::i;:::-;9727:18;;;9815:1;9811:10;;;;9803:19;;9799:28;;;9761:15;;;;-1:-1:-1;9839:19:1;;;9836:39;;;9871:1;9868;9861:12;9836:39;9895:11;;;;9915:217;9931:6;9926:3;9923:15;9915:217;;;10011:3;9998:17;10028:31;10053:5;10028:31;:::i;:::-;10072:18;;9948:12;;;;10110;;;;9915:217;;;10151:6;-1:-1:-1;;10195:18:1;;10182:32;;-1:-1:-1;;10226:16:1;;;10223:36;;;10255:1;10252;10245:12;10223:36;;10278:63;10333:7;10322:8;10311:9;10307:24;10278:63;:::i;:::-;10268:73;;;9070:1277;;;;;:::o;10352:435::-;10405:3;10443:5;10437:12;10470:6;10465:3;10458:19;10496:4;10525:2;10520:3;10516:12;10509:19;;10562:2;10555:5;10551:14;10583:1;10593:169;10607:6;10604:1;10601:13;10593:169;;;10668:13;;10656:26;;10702:12;;;;10737:15;;;;10629:1;10622:9;10593:169;;;-1:-1:-1;10778:3:1;;10352:435;-1:-1:-1;;;;;10352:435:1:o;10792:261::-;10971:2;10960:9;10953:21;10934:4;10991:56;11043:2;11032:9;11028:18;11020:6;10991:56;:::i;11058:247::-;11117:6;11170:2;11158:9;11149:7;11145:23;11141:32;11138:52;;;11186:1;11183;11176:12;11138:52;11225:9;11212:23;11244:31;11269:5;11244:31;:::i;11310:1259::-;11468:6;11476;11484;11492;11500;11508;11516;11524;11532;11540;11548:7;11557;11611:3;11599:9;11590:7;11586:23;11582:33;11579:53;;;11628:1;11625;11618:12;11579:53;11664:9;11651:23;11641:33;;11721:2;11710:9;11706:18;11693:32;11683:42;;11774:18;11768:2;11757:9;11753:18;11740:32;11737:56;11734:76;;;11806:1;11803;11796:12;11734:76;11845:85;11922:7;11915:2;11904:9;11900:18;11887:32;11876:9;11872:48;11845:85;:::i;:::-;11949:8;;-1:-1:-1;11976:8:1;-1:-1:-1;12033:18:1;12027:2;12012:18;;11999:32;11996:56;11993:76;;;12065:1;12062;12055:12;11993:76;12104:85;12181:7;12174:2;12163:9;12159:18;12146:32;12135:9;12131:48;12104:85;:::i;:::-;12208:8;;-1:-1:-1;12235:8:1;-1:-1:-1;12290:3:1;12275:19;;12262:33;;-1:-1:-1;12342:3:1;12327:19;;12314:33;;-1:-1:-1;12394:3:1;12379:19;;12366:33;;-1:-1:-1;12446:3:1;12431:19;;12418:33;;-1:-1:-1;12471:36:1;12502:3;12487:19;;12471:36;:::i;:::-;12460:47;;12527:36;12558:3;12547:9;12543:19;12527:36;:::i;:::-;12516:47;;11310:1259;;;;;;;;;;;;;;:::o;12574:411::-;12645:6;12653;12706:2;12694:9;12685:7;12681:23;12677:32;12674:52;;;12722:1;12719;12712:12;12674:52;12762:9;12749:23;12795:18;12787:6;12784:30;12781:50;;;12827:1;12824;12817:12;12781:50;12866:59;12917:7;12908:6;12897:9;12893:22;12866:59;:::i;:::-;12944:8;;12840:85;;-1:-1:-1;12574:411:1;-1:-1:-1;;;;12574:411:1:o;12990:315::-;13055:6;13063;13116:2;13104:9;13095:7;13091:23;13087:32;13084:52;;;13132:1;13129;13122:12;13084:52;13171:9;13158:23;13190:31;13215:5;13190:31;:::i;:::-;13240:5;-1:-1:-1;13264:35:1;13295:2;13280:18;;13264:35;:::i;:::-;13254:45;;12990:315;;;;;:::o;13884:248::-;13952:6;13960;14013:2;14001:9;13992:7;13988:23;13984:32;13981:52;;;14029:1;14026;14019:12;13981:52;-1:-1:-1;;14052:23:1;;;14122:2;14107:18;;;14094:32;;-1:-1:-1;13884:248:1:o;14137:841::-;14268:6;14276;14284;14292;14300;14353:2;14341:9;14332:7;14328:23;14324:32;14321:52;;;14369:1;14366;14359:12;14321:52;14405:9;14392:23;14382:33;;14466:2;14455:9;14451:18;14438:32;14489:18;14530:2;14522:6;14519:14;14516:34;;;14546:1;14543;14536:12;14516:34;14585:70;14647:7;14638:6;14627:9;14623:22;14585:70;:::i;:::-;14674:8;;-1:-1:-1;14559:96:1;-1:-1:-1;14762:2:1;14747:18;;14734:32;;-1:-1:-1;14778:16:1;;;14775:36;;;14807:1;14804;14797:12;14775:36;;14846:72;14910:7;14899:8;14888:9;14884:24;14846:72;:::i;:::-;14137:841;;;;-1:-1:-1;14137:841:1;;-1:-1:-1;14937:8:1;;14820:98;14137:841;-1:-1:-1;;;14137:841:1:o;14983:388::-;15051:6;15059;15112:2;15100:9;15091:7;15087:23;15083:32;15080:52;;;15128:1;15125;15118:12;15080:52;15167:9;15154:23;15186:31;15211:5;15186:31;:::i;:::-;15236:5;-1:-1:-1;15293:2:1;15278:18;;15265:32;15306:33;15265:32;15306:33;:::i;:::-;15358:7;15348:17;;;14983:388;;;;;:::o;15643:734::-;15747:6;15755;15763;15771;15779;15832:3;15820:9;15811:7;15807:23;15803:33;15800:53;;;15849:1;15846;15839:12;15800:53;15888:9;15875:23;15907:31;15932:5;15907:31;:::i;:::-;15957:5;-1:-1:-1;16014:2:1;15999:18;;15986:32;16027:33;15986:32;16027:33;:::i;:::-;16079:7;-1:-1:-1;16133:2:1;16118:18;;16105:32;;-1:-1:-1;16184:2:1;16169:18;;16156:32;;-1:-1:-1;16239:3:1;16224:19;;16211:33;16267:18;16256:30;;16253:50;;;16299:1;16296;16289:12;16253:50;16322:49;16363:7;16354:6;16343:9;16339:22;16322:49;:::i;16793:437::-;16872:1;16868:12;;;;16915;;;16936:61;;16990:4;16982:6;16978:17;16968:27;;16936:61;17043:2;17035:6;17032:14;17012:18;17009:38;17006:218;;17080:77;17077:1;17070:88;17181:4;17178:1;17171:15;17209:4;17206:1;17199:15;17006:218;;16793:437;;;:::o;17650:506::-;17912:34;17907:3;17900:47;17977:13;17972:2;17967:3;17963:12;17956:35;17882:3;18020:6;18014:13;18036:73;18102:6;18097:2;18092:3;18088:12;18083:2;18075:6;18071:15;18036:73;:::i;:::-;18129:16;;;;18147:2;18125:25;;17650:506;-1:-1:-1;;17650:506:1:o;18161:445::-;18382:3;18420:6;18414:13;18436:66;18495:6;18490:3;18483:4;18475:6;18471:17;18436:66;:::i;:::-;18563:7;18524:16;;18549:22;;;-1:-1:-1;18598:1:1;18587:13;;18161:445;-1:-1:-1;18161:445:1:o;18737:545::-;18839:2;18834:3;18831:11;18828:448;;;18875:1;18900:5;18896:2;18889:17;18945:4;18941:2;18931:19;19015:2;19003:10;18999:19;18996:1;18992:27;18986:4;18982:38;19051:4;19039:10;19036:20;19033:47;;;-1:-1:-1;19074:4:1;19033:47;19129:2;19124:3;19120:12;19117:1;19113:20;19107:4;19103:31;19093:41;;19184:82;19202:2;19195:5;19192:13;19184:82;;;19247:17;;;19228:1;19217:13;19184:82;;19518:1471;19644:3;19638:10;19671:18;19663:6;19660:30;19657:56;;;19693:18;;:::i;:::-;19722:97;19812:6;19772:38;19804:4;19798:11;19772:38;:::i;:::-;19766:4;19722:97;:::i;:::-;19874:4;;19938:2;19927:14;;19955:1;19950:782;;;;20776:1;20793:6;20790:89;;;-1:-1:-1;20845:19:1;;;20839:26;20790:89;19424:66;19415:1;19411:11;;;19407:84;19403:89;19393:100;19499:1;19495:11;;;19390:117;20892:81;;19920:1063;;19950:782;18684:1;18677:14;;;18721:4;18708:18;;19998:66;19986:79;;;20163:236;20177:7;20174:1;20171:14;20163:236;;;20266:19;;;20260:26;20245:42;;20358:27;;;;20326:1;20314:14;;;;20193:19;;20163:236;;;20167:3;20427:6;20418:7;20415:19;20412:261;;;20488:19;;;20482:26;20589:66;20571:1;20567:14;;;20583:3;20563:24;20559:97;20555:102;20540:118;20525:134;;20412:261;-1:-1:-1;;;;;20719:1:1;20703:14;;;20699:22;20686:36;;-1:-1:-1;19518:1471:1:o;20994:184::-;21046:77;21043:1;21036:88;21143:4;21140:1;21133:15;21167:4;21164:1;21157:15;21183:195;21222:3;21253:66;21246:5;21243:77;21240:103;;21323:18;;:::i;:::-;-1:-1:-1;21370:1:1;21359:13;;21183:195::o;21727:184::-;21779:77;21776:1;21769:88;21876:4;21873:1;21866:15;21900:4;21897:1;21890:15;21916:125;21981:9;;;22002:10;;;21999:36;;;22015:18;;:::i;22802:128::-;22869:9;;;22890:11;;;22887:37;;;22904:18;;:::i;22935:444::-;23168:6;23160;23155:3;23142:33;23124:3;23203:6;23198:3;23194:16;23230:1;23226:2;23219:13;23261:6;23255:13;23277:65;23335:6;23331:2;23324:4;23316:6;23312:17;23277:65;:::i;:::-;23358:15;;22935:444;-1:-1:-1;;;;;22935:444:1:o;23384:474::-;23573:3;23611:6;23605:13;23627:66;23686:6;23681:3;23674:4;23666:6;23662:17;23627:66;:::i;:::-;23715:16;;23768:6;23760;23715:16;23740:35;23832:1;23794:18;;23821:13;;;-1:-1:-1;23794:18:1;;23384:474;-1:-1:-1;;;23384:474:1:o;23863:1325::-;23987:18;23982:3;23979:27;23976:53;;;24009:18;;:::i;:::-;24038:94;24128:3;24088:38;24120:4;24114:11;24088:38;:::i;:::-;24082:4;24038:94;:::i;:::-;24158:1;24183:2;24178:3;24175:11;24200:1;24195:735;;;;24974:1;24991:3;24988:93;;;-1:-1:-1;25047:19:1;;;25034:33;24988:93;19424:66;19415:1;19411:11;;;19407:84;19403:89;19393:100;19499:1;19495:11;;;19390:117;25094:78;;24168:1014;;24195:735;18684:1;18677:14;;;18721:4;18708:18;;24240:66;24231:76;;;24391:9;24413:229;24427:7;24424:1;24421:14;24413:229;;;24516:19;;;24503:33;24488:49;;24623:4;24608:20;;;;24576:1;24564:14;;;;24443:12;24413:229;;;24417:3;24670;24661:7;24658:16;24655:219;;;24790:66;24784:3;24778;24775:1;24771:11;24767:21;24763:94;24759:99;24746:9;24741:3;24737:19;24724:33;24720:139;24712:6;24705:155;24655:219;;;24917:1;24911:3;24908:1;24904:11;24900:19;24894:4;24887:33;24168:1014;;23863:1325;;;:::o;25546:184::-;25616:6;25669:2;25657:9;25648:7;25644:23;25640:32;25637:52;;;25685:1;25682;25675:12;25637:52;-1:-1:-1;25708:16:1;;25546:184;-1:-1:-1;25546:184:1:o;27310:168::-;27383:9;;;27414;;27431:15;;;27425:22;;27411:37;27401:71;;27452:18;;:::i;33366:465::-;33623:2;33612:9;33605:21;33586:4;33649:56;33701:2;33690:9;33686:18;33678:6;33649:56;:::i;:::-;33753:9;33745:6;33741:22;33736:2;33725:9;33721:18;33714:50;33781:44;33818:6;33810;33781:44;:::i;:::-;33773:52;33366:465;-1:-1:-1;;;;;33366:465:1:o;35090:274::-;35130:1;35156;35146:189;;35191:77;35188:1;35181:88;35292:4;35289:1;35282:15;35320:4;35317:1;35310:15;35146:189;-1:-1:-1;35349:9:1;;35090:274::o;35369:850::-;35691:4;35720:42;35801:2;35793:6;35789:15;35778:9;35771:34;35853:2;35845:6;35841:15;35836:2;35825:9;35821:18;35814:43;;35893:3;35888:2;35877:9;35873:18;35866:31;35920:57;35972:3;35961:9;35957:19;35949:6;35920:57;:::i;:::-;36025:9;36017:6;36013:22;36008:2;35997:9;35993:18;35986:50;36059:44;36096:6;36088;36059:44;:::i;:::-;36045:58;;36152:9;36144:6;36140:22;36134:3;36123:9;36119:19;36112:51;36180:33;36206:6;36198;36180:33;:::i;:::-;36172:41;35369:850;-1:-1:-1;;;;;;;;35369:850:1:o;36224:249::-;36293:6;36346:2;36334:9;36325:7;36321:23;36317:32;36314:52;;;36362:1;36359;36352:12;36314:52;36394:9;36388:16;36413:30;36437:5;36413:30;:::i;36478:179::-;36513:3;36555:1;36537:16;36534:23;36531:120;;;36601:1;36598;36595;36580:23;-1:-1:-1;36638:1:1;36632:8;36627:3;36623:18;36531:120;36478:179;:::o;36662:731::-;36701:3;36743:4;36725:16;36722:26;36719:39;;;36662:731;:::o;36719:39::-;36785:2;36779:9;36807:66;36928:2;36910:16;36906:25;36903:1;36897:4;36882:50;36961:4;36955:11;36985:16;37020:18;37091:2;37084:4;37076:6;37072:17;37069:25;37064:2;37056:6;37053:14;37050:45;37047:58;;;37098:5;;;;;36662:731;:::o;37047:58::-;37135:6;37129:4;37125:17;37114:28;;37171:3;37165:10;37198:2;37190:6;37187:14;37184:27;;;37204:5;;;;;;36662:731;:::o;37184:27::-;37288:2;37269:16;37263:4;37259:27;37255:36;37248:4;37239:6;37234:3;37230:16;37226:27;37223:69;37220:82;;;37295:5;;;;;;36662:731;:::o;37220:82::-;37311:57;37362:4;37353:6;37345;37341:19;37337:30;37331:4;37311:57;:::i;:::-;-1:-1:-1;37384:3:1;;36662:731;-1:-1:-1;;;;;36662:731:1:o;38228:584::-;38450:4;38479:42;38560:2;38552:6;38548:15;38537:9;38530:34;38612:2;38604:6;38600:15;38595:2;38584:9;38580:18;38573:43;;38652:6;38647:2;38636:9;38632:18;38625:34;38695:6;38690:2;38679:9;38675:18;38668:34;38739:3;38733;38722:9;38718:19;38711:32;38760:46;38801:3;38790:9;38786:19;38778:6;38760:46;:::i;:::-;38752:54;38228:584;-1:-1:-1;;;;;;;38228:584:1:o

Swarm Source

ipfs://adbc8d1e3af294c59414cfa5b1b5890f9326877c4afdb72eefa219fb4f84a647
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.