Token Partyhat

 

Overview ERC-1155

Total Supply:
0 Partyhat

Holders:
32 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PHAT

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// PARTYHAT      HTTPS://T.ME/PARTYHAT      HTTPS://ARBITRUM.PARTY

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

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


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



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;






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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

        emit TransferSingle(operator, account, address(0), id, amount);
    }

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

        address operator = _msgSender();

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

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

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

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

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

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

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

        return array;
    }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IRandomizer {

    // Sets the number of blocks that must pass between increment the commitId and seeding the random
    // Admin
    function setNumBlocksAfterIncrement(uint8 _numBlocksAfterIncrement) external;

    // Increments the commit id.
    // Admin
    function incrementCommitId() external;

    // Adding the random number needs to be done AFTER incrementing the commit id on a separate transaction. If
    // these are done together, there is a potential vulnerability to front load a commit when the bad actor
    // sees the value of the random number.
    function addRandomForCommit(uint256 _seed) external;

    // Returns a request ID for a random number. This is unique.
    function requestRandomNumber() external returns(uint256);

    // Returns the random number for the given request ID. Will revert
    // if the random is not ready.
    function revealRandomNumber(uint256 _requestId) external view returns(uint256);

    // Returns if the random number for the given request ID is ready or not. Call
    // before calling revealRandomNumber.
    function isRandomReady(uint256 _requestId) external view returns(bool);
}

pragma solidity ^0.8.0;


contract PHAT is ERC1155 {
    address public owner;
    string private _baseURIExtended;
    string public name;

    uint256 private constant CRACKER = 0;
    uint256 private constant WHITE = 1;
    uint256 private constant RED = 2;
    uint256 private constant YELLOW = 3;
    uint256 private constant GREEN = 4;
    uint256 private constant BLUE = 5;
    uint256 private constant PURPLE = 6;
    uint256 private constant PINK = 7;

    uint256 [] private IDS = [CRACKER, WHITE, RED, YELLOW, GREEN, BLUE, PURPLE, PINK];

    uint256 public mintedHats = 0;
    uint256 public burnedHats = 0;

    mapping(address => uint256) public userId;
    mapping(address => uint256) public userAmount;

    IERC20 public phatERC20;
    IRandomizer public randomizer;

    event BurnNFTsForCrackers(uint256[] hats, address burner, uint256 amount);
    event RevealHats(uint256[] hatsToMint, address minter, uint256 amount);
    event PopCrackers(address popper, uint256 amount);
    event MintCrackers(address minter, uint256 amount);

    modifier _ownerOnly() {
        require(msg.sender == owner);
        _;
    }

    constructor(address _randomizer, address _phat) ERC1155("") {
        owner = msg.sender;
        name = "Partyhat";

        randomizer = IRandomizer(_randomizer);
        phatERC20 = IERC20(_phat);

        // Dev airdrops crackers from faulty v1 contract.
        _mint(0xEB7d0bE769Cf857aFa5626B5F8208528F034b1Da, CRACKER, 2, '');
        _mint(0x75365dDb02bc316748fB9A2dc5a33B42f1fBA2E7, CRACKER, 10, '');
    }

    function setBaseURI(string memory baseURI_) external _ownerOnly {
        _baseURIExtended = baseURI_;
    }

    function transferOwnership(address newOwner) public _ownerOnly {
        owner = newOwner;
    }

    //Mint cracker and burn PHAT ERC20
    function mintCrackers(uint256 amount) public {
        uint256 balance = phatERC20.balanceOf(address(0xdead));

        for(uint256 i = 0; i < amount*2; i++){
            phatERC20.transferFrom(msg.sender, address(0xdead), 1);
        }

        require(balance + amount*2 == phatERC20.balanceOf(address(0xdead)), "Insufficient PHAT transfered");
        
        emit MintCrackers(msg.sender, amount);
        _mint(msg.sender, CRACKER, amount, '');
    }

    //Burn cracker and request random number
    function popCrackers(uint256 amount) public {
        require(balanceOf(msg.sender, CRACKER) >= amount, "Insufficient crackers to pop.");
        require(userId[msg.sender] == 0, "Must reveal hats first.");
        require(userAmount[msg.sender] == 0, "Must reveal hats first.");

        _burn(msg.sender, CRACKER, amount);
        userAmount[msg.sender] = amount;
        userId[msg.sender] = randomizer.requestRandomNumber();

        emit PopCrackers(msg.sender, amount);
    }

    //Reveal hats from cracker
    function revealHats() public {

        require(userAmount[msg.sender] > 0, "No hats to mint.");
        require(userId[msg.sender] != 0, "User has no crackers to open.");
        require(randomizer.isRandomReady(userId[msg.sender]), "Random number not ready, try again.");

        uint256 secretHat;

        uint256[] memory hatsToMint = new uint256[](IDS.length);

        uint256 rand = randomizer.revealRandomNumber(userId[msg.sender]);

        for (uint256 i = 0; i < userAmount[msg.sender]*2; i++) {
            secretHat = uint256(keccak256(abi.encode(rand, i))) % 1000; 
            if(secretHat < 10) {// 1% pink
                hatsToMint[PINK]++;
            }
            else if(secretHat < 500) {// 49% purple
                hatsToMint[PURPLE]++;
            }
            else if(secretHat < 620) {// 12% blue
                hatsToMint[BLUE]++;
            }
            else if(secretHat < 720) {// 10% green
                hatsToMint[GREEN]++;
            }
            else if(secretHat < 830) {// 11% yellow
                hatsToMint[YELLOW]++;
            }
            else if(secretHat < 910) {// 8% red
                hatsToMint[RED]++;
            }
            else if(secretHat < 1000) {// 9% white
                hatsToMint[WHITE]++;
            }
        }

        emit RevealHats(hatsToMint, msg.sender, userAmount[msg.sender]*2);

        mintedHats += userAmount[msg.sender]*2;

        userAmount[msg.sender] = 0;
        userId[msg.sender] = 0;

        _mintBatch(msg.sender, IDS, hatsToMint,'');
    }

    function hatsOf(address account) public view returns(uint256[8] memory){
        uint256[PINK+1] memory hats;
        for(uint256 i = 0; i < PINK+1; i++) {
            hats[i] = hats[i] + balanceOf(account, i);
        }
        return(hats);
    }

    function burnNFTsForCrackers(uint256[] memory hats) public {
        uint256 sum;        
        
        //Burn hats submitted by user. Skip 0 to skip burning crackers.
        for(uint256 id = 1; id <= PINK; id++){
            sum = sum + hats[id];
            _burn(msg.sender, id, hats[id]);
        }
        require(sum > 0, "Must burn a non-zero number of hats");
        require(sum % 3 == 0, "Must burn a multiple of 3 hats!");

        emit BurnNFTsForCrackers(hats, msg.sender, sum);

        burnedHats += sum;

        _mint(msg.sender, CRACKER, sum/3, '');

    }

    function uri(uint256 _id) public view override returns (string memory) {
        return
            string(
                abi.encodePacked(
                    _baseURIExtended,
                    Strings.toString(_id),
                    ".json"
                )
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_randomizer","type":"address"},{"internalType":"address","name":"_phat","type":"address"}],"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":false,"internalType":"uint256[]","name":"hats","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnNFTsForCrackers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintCrackers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"popper","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PopCrackers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"hatsToMint","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RevealHats","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"hats","type":"uint256[]"}],"name":"burnNFTsForCrackers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnedHats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hatsOf","outputs":[{"internalType":"uint256[8]","name":"","type":"uint256[8]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintCrackers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedHats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phatERC20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"popCrackers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealHats","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052604051806101000160405280600081526020016001815260200160028152602001600381526020016004815260200160058152602001600681526020016007815250600690600862000058929190620006c0565b50600060075560006008553480156200007057600080fd5b5060405162005c0738038062005c07833981810160405281019062000096919062000836565b60405180602001604052806000815250620000b7816200024360201b60201c565b5033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600881526020017f5061727479686174000000000000000000000000000000000000000000000000815250600590805190602001906200014692919062000712565b5081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200020273eb7d0be769cf857afa5626b5f8208528f034b1da60006002604051806020016040528060008152506200025f60201b60201c565b6200023b7375365ddb02bc316748fb9a2dc5a33b42f1fba2e76000600a604051806020016040528060008152506200025f60201b60201c565b505062000f07565b80600290805190602001906200025b92919062000712565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620002d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c89062000904565b60405180910390fd5b6000620002e36200042360201b60201c565b90506200031c81600087620002fe886200042b60201b60201c565b6200030f886200042b60201b60201c565b87620004ac60201b60201c565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200037d91906200095f565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051620003fd929190620009cd565b60405180910390a46200041c81600087878787620004b460201b60201c565b5050505050565b600033905090565b60606000600167ffffffffffffffff8111156200044d576200044c620009fa565b5b6040519080825280602002602001820160405280156200047c5781602001602082028036833780820191505090505b509050828160008151811062000497576200049662000a29565b5b60200260200101818152505080915050919050565b505050505050565b620004e08473ffffffffffffffffffffffffffffffffffffffff16620006ad60201b62001c0d1760201c565b15620006a5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016200052995949392919062000b0d565b6020604051808303816000875af19250505080156200056857506040513d601f19601f8201168201806040525081019062000565919062000bce565b60015b62000619576200057762000c0d565b806308c379a003620005da57506200058e62000c68565b806200059b5750620005dc565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d1919062000d4f565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006109062000de9565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614620006a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069a9062000e81565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b828054828255906000526020600020908101928215620006ff579160200282015b82811115620006fe578251825591602001919060010190620006e1565b5b5090506200070e9190620007a3565b5090565b828054620007209062000ed2565b90600052602060002090601f01602090048101928262000744576000855562000790565b82601f106200075f57805160ff191683800117855562000790565b8280016001018555821562000790579182015b828111156200078f57825182559160200191906001019062000772565b5b5090506200079f9190620007a3565b5090565b5b80821115620007be576000816000905550600101620007a4565b5090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007fe82620007d1565b9050919050565b6200081081620007f1565b81146200081c57600080fd5b50565b600081519050620008308162000805565b92915050565b6000806040838503121562000850576200084f620007cc565b5b600062000860858286016200081f565b925050602062000873858286016200081f565b9150509250929050565b600082825260208201905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000620008ec6021836200087d565b9150620008f9826200088e565b604082019050919050565b600060208201905081810360008301526200091f81620008dd565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200096c8262000926565b9150620009798362000926565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620009b157620009b062000930565b5b828201905092915050565b620009c78162000926565b82525050565b6000604082019050620009e46000830185620009bc565b620009f36020830184620009bc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b62000a6381620007f1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000aa557808201518184015260208101905062000a88565b8381111562000ab5576000848401525b50505050565b6000601f19601f8301169050919050565b600062000ad98262000a69565b62000ae5818562000a74565b935062000af781856020860162000a85565b62000b028162000abb565b840191505092915050565b600060a08201905062000b24600083018862000a58565b62000b33602083018762000a58565b62000b426040830186620009bc565b62000b516060830185620009bc565b818103608083015262000b65818462000acc565b90509695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000ba88162000b71565b811462000bb457600080fd5b50565b60008151905062000bc88162000b9d565b92915050565b60006020828403121562000be75762000be6620007cc565b5b600062000bf78482850162000bb7565b91505092915050565b60008160e01c9050919050565b600060033d111562000c2f5760046000803e62000c2c60005162000c00565b90505b90565b62000c3d8262000abb565b810181811067ffffffffffffffff8211171562000c5f5762000c5e620009fa565b5b80604052505050565b600060443d1062000d005762000c7d620007c2565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000ca757505062000d00565b808201805167ffffffffffffffff81111562000cc7575050505062000d00565b80602083010160043d03850181111562000ce657505050505062000d00565b62000cf78260200185018662000c32565b82955050505050505b90565b600081519050919050565b600062000d1b8262000d03565b62000d2781856200087d565b935062000d3981856020860162000a85565b62000d448162000abb565b840191505092915050565b6000602082019050818103600083015262000d6b818462000d0e565b905092915050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600062000dd16034836200087d565b915062000dde8262000d73565b604082019050919050565b6000602082019050818103600083015262000e048162000dc2565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600062000e696028836200087d565b915062000e768262000e0b565b604082019050919050565b6000602082019050818103600083015262000e9c8162000e5a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000eeb57607f821691505b60208210810362000f015762000f0062000ea3565b5b50919050565b614cf08062000f176000396000f3fe608060405234801561001057600080fd5b506004361061014c5760003560e01c806355f804b3116100c3578063d5d519141161007c578063d5d5191414610389578063e1ad418e146103b9578063e985e9c5146103e9578063f10fb58414610419578063f242432a14610437578063f2fde38b146104535761014c565b806355f804b3146102f15780637f158ab81461030d578063803905c0146103295780638143fba2146103335780638da5cb5b1461034f578063a22cb4651461036d5761014c565b80632b46b68a116101155780632b46b68a1461021d5780632eb2c2d614610239578063376fe102146102555780633d6c905a146102855780633d91c85b146102a35780634e1273f4146102c15761014c565b8062fdd58e1461015157806301ffc9a71461018157806306fdde03146101b15780630e89341c146101cf5780630ebfe7b3146101ff575b600080fd5b61016b60048036038101906101669190612ef2565b61046f565b6040516101789190612f41565b60405180910390f35b61019b60048036038101906101969190612fb4565b610537565b6040516101a89190612ffc565b60405180910390f35b6101b9610619565b6040516101c691906130b0565b60405180910390f35b6101e960048036038101906101e491906130d2565b6106a7565b6040516101f691906130b0565b60405180910390f35b6102076106db565b6040516102149190612f41565b60405180910390f35b61023760048036038101906102329190613247565b6106e1565b005b610253600480360381019061024e9190613345565b610864565b005b61026f600480360381019061026a9190613414565b610905565b60405161027c9190612f41565b60405180910390f35b61028d61091d565b60405161029a91906134a0565b60405180910390f35b6102ab610943565b6040516102b89190612f41565b60405180910390f35b6102db60048036038101906102d6919061357e565b610949565b6040516102e891906136b4565b60405180910390f35b61030b60048036038101906103069190613777565b610a62565b005b610327600480360381019061032291906130d2565b610ad6565b005b610331610d89565b005b61034d600480360381019061034891906130d2565b611507565b005b6103576117c9565b60405161036491906137cf565b60405180910390f35b61038760048036038101906103829190613816565b6117ef565b005b6103a3600480360381019061039e9190613414565b61196f565b6040516103b091906138da565b60405180910390f35b6103d360048036038101906103ce9190613414565b6119fc565b6040516103e09190612f41565b60405180910390f35b61040360048036038101906103fe91906138f6565b611a14565b6040516104109190612ffc565b60405180910390f35b610421611aa8565b60405161042e9190613957565b60405180910390f35b610451600480360381019061044c9190613972565b611ace565b005b61046d60048036038101906104689190613414565b611b6f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036104df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d690613a7b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061060257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610612575061061182611c20565b5b9050919050565b6005805461062690613aca565b80601f016020809104026020016040519081016040528092919081815260200182805461065290613aca565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b505050505081565b606060046106b483611c8a565b6040516020016106c5929190613c17565b6040516020818303038152906040529050919050565b60075481565b600080600190505b600781116107515782818151811061070457610703613c46565b5b6020026020010151826107179190613ca4565b915061073e338285848151811061073157610730613c46565b5b6020026020010151611dea565b808061074990613cfa565b9150506106e9565b5060008111610795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078c90613db4565b60405180910390fd5b60006003826107a49190613e03565b146107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db90613e80565b60405180910390fd5b7f7d0da068bb331d0d5eda948f4285e2fa917d550a2675ed1829c1945b4889adf982338360405161081793929190613ea0565b60405180910390a180600860008282546108319190613ca4565b9250508190555061086033600060038461084b9190613ede565b60405180602001604052806000815250612006565b5050565b61086c61219b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806108b257506108b1856108ac61219b565b611a14565b5b6108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e890613f81565b60405180910390fd5b6108fe85858585856121a3565b5050505050565b60096020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b6060815183511461098f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098690614013565b60405180910390fd5b6000835167ffffffffffffffff8111156109ac576109ab613104565b5b6040519080825280602002602001820160405280156109da5781602001602082028036833780820191505090505b50905060005b8451811015610a5757610a278582815181106109ff576109fe613c46565b5b6020026020010151858381518110610a1a57610a19613c46565b5b602002602001015161046f565b828281518110610a3a57610a39613c46565b5b60200260200101818152505080610a5090613cfa565b90506109e0565b508091505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610abc57600080fd5b8060049080519060200190610ad2929190612d84565b5050565b80610ae233600061046f565b1015610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a9061407f565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c906140eb565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1e906140eb565b60405180910390fd5b610c3333600083611dea565b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638678a7b26040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610ce6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0a9190614120565b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fda5f11462eff8972f6ac479b372fe418b2aa97b8bde70c190e1f6a1c6e69d65b3382604051610d7e92919061414d565b60405180910390a150565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e02906141c2565b60405180910390fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e849061422e565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f0302107600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518263ffffffff1660e01b8152600401610f279190612f41565b602060405180830381865afa158015610f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f689190614263565b610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614302565b60405180910390fd5b60008060068054905067ffffffffffffffff811115610fc957610fc8613104565b5b604051908082528060200260200182016040528015610ff75781602001602082028036833780820191505090505b5090506000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634ad30a75600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518263ffffffff1660e01b81526004016110969190612f41565b602060405180830381865afa1580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d79190614120565b905060005b6002600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111289190614322565b811015611322576103e8828260405160200161114592919061437c565b6040516020818303038152906040528051906020012060001c6111689190613e03565b9350600a8410156111a5578260078151811061118757611186613c46565b5b60200260200101805180919061119c90613cfa565b8152505061130f565b6101f48410156111e157826006815181106111c3576111c2613c46565b5b6020026020010180518091906111d890613cfa565b8152505061130e565b61026c84101561121d57826005815181106111ff576111fe613c46565b5b60200260200101805180919061121490613cfa565b8152505061130d565b6102d0841015611259578260048151811061123b5761123a613c46565b5b60200260200101805180919061125090613cfa565b8152505061130c565b61033e841015611295578260038151811061127757611276613c46565b5b60200260200101805180919061128c90613cfa565b8152505061130b565b61038e8410156112d157826002815181106112b3576112b2613c46565b5b6020026020010180518091906112c890613cfa565b8152505061130a565b6103e884101561130957826001815181106112ef576112ee613c46565b5b60200260200101805180919061130490613cfa565b815250505b5b5b5b5b5b5b808061131a90613cfa565b9150506110dc565b507f0332c05e90196393f9b80c6e7a6b222fa5edcc767f8f88fc664d77a91738ac1e82336002600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113929190614322565b6040516113a193929190613ea0565b60405180910390a16002600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113f59190614322565b600760008282546114069190613ca4565b925050819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115023360068054806020026020016040519081016040528092919081815260200182805480156114e757602002820191906000526020600020905b8154815260200190600101908083116114d3575b505050505084604051806020016040528060008152506124b6565b505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161dead6040518263ffffffff1660e01b815260040161156691906137cf565b602060405180830381865afa158015611583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a79190614120565b905060005b6002836115b99190614322565b81101561167957600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3361dead60016040518463ffffffff1660e01b8152600401611622939291906143e0565b6020604051808303816000875af1158015611641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116659190614263565b50808061167190613cfa565b9150506115ac565b50600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161dead6040518263ffffffff1660e01b81526004016116d791906137cf565b602060405180830381865afa1580156116f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117189190614120565b6002836117259190614322565b826117309190613ca4565b14611770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176790614463565b60405180910390fd5b7fac63360672390dd9b8fdba3affc94ff7b4232990915a7dc056239916250837b033836040516117a192919061414d565b60405180910390a16117c53360008460405180602001604052806000815250612006565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b8173ffffffffffffffffffffffffffffffffffffffff1661180e61219b565b73ffffffffffffffffffffffffffffffffffffffff1603611864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185b906144f5565b60405180910390fd5b806001600061187161219b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661191e61219b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119639190612ffc565b60405180910390a35050565b611977612e0a565b61197f612e0a565b60005b600160076119909190613ca4565b8110156119f2576119a1848261046f565b8282600881106119b4576119b3613c46565b5b60200201516119c39190613ca4565b8282600881106119d6576119d5613c46565b5b60200201818152505080806119ea90613cfa565b915050611982565b5080915050919050565b600a6020528060005260406000206000915090505481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ad661219b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611b1c5750611b1b85611b1661219b565b611a14565b5b611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290614587565b60405180910390fd5b611b6885858585856126d3565b5050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bc957600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060008203611cd1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611de5565b600082905060005b60008214611d03578080611cec90613cfa565b915050600a82611cfc9190613ede565b9150611cd9565b60008167ffffffffffffffff811115611d1f57611d1e613104565b5b6040519080825280601f01601f191660200182016040528015611d515781602001600182028036833780820191505090505b5090505b60008514611dde57600182611d6a91906145a7565b9150600a85611d799190613e03565b6030611d859190613ca4565b60f81b818381518110611d9b57611d9a613c46565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611dd79190613ede565b9450611d55565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e509061464d565b60405180910390fd5b6000611e6361219b565b9050611e9381856000611e7587612954565b611e7e87612954565b604051806020016040528060008152506129ce565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f21906146df565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611ff792919061437c565b60405180910390a45050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206c90614771565b60405180910390fd5b600061207f61219b565b90506120a08160008761209188612954565b61209a88612954565b876129ce565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ff9190613ca4565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161217d92919061437c565b60405180910390a4612194816000878787876129d6565b5050505050565b600033905090565b81518351146121e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121de90614803565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224d90614895565b60405180910390fd5b600061226061219b565b90506122708187878787876129ce565b60005b845181101561242157600085828151811061229157612290613c46565b5b6020026020010151905060008583815181106122b0576122af613c46565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890614927565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124069190613ca4565b925050819055505050508061241a90613cfa565b9050612273565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612498929190614947565b60405180910390a46124ae818787878787612bad565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251c90614771565b60405180910390fd5b8151835114612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256090614803565b60405180910390fd5b600061257361219b565b9050612584816000878787876129ce565b60005b845181101561263d578381815181106125a3576125a2613c46565b5b60200260200101516000808784815181106125c1576125c0613c46565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126239190613ca4565b92505081905550808061263590613cfa565b915050612587565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126b5929190614947565b60405180910390a46126cc81600087878787612bad565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273990614895565b60405180910390fd5b600061274c61219b565b905061276c81878761275d88612954565b61276688612954565b876129ce565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fa90614927565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b89190613ca4565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161293592919061437c565b60405180910390a461294b8288888888886129d6565b50505050505050565b60606000600167ffffffffffffffff81111561297357612972613104565b5b6040519080825280602002602001820160405280156129a15781602001602082028036833780820191505090505b50905082816000815181106129b9576129b8613c46565b5b60200260200101818152505080915050919050565b505050505050565b6129f58473ffffffffffffffffffffffffffffffffffffffff16611c0d565b15612ba5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612a3b9594939291906149d3565b6020604051808303816000875af1925050508015612a7757506040513d601f19601f82011682018060405250810190612a749190614a42565b60015b612b1c57612a83614a7c565b806308c379a003612adf5750612a97614a9e565b80612aa25750612ae1565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad691906130b0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390614ba0565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9a90614c32565b60405180910390fd5b505b505050505050565b612bcc8473ffffffffffffffffffffffffffffffffffffffff16611c0d565b15612d7c578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612c12959493929190614c52565b6020604051808303816000875af1925050508015612c4e57506040513d601f19601f82011682018060405250810190612c4b9190614a42565b60015b612cf357612c5a614a7c565b806308c379a003612cb65750612c6e614a9e565b80612c795750612cb8565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad91906130b0565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cea90614ba0565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c32565b60405180910390fd5b505b505050505050565b828054612d9090613aca565b90600052602060002090601f016020900481019282612db25760008555612df9565b82601f10612dcb57805160ff1916838001178555612df9565b82800160010185558215612df9579182015b82811115612df8578251825591602001919060010190612ddd565b5b509050612e069190612e2d565b5090565b604051806101000160405280600890602082028036833780820191505090505090565b5b80821115612e46576000816000905550600101612e2e565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e8982612e5e565b9050919050565b612e9981612e7e565b8114612ea457600080fd5b50565b600081359050612eb681612e90565b92915050565b6000819050919050565b612ecf81612ebc565b8114612eda57600080fd5b50565b600081359050612eec81612ec6565b92915050565b60008060408385031215612f0957612f08612e54565b5b6000612f1785828601612ea7565b9250506020612f2885828601612edd565b9150509250929050565b612f3b81612ebc565b82525050565b6000602082019050612f566000830184612f32565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f9181612f5c565b8114612f9c57600080fd5b50565b600081359050612fae81612f88565b92915050565b600060208284031215612fca57612fc9612e54565b5b6000612fd884828501612f9f565b91505092915050565b60008115159050919050565b612ff681612fe1565b82525050565b60006020820190506130116000830184612fed565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613051578082015181840152602081019050613036565b83811115613060576000848401525b50505050565b6000601f19601f8301169050919050565b600061308282613017565b61308c8185613022565b935061309c818560208601613033565b6130a581613066565b840191505092915050565b600060208201905081810360008301526130ca8184613077565b905092915050565b6000602082840312156130e8576130e7612e54565b5b60006130f684828501612edd565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61313c82613066565b810181811067ffffffffffffffff8211171561315b5761315a613104565b5b80604052505050565b600061316e612e4a565b905061317a8282613133565b919050565b600067ffffffffffffffff82111561319a57613199613104565b5b602082029050602081019050919050565b600080fd5b60006131c36131be8461317f565b613164565b905080838252602082019050602084028301858111156131e6576131e56131ab565b5b835b8181101561320f57806131fb8882612edd565b8452602084019350506020810190506131e8565b5050509392505050565b600082601f83011261322e5761322d6130ff565b5b813561323e8482602086016131b0565b91505092915050565b60006020828403121561325d5761325c612e54565b5b600082013567ffffffffffffffff81111561327b5761327a612e59565b5b61328784828501613219565b91505092915050565b600080fd5b600067ffffffffffffffff8211156132b0576132af613104565b5b6132b982613066565b9050602081019050919050565b82818337600083830152505050565b60006132e86132e384613295565b613164565b90508281526020810184848401111561330457613303613290565b5b61330f8482856132c6565b509392505050565b600082601f83011261332c5761332b6130ff565b5b813561333c8482602086016132d5565b91505092915050565b600080600080600060a0868803121561336157613360612e54565b5b600061336f88828901612ea7565b955050602061338088828901612ea7565b945050604086013567ffffffffffffffff8111156133a1576133a0612e59565b5b6133ad88828901613219565b935050606086013567ffffffffffffffff8111156133ce576133cd612e59565b5b6133da88828901613219565b925050608086013567ffffffffffffffff8111156133fb576133fa612e59565b5b61340788828901613317565b9150509295509295909350565b60006020828403121561342a57613429612e54565b5b600061343884828501612ea7565b91505092915050565b6000819050919050565b600061346661346161345c84612e5e565b613441565b612e5e565b9050919050565b60006134788261344b565b9050919050565b600061348a8261346d565b9050919050565b61349a8161347f565b82525050565b60006020820190506134b56000830184613491565b92915050565b600067ffffffffffffffff8211156134d6576134d5613104565b5b602082029050602081019050919050565b60006134fa6134f5846134bb565b613164565b9050808382526020820190506020840283018581111561351d5761351c6131ab565b5b835b8181101561354657806135328882612ea7565b84526020840193505060208101905061351f565b5050509392505050565b600082601f830112613565576135646130ff565b5b81356135758482602086016134e7565b91505092915050565b6000806040838503121561359557613594612e54565b5b600083013567ffffffffffffffff8111156135b3576135b2612e59565b5b6135bf85828601613550565b925050602083013567ffffffffffffffff8111156135e0576135df612e59565b5b6135ec85828601613219565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61362b81612ebc565b82525050565b600061363d8383613622565b60208301905092915050565b6000602082019050919050565b6000613661826135f6565b61366b8185613601565b935061367683613612565b8060005b838110156136a757815161368e8882613631565b975061369983613649565b92505060018101905061367a565b5085935050505092915050565b600060208201905081810360008301526136ce8184613656565b905092915050565b600067ffffffffffffffff8211156136f1576136f0613104565b5b6136fa82613066565b9050602081019050919050565b600061371a613715846136d6565b613164565b90508281526020810184848401111561373657613735613290565b5b6137418482856132c6565b509392505050565b600082601f83011261375e5761375d6130ff565b5b813561376e848260208601613707565b91505092915050565b60006020828403121561378d5761378c612e54565b5b600082013567ffffffffffffffff8111156137ab576137aa612e59565b5b6137b784828501613749565b91505092915050565b6137c981612e7e565b82525050565b60006020820190506137e460008301846137c0565b92915050565b6137f381612fe1565b81146137fe57600080fd5b50565b600081359050613810816137ea565b92915050565b6000806040838503121561382d5761382c612e54565b5b600061383b85828601612ea7565b925050602061384c85828601613801565b9150509250929050565b600060089050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61388c81613856565b6138968184613861565b92506138a18261386c565b8060005b838110156138d25781516138b98782613631565b96506138c483613876565b9250506001810190506138a5565b505050505050565b6000610100820190506138f06000830184613883565b92915050565b6000806040838503121561390d5761390c612e54565b5b600061391b85828601612ea7565b925050602061392c85828601612ea7565b9150509250929050565b60006139418261346d565b9050919050565b61395181613936565b82525050565b600060208201905061396c6000830184613948565b92915050565b600080600080600060a0868803121561398e5761398d612e54565b5b600061399c88828901612ea7565b95505060206139ad88828901612ea7565b94505060406139be88828901612edd565b93505060606139cf88828901612edd565b925050608086013567ffffffffffffffff8111156139f0576139ef612e59565b5b6139fc88828901613317565b9150509295509295909350565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613a65602b83613022565b9150613a7082613a09565b604082019050919050565b60006020820190508181036000830152613a9481613a58565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ae257607f821691505b602082108103613af557613af4613a9b565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613b2881613aca565b613b328186613afb565b94506001821660008114613b4d5760018114613b5e57613b91565b60ff19831686528186019350613b91565b613b6785613b06565b60005b83811015613b8957815481890152600182019150602081019050613b6a565b838801955050505b50505092915050565b6000613ba582613017565b613baf8185613afb565b9350613bbf818560208601613033565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613c01600583613afb565b9150613c0c82613bcb565b600582019050919050565b6000613c238285613b1b565b9150613c2f8284613b9a565b9150613c3a82613bf4565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613caf82612ebc565b9150613cba83612ebc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613cef57613cee613c75565b5b828201905092915050565b6000613d0582612ebc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d3757613d36613c75565b5b600182019050919050565b7f4d757374206275726e2061206e6f6e2d7a65726f206e756d626572206f66206860008201527f6174730000000000000000000000000000000000000000000000000000000000602082015250565b6000613d9e602383613022565b9150613da982613d42565b604082019050919050565b60006020820190508181036000830152613dcd81613d91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e0e82612ebc565b9150613e1983612ebc565b925082613e2957613e28613dd4565b5b828206905092915050565b7f4d757374206275726e2061206d756c7469706c65206f66203320686174732100600082015250565b6000613e6a601f83613022565b9150613e7582613e34565b602082019050919050565b60006020820190508181036000830152613e9981613e5d565b9050919050565b60006060820190508181036000830152613eba8186613656565b9050613ec960208301856137c0565b613ed66040830184612f32565b949350505050565b6000613ee982612ebc565b9150613ef483612ebc565b925082613f0457613f03613dd4565b5b828204905092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000613f6b603283613022565b9150613f7682613f0f565b604082019050919050565b60006020820190508181036000830152613f9a81613f5e565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613ffd602983613022565b915061400882613fa1565b604082019050919050565b6000602082019050818103600083015261402c81613ff0565b9050919050565b7f496e73756666696369656e7420637261636b65727320746f20706f702e000000600082015250565b6000614069601d83613022565b915061407482614033565b602082019050919050565b600060208201905081810360008301526140988161405c565b9050919050565b7f4d7573742072657665616c20686174732066697273742e000000000000000000600082015250565b60006140d5601783613022565b91506140e08261409f565b602082019050919050565b60006020820190508181036000830152614104816140c8565b9050919050565b60008151905061411a81612ec6565b92915050565b60006020828403121561413657614135612e54565b5b60006141448482850161410b565b91505092915050565b600060408201905061416260008301856137c0565b61416f6020830184612f32565b9392505050565b7f4e6f206861747320746f206d696e742e00000000000000000000000000000000600082015250565b60006141ac601083613022565b91506141b782614176565b602082019050919050565b600060208201905081810360008301526141db8161419f565b9050919050565b7f5573657220686173206e6f20637261636b65727320746f206f70656e2e000000600082015250565b6000614218601d83613022565b9150614223826141e2565b602082019050919050565b600060208201905081810360008301526142478161420b565b9050919050565b60008151905061425d816137ea565b92915050565b60006020828403121561427957614278612e54565b5b60006142878482850161424e565b91505092915050565b7f52616e646f6d206e756d626572206e6f742072656164792c207472792061676160008201527f696e2e0000000000000000000000000000000000000000000000000000000000602082015250565b60006142ec602383613022565b91506142f782614290565b604082019050919050565b6000602082019050818103600083015261431b816142df565b9050919050565b600061432d82612ebc565b915061433883612ebc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561437157614370613c75565b5b828202905092915050565b60006040820190506143916000830185612f32565b61439e6020830184612f32565b9392505050565b6000819050919050565b60006143ca6143c56143c0846143a5565b613441565b612ebc565b9050919050565b6143da816143af565b82525050565b60006060820190506143f560008301866137c0565b61440260208301856137c0565b61440f60408301846143d1565b949350505050565b7f496e73756666696369656e742050484154207472616e73666572656400000000600082015250565b600061444d601c83613022565b915061445882614417565b602082019050919050565b6000602082019050818103600083015261447c81614440565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006144df602983613022565b91506144ea82614483565b604082019050919050565b6000602082019050818103600083015261450e816144d2565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614571602983613022565b915061457c82614515565b604082019050919050565b600060208201905081810360008301526145a081614564565b9050919050565b60006145b282612ebc565b91506145bd83612ebc565b9250828210156145d0576145cf613c75565b5b828203905092915050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614637602383613022565b9150614642826145db565b604082019050919050565b600060208201905081810360008301526146668161462a565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006146c9602483613022565b91506146d48261466d565b604082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061475b602183613022565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006147ed602883613022565b91506147f882614791565b604082019050919050565b6000602082019050818103600083015261481c816147e0565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061487f602583613022565b915061488a82614823565b604082019050919050565b600060208201905081810360008301526148ae81614872565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614911602a83613022565b915061491c826148b5565b604082019050919050565b6000602082019050818103600083015261494081614904565b9050919050565b600060408201905081810360008301526149618185613656565b905081810360208301526149758184613656565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006149a58261497e565b6149af8185614989565b93506149bf818560208601613033565b6149c881613066565b840191505092915050565b600060a0820190506149e860008301886137c0565b6149f560208301876137c0565b614a026040830186612f32565b614a0f6060830185612f32565b8181036080830152614a21818461499a565b90509695505050505050565b600081519050614a3c81612f88565b92915050565b600060208284031215614a5857614a57612e54565b5b6000614a6684828501614a2d565b91505092915050565b60008160e01c9050919050565b600060033d1115614a9b5760046000803e614a98600051614a6f565b90505b90565b600060443d10614b2b57614ab0612e4a565b60043d036004823e80513d602482011167ffffffffffffffff82111715614ad8575050614b2b565b808201805167ffffffffffffffff811115614af65750505050614b2b565b80602083010160043d038501811115614b13575050505050614b2b565b614b2282602001850186613133565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614b8a603483613022565b9150614b9582614b2e565b604082019050919050565b60006020820190508181036000830152614bb981614b7d565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614c1c602883613022565b9150614c2782614bc0565b604082019050919050565b60006020820190508181036000830152614c4b81614c0f565b9050919050565b600060a082019050614c6760008301886137c0565b614c7460208301876137c0565b8181036040830152614c868186613656565b90508181036060830152614c9a8185613656565b90508181036080830152614cae818461499a565b9050969550505050505056fea2646970667358221220de530025b277bfdd630ca1fd6c32111a54ab472a44f1b1464e05385ed6ec16f664736f6c634300080d00330000000000000000000000008e79c8607a28fe1ec3527991c89f1d9e36d1bad900000000000000000000000069b2cd28b205b47c8ba427e111dd486f9c461b57

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

0000000000000000000000008e79c8607a28fe1ec3527991c89f1d9e36d1bad900000000000000000000000069b2cd28b205b47c8ba427e111dd486f9c461b57

-----Decoded View---------------
Arg [0] : _randomizer (address): 0x8e79c8607a28fe1ec3527991c89f1d9e36d1bad9
Arg [1] : _phat (address): 0x69b2cd28b205b47c8ba427e111dd486f9c461b57

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008e79c8607a28fe1ec3527991c89f1d9e36d1bad9
Arg [1] : 00000000000000000000000069b2cd28b205b47c8ba427e111dd486f9c461b57


Deployed ByteCode Sourcemap

39231:5663:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22576:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21599:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39328:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44593:298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39775:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43990:595;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24671:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39849:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39951:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39811:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22973:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40813:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41598:491;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42129:1591;;;:::i;:::-;;41077:467;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39263:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23570:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43728:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39897:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23953:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39981:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24193:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40931:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22576:231;22662:7;22709:1;22690:21;;:7;:21;;;22682:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;22777:9;:13;22787:2;22777:13;;;;;;;;;;;:22;22791:7;22777:22;;;;;;;;;;;;;;;;22770:29;;22576:231;;;;:::o;21599:310::-;21701:4;21753:26;21738:41;;;:11;:41;;;;:110;;;;21811:37;21796:52;;;:11;:52;;;;21738:110;:163;;;;21865:36;21889:11;21865:23;:36::i;:::-;21738:163;21718:183;;21599:310;;;:::o;39328:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44593:298::-;44649:13;44759:16;44798:21;44815:3;44798:16;:21::i;:::-;44720:148;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44675:208;;44593:298;;;:::o;39775:29::-;;;;:::o;43990:595::-;44060:11;44177:10;44190:1;44177:14;;44173:130;39675:1;44193:2;:10;44173:130;;44237:4;44242:2;44237:8;;;;;;;;:::i;:::-;;;;;;;;44231:3;:14;;;;:::i;:::-;44225:20;;44260:31;44266:10;44278:2;44282:4;44287:2;44282:8;;;;;;;;:::i;:::-;;;;;;;;44260:5;:31::i;:::-;44205:4;;;;;:::i;:::-;;;;44173:130;;;;44327:1;44321:3;:7;44313:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44398:1;44393;44387:3;:7;;;;:::i;:::-;:12;44379:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44453:42;44473:4;44479:10;44491:3;44453:42;;;;;;;;:::i;:::-;;;;;;;;44522:3;44508:10;;:17;;;;;;;:::i;:::-;;;;;;;;44538:37;44544:10;39390:1;44569;44565:3;:5;;;;:::i;:::-;44538:37;;;;;;;;;;;;:5;:37::i;:::-;44049:536;43990:595;:::o;24671:442::-;24912:12;:10;:12::i;:::-;24904:20;;:4;:20;;;:60;;;;24928:36;24945:4;24951:12;:10;:12::i;:::-;24928:16;:36::i;:::-;24904:60;24882:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;25053:52;25076:4;25082:2;25086:3;25091:7;25100:4;25053:22;:52::i;:::-;24671:442;;;;;:::o;39849:41::-;;;;;;;;;;;;;;;;;:::o;39951:23::-;;;;;;;;;;;;;:::o;39811:29::-;;;;:::o;22973:524::-;23129:16;23190:3;:10;23171:8;:15;:29;23163:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;23259:30;23306:8;:15;23292:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23259:63;;23340:9;23335:122;23359:8;:15;23355:1;:19;23335:122;;;23415:30;23425:8;23434:1;23425:11;;;;;;;;:::i;:::-;;;;;;;;23438:3;23442:1;23438:6;;;;;;;;:::i;:::-;;;;;;;;23415:9;:30::i;:::-;23396:13;23410:1;23396:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;23376:3;;;;:::i;:::-;;;23335:122;;;;23476:13;23469:20;;;22973:524;;;;:::o;40813:110::-;40346:5;;;;;;;;;;;40332:19;;:10;:19;;;40324:28;;;;;;40907:8:::1;40888:16;:27;;;;;;;;;;;;:::i;:::-;;40813:110:::0;:::o;41598:491::-;41695:6;41661:30;41671:10;39390:1;41661:9;:30::i;:::-;:40;;41653:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;41776:1;41754:6;:18;41761:10;41754:18;;;;;;;;;;;;;;;;:23;41746:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;41850:1;41824:10;:22;41835:10;41824:22;;;;;;;;;;;;;;;;:27;41816:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;41892:34;41898:10;39390:1;41919:6;41892:5;:34::i;:::-;41962:6;41937:10;:22;41948:10;41937:22;;;;;;;;;;;;;;;:31;;;;42000:10;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41979:6;:18;41986:10;41979:18;;;;;;;;;;;;;;;:53;;;;42050:31;42062:10;42074:6;42050:31;;;;;;;:::i;:::-;;;;;;;;41598:491;:::o;42129:1591::-;42204:1;42179:10;:22;42190:10;42179:22;;;;;;;;;;;;;;;;:26;42171:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;42267:1;42245:6;:18;42252:10;42245:18;;;;;;;;;;;;;;;;:23;42237:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42321:10;;;;;;;;;;;:24;;;42346:6;:18;42353:10;42346:18;;;;;;;;;;;;;;;;42321:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42313:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;42418:17;42448:27;42492:3;:10;;;;42478:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42448:55;;42516:12;42531:10;;;;;;;;;;;:29;;;42561:6;:18;42568:10;42561:18;;;;;;;;;;;;;;;;42531:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42516:64;;42598:9;42593:864;42640:1;42617:10;:22;42628:10;42617:22;;;;;;;;;;;;;;;;:24;;;;:::i;:::-;42613:1;:28;42593:864;;;42717:4;42704;42710:1;42693:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42683:30;;;;;;42675:39;;:46;;;;:::i;:::-;42663:58;;42752:2;42740:9;:14;42737:709;;;42785:10;39675:1;42785:16;;;;;;;;:::i;:::-;;;;;;;:18;;;;;;;;:::i;:::-;;;;;42737:709;;;42853:3;42841:9;:15;42838:608;;;42890:10;39635:1;42890:18;;;;;;;;:::i;:::-;;;;;;;:20;;;;;;;;:::i;:::-;;;;;42838:608;;;42960:3;42948:9;:15;42945:501;;;42995:10;39593:1;42995:16;;;;;;;;:::i;:::-;;;;;;;:18;;;;;;;;:::i;:::-;;;;;42945:501;;;43063:3;43051:9;:15;43048:398;;;43099:10;39553:1;43099:17;;;;;;;;:::i;:::-;;;;;;;:19;;;;;;;;:::i;:::-;;;;;43048:398;;;43168:3;43156:9;:15;43153:293;;;43205:10;39512:1;43205:18;;;;;;;;:::i;:::-;;;;;;;:20;;;;;;;;:::i;:::-;;;;;43153:293;;;43275:3;43263:9;:15;43260:186;;;43308:10;39470:1;43308:15;;;;;;;;:::i;:::-;;;;;;;:17;;;;;;;;:::i;:::-;;;;;43260:186;;;43375:4;43363:9;:16;43360:86;;;43411:10;39431:1;43411:17;;;;;;;;:::i;:::-;;;;;;;:19;;;;;;;;:::i;:::-;;;;;43360:86;43260:186;43153:293;43048:398;42945:501;42838:608;42737:709;42643:3;;;;;:::i;:::-;;;;42593:864;;;;43474:60;43485:10;43497;43532:1;43509:10;:22;43520:10;43509:22;;;;;;;;;;;;;;;;:24;;;;:::i;:::-;43474:60;;;;;;;;:::i;:::-;;;;;;;;43584:1;43561:10;:22;43572:10;43561:22;;;;;;;;;;;;;;;;:24;;;;:::i;:::-;43547:10;;:38;;;;;;;:::i;:::-;;;;;;;;43623:1;43598:10;:22;43609:10;43598:22;;;;;;;;;;;;;;;:26;;;;43656:1;43635:6;:18;43642:10;43635:18;;;;;;;;;;;;;;;:22;;;;43670:42;43681:10;43693:3;43670:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43698:10;43670:42;;;;;;;;;;;;:10;:42::i;:::-;42158:1562;;;42129:1591::o;41077:467::-;41133:15;41151:9;;;;;;;;;;;:19;;;41179:6;41151:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41133:54;;41204:9;41200:118;41230:1;41223:6;:8;;;;:::i;:::-;41219:1;:12;41200:118;;;41252:9;;;;;;;;;;;:22;;;41275:10;41295:6;41304:1;41252:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41233:3;;;;;:::i;:::-;;;;41200:118;;;;41360:9;;;;;;;;;;;:19;;;41388:6;41360:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41355:1;41348:6;:8;;;;:::i;:::-;41338:7;:18;;;;:::i;:::-;:58;41330:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41455:32;41468:10;41480:6;41455:32;;;;;;;:::i;:::-;;;;;;;;41498:38;41504:10;39390:1;41525:6;41498:38;;;;;;;;;;;;:5;:38::i;:::-;41122:422;41077:467;:::o;39263:20::-;;;;;;;;;;;;;:::o;23570:311::-;23689:8;23673:24;;:12;:10;:12::i;:::-;:24;;;23665:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;23801:8;23756:18;:32;23775:12;:10;:12::i;:::-;23756:32;;;;;;;;;;;;;;;:42;23789:8;23756:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23854:8;23825:48;;23840:12;:10;:12::i;:::-;23825:48;;;23864:8;23825:48;;;;;;:::i;:::-;;;;;;;;23570:311;;:::o;43728:254::-;43781:17;;:::i;:::-;43810:27;;:::i;:::-;43852:9;43848:104;43876:1;39675;43871:6;;;;:::i;:::-;43867:1;:10;43848:104;;;43919:21;43929:7;43938:1;43919:9;:21::i;:::-;43909:4;43914:1;43909:7;;;;;;;:::i;:::-;;;;;;:31;;;;:::i;:::-;43899:4;43904:1;43899:7;;;;;;;:::i;:::-;;;;;:41;;;;;43879:3;;;;;:::i;:::-;;;;43848:104;;;;43969:4;43962:12;;;43728:254;;;:::o;39897:45::-;;;;;;;;;;;;;;;;;:::o;23953:168::-;24052:4;24076:18;:27;24095:7;24076:27;;;;;;;;;;;;;;;:37;24104:8;24076:37;;;;;;;;;;;;;;;;;;;;;;;;;24069:44;;23953:168;;;;:::o;39981:29::-;;;;;;;;;;;;;:::o;24193:401::-;24409:12;:10;:12::i;:::-;24401:20;;:4;:20;;;:60;;;;24425:36;24442:4;24448:12;:10;:12::i;:::-;24425:16;:36::i;:::-;24401:60;24379:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;24541:45;24559:4;24565:2;24569;24573:6;24581:4;24541:17;:45::i;:::-;24193:401;;;;;:::o;40931:98::-;40346:5;;;;;;;;;;;40332:19;;:10;:19;;;40324:28;;;;;;41013:8:::1;41005:5;;:16;;;;;;;;;;;;;;;;;;40931:98:::0;:::o;11650:387::-;11710:4;11918:12;11985:7;11973:20;11965:28;;12028:1;12021:4;:8;12014:15;;;11650:387;;;:::o;20414:157::-;20499:4;20538:25;20523:40;;;:11;:40;;;;20516:47;;20414:157;;;:::o;36197:723::-;36253:13;36483:1;36474:5;:10;36470:53;;36501:10;;;;;;;;;;;;;;;;;;;;;36470:53;36533:12;36548:5;36533:20;;36564:14;36589:78;36604:1;36596:4;:9;36589:78;;36622:8;;;;;:::i;:::-;;;;36653:2;36645:10;;;;;:::i;:::-;;;36589:78;;;36677:19;36709:6;36699:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36677:39;;36727:154;36743:1;36734:5;:10;36727:154;;36771:1;36761:11;;;;;:::i;:::-;;;36838:2;36830:5;:10;;;;:::i;:::-;36817:2;:24;;;;:::i;:::-;36804:39;;36787:6;36794;36787:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;36867:2;36858:11;;;;;:::i;:::-;;;36727:154;;;36905:6;36891:21;;;;;36197:723;;;;:::o;31111:675::-;31260:1;31241:21;;:7;:21;;;31233:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;31315:16;31334:12;:10;:12::i;:::-;31315:31;;31359:105;31380:8;31390:7;31407:1;31411:21;31429:2;31411:17;:21::i;:::-;31434:25;31452:6;31434:17;:25::i;:::-;31359:105;;;;;;;;;;;;:20;:105::i;:::-;31477:22;31502:9;:13;31512:2;31502:13;;;;;;;;;;;:22;31516:7;31502:22;;;;;;;;;;;;;;;;31477:47;;31561:6;31543:14;:24;;31535:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31686:6;31669:14;:23;31644:9;:13;31654:2;31644:13;;;;;;;;;;;:22;31658:7;31644:22;;;;;;;;;;;;;;;:48;;;;31763:1;31721:57;;31746:7;31721:57;;31736:8;31721:57;;;31767:2;31771:6;31721:57;;;;;;;:::i;:::-;;;;;;;;31222:564;;31111:675;;;:::o;29162:599::-;29339:1;29320:21;;:7;:21;;;29312:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29392:16;29411:12;:10;:12::i;:::-;29392:31;;29436:107;29457:8;29475:1;29479:7;29488:21;29506:2;29488:17;:21::i;:::-;29511:25;29529:6;29511:17;:25::i;:::-;29538:4;29436:20;:107::i;:::-;29582:6;29556:9;:13;29566:2;29556:13;;;;;;;;;;;:22;29570:7;29556:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;29641:7;29604:57;;29637:1;29604:57;;29619:8;29604:57;;;29650:2;29654:6;29604:57;;;;;;;:::i;:::-;;;;;;;;29674:79;29705:8;29723:1;29727:7;29736:2;29740:6;29748:4;29674:30;:79::i;:::-;29301:460;29162:599;;;;:::o;19396:98::-;19449:7;19476:10;19469:17;;19396:98;:::o;26755:1074::-;26982:7;:14;26968:3;:10;:28;26960:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;27074:1;27060:16;;:2;:16;;;27052:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27131:16;27150:12;:10;:12::i;:::-;27131:31;;27175:60;27196:8;27206:4;27212:2;27216:3;27221:7;27230:4;27175:20;:60::i;:::-;27253:9;27248:421;27272:3;:10;27268:1;:14;27248:421;;;27304:10;27317:3;27321:1;27317:6;;;;;;;;:::i;:::-;;;;;;;;27304:19;;27338:14;27355:7;27363:1;27355:10;;;;;;;;:::i;:::-;;;;;;;;27338:27;;27382:19;27404:9;:13;27414:2;27404:13;;;;;;;;;;;:19;27418:4;27404:19;;;;;;;;;;;;;;;;27382:41;;27461:6;27446:11;:21;;27438:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27594:6;27580:11;:20;27558:9;:13;27568:2;27558:13;;;;;;;;;;;:19;27572:4;27558:19;;;;;;;;;;;;;;;:42;;;;27651:6;27630:9;:13;27640:2;27630:13;;;;;;;;;;;:17;27644:2;27630:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27289:380;;;27284:3;;;;:::i;:::-;;;27248:421;;;;27716:2;27686:47;;27710:4;27686:47;;27700:8;27686:47;;;27720:3;27725:7;27686:47;;;;;;;:::i;:::-;;;;;;;;27746:75;27782:8;27792:4;27798:2;27802:3;27807:7;27816:4;27746:35;:75::i;:::-;26949:880;26755:1074;;;;;:::o;30117:735::-;30309:1;30295:16;;:2;:16;;;30287:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30382:7;:14;30368:3;:10;:28;30360:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30454:16;30473:12;:10;:12::i;:::-;30454:31;;30498:66;30519:8;30537:1;30541:2;30545:3;30550:7;30559:4;30498:20;:66::i;:::-;30582:9;30577:103;30601:3;:10;30597:1;:14;30577:103;;;30658:7;30666:1;30658:10;;;;;;;;:::i;:::-;;;;;;;;30633:9;:17;30643:3;30647:1;30643:6;;;;;;;;:::i;:::-;;;;;;;;30633:17;;;;;;;;;;;:21;30651:2;30633:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;30613:3;;;;;:::i;:::-;;;;30577:103;;;;30733:2;30697:53;;30729:1;30697:53;;30711:8;30697:53;;;30737:3;30742:7;30697:53;;;;;;;:::i;:::-;;;;;;;;30763:81;30799:8;30817:1;30821:2;30825:3;30830:7;30839:4;30763:35;:81::i;:::-;30276:576;30117:735;;;;:::o;25577:820::-;25779:1;25765:16;;:2;:16;;;25757:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;25836:16;25855:12;:10;:12::i;:::-;25836:31;;25880:96;25901:8;25911:4;25917:2;25921:21;25939:2;25921:17;:21::i;:::-;25944:25;25962:6;25944:17;:25::i;:::-;25971:4;25880:20;:96::i;:::-;25989:19;26011:9;:13;26021:2;26011:13;;;;;;;;;;;:19;26025:4;26011:19;;;;;;;;;;;;;;;;25989:41;;26064:6;26049:11;:21;;26041:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26189:6;26175:11;:20;26153:9;:13;26163:2;26153:13;;;;;;;;;;;:19;26167:4;26153:19;;;;;;;;;;;;;;;:42;;;;26238:6;26217:9;:13;26227:2;26217:13;;;;;;;;;;;:17;26231:2;26217:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;26293:2;26262:46;;26287:4;26262:46;;26277:8;26262:46;;;26297:2;26301:6;26262:46;;;;;;;:::i;:::-;;;;;;;;26321:68;26352:8;26362:4;26368:2;26372;26376:6;26384:4;26321:30;:68::i;:::-;25746:651;;25577:820;;;;;:::o;35673:198::-;35739:16;35768:22;35807:1;35793:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35768:41;;35831:7;35820:5;35826:1;35820:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;35858:5;35851:12;;;35673:198;;;:::o;33863:221::-;;;;;;;:::o;34092:748::-;34307:15;:2;:13;;;:15::i;:::-;34303:530;;;34360:2;34343:38;;;34382:8;34392:4;34398:2;34402:6;34410:4;34343:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34339:483;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;34695:6;34688:14;;;;;;;;;;;:::i;:::-;;;;;;;;34339:483;;;34744:62;;;;;;;;;;:::i;:::-;;;;;;;;34339:483;34477:47;;;34465:59;;;:8;:59;;;;34461:158;;34549:50;;;;;;;;;;:::i;:::-;;;;;;;;34461:158;34416:218;34303:530;34092:748;;;;;;:::o;34848:817::-;35088:15;:2;:13;;;:15::i;:::-;35084:574;;;35141:2;35124:43;;;35168:8;35178:4;35184:3;35189:7;35198:4;35124:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35120:527;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;35520:6;35513:14;;;;;;;;;;;:::i;:::-;;;;;;;;35120:527;;;35569:62;;;;;;;;;;:::i;:::-;;;;;;;;35120:527;35297:52;;;35285:64;;;:8;:64;;;;35281:163;;35374:50;;;;;;;;;;:::i;:::-;;;;;;;;35281:163;35204:255;35084:574;34848:817;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:307::-;3561:1;3571:113;3585:6;3582:1;3579:13;3571:113;;;3670:1;3665:3;3661:11;3655:18;3651:1;3646:3;3642:11;3635:39;3607:2;3604:1;3600:10;3595:15;;3571:113;;;3702:6;3699:1;3696:13;3693:101;;;3782:1;3773:6;3768:3;3764:16;3757:27;3693:101;3542:258;3493:307;;;:::o;3806:102::-;3847:6;3898:2;3894:7;3889:2;3882:5;3878:14;3874:28;3864:38;;3806:102;;;:::o;3914:364::-;4002:3;4030:39;4063:5;4030:39;:::i;:::-;4085:71;4149:6;4144:3;4085:71;:::i;:::-;4078:78;;4165:52;4210:6;4205:3;4198:4;4191:5;4187:16;4165:52;:::i;:::-;4242:29;4264:6;4242:29;:::i;:::-;4237:3;4233:39;4226:46;;4006:272;3914:364;;;;:::o;4284:313::-;4397:4;4435:2;4424:9;4420:18;4412:26;;4484:9;4478:4;4474:20;4470:1;4459:9;4455:17;4448:47;4512:78;4585:4;4576:6;4512:78;:::i;:::-;4504:86;;4284:313;;;;:::o;4603:329::-;4662:6;4711:2;4699:9;4690:7;4686:23;4682:32;4679:119;;;4717:79;;:::i;:::-;4679:119;4837:1;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4808:117;4603:329;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:180;5109:77;5106:1;5099:88;5206:4;5203:1;5196:15;5230:4;5227:1;5220:15;5247:281;5330:27;5352:4;5330:27;:::i;:::-;5322:6;5318:40;5460:6;5448:10;5445:22;5424:18;5412:10;5409:34;5406:62;5403:88;;;5471:18;;:::i;:::-;5403:88;5511:10;5507:2;5500:22;5290:238;5247:281;;:::o;5534:129::-;5568:6;5595:20;;:::i;:::-;5585:30;;5624:33;5652:4;5644:6;5624:33;:::i;:::-;5534:129;;;:::o;5669:311::-;5746:4;5836:18;5828:6;5825:30;5822:56;;;5858:18;;:::i;:::-;5822:56;5908:4;5900:6;5896:17;5888:25;;5968:4;5962;5958:15;5950:23;;5669:311;;;:::o;5986:117::-;6095:1;6092;6085:12;6126:710;6222:5;6247:81;6263:64;6320:6;6263:64;:::i;:::-;6247:81;:::i;:::-;6238:90;;6348:5;6377:6;6370:5;6363:21;6411:4;6404:5;6400:16;6393:23;;6464:4;6456:6;6452:17;6444:6;6440:30;6493:3;6485:6;6482:15;6479:122;;;6512:79;;:::i;:::-;6479:122;6627:6;6610:220;6644:6;6639:3;6636:15;6610:220;;;6719:3;6748:37;6781:3;6769:10;6748:37;:::i;:::-;6743:3;6736:50;6815:4;6810:3;6806:14;6799:21;;6686:144;6670:4;6665:3;6661:14;6654:21;;6610:220;;;6614:21;6228:608;;6126:710;;;;;:::o;6859:370::-;6930:5;6979:3;6972:4;6964:6;6960:17;6956:27;6946:122;;6987:79;;:::i;:::-;6946:122;7104:6;7091:20;7129:94;7219:3;7211:6;7204:4;7196:6;7192:17;7129:94;:::i;:::-;7120:103;;6936:293;6859:370;;;;:::o;7235:539::-;7319:6;7368:2;7356:9;7347:7;7343:23;7339:32;7336:119;;;7374:79;;:::i;:::-;7336:119;7522:1;7511:9;7507:17;7494:31;7552:18;7544:6;7541:30;7538:117;;;7574:79;;:::i;:::-;7538:117;7679:78;7749:7;7740:6;7729:9;7725:22;7679:78;:::i;:::-;7669:88;;7465:302;7235:539;;;;:::o;7780:117::-;7889:1;7886;7879:12;7903:307;7964:4;8054:18;8046:6;8043:30;8040:56;;;8076:18;;:::i;:::-;8040:56;8114:29;8136:6;8114:29;:::i;:::-;8106:37;;8198:4;8192;8188:15;8180:23;;7903:307;;;:::o;8216:154::-;8300:6;8295:3;8290;8277:30;8362:1;8353:6;8348:3;8344:16;8337:27;8216:154;;;:::o;8376:410::-;8453:5;8478:65;8494:48;8535:6;8494:48;:::i;:::-;8478:65;:::i;:::-;8469:74;;8566:6;8559:5;8552:21;8604:4;8597:5;8593:16;8642:3;8633:6;8628:3;8624:16;8621:25;8618:112;;;8649:79;;:::i;:::-;8618:112;8739:41;8773:6;8768:3;8763;8739:41;:::i;:::-;8459:327;8376:410;;;;;:::o;8805:338::-;8860:5;8909:3;8902:4;8894:6;8890:17;8886:27;8876:122;;8917:79;;:::i;:::-;8876:122;9034:6;9021:20;9059:78;9133:3;9125:6;9118:4;9110:6;9106:17;9059:78;:::i;:::-;9050:87;;8866:277;8805:338;;;;:::o;9149:1509::-;9303:6;9311;9319;9327;9335;9384:3;9372:9;9363:7;9359:23;9355:33;9352:120;;;9391:79;;:::i;:::-;9352:120;9511:1;9536:53;9581:7;9572:6;9561:9;9557:22;9536:53;:::i;:::-;9526:63;;9482:117;9638:2;9664:53;9709:7;9700:6;9689:9;9685:22;9664:53;:::i;:::-;9654:63;;9609:118;9794:2;9783:9;9779:18;9766:32;9825:18;9817:6;9814:30;9811:117;;;9847:79;;:::i;:::-;9811:117;9952:78;10022:7;10013:6;10002:9;9998:22;9952:78;:::i;:::-;9942:88;;9737:303;10107:2;10096:9;10092:18;10079:32;10138:18;10130:6;10127:30;10124:117;;;10160:79;;:::i;:::-;10124:117;10265:78;10335:7;10326:6;10315:9;10311:22;10265:78;:::i;:::-;10255:88;;10050:303;10420:3;10409:9;10405:19;10392:33;10452:18;10444:6;10441:30;10438:117;;;10474:79;;:::i;:::-;10438:117;10579:62;10633:7;10624:6;10613:9;10609:22;10579:62;:::i;:::-;10569:72;;10363:288;9149:1509;;;;;;;;:::o;10664:329::-;10723:6;10772:2;10760:9;10751:7;10747:23;10743:32;10740:119;;;10778:79;;:::i;:::-;10740:119;10898:1;10923:53;10968:7;10959:6;10948:9;10944:22;10923:53;:::i;:::-;10913:63;;10869:117;10664:329;;;;:::o;10999:60::-;11027:3;11048:5;11041:12;;10999:60;;;:::o;11065:142::-;11115:9;11148:53;11166:34;11175:24;11193:5;11175:24;:::i;:::-;11166:34;:::i;:::-;11148:53;:::i;:::-;11135:66;;11065:142;;;:::o;11213:126::-;11263:9;11296:37;11327:5;11296:37;:::i;:::-;11283:50;;11213:126;;;:::o;11345:139::-;11408:9;11441:37;11472:5;11441:37;:::i;:::-;11428:50;;11345:139;;;:::o;11490:157::-;11590:50;11634:5;11590:50;:::i;:::-;11585:3;11578:63;11490:157;;:::o;11653:248::-;11759:4;11797:2;11786:9;11782:18;11774:26;;11810:84;11891:1;11880:9;11876:17;11867:6;11810:84;:::i;:::-;11653:248;;;;:::o;11907:311::-;11984:4;12074:18;12066:6;12063:30;12060:56;;;12096:18;;:::i;:::-;12060:56;12146:4;12138:6;12134:17;12126:25;;12206:4;12200;12196:15;12188:23;;11907:311;;;:::o;12241:710::-;12337:5;12362:81;12378:64;12435:6;12378:64;:::i;:::-;12362:81;:::i;:::-;12353:90;;12463:5;12492:6;12485:5;12478:21;12526:4;12519:5;12515:16;12508:23;;12579:4;12571:6;12567:17;12559:6;12555:30;12608:3;12600:6;12597:15;12594:122;;;12627:79;;:::i;:::-;12594:122;12742:6;12725:220;12759:6;12754:3;12751:15;12725:220;;;12834:3;12863:37;12896:3;12884:10;12863:37;:::i;:::-;12858:3;12851:50;12930:4;12925:3;12921:14;12914:21;;12801:144;12785:4;12780:3;12776:14;12769:21;;12725:220;;;12729:21;12343:608;;12241:710;;;;;:::o;12974:370::-;13045:5;13094:3;13087:4;13079:6;13075:17;13071:27;13061:122;;13102:79;;:::i;:::-;13061:122;13219:6;13206:20;13244:94;13334:3;13326:6;13319:4;13311:6;13307:17;13244:94;:::i;:::-;13235:103;;13051:293;12974:370;;;;:::o;13350:894::-;13468:6;13476;13525:2;13513:9;13504:7;13500:23;13496:32;13493:119;;;13531:79;;:::i;:::-;13493:119;13679:1;13668:9;13664:17;13651:31;13709:18;13701:6;13698:30;13695:117;;;13731:79;;:::i;:::-;13695:117;13836:78;13906:7;13897:6;13886:9;13882:22;13836:78;:::i;:::-;13826:88;;13622:302;13991:2;13980:9;13976:18;13963:32;14022:18;14014:6;14011:30;14008:117;;;14044:79;;:::i;:::-;14008:117;14149:78;14219:7;14210:6;14199:9;14195:22;14149:78;:::i;:::-;14139:88;;13934:303;13350:894;;;;;:::o;14250:114::-;14317:6;14351:5;14345:12;14335:22;;14250:114;;;:::o;14370:184::-;14469:11;14503:6;14498:3;14491:19;14543:4;14538:3;14534:14;14519:29;;14370:184;;;;:::o;14560:132::-;14627:4;14650:3;14642:11;;14680:4;14675:3;14671:14;14663:22;;14560:132;;;:::o;14698:108::-;14775:24;14793:5;14775:24;:::i;:::-;14770:3;14763:37;14698:108;;:::o;14812:179::-;14881:10;14902:46;14944:3;14936:6;14902:46;:::i;:::-;14980:4;14975:3;14971:14;14957:28;;14812:179;;;;:::o;14997:113::-;15067:4;15099;15094:3;15090:14;15082:22;;14997:113;;;:::o;15146:732::-;15265:3;15294:54;15342:5;15294:54;:::i;:::-;15364:86;15443:6;15438:3;15364:86;:::i;:::-;15357:93;;15474:56;15524:5;15474:56;:::i;:::-;15553:7;15584:1;15569:284;15594:6;15591:1;15588:13;15569:284;;;15670:6;15664:13;15697:63;15756:3;15741:13;15697:63;:::i;:::-;15690:70;;15783:60;15836:6;15783:60;:::i;:::-;15773:70;;15629:224;15616:1;15613;15609:9;15604:14;;15569:284;;;15573:14;15869:3;15862:10;;15270:608;;;15146:732;;;;:::o;15884:373::-;16027:4;16065:2;16054:9;16050:18;16042:26;;16114:9;16108:4;16104:20;16100:1;16089:9;16085:17;16078:47;16142:108;16245:4;16236:6;16142:108;:::i;:::-;16134:116;;15884:373;;;;:::o;16263:308::-;16325:4;16415:18;16407:6;16404:30;16401:56;;;16437:18;;:::i;:::-;16401:56;16475:29;16497:6;16475:29;:::i;:::-;16467:37;;16559:4;16553;16549:15;16541:23;;16263:308;;;:::o;16577:412::-;16655:5;16680:66;16696:49;16738:6;16696:49;:::i;:::-;16680:66;:::i;:::-;16671:75;;16769:6;16762:5;16755:21;16807:4;16800:5;16796:16;16845:3;16836:6;16831:3;16827:16;16824:25;16821:112;;;16852:79;;:::i;:::-;16821:112;16942:41;16976:6;16971:3;16966;16942:41;:::i;:::-;16661:328;16577:412;;;;;:::o;17009:340::-;17065:5;17114:3;17107:4;17099:6;17095:17;17091:27;17081:122;;17122:79;;:::i;:::-;17081:122;17239:6;17226:20;17264:79;17339:3;17331:6;17324:4;17316:6;17312:17;17264:79;:::i;:::-;17255:88;;17071:278;17009:340;;;;:::o;17355:509::-;17424:6;17473:2;17461:9;17452:7;17448:23;17444:32;17441:119;;;17479:79;;:::i;:::-;17441:119;17627:1;17616:9;17612:17;17599:31;17657:18;17649:6;17646:30;17643:117;;;17679:79;;:::i;:::-;17643:117;17784:63;17839:7;17830:6;17819:9;17815:22;17784:63;:::i;:::-;17774:73;;17570:287;17355:509;;;;:::o;17870:118::-;17957:24;17975:5;17957:24;:::i;:::-;17952:3;17945:37;17870:118;;:::o;17994:222::-;18087:4;18125:2;18114:9;18110:18;18102:26;;18138:71;18206:1;18195:9;18191:17;18182:6;18138:71;:::i;:::-;17994:222;;;;:::o;18222:116::-;18292:21;18307:5;18292:21;:::i;:::-;18285:5;18282:32;18272:60;;18328:1;18325;18318:12;18272:60;18222:116;:::o;18344:133::-;18387:5;18425:6;18412:20;18403:29;;18441:30;18465:5;18441:30;:::i;:::-;18344:133;;;;:::o;18483:468::-;18548:6;18556;18605:2;18593:9;18584:7;18580:23;18576:32;18573:119;;;18611:79;;:::i;:::-;18573:119;18731:1;18756:53;18801:7;18792:6;18781:9;18777:22;18756:53;:::i;:::-;18746:63;;18702:117;18858:2;18884:50;18926:7;18917:6;18906:9;18902:22;18884:50;:::i;:::-;18874:60;;18829:115;18483:468;;;;;:::o;18957:104::-;19022:6;19050:4;19040:14;;18957:104;;;:::o;19067:143::-;19164:11;19201:3;19186:18;;19067:143;;;;:::o;19216:98::-;19281:4;19304:3;19296:11;;19216:98;;;:::o;19320:111::-;19388:4;19420;19415:3;19411:14;19403:22;;19320:111;;;:::o;19469:694::-;19605:52;19651:5;19605:52;:::i;:::-;19673:84;19750:6;19745:3;19673:84;:::i;:::-;19666:91;;19781:54;19829:5;19781:54;:::i;:::-;19858:7;19889:1;19874:282;19899:6;19896:1;19893:13;19874:282;;;19975:6;19969:13;20002:63;20061:3;20046:13;20002:63;:::i;:::-;19995:70;;20088:58;20139:6;20088:58;:::i;:::-;20078:68;;19934:222;19921:1;19918;19914:9;19909:14;;19874:282;;;19878:14;19581:582;;;19469:694;;:::o;20169:315::-;20308:4;20346:3;20335:9;20331:19;20323:27;;20360:117;20474:1;20463:9;20459:17;20450:6;20360:117;:::i;:::-;20169:315;;;;:::o;20490:474::-;20558:6;20566;20615:2;20603:9;20594:7;20590:23;20586:32;20583:119;;;20621:79;;:::i;:::-;20583:119;20741:1;20766:53;20811:7;20802:6;20791:9;20787:22;20766:53;:::i;:::-;20756:63;;20712:117;20868:2;20894:53;20939:7;20930:6;20919:9;20915:22;20894:53;:::i;:::-;20884:63;;20839:118;20490:474;;;;;:::o;20970:146::-;21040:9;21073:37;21104:5;21073:37;:::i;:::-;21060:50;;20970:146;;;:::o;21122:171::-;21229:57;21280:5;21229:57;:::i;:::-;21224:3;21217:70;21122:171;;:::o;21299:262::-;21412:4;21450:2;21439:9;21435:18;21427:26;;21463:91;21551:1;21540:9;21536:17;21527:6;21463:91;:::i;:::-;21299:262;;;;:::o;21567:1089::-;21671:6;21679;21687;21695;21703;21752:3;21740:9;21731:7;21727:23;21723:33;21720:120;;;21759:79;;:::i;:::-;21720:120;21879:1;21904:53;21949:7;21940:6;21929:9;21925:22;21904:53;:::i;:::-;21894:63;;21850:117;22006:2;22032:53;22077:7;22068:6;22057:9;22053:22;22032:53;:::i;:::-;22022:63;;21977:118;22134:2;22160:53;22205:7;22196:6;22185:9;22181:22;22160:53;:::i;:::-;22150:63;;22105:118;22262:2;22288:53;22333:7;22324:6;22313:9;22309:22;22288:53;:::i;:::-;22278:63;;22233:118;22418:3;22407:9;22403:19;22390:33;22450:18;22442:6;22439:30;22436:117;;;22472:79;;:::i;:::-;22436:117;22577:62;22631:7;22622:6;22611:9;22607:22;22577:62;:::i;:::-;22567:72;;22361:288;21567:1089;;;;;;;;:::o;22662:230::-;22802:34;22798:1;22790:6;22786:14;22779:58;22871:13;22866:2;22858:6;22854:15;22847:38;22662:230;:::o;22898:366::-;23040:3;23061:67;23125:2;23120:3;23061:67;:::i;:::-;23054:74;;23137:93;23226:3;23137:93;:::i;:::-;23255:2;23250:3;23246:12;23239:19;;22898:366;;;:::o;23270:419::-;23436:4;23474:2;23463:9;23459:18;23451:26;;23523:9;23517:4;23513:20;23509:1;23498:9;23494:17;23487:47;23551:131;23677:4;23551:131;:::i;:::-;23543:139;;23270:419;;;:::o;23695:180::-;23743:77;23740:1;23733:88;23840:4;23837:1;23830:15;23864:4;23861:1;23854:15;23881:320;23925:6;23962:1;23956:4;23952:12;23942:22;;24009:1;24003:4;23999:12;24030:18;24020:81;;24086:4;24078:6;24074:17;24064:27;;24020:81;24148:2;24140:6;24137:14;24117:18;24114:38;24111:84;;24167:18;;:::i;:::-;24111:84;23932:269;23881:320;;;:::o;24207:148::-;24309:11;24346:3;24331:18;;24207:148;;;;:::o;24361:141::-;24410:4;24433:3;24425:11;;24456:3;24453:1;24446:14;24490:4;24487:1;24477:18;24469:26;;24361:141;;;:::o;24532:845::-;24635:3;24672:5;24666:12;24701:36;24727:9;24701:36;:::i;:::-;24753:89;24835:6;24830:3;24753:89;:::i;:::-;24746:96;;24873:1;24862:9;24858:17;24889:1;24884:137;;;;25035:1;25030:341;;;;24851:520;;24884:137;24968:4;24964:9;24953;24949:25;24944:3;24937:38;25004:6;24999:3;24995:16;24988:23;;24884:137;;25030:341;25097:38;25129:5;25097:38;:::i;:::-;25157:1;25171:154;25185:6;25182:1;25179:13;25171:154;;;25259:7;25253:14;25249:1;25244:3;25240:11;25233:35;25309:1;25300:7;25296:15;25285:26;;25207:4;25204:1;25200:12;25195:17;;25171:154;;;25354:6;25349:3;25345:16;25338:23;;25037:334;;24851:520;;24639:738;;24532:845;;;;:::o;25383:377::-;25489:3;25517:39;25550:5;25517:39;:::i;:::-;25572:89;25654:6;25649:3;25572:89;:::i;:::-;25565:96;;25670:52;25715:6;25710:3;25703:4;25696:5;25692:16;25670:52;:::i;:::-;25747:6;25742:3;25738:16;25731:23;;25493:267;25383:377;;;;:::o;25766:155::-;25906:7;25902:1;25894:6;25890:14;25883:31;25766:155;:::o;25927:400::-;26087:3;26108:84;26190:1;26185:3;26108:84;:::i;:::-;26101:91;;26201:93;26290:3;26201:93;:::i;:::-;26319:1;26314:3;26310:11;26303:18;;25927:400;;;:::o;26333:695::-;26611:3;26633:92;26721:3;26712:6;26633:92;:::i;:::-;26626:99;;26742:95;26833:3;26824:6;26742:95;:::i;:::-;26735:102;;26854:148;26998:3;26854:148;:::i;:::-;26847:155;;27019:3;27012:10;;26333:695;;;;;:::o;27034:180::-;27082:77;27079:1;27072:88;27179:4;27176:1;27169:15;27203:4;27200:1;27193:15;27220:180;27268:77;27265:1;27258:88;27365:4;27362:1;27355:15;27389:4;27386:1;27379:15;27406:305;27446:3;27465:20;27483:1;27465:20;:::i;:::-;27460:25;;27499:20;27517:1;27499:20;:::i;:::-;27494:25;;27653:1;27585:66;27581:74;27578:1;27575:81;27572:107;;;27659:18;;:::i;:::-;27572:107;27703:1;27700;27696:9;27689:16;;27406:305;;;;:::o;27717:233::-;27756:3;27779:24;27797:5;27779:24;:::i;:::-;27770:33;;27825:66;27818:5;27815:77;27812:103;;27895:18;;:::i;:::-;27812:103;27942:1;27935:5;27931:13;27924:20;;27717:233;;;:::o;27956:222::-;28096:34;28092:1;28084:6;28080:14;28073:58;28165:5;28160:2;28152:6;28148:15;28141:30;27956:222;:::o;28184:366::-;28326:3;28347:67;28411:2;28406:3;28347:67;:::i;:::-;28340:74;;28423:93;28512:3;28423:93;:::i;:::-;28541:2;28536:3;28532:12;28525:19;;28184:366;;;:::o;28556:419::-;28722:4;28760:2;28749:9;28745:18;28737:26;;28809:9;28803:4;28799:20;28795:1;28784:9;28780:17;28773:47;28837:131;28963:4;28837:131;:::i;:::-;28829:139;;28556:419;;;:::o;28981:180::-;29029:77;29026:1;29019:88;29126:4;29123:1;29116:15;29150:4;29147:1;29140:15;29167:176;29199:1;29216:20;29234:1;29216:20;:::i;:::-;29211:25;;29250:20;29268:1;29250:20;:::i;:::-;29245:25;;29289:1;29279:35;;29294:18;;:::i;:::-;29279:35;29335:1;29332;29328:9;29323:14;;29167:176;;;;:::o;29349:181::-;29489:33;29485:1;29477:6;29473:14;29466:57;29349:181;:::o;29536:366::-;29678:3;29699:67;29763:2;29758:3;29699:67;:::i;:::-;29692:74;;29775:93;29864:3;29775:93;:::i;:::-;29893:2;29888:3;29884:12;29877:19;;29536:366;;;:::o;29908:419::-;30074:4;30112:2;30101:9;30097:18;30089:26;;30161:9;30155:4;30151:20;30147:1;30136:9;30132:17;30125:47;30189:131;30315:4;30189:131;:::i;:::-;30181:139;;29908:419;;;:::o;30333:593::-;30532:4;30570:2;30559:9;30555:18;30547:26;;30619:9;30613:4;30609:20;30605:1;30594:9;30590:17;30583:47;30647:108;30750:4;30741:6;30647:108;:::i;:::-;30639:116;;30765:72;30833:2;30822:9;30818:18;30809:6;30765:72;:::i;:::-;30847;30915:2;30904:9;30900:18;30891:6;30847:72;:::i;:::-;30333:593;;;;;;:::o;30932:185::-;30972:1;30989:20;31007:1;30989:20;:::i;:::-;30984:25;;31023:20;31041:1;31023:20;:::i;:::-;31018:25;;31062:1;31052:35;;31067:18;;:::i;:::-;31052:35;31109:1;31106;31102:9;31097:14;;30932:185;;;;:::o;31123:237::-;31263:34;31259:1;31251:6;31247:14;31240:58;31332:20;31327:2;31319:6;31315:15;31308:45;31123:237;:::o;31366:366::-;31508:3;31529:67;31593:2;31588:3;31529:67;:::i;:::-;31522:74;;31605:93;31694:3;31605:93;:::i;:::-;31723:2;31718:3;31714:12;31707:19;;31366:366;;;:::o;31738:419::-;31904:4;31942:2;31931:9;31927:18;31919:26;;31991:9;31985:4;31981:20;31977:1;31966:9;31962:17;31955:47;32019:131;32145:4;32019:131;:::i;:::-;32011:139;;31738:419;;;:::o;32163:228::-;32303:34;32299:1;32291:6;32287:14;32280:58;32372:11;32367:2;32359:6;32355:15;32348:36;32163:228;:::o;32397:366::-;32539:3;32560:67;32624:2;32619:3;32560:67;:::i;:::-;32553:74;;32636:93;32725:3;32636:93;:::i;:::-;32754:2;32749:3;32745:12;32738:19;;32397:366;;;:::o;32769:419::-;32935:4;32973:2;32962:9;32958:18;32950:26;;33022:9;33016:4;33012:20;33008:1;32997:9;32993:17;32986:47;33050:131;33176:4;33050:131;:::i;:::-;33042:139;;32769:419;;;:::o;33194:179::-;33334:31;33330:1;33322:6;33318:14;33311:55;33194:179;:::o;33379:366::-;33521:3;33542:67;33606:2;33601:3;33542:67;:::i;:::-;33535:74;;33618:93;33707:3;33618:93;:::i;:::-;33736:2;33731:3;33727:12;33720:19;;33379:366;;;:::o;33751:419::-;33917:4;33955:2;33944:9;33940:18;33932:26;;34004:9;33998:4;33994:20;33990:1;33979:9;33975:17;33968:47;34032:131;34158:4;34032:131;:::i;:::-;34024:139;;33751:419;;;:::o;34176:173::-;34316:25;34312:1;34304:6;34300:14;34293:49;34176:173;:::o;34355:366::-;34497:3;34518:67;34582:2;34577:3;34518:67;:::i;:::-;34511:74;;34594:93;34683:3;34594:93;:::i;:::-;34712:2;34707:3;34703:12;34696:19;;34355:366;;;:::o;34727:419::-;34893:4;34931:2;34920:9;34916:18;34908:26;;34980:9;34974:4;34970:20;34966:1;34955:9;34951:17;34944:47;35008:131;35134:4;35008:131;:::i;:::-;35000:139;;34727:419;;;:::o;35152:143::-;35209:5;35240:6;35234:13;35225:22;;35256:33;35283:5;35256:33;:::i;:::-;35152:143;;;;:::o;35301:351::-;35371:6;35420:2;35408:9;35399:7;35395:23;35391:32;35388:119;;;35426:79;;:::i;:::-;35388:119;35546:1;35571:64;35627:7;35618:6;35607:9;35603:22;35571:64;:::i;:::-;35561:74;;35517:128;35301:351;;;;:::o;35658:332::-;35779:4;35817:2;35806:9;35802:18;35794:26;;35830:71;35898:1;35887:9;35883:17;35874:6;35830:71;:::i;:::-;35911:72;35979:2;35968:9;35964:18;35955:6;35911:72;:::i;:::-;35658:332;;;;;:::o;35996:166::-;36136:18;36132:1;36124:6;36120:14;36113:42;35996:166;:::o;36168:366::-;36310:3;36331:67;36395:2;36390:3;36331:67;:::i;:::-;36324:74;;36407:93;36496:3;36407:93;:::i;:::-;36525:2;36520:3;36516:12;36509:19;;36168:366;;;:::o;36540:419::-;36706:4;36744:2;36733:9;36729:18;36721:26;;36793:9;36787:4;36783:20;36779:1;36768:9;36764:17;36757:47;36821:131;36947:4;36821:131;:::i;:::-;36813:139;;36540:419;;;:::o;36965:179::-;37105:31;37101:1;37093:6;37089:14;37082:55;36965:179;:::o;37150:366::-;37292:3;37313:67;37377:2;37372:3;37313:67;:::i;:::-;37306:74;;37389:93;37478:3;37389:93;:::i;:::-;37507:2;37502:3;37498:12;37491:19;;37150:366;;;:::o;37522:419::-;37688:4;37726:2;37715:9;37711:18;37703:26;;37775:9;37769:4;37765:20;37761:1;37750:9;37746:17;37739:47;37803:131;37929:4;37803:131;:::i;:::-;37795:139;;37522:419;;;:::o;37947:137::-;38001:5;38032:6;38026:13;38017:22;;38048:30;38072:5;38048:30;:::i;:::-;37947:137;;;;:::o;38090:345::-;38157:6;38206:2;38194:9;38185:7;38181:23;38177:32;38174:119;;;38212:79;;:::i;:::-;38174:119;38332:1;38357:61;38410:7;38401:6;38390:9;38386:22;38357:61;:::i;:::-;38347:71;;38303:125;38090:345;;;;:::o;38441:222::-;38581:34;38577:1;38569:6;38565:14;38558:58;38650:5;38645:2;38637:6;38633:15;38626:30;38441:222;:::o;38669:366::-;38811:3;38832:67;38896:2;38891:3;38832:67;:::i;:::-;38825:74;;38908:93;38997:3;38908:93;:::i;:::-;39026:2;39021:3;39017:12;39010:19;;38669:366;;;:::o;39041:419::-;39207:4;39245:2;39234:9;39230:18;39222:26;;39294:9;39288:4;39284:20;39280:1;39269:9;39265:17;39258:47;39322:131;39448:4;39322:131;:::i;:::-;39314:139;;39041:419;;;:::o;39466:348::-;39506:7;39529:20;39547:1;39529:20;:::i;:::-;39524:25;;39563:20;39581:1;39563:20;:::i;:::-;39558:25;;39751:1;39683:66;39679:74;39676:1;39673:81;39668:1;39661:9;39654:17;39650:105;39647:131;;;39758:18;;:::i;:::-;39647:131;39806:1;39803;39799:9;39788:20;;39466:348;;;;:::o;39820:332::-;39941:4;39979:2;39968:9;39964:18;39956:26;;39992:71;40060:1;40049:9;40045:17;40036:6;39992:71;:::i;:::-;40073:72;40141:2;40130:9;40126:18;40117:6;40073:72;:::i;:::-;39820:332;;;;;:::o;40158:85::-;40203:7;40232:5;40221:16;;40158:85;;;:::o;40249:158::-;40307:9;40340:61;40358:42;40367:32;40393:5;40367:32;:::i;:::-;40358:42;:::i;:::-;40340:61;:::i;:::-;40327:74;;40249:158;;;:::o;40413:147::-;40508:45;40547:5;40508:45;:::i;:::-;40503:3;40496:58;40413:147;;:::o;40566:458::-;40723:4;40761:2;40750:9;40746:18;40738:26;;40774:71;40842:1;40831:9;40827:17;40818:6;40774:71;:::i;:::-;40855:72;40923:2;40912:9;40908:18;40899:6;40855:72;:::i;:::-;40937:80;41013:2;41002:9;40998:18;40989:6;40937:80;:::i;:::-;40566:458;;;;;;:::o;41030:178::-;41170:30;41166:1;41158:6;41154:14;41147:54;41030:178;:::o;41214:366::-;41356:3;41377:67;41441:2;41436:3;41377:67;:::i;:::-;41370:74;;41453:93;41542:3;41453:93;:::i;:::-;41571:2;41566:3;41562:12;41555:19;;41214:366;;;:::o;41586:419::-;41752:4;41790:2;41779:9;41775:18;41767:26;;41839:9;41833:4;41829:20;41825:1;41814:9;41810:17;41803:47;41867:131;41993:4;41867:131;:::i;:::-;41859:139;;41586:419;;;:::o;42011:228::-;42151:34;42147:1;42139:6;42135:14;42128:58;42220:11;42215:2;42207:6;42203:15;42196:36;42011:228;:::o;42245:366::-;42387:3;42408:67;42472:2;42467:3;42408:67;:::i;:::-;42401:74;;42484:93;42573:3;42484:93;:::i;:::-;42602:2;42597:3;42593:12;42586:19;;42245:366;;;:::o;42617:419::-;42783:4;42821:2;42810:9;42806:18;42798:26;;42870:9;42864:4;42860:20;42856:1;42845:9;42841:17;42834:47;42898:131;43024:4;42898:131;:::i;:::-;42890:139;;42617:419;;;:::o;43042:228::-;43182:34;43178:1;43170:6;43166:14;43159:58;43251:11;43246:2;43238:6;43234:15;43227:36;43042:228;:::o;43276:366::-;43418:3;43439:67;43503:2;43498:3;43439:67;:::i;:::-;43432:74;;43515:93;43604:3;43515:93;:::i;:::-;43633:2;43628:3;43624:12;43617:19;;43276:366;;;:::o;43648:419::-;43814:4;43852:2;43841:9;43837:18;43829:26;;43901:9;43895:4;43891:20;43887:1;43876:9;43872:17;43865:47;43929:131;44055:4;43929:131;:::i;:::-;43921:139;;43648:419;;;:::o;44073:191::-;44113:4;44133:20;44151:1;44133:20;:::i;:::-;44128:25;;44167:20;44185:1;44167:20;:::i;:::-;44162:25;;44206:1;44203;44200:8;44197:34;;;44211:18;;:::i;:::-;44197:34;44256:1;44253;44249:9;44241:17;;44073:191;;;;:::o;44270:222::-;44410:34;44406:1;44398:6;44394:14;44387:58;44479:5;44474:2;44466:6;44462:15;44455:30;44270:222;:::o;44498:366::-;44640:3;44661:67;44725:2;44720:3;44661:67;:::i;:::-;44654:74;;44737:93;44826:3;44737:93;:::i;:::-;44855:2;44850:3;44846:12;44839:19;;44498:366;;;:::o;44870:419::-;45036:4;45074:2;45063:9;45059:18;45051:26;;45123:9;45117:4;45113:20;45109:1;45098:9;45094:17;45087:47;45151:131;45277:4;45151:131;:::i;:::-;45143:139;;44870:419;;;:::o;45295:223::-;45435:34;45431:1;45423:6;45419:14;45412:58;45504:6;45499:2;45491:6;45487:15;45480:31;45295:223;:::o;45524:366::-;45666:3;45687:67;45751:2;45746:3;45687:67;:::i;:::-;45680:74;;45763:93;45852:3;45763:93;:::i;:::-;45881:2;45876:3;45872:12;45865:19;;45524:366;;;:::o;45896:419::-;46062:4;46100:2;46089:9;46085:18;46077:26;;46149:9;46143:4;46139:20;46135:1;46124:9;46120:17;46113:47;46177:131;46303:4;46177:131;:::i;:::-;46169:139;;45896:419;;;:::o;46321:220::-;46461:34;46457:1;46449:6;46445:14;46438:58;46530:3;46525:2;46517:6;46513:15;46506:28;46321:220;:::o;46547:366::-;46689:3;46710:67;46774:2;46769:3;46710:67;:::i;:::-;46703:74;;46786:93;46875:3;46786:93;:::i;:::-;46904:2;46899:3;46895:12;46888:19;;46547:366;;;:::o;46919:419::-;47085:4;47123:2;47112:9;47108:18;47100:26;;47172:9;47166:4;47162:20;47158:1;47147:9;47143:17;47136:47;47200:131;47326:4;47200:131;:::i;:::-;47192:139;;46919:419;;;:::o;47344:227::-;47484:34;47480:1;47472:6;47468:14;47461:58;47553:10;47548:2;47540:6;47536:15;47529:35;47344:227;:::o;47577:366::-;47719:3;47740:67;47804:2;47799:3;47740:67;:::i;:::-;47733:74;;47816:93;47905:3;47816:93;:::i;:::-;47934:2;47929:3;47925:12;47918:19;;47577:366;;;:::o;47949:419::-;48115:4;48153:2;48142:9;48138:18;48130:26;;48202:9;48196:4;48192:20;48188:1;48177:9;48173:17;48166:47;48230:131;48356:4;48230:131;:::i;:::-;48222:139;;47949:419;;;:::o;48374:224::-;48514:34;48510:1;48502:6;48498:14;48491:58;48583:7;48578:2;48570:6;48566:15;48559:32;48374:224;:::o;48604:366::-;48746:3;48767:67;48831:2;48826:3;48767:67;:::i;:::-;48760:74;;48843:93;48932:3;48843:93;:::i;:::-;48961:2;48956:3;48952:12;48945:19;;48604:366;;;:::o;48976:419::-;49142:4;49180:2;49169:9;49165:18;49157:26;;49229:9;49223:4;49219:20;49215:1;49204:9;49200:17;49193:47;49257:131;49383:4;49257:131;:::i;:::-;49249:139;;48976:419;;;:::o;49401:229::-;49541:34;49537:1;49529:6;49525:14;49518:58;49610:12;49605:2;49597:6;49593:15;49586:37;49401:229;:::o;49636:366::-;49778:3;49799:67;49863:2;49858:3;49799:67;:::i;:::-;49792:74;;49875:93;49964:3;49875:93;:::i;:::-;49993:2;49988:3;49984:12;49977:19;;49636:366;;;:::o;50008:419::-;50174:4;50212:2;50201:9;50197:18;50189:26;;50261:9;50255:4;50251:20;50247:1;50236:9;50232:17;50225:47;50289:131;50415:4;50289:131;:::i;:::-;50281:139;;50008:419;;;:::o;50433:634::-;50654:4;50692:2;50681:9;50677:18;50669:26;;50741:9;50735:4;50731:20;50727:1;50716:9;50712:17;50705:47;50769:108;50872:4;50863:6;50769:108;:::i;:::-;50761:116;;50924:9;50918:4;50914:20;50909:2;50898:9;50894:18;50887:48;50952:108;51055:4;51046:6;50952:108;:::i;:::-;50944:116;;50433:634;;;;;:::o;51073:98::-;51124:6;51158:5;51152:12;51142:22;;51073:98;;;:::o;51177:168::-;51260:11;51294:6;51289:3;51282:19;51334:4;51329:3;51325:14;51310:29;;51177:168;;;;:::o;51351:360::-;51437:3;51465:38;51497:5;51465:38;:::i;:::-;51519:70;51582:6;51577:3;51519:70;:::i;:::-;51512:77;;51598:52;51643:6;51638:3;51631:4;51624:5;51620:16;51598:52;:::i;:::-;51675:29;51697:6;51675:29;:::i;:::-;51670:3;51666:39;51659:46;;51441:270;51351:360;;;;:::o;51717:751::-;51940:4;51978:3;51967:9;51963:19;51955:27;;51992:71;52060:1;52049:9;52045:17;52036:6;51992:71;:::i;:::-;52073:72;52141:2;52130:9;52126:18;52117:6;52073:72;:::i;:::-;52155;52223:2;52212:9;52208:18;52199:6;52155:72;:::i;:::-;52237;52305:2;52294:9;52290:18;52281:6;52237:72;:::i;:::-;52357:9;52351:4;52347:20;52341:3;52330:9;52326:19;52319:49;52385:76;52456:4;52447:6;52385:76;:::i;:::-;52377:84;;51717:751;;;;;;;;:::o;52474:141::-;52530:5;52561:6;52555:13;52546:22;;52577:32;52603:5;52577:32;:::i;:::-;52474:141;;;;:::o;52621:349::-;52690:6;52739:2;52727:9;52718:7;52714:23;52710:32;52707:119;;;52745:79;;:::i;:::-;52707:119;52865:1;52890:63;52945:7;52936:6;52925:9;52921:22;52890:63;:::i;:::-;52880:73;;52836:127;52621:349;;;;:::o;52976:106::-;53020:8;53069:5;53064:3;53060:15;53039:36;;52976:106;;;:::o;53088:183::-;53123:3;53161:1;53143:16;53140:23;53137:128;;;53199:1;53196;53193;53178:23;53221:34;53252:1;53246:8;53221:34;:::i;:::-;53214:41;;53137:128;53088:183;:::o;53277:711::-;53316:3;53354:4;53336:16;53333:26;53362:5;53330:39;53391:20;;:::i;:::-;53466:1;53448:16;53444:24;53441:1;53435:4;53420:49;53499:4;53493:11;53598:16;53591:4;53583:6;53579:17;53576:39;53543:18;53535:6;53532:30;53516:113;53513:146;;;53644:5;;;;53513:146;53690:6;53684:4;53680:17;53726:3;53720:10;53753:18;53745:6;53742:30;53739:43;;;53775:5;;;;;;53739:43;53823:6;53816:4;53811:3;53807:14;53803:27;53882:1;53864:16;53860:24;53854:4;53850:35;53845:3;53842:44;53839:57;;;53889:5;;;;;;;53839:57;53906;53954:6;53948:4;53944:17;53936:6;53932:30;53926:4;53906:57;:::i;:::-;53979:3;53972:10;;53320:668;;;;;53277:711;;:::o;53994:239::-;54134:34;54130:1;54122:6;54118:14;54111:58;54203:22;54198:2;54190:6;54186:15;54179:47;53994:239;:::o;54239:366::-;54381:3;54402:67;54466:2;54461:3;54402:67;:::i;:::-;54395:74;;54478:93;54567:3;54478:93;:::i;:::-;54596:2;54591:3;54587:12;54580:19;;54239:366;;;:::o;54611:419::-;54777:4;54815:2;54804:9;54800:18;54792:26;;54864:9;54858:4;54854:20;54850:1;54839:9;54835:17;54828:47;54892:131;55018:4;54892:131;:::i;:::-;54884:139;;54611:419;;;:::o;55036:227::-;55176:34;55172:1;55164:6;55160:14;55153:58;55245:10;55240:2;55232:6;55228:15;55221:35;55036:227;:::o;55269:366::-;55411:3;55432:67;55496:2;55491:3;55432:67;:::i;:::-;55425:74;;55508:93;55597:3;55508:93;:::i;:::-;55626:2;55621:3;55617:12;55610:19;;55269:366;;;:::o;55641:419::-;55807:4;55845:2;55834:9;55830:18;55822:26;;55894:9;55888:4;55884:20;55880:1;55869:9;55865:17;55858:47;55922:131;56048:4;55922:131;:::i;:::-;55914:139;;55641:419;;;:::o;56066:1053::-;56389:4;56427:3;56416:9;56412:19;56404:27;;56441:71;56509:1;56498:9;56494:17;56485:6;56441:71;:::i;:::-;56522:72;56590:2;56579:9;56575:18;56566:6;56522:72;:::i;:::-;56641:9;56635:4;56631:20;56626:2;56615:9;56611:18;56604:48;56669:108;56772:4;56763:6;56669:108;:::i;:::-;56661:116;;56824:9;56818:4;56814:20;56809:2;56798:9;56794:18;56787:48;56852:108;56955:4;56946:6;56852:108;:::i;:::-;56844:116;;57008:9;57002:4;56998:20;56992:3;56981:9;56977:19;56970:49;57036:76;57107:4;57098:6;57036:76;:::i;:::-;57028:84;;56066:1053;;;;;;;;:::o

Metadata Hash

ipfs://de530025b277bfdd630ca1fd6c32111a54ab472a44f1b1464e05385ed6ec16f6
Loading