ETH Price: $2,657.89 (+0.57%)

Token

Phygitals: Collectibles (PHYGI)
 

Overview

Max Total Supply

500 PHYGI

Holders

153

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xa4e8787ed2be2f433e99e748e601936a17769899
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PhygitalsCollectibles

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-23
*/

// Sources flattened with hardhat v2.17.3 https://hardhat.org

// SPDX-License-Identifier: MIT

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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;






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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

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

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

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

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}


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

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC1155 token with storage based token URI management.
 * Inspired by the ERC721URIStorage extension
 *
 * _Available since v4.6._
 */
abstract contract ERC1155URIStorage is ERC1155 {
    using Strings for uint256;

    // Optional base URI
    string private _baseURI = "";

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the concatenation of the `_baseURI`
     * and the token-specific uri if the latter is set
     *
     * This enables the following behaviors:
     *
     * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation
     *   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`
     *   is empty per default);
     *
     * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`
     *   which in most cases will contain `ERC1155._uri`;
     *
     * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a
     *   uri value set, then the result is empty.
     */
    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        string memory tokenURI = _tokenURIs[tokenId];

        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
        return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);
    }

    /**
     * @dev Sets `tokenURI` as the tokenURI of `tokenId`.
     */
    function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {
        _tokenURIs[tokenId] = tokenURI;
        emit URI(uri(tokenId), tokenId);
    }

    /**
     * @dev Sets `baseURI` as the `_baseURI` for all tokens
     */
    function _setBaseURI(string memory baseURI) internal virtual {
        _baseURI = baseURI;
    }
}


// File contracts/PhygitalsCollectibles.sol

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.9;





contract PhygitalsCollectibles is
    ERC1155,
    Ownable,
    Pausable,
    ERC1155Supply,
    ERC1155URIStorage
{
    string public name = "Phygitals: Collectibles";
    string public symbol = "PHYGI";

    // id to public mint state
    mapping(uint256 => bool) public idToPublicMint;

    // id to mint price
    mapping(uint256 => uint256) public idToPrice;

    // id to max supply
    mapping(uint256 => uint256) public idToMaxSupply;

    // id to max mints per wallet
    mapping(uint256 => uint256) public idToMaxMintsPerWallet;

    // track mints per wallet per id
    mapping(address => mapping(uint256 => uint256)) public walletToIdToMints;

    address emergencyAddress;

    constructor() ERC1155("") {}

    function setURI(uint256 tokenId, string memory tokenURI) public onlyOwner {
        _setURI(tokenId, tokenURI);
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function publicMint(
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public payable {
        require(idToPublicMint[id], "public mint not enabled");
        require(amount > 0, "amount must be greater than 0");
        uint256 totalPrice = idToPrice[id] * amount;
        require(msg.value >= totalPrice, "insufficient funds");
        require(
            totalSupply(id) + amount <= idToMaxSupply[id],
            "max supply reached"
        );
        require(
            walletToIdToMints[msg.sender][id] + amount <=
                idToMaxMintsPerWallet[id],
            "max mints per wallet reached"
        );
        walletToIdToMints[msg.sender][id] += amount;
        _mint(address(msg.sender), id, amount, data);
    }

    function mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public onlyOwner {
        require(amount > 0, "amount must be greater than 0");
        require(
            totalSupply(id) + amount <= idToMaxSupply[id],
            "max supply reached"
        );
        _mint(account, id, amount, data);
    }

    function mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public onlyOwner {
        for (uint256 i = 0; i < ids.length; i++) {
            require(amounts[i] > 0, "amount must be greater than 0");
            require(
                totalSupply(ids[i]) + amounts[i] <= idToMaxSupply[ids[i]],
                "max supply reached"
            );
        }
        _mintBatch(to, ids, amounts, data);
    }

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) whenNotPaused {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    function uri(
        uint256 tokenId
    ) public view override(ERC1155, ERC1155URIStorage) returns (string memory) {
        return ERC1155URIStorage.uri(tokenId);
    }

    // SETTERS AND GETTERS
    // ==================
    function setPublicMint(
        uint256 tokenId,
        bool canPublicMint
    ) public onlyOwner {
        idToPublicMint[tokenId] = canPublicMint;
    }

    function getPublicMint(uint256 tokenId) public view returns (bool) {
        return idToPublicMint[tokenId];
    }

    function setPrice(uint256 tokenId, uint256 price) public onlyOwner {
        idToPrice[tokenId] = price;
    }

    function getPrice(uint256 tokenId) public view returns (uint256) {
        return idToPrice[tokenId];
    }

    function setMaxSupply(uint256 tokenId, uint256 maxSupply) public onlyOwner {
        idToMaxSupply[tokenId] = maxSupply;
    }

    function getMaxSupply(uint256 tokenId) public view returns (uint256) {
        return idToMaxSupply[tokenId];
    }

    function setMaxMintsPerId(
        uint256 tokenId,
        uint256 maxMintsPerId
    ) public onlyOwner {
        idToMaxMintsPerWallet[tokenId] = maxMintsPerId;
    }

    function getMaxMintsPerId(uint256 tokenId) public view returns (uint256) {
        return idToMaxMintsPerWallet[tokenId];
    }

    function getMintsPerWalletPerId(
        address wallet,
        uint256 tokenId
    ) public view returns (uint256) {
        return walletToIdToMints[wallet][tokenId];
    }

    // ==================

    // EMERGENCY FUNCTIONS
    // ==================
    function transferOwnershipToEmergencyAddress() public {
        require(emergencyAddress != address(0), "emergencyAddress not set");
        require(
            msg.sender == owner() || msg.sender == emergencyAddress,
            "only owner or emergencyAddress can transfer ownership to emergencyAddress"
        );
        transferOwnership(emergencyAddress);
    }

    function setEmergencyAddress(address _emergencyAddress) public onlyOwner {
        emergencyAddress = _emergencyAddress;
    }

    function getEmergencyAddress() public view returns (address) {
        return emergencyAddress;
    }

    // ==================

    // Withdraw
    // ==================
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = payable(msg.sender).call{value: balance}("");
        require(success, "Transfer failed.");
    }
    // ==================
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEmergencyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMaxMintsPerId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMintsPerWalletPerId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToMaxMintsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"mintBatch","outputs":[],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_emergencyAddress","type":"address"}],"name":"setEmergencyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"maxMintsPerId","type":"uint256"}],"name":"setMaxMintsPerId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"canPublicMint","type":"bool"}],"name":"setPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferOwnershipToEmergencyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"walletToIdToMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806020016040528060008152506005908162000024919062000481565b506040518060400160405280601781526020017f506879676974616c733a20436f6c6c65637469626c6573000000000000000000815250600790816200006b919062000481565b506040518060400160405280600581526020017f504859474900000000000000000000000000000000000000000000000000000081525060089081620000b2919062000481565b50348015620000c057600080fd5b5060405180602001604052806000815250620000e2816200012460201b60201c565b5062000103620000f76200013960201b60201c565b6200014160201b60201c565b6000600360146101000a81548160ff02191690831515021790555062000568565b806002908162000135919062000481565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028957607f821691505b6020821081036200029f576200029e62000241565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002ca565b620003158683620002ca565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003626200035c62000356846200032d565b62000337565b6200032d565b9050919050565b6000819050919050565b6200037e8362000341565b620003966200038d8262000369565b848454620002d7565b825550505050565b600090565b620003ad6200039e565b620003ba81848462000373565b505050565b5b81811015620003e257620003d6600082620003a3565b600181019050620003c0565b5050565b601f8211156200043157620003fb81620002a5565b6200040684620002ba565b8101602085101562000416578190505b6200042e6200042585620002ba565b830182620003bf565b50505b505050565b600082821c905092915050565b6000620004566000198460080262000436565b1980831691505092915050565b600062000471838362000443565b9150826002028217905092915050565b6200048c8262000207565b67ffffffffffffffff811115620004a857620004a762000212565b5b620004b4825462000270565b620004c1828285620003e6565b600060209050601f831160018114620004f95760008415620004e4578287015190505b620004f0858262000463565b86555062000560565b601f1984166200050986620002a5565b60005b8281101562000533578489015182556001820191506020850194506020810190506200050c565b868310156200055357848901516200054f601f89168262000443565b8355505b6001600288020188555050505b505050505050565b61506280620005786000396000f3fe60806040526004361061023a5760003560e01c8063715018a61161012e578063bd85b039116100ab578063ed1b64201161006f578063ed1b6420146108a9578063f242432a146108e6578063f2fde38b1461090f578063f7d9757714610938578063f9c6a054146109615761023a565b8063bd85b0391461078c578063cf6aa43a146107c9578063d8ed2478146107f2578063e75722301461082f578063e985e9c51461086c5761023a565b8063862440e2116100f2578063862440e2146106a75780638da5cb5b146106d057806395d89b41146106fb578063a22cb46514610726578063a97181c21461074f5761023a565b8063715018a6146105ea57806372ed8d7514610601578063731133e91461063e5780637352434d146106675780638456cb59146106905761023a565b80632eb2c2d6116101bc5780634f558e79116101805780634f558e79146104dd57806356968be31461051a5780635c975abb146105575780635e495d74146105825780635f96c77c146105bf5761023a565b80632eb2c2d61461042057806337da577c146104495780633ccfd60b146104725780633f4ba83a146104895780634e1273f4146104a05761023a565b80630e89341c116102035780630e89341c1461033d5780630ebcd14a1461037a578063128735dc146103915780631f7fdffa146103ce5780632aa11ffb146103f75761023a565b8062fdd58e1461023f57806301ffc9a71461027c57806306fdde03146102b957806308a4b99b146102e45780630a8bd9e814610321575b600080fd5b34801561024b57600080fd5b506102666004803603810190610261919061311a565b61099e565b6040516102739190613169565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906131dc565b610a66565b6040516102b09190613224565b60405180910390f35b3480156102c557600080fd5b506102ce610b48565b6040516102db91906132cf565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906132f1565b610bd6565b6040516103189190613224565b60405180910390f35b61033b60048036038101906103369190613453565b610bf6565b005b34801561034957600080fd5b50610364600480360381019061035f91906132f1565b610e92565b60405161037191906132cf565b60405180910390f35b34801561038657600080fd5b5061038f610ea4565b005b34801561039d57600080fd5b506103b860048036038101906103b3919061311a565b61102f565b6040516103c59190613169565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061358a565b611054565b005b34801561040357600080fd5b5061041e60048036038101906104199190613645565b6111a2565b005b34801561042c57600080fd5b5061044760048036038101906104429190613672565b6111ee565b005b34801561045557600080fd5b50610470600480360381019061046b9190613741565b61128f565b005b34801561047e57600080fd5b506104876112b3565b005b34801561049557600080fd5b5061049e611370565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613844565b611382565b6040516104d4919061397a565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff91906132f1565b61149b565b6040516105119190613224565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c91906132f1565b6114af565b60405161054e9190613169565b60405180910390f35b34801561056357600080fd5b5061056c6114c7565b6040516105799190613224565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a491906132f1565b6114de565b6040516105b69190613169565b60405180910390f35b3480156105cb57600080fd5b506105d46114fb565b6040516105e191906139ab565b60405180910390f35b3480156105f657600080fd5b506105ff611525565b005b34801561060d57600080fd5b50610628600480360381019061062391906132f1565b611539565b6040516106359190613169565b60405180910390f35b34801561064a57600080fd5b50610665600480360381019061066091906139c6565b611556565b005b34801561067357600080fd5b5061068e60048036038101906106899190613a75565b61161c565b005b34801561069c57600080fd5b506106a5611653565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613b56565b611665565b005b3480156106dc57600080fd5b506106e561167b565b6040516106f291906139ab565b60405180910390f35b34801561070757600080fd5b506107106116a5565b60405161071d91906132cf565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190613bb2565b611733565b005b34801561075b57600080fd5b50610776600480360381019061077191906132f1565b611749565b6040516107839190613169565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae91906132f1565b611761565b6040516107c09190613169565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613741565b61177e565b005b3480156107fe57600080fd5b50610819600480360381019061081491906132f1565b6117a2565b6040516108269190613224565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906132f1565b6117cc565b6040516108639190613169565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e9190613bf2565b6117e9565b6040516108a09190613224565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb919061311a565b61187d565b6040516108dd9190613169565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613c32565b6118d8565b005b34801561091b57600080fd5b5061093660048036038101906109319190613645565b611979565b005b34801561094457600080fd5b5061095f600480360381019061095a9190613741565b6119fc565b005b34801561096d57600080fd5b50610988600480360381019061098391906132f1565b611a20565b6040516109959190613169565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590613d3b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b415750610b4082611a38565b5b9050919050565b60078054610b5590613d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8190613d8a565b8015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b505050505081565b60096020528060005260406000206000915054906101000a900460ff1681565b6009600084815260200190815260200160002060009054906101000a900460ff16610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90613e07565b60405180910390fd5b60008211610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613e73565b60405180910390fd5b600082600a600086815260200190815260200160002054610cba9190613ec2565b905080341015610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690613f50565b60405180910390fd5b600b60008581526020019081526020016000205483610d1d86611761565b610d279190613f70565b1115610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613ff0565b60405180910390fd5b600c60008581526020019081526020016000205483600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002054610dd89190613f70565b1115610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e109061405c565b60405180910390fd5b82600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000828254610e799190613f70565b92505081905550610e8c33858585611aa2565b50505050565b6060610e9d82611c52565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c906140c8565b60405180910390fd5b610f3d61167b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610fc35750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990614180565b60405180910390fd5b61102d600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611979565b565b600d602052816000526040600020602052806000526040600020600091509150505481565b61105c611d37565b60005b835181101561118f57600083828151811061107d5761107c6141a0565b5b6020026020010151116110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90613e73565b60405180910390fd5b600b60008583815181106110dc576110db6141a0565b5b6020026020010151815260200190815260200160002054838281518110611106576111056141a0565b5b6020026020010151611131868481518110611124576111236141a0565b5b6020026020010151611761565b61113b9190613f70565b111561117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390613ff0565b60405180910390fd5b8080611187906141cf565b91505061105f565b5061119c84848484611db5565b50505050565b6111aa611d37565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111f6611fe1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061123c575061123b85611236611fe1565b6117e9565b5b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290614289565b60405180910390fd5b6112888585858585611fe9565b5050505050565b611297611d37565b80600b6000848152602001908152602001600020819055505050565b6112bb611d37565b600047905060003373ffffffffffffffffffffffffffffffffffffffff16826040516112e6906142da565b60006040518083038185875af1925050503d8060008114611323576040519150601f19603f3d011682016040523d82523d6000602084013e611328565b606091505b505090508061136c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113639061433b565b60405180910390fd5b5050565b611378611d37565b61138061230a565b565b606081518351146113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf906143cd565b60405180910390fd5b6000835167ffffffffffffffff8111156113e5576113e4613328565b5b6040519080825280602002602001820160405280156114135781602001602082028036833780820191505090505b50905060005b845181101561149057611460858281518110611438576114376141a0565b5b6020026020010151858381518110611453576114526141a0565b5b602002602001015161099e565b828281518110611473576114726141a0565b5b60200260200101818152505080611489906141cf565b9050611419565b508091505092915050565b6000806114a783611761565b119050919050565b600c6020528060005260406000206000915090505481565b6000600360149054906101000a900460ff16905090565b6000600b6000838152602001908152602001600020549050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61152d611d37565b611537600061236d565b565b6000600c6000838152602001908152602001600020549050919050565b61155e611d37565b600082116115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890613e73565b60405180910390fd5b600b600084815260200190815260200160002054826115bf85611761565b6115c99190613f70565b111561160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190613ff0565b60405180910390fd5b61161684848484611aa2565b50505050565b611624611d37565b806009600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61165b611d37565b611663612433565b565b61166d611d37565b6116778282612496565b5050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600880546116b290613d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546116de90613d8a565b801561172b5780601f106117005761010080835404028352916020019161172b565b820191906000526020600020905b81548152906001019060200180831161170e57829003601f168201915b505050505081565b61174561173e611fe1565b83836124fb565b5050565b600b6020528060005260406000206000915090505481565b600060046000838152602001908152602001600020549050919050565b611786611d37565b80600c6000848152602001908152602001600020819055505050565b60006009600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a6000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6118e0611fe1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611926575061192585611920611fe1565b6117e9565b5b611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90614289565b60405180910390fd5b6119728585858585612667565b5050505050565b611981611d37565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e79061445f565b60405180910390fd5b6119f98161236d565b50565b611a04611d37565b80600a6000848152602001908152602001600020819055505050565b600a6020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b08906144f1565b60405180910390fd5b6000611b1b611fe1565b90506000611b2885612902565b90506000611b3585612902565b9050611b468360008985858961297c565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba59190613f70565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611c23929190614511565b60405180910390a4611c3a8360008985858961299a565b611c49836000898989896129a2565b50505050505050565b60606000600660008481526020019081526020016000208054611c7490613d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca090613d8a565b8015611ced5780601f10611cc257610100808354040283529160200191611ced565b820191906000526020600020905b815481529060010190602001808311611cd057829003601f168201915b505050505090506000815111611d0b57611d0683612b79565b611d2f565b600581604051602001611d1f92919061460e565b6040516020818303038152906040525b915050919050565b611d3f611fe1565b73ffffffffffffffffffffffffffffffffffffffff16611d5d61167b565b73ffffffffffffffffffffffffffffffffffffffff1614611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061467e565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b906144f1565b60405180910390fd5b8151835114611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614710565b60405180910390fd5b6000611e72611fe1565b9050611e838160008787878761297c565b60005b8451811015611f3c57838181518110611ea257611ea16141a0565b5b6020026020010151600080878481518110611ec057611ebf6141a0565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f229190613f70565b925050819055508080611f34906141cf565b915050611e86565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611fb4929190614730565b60405180910390a4611fcb8160008787878761299a565b611fda81600087878787612c0d565b5050505050565b600033905090565b815183511461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490614710565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361209c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612093906147d9565b60405180910390fd5b60006120a6611fe1565b90506120b681878787878761297c565b60005b84518110156122675760008582815181106120d7576120d66141a0565b5b6020026020010151905060008583815181106120f6576120f56141a0565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e9061486b565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461224c9190613f70565b9250508190555050505080612260906141cf565b90506120b9565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516122de929190614730565b60405180910390a46122f481878787878761299a565b612302818787878787612c0d565b505050505050565b612312612de4565b6000600360146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612356611fe1565b60405161236391906139ab565b60405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61243b612e2d565b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861247f611fe1565b60405161248c91906139ab565b60405180910390a1565b806006600084815260200190815260200160002090816124b69190614a22565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6124e284610e92565b6040516124ef91906132cf565b60405180910390a25050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256090614b66565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161265a9190613224565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036126d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cd906147d9565b60405180910390fd5b60006126e0611fe1565b905060006126ed85612902565b905060006126fa85612902565b905061270a83898985858961297c565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156127a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127989061486b565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128569190613f70565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516128d3929190614511565b60405180910390a46128e9848a8a86868a61299a565b6128f7848a8a8a8a8a6129a2565b505050505050505050565b60606000600167ffffffffffffffff81111561292157612920613328565b5b60405190808252806020026020018201604052801561294f5781602001602082028036833780820191505090505b5090508281600081518110612967576129666141a0565b5b60200260200101818152505080915050919050565b612984612e2d565b612992868686868686612e77565b505050505050565b505050505050565b6129c18473ffffffffffffffffffffffffffffffffffffffff16613047565b15612b71578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612a07959493929190614bdb565b6020604051808303816000875af1925050508015612a4357506040513d601f19601f82011682018060405250810190612a409190614c4a565b60015b612ae857612a4f614c84565b806308c379a003612aab5750612a63614ca6565b80612a6e5750612aad565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa291906132cf565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf90614da8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614e3a565b60405180910390fd5b505b505050505050565b606060028054612b8890613d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054612bb490613d8a565b8015612c015780601f10612bd657610100808354040283529160200191612c01565b820191906000526020600020905b815481529060010190602001808311612be457829003601f168201915b50505050509050919050565b612c2c8473ffffffffffffffffffffffffffffffffffffffff16613047565b15612ddc578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612c72959493929190614e5a565b6020604051808303816000875af1925050508015612cae57506040513d601f19601f82011682018060405250810190612cab9190614c4a565b60015b612d5357612cba614c84565b806308c379a003612d165750612cce614ca6565b80612cd95750612d18565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0d91906132cf565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4a90614da8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd190614e3a565b60405180910390fd5b505b505050505050565b612dec6114c7565b612e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2290614f0e565b60405180910390fd5b565b612e356114c7565b15612e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6c90614f7a565b60405180910390fd5b565b612e8586868686868661306a565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f365760005b8351811015612f3457828181518110612ed857612ed76141a0565b5b602002602001015160046000868481518110612ef757612ef66141a0565b5b602002602001015181526020019081526020016000206000828254612f1c9190613f70565b9250508190555080612f2d906141cf565b9050612ebc565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361303f5760005b835181101561303d576000848281518110612f8b57612f8a6141a0565b5b602002602001015190506000848381518110612faa57612fa96141a0565b5b602002602001015190506000600460008481526020019081526020016000205490508181101561300f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130069061500c565b60405180910390fd5b818103600460008581526020019081526020016000208190555050505080613036906141cf565b9050612f6d565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130b182613086565b9050919050565b6130c1816130a6565b81146130cc57600080fd5b50565b6000813590506130de816130b8565b92915050565b6000819050919050565b6130f7816130e4565b811461310257600080fd5b50565b600081359050613114816130ee565b92915050565b600080604083850312156131315761313061307c565b5b600061313f858286016130cf565b925050602061315085828601613105565b9150509250929050565b613163816130e4565b82525050565b600060208201905061317e600083018461315a565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b981613184565b81146131c457600080fd5b50565b6000813590506131d6816131b0565b92915050565b6000602082840312156131f2576131f161307c565b5b6000613200848285016131c7565b91505092915050565b60008115159050919050565b61321e81613209565b82525050565b60006020820190506132396000830184613215565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561327957808201518184015260208101905061325e565b60008484015250505050565b6000601f19601f8301169050919050565b60006132a18261323f565b6132ab818561324a565b93506132bb81856020860161325b565b6132c481613285565b840191505092915050565b600060208201905081810360008301526132e98184613296565b905092915050565b6000602082840312156133075761330661307c565b5b600061331584828501613105565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61336082613285565b810181811067ffffffffffffffff8211171561337f5761337e613328565b5b80604052505050565b6000613392613072565b905061339e8282613357565b919050565b600067ffffffffffffffff8211156133be576133bd613328565b5b6133c782613285565b9050602081019050919050565b82818337600083830152505050565b60006133f66133f1846133a3565b613388565b90508281526020810184848401111561341257613411613323565b5b61341d8482856133d4565b509392505050565b600082601f83011261343a5761343961331e565b5b813561344a8482602086016133e3565b91505092915050565b60008060006060848603121561346c5761346b61307c565b5b600061347a86828701613105565b935050602061348b86828701613105565b925050604084013567ffffffffffffffff8111156134ac576134ab613081565b5b6134b886828701613425565b9150509250925092565b600067ffffffffffffffff8211156134dd576134dc613328565b5b602082029050602081019050919050565b600080fd5b6000613506613501846134c2565b613388565b90508083825260208201905060208402830185811115613529576135286134ee565b5b835b81811015613552578061353e8882613105565b84526020840193505060208101905061352b565b5050509392505050565b600082601f8301126135715761357061331e565b5b81356135818482602086016134f3565b91505092915050565b600080600080608085870312156135a4576135a361307c565b5b60006135b2878288016130cf565b945050602085013567ffffffffffffffff8111156135d3576135d2613081565b5b6135df8782880161355c565b935050604085013567ffffffffffffffff811115613600576135ff613081565b5b61360c8782880161355c565b925050606085013567ffffffffffffffff81111561362d5761362c613081565b5b61363987828801613425565b91505092959194509250565b60006020828403121561365b5761365a61307c565b5b6000613669848285016130cf565b91505092915050565b600080600080600060a0868803121561368e5761368d61307c565b5b600061369c888289016130cf565b95505060206136ad888289016130cf565b945050604086013567ffffffffffffffff8111156136ce576136cd613081565b5b6136da8882890161355c565b935050606086013567ffffffffffffffff8111156136fb576136fa613081565b5b6137078882890161355c565b925050608086013567ffffffffffffffff81111561372857613727613081565b5b61373488828901613425565b9150509295509295909350565b600080604083850312156137585761375761307c565b5b600061376685828601613105565b925050602061377785828601613105565b9150509250929050565b600067ffffffffffffffff82111561379c5761379b613328565b5b602082029050602081019050919050565b60006137c06137bb84613781565b613388565b905080838252602082019050602084028301858111156137e3576137e26134ee565b5b835b8181101561380c57806137f888826130cf565b8452602084019350506020810190506137e5565b5050509392505050565b600082601f83011261382b5761382a61331e565b5b813561383b8482602086016137ad565b91505092915050565b6000806040838503121561385b5761385a61307c565b5b600083013567ffffffffffffffff81111561387957613878613081565b5b61388585828601613816565b925050602083013567ffffffffffffffff8111156138a6576138a5613081565b5b6138b28582860161355c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138f1816130e4565b82525050565b600061390383836138e8565b60208301905092915050565b6000602082019050919050565b6000613927826138bc565b61393181856138c7565b935061393c836138d8565b8060005b8381101561396d57815161395488826138f7565b975061395f8361390f565b925050600181019050613940565b5085935050505092915050565b60006020820190508181036000830152613994818461391c565b905092915050565b6139a5816130a6565b82525050565b60006020820190506139c0600083018461399c565b92915050565b600080600080608085870312156139e0576139df61307c565b5b60006139ee878288016130cf565b94505060206139ff87828801613105565b9350506040613a1087828801613105565b925050606085013567ffffffffffffffff811115613a3157613a30613081565b5b613a3d87828801613425565b91505092959194509250565b613a5281613209565b8114613a5d57600080fd5b50565b600081359050613a6f81613a49565b92915050565b60008060408385031215613a8c57613a8b61307c565b5b6000613a9a85828601613105565b9250506020613aab85828601613a60565b9150509250929050565b600067ffffffffffffffff821115613ad057613acf613328565b5b613ad982613285565b9050602081019050919050565b6000613af9613af484613ab5565b613388565b905082815260208101848484011115613b1557613b14613323565b5b613b208482856133d4565b509392505050565b600082601f830112613b3d57613b3c61331e565b5b8135613b4d848260208601613ae6565b91505092915050565b60008060408385031215613b6d57613b6c61307c565b5b6000613b7b85828601613105565b925050602083013567ffffffffffffffff811115613b9c57613b9b613081565b5b613ba885828601613b28565b9150509250929050565b60008060408385031215613bc957613bc861307c565b5b6000613bd7858286016130cf565b9250506020613be885828601613a60565b9150509250929050565b60008060408385031215613c0957613c0861307c565b5b6000613c17858286016130cf565b9250506020613c28858286016130cf565b9150509250929050565b600080600080600060a08688031215613c4e57613c4d61307c565b5b6000613c5c888289016130cf565b9550506020613c6d888289016130cf565b9450506040613c7e88828901613105565b9350506060613c8f88828901613105565b925050608086013567ffffffffffffffff811115613cb057613caf613081565b5b613cbc88828901613425565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613d25602a8361324a565b9150613d3082613cc9565b604082019050919050565b60006020820190508181036000830152613d5481613d18565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613da257607f821691505b602082108103613db557613db4613d5b565b5b50919050565b7f7075626c6963206d696e74206e6f7420656e61626c6564000000000000000000600082015250565b6000613df160178361324a565b9150613dfc82613dbb565b602082019050919050565b60006020820190508181036000830152613e2081613de4565b9050919050565b7f616d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000613e5d601d8361324a565b9150613e6882613e27565b602082019050919050565b60006020820190508181036000830152613e8c81613e50565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ecd826130e4565b9150613ed8836130e4565b9250828202613ee6816130e4565b91508282048414831517613efd57613efc613e93565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613f3a60128361324a565b9150613f4582613f04565b602082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b6000613f7b826130e4565b9150613f86836130e4565b9250828201905080821115613f9e57613f9d613e93565b5b92915050565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613fda60128361324a565b9150613fe582613fa4565b602082019050919050565b6000602082019050818103600083015261400981613fcd565b9050919050565b7f6d6178206d696e7473207065722077616c6c6574207265616368656400000000600082015250565b6000614046601c8361324a565b915061405182614010565b602082019050919050565b6000602082019050818103600083015261407581614039565b9050919050565b7f656d657267656e637941646472657373206e6f74207365740000000000000000600082015250565b60006140b260188361324a565b91506140bd8261407c565b602082019050919050565b600060208201905081810360008301526140e1816140a5565b9050919050565b7f6f6e6c79206f776e6572206f7220656d657267656e637941646472657373206360008201527f616e207472616e73666572206f776e65727368697020746f20656d657267656e60208201527f6379416464726573730000000000000000000000000000000000000000000000604082015250565b600061416a60498361324a565b9150614175826140e8565b606082019050919050565b600060208201905081810360008301526141998161415d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006141da826130e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361420c5761420b613e93565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614273602e8361324a565b915061427e82614217565b604082019050919050565b600060208201905081810360008301526142a281614266565b9050919050565b600081905092915050565b50565b60006142c46000836142a9565b91506142cf826142b4565b600082019050919050565b60006142e5826142b7565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061432560108361324a565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006143b760298361324a565b91506143c28261435b565b604082019050919050565b600060208201905081810360008301526143e6816143aa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444960268361324a565b9150614454826143ed565b604082019050919050565b600060208201905081810360008301526144788161443c565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006144db60218361324a565b91506144e68261447f565b604082019050919050565b6000602082019050818103600083015261450a816144ce565b9050919050565b6000604082019050614526600083018561315a565b614533602083018461315a565b9392505050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461456781613d8a565b614571818661453a565b9450600182166000811461458c57600181146145a1576145d4565b60ff19831686528115158202860193506145d4565b6145aa85614545565b60005b838110156145cc578154818901526001820191506020810190506145ad565b838801955050505b50505092915050565b60006145e88261323f565b6145f2818561453a565b935061460281856020860161325b565b80840191505092915050565b600061461a828561455a565b915061462682846145dd565b91508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061466860208361324a565b915061467382614632565b602082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006146fa60288361324a565b91506147058261469e565b604082019050919050565b60006020820190508181036000830152614729816146ed565b9050919050565b6000604082019050818103600083015261474a818561391c565b9050818103602083015261475e818461391c565b90509392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006147c360258361324a565b91506147ce82614767565b604082019050919050565b600060208201905081810360008301526147f2816147b6565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614855602a8361324a565b9150614860826147f9565b604082019050919050565b6000602082019050818103600083015261488481614848565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261489b565b6148e2868361489b565b95508019841693508086168417925050509392505050565b6000819050919050565b600061491f61491a614915846130e4565b6148fa565b6130e4565b9050919050565b6000819050919050565b61493983614904565b61494d61494582614926565b8484546148a8565b825550505050565b600090565b614962614955565b61496d818484614930565b505050565b5b818110156149915761498660008261495a565b600181019050614973565b5050565b601f8211156149d6576149a781614545565b6149b08461488b565b810160208510156149bf578190505b6149d36149cb8561488b565b830182614972565b50505b505050565b600082821c905092915050565b60006149f9600019846008026149db565b1980831691505092915050565b6000614a1283836149e8565b9150826002028217905092915050565b614a2b8261323f565b67ffffffffffffffff811115614a4457614a43613328565b5b614a4e8254613d8a565b614a59828285614995565b600060209050601f831160018114614a8c5760008415614a7a578287015190505b614a848582614a06565b865550614aec565b601f198416614a9a86614545565b60005b82811015614ac257848901518255600182019150602085019450602081019050614a9d565b86831015614adf5784890151614adb601f8916826149e8565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614b5060298361324a565b9150614b5b82614af4565b604082019050919050565b60006020820190508181036000830152614b7f81614b43565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bad82614b86565b614bb78185614b91565b9350614bc781856020860161325b565b614bd081613285565b840191505092915050565b600060a082019050614bf0600083018861399c565b614bfd602083018761399c565b614c0a604083018661315a565b614c17606083018561315a565b8181036080830152614c298184614ba2565b90509695505050505050565b600081519050614c44816131b0565b92915050565b600060208284031215614c6057614c5f61307c565b5b6000614c6e84828501614c35565b91505092915050565b60008160e01c9050919050565b600060033d1115614ca35760046000803e614ca0600051614c77565b90505b90565b600060443d10614d3357614cb8613072565b60043d036004823e80513d602482011167ffffffffffffffff82111715614ce0575050614d33565b808201805167ffffffffffffffff811115614cfe5750505050614d33565b80602083010160043d038501811115614d1b575050505050614d33565b614d2a82602001850186613357565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614d9260348361324a565b9150614d9d82614d36565b604082019050919050565b60006020820190508181036000830152614dc181614d85565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614e2460288361324a565b9150614e2f82614dc8565b604082019050919050565b60006020820190508181036000830152614e5381614e17565b9050919050565b600060a082019050614e6f600083018861399c565b614e7c602083018761399c565b8181036040830152614e8e818661391c565b90508181036060830152614ea2818561391c565b90508181036080830152614eb68184614ba2565b90509695505050505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614ef860148361324a565b9150614f0382614ec2565b602082019050919050565b60006020820190508181036000830152614f2781614eeb565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614f6460108361324a565b9150614f6f82614f2e565b602082019050919050565b60006020820190508181036000830152614f9381614f57565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614ff660288361324a565b915061500182614f9a565b604082019050919050565b6000602082019050818103600083015261502581614fe9565b905091905056fea26469706673582212205eaf4986f793c642b2422bfdc64110708a0308be374d4a291531469a5ba8632464736f6c63430008130033

Deployed Bytecode

0x60806040526004361061023a5760003560e01c8063715018a61161012e578063bd85b039116100ab578063ed1b64201161006f578063ed1b6420146108a9578063f242432a146108e6578063f2fde38b1461090f578063f7d9757714610938578063f9c6a054146109615761023a565b8063bd85b0391461078c578063cf6aa43a146107c9578063d8ed2478146107f2578063e75722301461082f578063e985e9c51461086c5761023a565b8063862440e2116100f2578063862440e2146106a75780638da5cb5b146106d057806395d89b41146106fb578063a22cb46514610726578063a97181c21461074f5761023a565b8063715018a6146105ea57806372ed8d7514610601578063731133e91461063e5780637352434d146106675780638456cb59146106905761023a565b80632eb2c2d6116101bc5780634f558e79116101805780634f558e79146104dd57806356968be31461051a5780635c975abb146105575780635e495d74146105825780635f96c77c146105bf5761023a565b80632eb2c2d61461042057806337da577c146104495780633ccfd60b146104725780633f4ba83a146104895780634e1273f4146104a05761023a565b80630e89341c116102035780630e89341c1461033d5780630ebcd14a1461037a578063128735dc146103915780631f7fdffa146103ce5780632aa11ffb146103f75761023a565b8062fdd58e1461023f57806301ffc9a71461027c57806306fdde03146102b957806308a4b99b146102e45780630a8bd9e814610321575b600080fd5b34801561024b57600080fd5b506102666004803603810190610261919061311a565b61099e565b6040516102739190613169565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906131dc565b610a66565b6040516102b09190613224565b60405180910390f35b3480156102c557600080fd5b506102ce610b48565b6040516102db91906132cf565b60405180910390f35b3480156102f057600080fd5b5061030b600480360381019061030691906132f1565b610bd6565b6040516103189190613224565b60405180910390f35b61033b60048036038101906103369190613453565b610bf6565b005b34801561034957600080fd5b50610364600480360381019061035f91906132f1565b610e92565b60405161037191906132cf565b60405180910390f35b34801561038657600080fd5b5061038f610ea4565b005b34801561039d57600080fd5b506103b860048036038101906103b3919061311a565b61102f565b6040516103c59190613169565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f0919061358a565b611054565b005b34801561040357600080fd5b5061041e60048036038101906104199190613645565b6111a2565b005b34801561042c57600080fd5b5061044760048036038101906104429190613672565b6111ee565b005b34801561045557600080fd5b50610470600480360381019061046b9190613741565b61128f565b005b34801561047e57600080fd5b506104876112b3565b005b34801561049557600080fd5b5061049e611370565b005b3480156104ac57600080fd5b506104c760048036038101906104c29190613844565b611382565b6040516104d4919061397a565b60405180910390f35b3480156104e957600080fd5b5061050460048036038101906104ff91906132f1565b61149b565b6040516105119190613224565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c91906132f1565b6114af565b60405161054e9190613169565b60405180910390f35b34801561056357600080fd5b5061056c6114c7565b6040516105799190613224565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a491906132f1565b6114de565b6040516105b69190613169565b60405180910390f35b3480156105cb57600080fd5b506105d46114fb565b6040516105e191906139ab565b60405180910390f35b3480156105f657600080fd5b506105ff611525565b005b34801561060d57600080fd5b50610628600480360381019061062391906132f1565b611539565b6040516106359190613169565b60405180910390f35b34801561064a57600080fd5b50610665600480360381019061066091906139c6565b611556565b005b34801561067357600080fd5b5061068e60048036038101906106899190613a75565b61161c565b005b34801561069c57600080fd5b506106a5611653565b005b3480156106b357600080fd5b506106ce60048036038101906106c99190613b56565b611665565b005b3480156106dc57600080fd5b506106e561167b565b6040516106f291906139ab565b60405180910390f35b34801561070757600080fd5b506107106116a5565b60405161071d91906132cf565b60405180910390f35b34801561073257600080fd5b5061074d60048036038101906107489190613bb2565b611733565b005b34801561075b57600080fd5b50610776600480360381019061077191906132f1565b611749565b6040516107839190613169565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae91906132f1565b611761565b6040516107c09190613169565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190613741565b61177e565b005b3480156107fe57600080fd5b50610819600480360381019061081491906132f1565b6117a2565b6040516108269190613224565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906132f1565b6117cc565b6040516108639190613169565b60405180910390f35b34801561087857600080fd5b50610893600480360381019061088e9190613bf2565b6117e9565b6040516108a09190613224565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb919061311a565b61187d565b6040516108dd9190613169565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190613c32565b6118d8565b005b34801561091b57600080fd5b5061093660048036038101906109319190613645565b611979565b005b34801561094457600080fd5b5061095f600480360381019061095a9190613741565b6119fc565b005b34801561096d57600080fd5b50610988600480360381019061098391906132f1565b611a20565b6040516109959190613169565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590613d3b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b3157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b415750610b4082611a38565b5b9050919050565b60078054610b5590613d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8190613d8a565b8015610bce5780601f10610ba357610100808354040283529160200191610bce565b820191906000526020600020905b815481529060010190602001808311610bb157829003601f168201915b505050505081565b60096020528060005260406000206000915054906101000a900460ff1681565b6009600084815260200190815260200160002060009054906101000a900460ff16610c56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4d90613e07565b60405180910390fd5b60008211610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613e73565b60405180910390fd5b600082600a600086815260200190815260200160002054610cba9190613ec2565b905080341015610cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf690613f50565b60405180910390fd5b600b60008581526020019081526020016000205483610d1d86611761565b610d279190613f70565b1115610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90613ff0565b60405180910390fd5b600c60008581526020019081526020016000205483600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002054610dd89190613f70565b1115610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e109061405c565b60405180910390fd5b82600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000828254610e799190613f70565b92505081905550610e8c33858585611aa2565b50505050565b6060610e9d82611c52565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c906140c8565b60405180910390fd5b610f3d61167b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610fc35750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990614180565b60405180910390fd5b61102d600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611979565b565b600d602052816000526040600020602052806000526040600020600091509150505481565b61105c611d37565b60005b835181101561118f57600083828151811061107d5761107c6141a0565b5b6020026020010151116110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90613e73565b60405180910390fd5b600b60008583815181106110dc576110db6141a0565b5b6020026020010151815260200190815260200160002054838281518110611106576111056141a0565b5b6020026020010151611131868481518110611124576111236141a0565b5b6020026020010151611761565b61113b9190613f70565b111561117c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117390613ff0565b60405180910390fd5b8080611187906141cf565b91505061105f565b5061119c84848484611db5565b50505050565b6111aa611d37565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111f6611fe1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061123c575061123b85611236611fe1565b6117e9565b5b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290614289565b60405180910390fd5b6112888585858585611fe9565b5050505050565b611297611d37565b80600b6000848152602001908152602001600020819055505050565b6112bb611d37565b600047905060003373ffffffffffffffffffffffffffffffffffffffff16826040516112e6906142da565b60006040518083038185875af1925050503d8060008114611323576040519150601f19603f3d011682016040523d82523d6000602084013e611328565b606091505b505090508061136c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113639061433b565b60405180910390fd5b5050565b611378611d37565b61138061230a565b565b606081518351146113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf906143cd565b60405180910390fd5b6000835167ffffffffffffffff8111156113e5576113e4613328565b5b6040519080825280602002602001820160405280156114135781602001602082028036833780820191505090505b50905060005b845181101561149057611460858281518110611438576114376141a0565b5b6020026020010151858381518110611453576114526141a0565b5b602002602001015161099e565b828281518110611473576114726141a0565b5b60200260200101818152505080611489906141cf565b9050611419565b508091505092915050565b6000806114a783611761565b119050919050565b600c6020528060005260406000206000915090505481565b6000600360149054906101000a900460ff16905090565b6000600b6000838152602001908152602001600020549050919050565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61152d611d37565b611537600061236d565b565b6000600c6000838152602001908152602001600020549050919050565b61155e611d37565b600082116115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890613e73565b60405180910390fd5b600b600084815260200190815260200160002054826115bf85611761565b6115c99190613f70565b111561160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190613ff0565b60405180910390fd5b61161684848484611aa2565b50505050565b611624611d37565b806009600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61165b611d37565b611663612433565b565b61166d611d37565b6116778282612496565b5050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600880546116b290613d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546116de90613d8a565b801561172b5780601f106117005761010080835404028352916020019161172b565b820191906000526020600020905b81548152906001019060200180831161170e57829003601f168201915b505050505081565b61174561173e611fe1565b83836124fb565b5050565b600b6020528060005260406000206000915090505481565b600060046000838152602001908152602001600020549050919050565b611786611d37565b80600c6000848152602001908152602001600020819055505050565b60006009600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a6000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6118e0611fe1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611926575061192585611920611fe1565b6117e9565b5b611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90614289565b60405180910390fd5b6119728585858585612667565b5050505050565b611981611d37565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e79061445f565b60405180910390fd5b6119f98161236d565b50565b611a04611d37565b80600a6000848152602001908152602001600020819055505050565b600a6020528060005260406000206000915090505481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b08906144f1565b60405180910390fd5b6000611b1b611fe1565b90506000611b2885612902565b90506000611b3585612902565b9050611b468360008985858961297c565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba59190613f70565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611c23929190614511565b60405180910390a4611c3a8360008985858961299a565b611c49836000898989896129a2565b50505050505050565b60606000600660008481526020019081526020016000208054611c7490613d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ca090613d8a565b8015611ced5780601f10611cc257610100808354040283529160200191611ced565b820191906000526020600020905b815481529060010190602001808311611cd057829003601f168201915b505050505090506000815111611d0b57611d0683612b79565b611d2f565b600581604051602001611d1f92919061460e565b6040516020818303038152906040525b915050919050565b611d3f611fe1565b73ffffffffffffffffffffffffffffffffffffffff16611d5d61167b565b73ffffffffffffffffffffffffffffffffffffffff1614611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061467e565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b906144f1565b60405180910390fd5b8151835114611e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5f90614710565b60405180910390fd5b6000611e72611fe1565b9050611e838160008787878761297c565b60005b8451811015611f3c57838181518110611ea257611ea16141a0565b5b6020026020010151600080878481518110611ec057611ebf6141a0565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f229190613f70565b925050819055508080611f34906141cf565b915050611e86565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611fb4929190614730565b60405180910390a4611fcb8160008787878761299a565b611fda81600087878787612c0d565b5050505050565b600033905090565b815183511461202d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202490614710565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361209c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612093906147d9565b60405180910390fd5b60006120a6611fe1565b90506120b681878787878761297c565b60005b84518110156122675760008582815181106120d7576120d66141a0565b5b6020026020010151905060008583815181106120f6576120f56141a0565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e9061486b565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461224c9190613f70565b9250508190555050505080612260906141cf565b90506120b9565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516122de929190614730565b60405180910390a46122f481878787878761299a565b612302818787878787612c0d565b505050505050565b612312612de4565b6000600360146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612356611fe1565b60405161236391906139ab565b60405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61243b612e2d565b6001600360146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861247f611fe1565b60405161248c91906139ab565b60405180910390a1565b806006600084815260200190815260200160002090816124b69190614a22565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6124e284610e92565b6040516124ef91906132cf565b60405180910390a25050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256090614b66565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161265a9190613224565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036126d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cd906147d9565b60405180910390fd5b60006126e0611fe1565b905060006126ed85612902565b905060006126fa85612902565b905061270a83898985858961297c565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156127a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127989061486b565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128569190613f70565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516128d3929190614511565b60405180910390a46128e9848a8a86868a61299a565b6128f7848a8a8a8a8a6129a2565b505050505050505050565b60606000600167ffffffffffffffff81111561292157612920613328565b5b60405190808252806020026020018201604052801561294f5781602001602082028036833780820191505090505b5090508281600081518110612967576129666141a0565b5b60200260200101818152505080915050919050565b612984612e2d565b612992868686868686612e77565b505050505050565b505050505050565b6129c18473ffffffffffffffffffffffffffffffffffffffff16613047565b15612b71578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612a07959493929190614bdb565b6020604051808303816000875af1925050508015612a4357506040513d601f19601f82011682018060405250810190612a409190614c4a565b60015b612ae857612a4f614c84565b806308c379a003612aab5750612a63614ca6565b80612a6e5750612aad565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa291906132cf565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf90614da8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614e3a565b60405180910390fd5b505b505050505050565b606060028054612b8890613d8a565b80601f0160208091040260200160405190810160405280929190818152602001828054612bb490613d8a565b8015612c015780601f10612bd657610100808354040283529160200191612c01565b820191906000526020600020905b815481529060010190602001808311612be457829003601f168201915b50505050509050919050565b612c2c8473ffffffffffffffffffffffffffffffffffffffff16613047565b15612ddc578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612c72959493929190614e5a565b6020604051808303816000875af1925050508015612cae57506040513d601f19601f82011682018060405250810190612cab9190614c4a565b60015b612d5357612cba614c84565b806308c379a003612d165750612cce614ca6565b80612cd95750612d18565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0d91906132cf565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4a90614da8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd190614e3a565b60405180910390fd5b505b505050505050565b612dec6114c7565b612e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2290614f0e565b60405180910390fd5b565b612e356114c7565b15612e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6c90614f7a565b60405180910390fd5b565b612e8586868686868661306a565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f365760005b8351811015612f3457828181518110612ed857612ed76141a0565b5b602002602001015160046000868481518110612ef757612ef66141a0565b5b602002602001015181526020019081526020016000206000828254612f1c9190613f70565b9250508190555080612f2d906141cf565b9050612ebc565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361303f5760005b835181101561303d576000848281518110612f8b57612f8a6141a0565b5b602002602001015190506000848381518110612faa57612fa96141a0565b5b602002602001015190506000600460008481526020019081526020016000205490508181101561300f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130069061500c565b60405180910390fd5b818103600460008581526020019081526020016000208190555050505080613036906141cf565b9050612f6d565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130b182613086565b9050919050565b6130c1816130a6565b81146130cc57600080fd5b50565b6000813590506130de816130b8565b92915050565b6000819050919050565b6130f7816130e4565b811461310257600080fd5b50565b600081359050613114816130ee565b92915050565b600080604083850312156131315761313061307c565b5b600061313f858286016130cf565b925050602061315085828601613105565b9150509250929050565b613163816130e4565b82525050565b600060208201905061317e600083018461315a565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131b981613184565b81146131c457600080fd5b50565b6000813590506131d6816131b0565b92915050565b6000602082840312156131f2576131f161307c565b5b6000613200848285016131c7565b91505092915050565b60008115159050919050565b61321e81613209565b82525050565b60006020820190506132396000830184613215565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561327957808201518184015260208101905061325e565b60008484015250505050565b6000601f19601f8301169050919050565b60006132a18261323f565b6132ab818561324a565b93506132bb81856020860161325b565b6132c481613285565b840191505092915050565b600060208201905081810360008301526132e98184613296565b905092915050565b6000602082840312156133075761330661307c565b5b600061331584828501613105565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61336082613285565b810181811067ffffffffffffffff8211171561337f5761337e613328565b5b80604052505050565b6000613392613072565b905061339e8282613357565b919050565b600067ffffffffffffffff8211156133be576133bd613328565b5b6133c782613285565b9050602081019050919050565b82818337600083830152505050565b60006133f66133f1846133a3565b613388565b90508281526020810184848401111561341257613411613323565b5b61341d8482856133d4565b509392505050565b600082601f83011261343a5761343961331e565b5b813561344a8482602086016133e3565b91505092915050565b60008060006060848603121561346c5761346b61307c565b5b600061347a86828701613105565b935050602061348b86828701613105565b925050604084013567ffffffffffffffff8111156134ac576134ab613081565b5b6134b886828701613425565b9150509250925092565b600067ffffffffffffffff8211156134dd576134dc613328565b5b602082029050602081019050919050565b600080fd5b6000613506613501846134c2565b613388565b90508083825260208201905060208402830185811115613529576135286134ee565b5b835b81811015613552578061353e8882613105565b84526020840193505060208101905061352b565b5050509392505050565b600082601f8301126135715761357061331e565b5b81356135818482602086016134f3565b91505092915050565b600080600080608085870312156135a4576135a361307c565b5b60006135b2878288016130cf565b945050602085013567ffffffffffffffff8111156135d3576135d2613081565b5b6135df8782880161355c565b935050604085013567ffffffffffffffff811115613600576135ff613081565b5b61360c8782880161355c565b925050606085013567ffffffffffffffff81111561362d5761362c613081565b5b61363987828801613425565b91505092959194509250565b60006020828403121561365b5761365a61307c565b5b6000613669848285016130cf565b91505092915050565b600080600080600060a0868803121561368e5761368d61307c565b5b600061369c888289016130cf565b95505060206136ad888289016130cf565b945050604086013567ffffffffffffffff8111156136ce576136cd613081565b5b6136da8882890161355c565b935050606086013567ffffffffffffffff8111156136fb576136fa613081565b5b6137078882890161355c565b925050608086013567ffffffffffffffff81111561372857613727613081565b5b61373488828901613425565b9150509295509295909350565b600080604083850312156137585761375761307c565b5b600061376685828601613105565b925050602061377785828601613105565b9150509250929050565b600067ffffffffffffffff82111561379c5761379b613328565b5b602082029050602081019050919050565b60006137c06137bb84613781565b613388565b905080838252602082019050602084028301858111156137e3576137e26134ee565b5b835b8181101561380c57806137f888826130cf565b8452602084019350506020810190506137e5565b5050509392505050565b600082601f83011261382b5761382a61331e565b5b813561383b8482602086016137ad565b91505092915050565b6000806040838503121561385b5761385a61307c565b5b600083013567ffffffffffffffff81111561387957613878613081565b5b61388585828601613816565b925050602083013567ffffffffffffffff8111156138a6576138a5613081565b5b6138b28582860161355c565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6138f1816130e4565b82525050565b600061390383836138e8565b60208301905092915050565b6000602082019050919050565b6000613927826138bc565b61393181856138c7565b935061393c836138d8565b8060005b8381101561396d57815161395488826138f7565b975061395f8361390f565b925050600181019050613940565b5085935050505092915050565b60006020820190508181036000830152613994818461391c565b905092915050565b6139a5816130a6565b82525050565b60006020820190506139c0600083018461399c565b92915050565b600080600080608085870312156139e0576139df61307c565b5b60006139ee878288016130cf565b94505060206139ff87828801613105565b9350506040613a1087828801613105565b925050606085013567ffffffffffffffff811115613a3157613a30613081565b5b613a3d87828801613425565b91505092959194509250565b613a5281613209565b8114613a5d57600080fd5b50565b600081359050613a6f81613a49565b92915050565b60008060408385031215613a8c57613a8b61307c565b5b6000613a9a85828601613105565b9250506020613aab85828601613a60565b9150509250929050565b600067ffffffffffffffff821115613ad057613acf613328565b5b613ad982613285565b9050602081019050919050565b6000613af9613af484613ab5565b613388565b905082815260208101848484011115613b1557613b14613323565b5b613b208482856133d4565b509392505050565b600082601f830112613b3d57613b3c61331e565b5b8135613b4d848260208601613ae6565b91505092915050565b60008060408385031215613b6d57613b6c61307c565b5b6000613b7b85828601613105565b925050602083013567ffffffffffffffff811115613b9c57613b9b613081565b5b613ba885828601613b28565b9150509250929050565b60008060408385031215613bc957613bc861307c565b5b6000613bd7858286016130cf565b9250506020613be885828601613a60565b9150509250929050565b60008060408385031215613c0957613c0861307c565b5b6000613c17858286016130cf565b9250506020613c28858286016130cf565b9150509250929050565b600080600080600060a08688031215613c4e57613c4d61307c565b5b6000613c5c888289016130cf565b9550506020613c6d888289016130cf565b9450506040613c7e88828901613105565b9350506060613c8f88828901613105565b925050608086013567ffffffffffffffff811115613cb057613caf613081565b5b613cbc88828901613425565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613d25602a8361324a565b9150613d3082613cc9565b604082019050919050565b60006020820190508181036000830152613d5481613d18565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613da257607f821691505b602082108103613db557613db4613d5b565b5b50919050565b7f7075626c6963206d696e74206e6f7420656e61626c6564000000000000000000600082015250565b6000613df160178361324a565b9150613dfc82613dbb565b602082019050919050565b60006020820190508181036000830152613e2081613de4565b9050919050565b7f616d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000613e5d601d8361324a565b9150613e6882613e27565b602082019050919050565b60006020820190508181036000830152613e8c81613e50565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ecd826130e4565b9150613ed8836130e4565b9250828202613ee6816130e4565b91508282048414831517613efd57613efc613e93565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613f3a60128361324a565b9150613f4582613f04565b602082019050919050565b60006020820190508181036000830152613f6981613f2d565b9050919050565b6000613f7b826130e4565b9150613f86836130e4565b9250828201905080821115613f9e57613f9d613e93565b5b92915050565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b6000613fda60128361324a565b9150613fe582613fa4565b602082019050919050565b6000602082019050818103600083015261400981613fcd565b9050919050565b7f6d6178206d696e7473207065722077616c6c6574207265616368656400000000600082015250565b6000614046601c8361324a565b915061405182614010565b602082019050919050565b6000602082019050818103600083015261407581614039565b9050919050565b7f656d657267656e637941646472657373206e6f74207365740000000000000000600082015250565b60006140b260188361324a565b91506140bd8261407c565b602082019050919050565b600060208201905081810360008301526140e1816140a5565b9050919050565b7f6f6e6c79206f776e6572206f7220656d657267656e637941646472657373206360008201527f616e207472616e73666572206f776e65727368697020746f20656d657267656e60208201527f6379416464726573730000000000000000000000000000000000000000000000604082015250565b600061416a60498361324a565b9150614175826140e8565b606082019050919050565b600060208201905081810360008301526141998161415d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006141da826130e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361420c5761420b613e93565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614273602e8361324a565b915061427e82614217565b604082019050919050565b600060208201905081810360008301526142a281614266565b9050919050565b600081905092915050565b50565b60006142c46000836142a9565b91506142cf826142b4565b600082019050919050565b60006142e5826142b7565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061432560108361324a565b9150614330826142ef565b602082019050919050565b6000602082019050818103600083015261435481614318565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006143b760298361324a565b91506143c28261435b565b604082019050919050565b600060208201905081810360008301526143e6816143aa565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444960268361324a565b9150614454826143ed565b604082019050919050565b600060208201905081810360008301526144788161443c565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006144db60218361324a565b91506144e68261447f565b604082019050919050565b6000602082019050818103600083015261450a816144ce565b9050919050565b6000604082019050614526600083018561315a565b614533602083018461315a565b9392505050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461456781613d8a565b614571818661453a565b9450600182166000811461458c57600181146145a1576145d4565b60ff19831686528115158202860193506145d4565b6145aa85614545565b60005b838110156145cc578154818901526001820191506020810190506145ad565b838801955050505b50505092915050565b60006145e88261323f565b6145f2818561453a565b935061460281856020860161325b565b80840191505092915050565b600061461a828561455a565b915061462682846145dd565b91508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061466860208361324a565b915061467382614632565b602082019050919050565b600060208201905081810360008301526146978161465b565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006146fa60288361324a565b91506147058261469e565b604082019050919050565b60006020820190508181036000830152614729816146ed565b9050919050565b6000604082019050818103600083015261474a818561391c565b9050818103602083015261475e818461391c565b90509392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006147c360258361324a565b91506147ce82614767565b604082019050919050565b600060208201905081810360008301526147f2816147b6565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614855602a8361324a565b9150614860826147f9565b604082019050919050565b6000602082019050818103600083015261488481614848565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026148d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261489b565b6148e2868361489b565b95508019841693508086168417925050509392505050565b6000819050919050565b600061491f61491a614915846130e4565b6148fa565b6130e4565b9050919050565b6000819050919050565b61493983614904565b61494d61494582614926565b8484546148a8565b825550505050565b600090565b614962614955565b61496d818484614930565b505050565b5b818110156149915761498660008261495a565b600181019050614973565b5050565b601f8211156149d6576149a781614545565b6149b08461488b565b810160208510156149bf578190505b6149d36149cb8561488b565b830182614972565b50505b505050565b600082821c905092915050565b60006149f9600019846008026149db565b1980831691505092915050565b6000614a1283836149e8565b9150826002028217905092915050565b614a2b8261323f565b67ffffffffffffffff811115614a4457614a43613328565b5b614a4e8254613d8a565b614a59828285614995565b600060209050601f831160018114614a8c5760008415614a7a578287015190505b614a848582614a06565b865550614aec565b601f198416614a9a86614545565b60005b82811015614ac257848901518255600182019150602085019450602081019050614a9d565b86831015614adf5784890151614adb601f8916826149e8565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614b5060298361324a565b9150614b5b82614af4565b604082019050919050565b60006020820190508181036000830152614b7f81614b43565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bad82614b86565b614bb78185614b91565b9350614bc781856020860161325b565b614bd081613285565b840191505092915050565b600060a082019050614bf0600083018861399c565b614bfd602083018761399c565b614c0a604083018661315a565b614c17606083018561315a565b8181036080830152614c298184614ba2565b90509695505050505050565b600081519050614c44816131b0565b92915050565b600060208284031215614c6057614c5f61307c565b5b6000614c6e84828501614c35565b91505092915050565b60008160e01c9050919050565b600060033d1115614ca35760046000803e614ca0600051614c77565b90505b90565b600060443d10614d3357614cb8613072565b60043d036004823e80513d602482011167ffffffffffffffff82111715614ce0575050614d33565b808201805167ffffffffffffffff811115614cfe5750505050614d33565b80602083010160043d038501811115614d1b575050505050614d33565b614d2a82602001850186613357565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614d9260348361324a565b9150614d9d82614d36565b604082019050919050565b60006020820190508181036000830152614dc181614d85565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614e2460288361324a565b9150614e2f82614dc8565b604082019050919050565b60006020820190508181036000830152614e5381614e17565b9050919050565b600060a082019050614e6f600083018861399c565b614e7c602083018761399c565b8181036040830152614e8e818661391c565b90508181036060830152614ea2818561391c565b90508181036080830152614eb68184614ba2565b90509695505050505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614ef860148361324a565b9150614f0382614ec2565b602082019050919050565b60006020820190508181036000830152614f2781614eeb565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614f6460108361324a565b9150614f6f82614f2e565b602082019050919050565b60006020820190508181036000830152614f9381614f57565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614ff660288361324a565b915061500182614f9a565b604082019050919050565b6000602082019050818103600083015261502581614fe9565b905091905056fea26469706673582212205eaf4986f793c642b2422bfdc64110708a0308be374d4a291531469a5ba8632464736f6c63430008130033

Deployed Bytecode Sourcemap

65276:5620:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27952:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26975:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65404:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66300:781;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68329:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69947:375;;;;;;;;;;;;;:::i;:::-;;65881:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67473:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70330:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29870:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69096:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70650:216;;;;;;;;;;;;;:::i;:::-;;66227:65;;;;;;;;;;;;;:::i;:::-;;28348:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44313:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65778:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5524:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69232:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70466:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2979;;;;;;;;;;;;;:::i;:::-;;69538:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67089:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68567:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66158:61;;;;;;;;;;;;;:::i;:::-;;66031:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2338:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65457:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28920:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65686:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44102:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69357:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68735:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68979:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29147:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69675:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29387:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3237:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68859:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65608:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27952:230;28038:7;28085:1;28066:21;;:7;:21;;;28058:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28152:9;:13;28162:2;28152:13;;;;;;;;;;;:22;28166:7;28152:22;;;;;;;;;;;;;;;;28145:29;;27952:230;;;;:::o;26975:310::-;27077:4;27129:26;27114:41;;;:11;:41;;;;:110;;;;27187:37;27172:52;;;:11;:52;;;;27114:110;:163;;;;27241:36;27265:11;27241:23;:36::i;:::-;27114:163;27094:183;;26975:310;;;:::o;65404:46::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65528:::-;;;;;;;;;;;;;;;;;;;;;;:::o;66300:781::-;66435:14;:18;66450:2;66435:18;;;;;;;;;;;;;;;;;;;;;66427:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;66509:1;66500:6;:10;66492:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;66555:18;66592:6;66576:9;:13;66586:2;66576:13;;;;;;;;;;;;:22;;;;:::i;:::-;66555:43;;66630:10;66617:9;:23;;66609:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;66724:13;:17;66738:2;66724:17;;;;;;;;;;;;66714:6;66696:15;66708:2;66696:11;:15::i;:::-;:24;;;;:::i;:::-;:45;;66674:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;66883:21;:25;66905:2;66883:25;;;;;;;;;;;;66856:6;66820:17;:29;66838:10;66820:29;;;;;;;;;;;;;;;:33;66850:2;66820:33;;;;;;;;;;;;:42;;;;:::i;:::-;:88;;66798:166;;;;;;;;;;;;:::i;:::-;;;;;;;;;67012:6;66975:17;:29;66993:10;66975:29;;;;;;;;;;;;;;;:33;67005:2;66975:33;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;67029:44;67043:10;67056:2;67060:6;67068:4;67029:5;:44::i;:::-;66416:665;66300:781;;;:::o;68329:175::-;68433:13;68466:30;68488:7;68466:21;:30::i;:::-;68459:37;;68329:175;;;:::o;69947:375::-;70048:1;70020:30;;:16;;;;;;;;;;;:30;;;70012:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;70126:7;:5;:7::i;:::-;70112:21;;:10;:21;;;:55;;;;70151:16;;;;;;;;;;;70137:30;;:10;:30;;;70112:55;70090:178;;;;;;;;;;;;:::i;:::-;;;;;;;;;70279:35;70297:16;;;;;;;;;;;70279:17;:35::i;:::-;69947:375::o;65881:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67473:497::-;2224:13;:11;:13::i;:::-;67647:9:::1;67642:276;67666:3;:10;67662:1;:14;67642:276;;;67719:1;67706:7;67714:1;67706:10;;;;;;;;:::i;:::-;;;;;;;;:14;67698:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;67831:13;:21;67845:3;67849:1;67845:6;;;;;;;;:::i;:::-;;;;;;;;67831:21;;;;;;;;;;;;67817:7;67825:1;67817:10;;;;;;;;:::i;:::-;;;;;;;;67795:19;67807:3;67811:1;67807:6;;;;;;;;:::i;:::-;;;;;;;;67795:11;:19::i;:::-;:32;;;;:::i;:::-;:57;;67769:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;67678:3;;;;;:::i;:::-;;;;67642:276;;;;67928:34;67939:2;67943:3;67948:7;67957:4;67928:10;:34::i;:::-;67473:497:::0;;;;:::o;70330:128::-;2224:13;:11;:13::i;:::-;70433:17:::1;70414:16;;:36;;;;;;;;;;;;;;;;;;70330:128:::0;:::o;29870:438::-;30111:12;:10;:12::i;:::-;30103:20;;:4;:20;;;:60;;;;30127:36;30144:4;30150:12;:10;:12::i;:::-;30127:16;:36::i;:::-;30103:60;30081:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;30248:52;30271:4;30277:2;30281:3;30286:7;30295:4;30248:22;:52::i;:::-;29870:438;;;;;:::o;69096:128::-;2224:13;:11;:13::i;:::-;69207:9:::1;69182:13;:22;69196:7;69182:22;;;;;;;;;;;:34;;;;69096:128:::0;;:::o;70650:216::-;2224:13;:11;:13::i;:::-;70698:15:::1;70716:21;70698:39;;70749:12;70775:10;70767:24;;70799:7;70767:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70748:63;;;70830:7;70822:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;70687:179;;70650:216::o:0;66227:65::-;2224:13;:11;:13::i;:::-;66274:10:::1;:8;:10::i;:::-;66227:65::o:0;28348:499::-;28484:16;28540:3;:10;28521:8;:15;:29;28513:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;28609:30;28656:8;:15;28642:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28609:63;;28690:9;28685:122;28709:8;:15;28705:1;:19;28685:122;;;28765:30;28775:8;28784:1;28775:11;;;;;;;;:::i;:::-;;;;;;;;28788:3;28792:1;28788:6;;;;;;;;:::i;:::-;;;;;;;;28765:9;:30::i;:::-;28746:13;28760:1;28746:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;28726:3;;;;:::i;:::-;;;28685:122;;;;28826:13;28819:20;;;28348:499;;;;:::o;44313:122::-;44370:4;44426:1;44394:29;44420:2;44394:25;:29::i;:::-;:33;44387:40;;44313:122;;;:::o;65778:56::-;;;;;;;;;;;;;;;;;:::o;5524:86::-;5571:4;5595:7;;;;;;;;;;;5588:14;;5524:86;:::o;69232:117::-;69292:7;69319:13;:22;69333:7;69319:22;;;;;;;;;;;;69312:29;;69232:117;;;:::o;70466:103::-;70518:7;70545:16;;;;;;;;;;;70538:23;;70466:103;:::o;2979:::-;2224:13;:11;:13::i;:::-;3044:30:::1;3071:1;3044:18;:30::i;:::-;2979:103::o:0;69538:129::-;69602:7;69629:21;:30;69651:7;69629:30;;;;;;;;;;;;69622:37;;69538:129;;;:::o;67089:376::-;2224:13;:11;:13::i;:::-;67255:1:::1;67246:6;:10;67238:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;67351:13;:17;67365:2;67351:17;;;;;;;;;;;;67341:6;67323:15;67335:2;67323:11;:15::i;:::-;:24;;;;:::i;:::-;:45;;67301:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;67425:32;67431:7;67440:2;67444:6;67452:4;67425:5;:32::i;:::-;67089:376:::0;;;;:::o;68567:160::-;2224:13;:11;:13::i;:::-;68706::::1;68680:14;:23;68695:7;68680:23;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;68567:160:::0;;:::o;66158:61::-;2224:13;:11;:13::i;:::-;66203:8:::1;:6;:8::i;:::-;66158:61::o:0;66031:119::-;2224:13;:11;:13::i;:::-;66116:26:::1;66124:7;66133:8;66116:7;:26::i;:::-;66031:119:::0;;:::o;2338:87::-;2384:7;2411:6;;;;;;;;;;;2404:13;;2338:87;:::o;65457:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28920:155::-;29015:52;29034:12;:10;:12::i;:::-;29048:8;29058;29015:18;:52::i;:::-;28920:155;;:::o;65686:48::-;;;;;;;;;;;;;;;;;:::o;44102:113::-;44164:7;44191:12;:16;44204:2;44191:16;;;;;;;;;;;;44184:23;;44102:113;;;:::o;69357:173::-;2224:13;:11;:13::i;:::-;69509::::1;69476:21;:30;69498:7;69476:30;;;;;;;;;;;:46;;;;69357:173:::0;;:::o;68735:116::-;68796:4;68820:14;:23;68835:7;68820:23;;;;;;;;;;;;;;;;;;;;;68813:30;;68735:116;;;:::o;68979:109::-;69035:7;69062:9;:18;69072:7;69062:18;;;;;;;;;;;;69055:25;;68979:109;;;:::o;29147:168::-;29246:4;29270:18;:27;29289:7;29270:27;;;;;;;;;;;;;;;:37;29298:8;29270:37;;;;;;;;;;;;;;;;;;;;;;;;;29263:44;;29147:168;;;;:::o;69675:180::-;69786:7;69813:17;:25;69831:6;69813:25;;;;;;;;;;;;;;;:34;69839:7;69813:34;;;;;;;;;;;;69806:41;;69675:180;;;;:::o;29387:406::-;29603:12;:10;:12::i;:::-;29595:20;;:4;:20;;;:60;;;;29619:36;29636:4;29642:12;:10;:12::i;:::-;29619:16;:36::i;:::-;29595:60;29573:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;29740:45;29758:4;29764:2;29768;29772:6;29780:4;29740:17;:45::i;:::-;29387:406;;;;;:::o;3237:201::-;2224:13;:11;:13::i;:::-;3346:1:::1;3326:22;;:8;:22;;::::0;3318:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3402:28;3421:8;3402:18;:28::i;:::-;3237:201:::0;:::o;68859:112::-;2224:13;:11;:13::i;:::-;68958:5:::1;68937:9;:18;68947:7;68937:18;;;;;;;;;;;:26;;;;68859:112:::0;;:::o;65608:44::-;;;;;;;;;;;;;;;;;:::o;25664:157::-;25749:4;25788:25;25773:40;;;:11;:40;;;;25766:47;;25664:157;;;:::o;34568:686::-;34692:1;34678:16;;:2;:16;;;34670:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34745:16;34764:12;:10;:12::i;:::-;34745:31;;34787:20;34810:21;34828:2;34810:17;:21::i;:::-;34787:44;;34842:24;34869:25;34887:6;34869:17;:25::i;:::-;34842:52;;34907:66;34928:8;34946:1;34950:2;34954:3;34959:7;34968:4;34907:20;:66::i;:::-;35007:6;34986:9;:13;34996:2;34986:13;;;;;;;;;;;:17;35000:2;34986:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;35066:2;35029:52;;35062:1;35029:52;;35044:8;35029:52;;;35070:2;35074:6;35029:52;;;;;;;:::i;:::-;;;;;;;;35094:65;35114:8;35132:1;35136:2;35140:3;35145:7;35154:4;35094:19;:65::i;:::-;35172:74;35203:8;35221:1;35225:2;35229;35233:6;35241:4;35172:30;:74::i;:::-;34659:595;;;34568:686;;;;:::o;64347:351::-;64415:13;64441:22;64466:10;:19;64477:7;64466:19;;;;;;;;;;;64441:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64621:1;64602:8;64596:22;:26;:94;;64672:18;64682:7;64672:9;:18::i;:::-;64596:94;;;64649:8;64659;64632:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64596:94;64589:101;;;64347:351;;;:::o;2503:132::-;2578:12;:10;:12::i;:::-;2567:23;;:7;:5;:7::i;:::-;:23;;;2559:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2503:132::o;35657:813::-;35849:1;35835:16;;:2;:16;;;35827:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35922:7;:14;35908:3;:10;:28;35900:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35994:16;36013:12;:10;:12::i;:::-;35994:31;;36038:66;36059:8;36077:1;36081:2;36085:3;36090:7;36099:4;36038:20;:66::i;:::-;36122:9;36117:103;36141:3;:10;36137:1;:14;36117:103;;;36198:7;36206:1;36198:10;;;;;;;;:::i;:::-;;;;;;;;36173:9;:17;36183:3;36187:1;36183:6;;;;;;;;:::i;:::-;;;;;;;;36173:17;;;;;;;;;;;:21;36191:2;36173:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;36153:3;;;;;:::i;:::-;;;;36117:103;;;;36273:2;36237:53;;36269:1;36237:53;;36251:8;36237:53;;;36277:3;36282:7;36237:53;;;;;;;:::i;:::-;;;;;;;;36303:65;36323:8;36341:1;36345:2;36349:3;36354:7;36363:4;36303:19;:65::i;:::-;36381:81;36417:8;36435:1;36439:2;36443:3;36448:7;36457:4;36381:35;:81::i;:::-;35816:654;35657:813;;;;:::o;834:98::-;887:7;914:10;907:17;;834:98;:::o;32104:1146::-;32331:7;:14;32317:3;:10;:28;32309:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32423:1;32409:16;;:2;:16;;;32401:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32480:16;32499:12;:10;:12::i;:::-;32480:31;;32524:60;32545:8;32555:4;32561:2;32565:3;32570:7;32579:4;32524:20;:60::i;:::-;32602:9;32597:421;32621:3;:10;32617:1;:14;32597:421;;;32653:10;32666:3;32670:1;32666:6;;;;;;;;:::i;:::-;;;;;;;;32653:19;;32687:14;32704:7;32712:1;32704:10;;;;;;;;:::i;:::-;;;;;;;;32687:27;;32731:19;32753:9;:13;32763:2;32753:13;;;;;;;;;;;:19;32767:4;32753:19;;;;;;;;;;;;;;;;32731:41;;32810:6;32795:11;:21;;32787:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32943:6;32929:11;:20;32907:9;:13;32917:2;32907:13;;;;;;;;;;;:19;32921:4;32907:19;;;;;;;;;;;;;;;:42;;;;33000:6;32979:9;:13;32989:2;32979:13;;;;;;;;;;;:17;32993:2;32979:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;32638:380;;;32633:3;;;;:::i;:::-;;;32597:421;;;;33065:2;33035:47;;33059:4;33035:47;;33049:8;33035:47;;;33069:3;33074:7;33035:47;;;;;;;:::i;:::-;;;;;;;;33095:59;33115:8;33125:4;33131:2;33135:3;33140:7;33149:4;33095:19;:59::i;:::-;33167:75;33203:8;33213:4;33219:2;33223:3;33228:7;33237:4;33167:35;:75::i;:::-;32298:952;32104:1146;;;;;:::o;6379:120::-;5388:16;:14;:16::i;:::-;6448:5:::1;6438:7;;:15;;;;;;;;;;;;;;;;;;6469:22;6478:12;:10;:12::i;:::-;6469:22;;;;;;:::i;:::-;;;;;;;;6379:120::o:0;3598:191::-;3672:16;3691:6;;;;;;;;;;;3672:25;;3717:8;3708:6;;:17;;;;;;;;;;;;;;;;;;3772:8;3741:40;;3762:8;3741:40;;;;;;;;;;;;3661:128;3598:191;:::o;6120:118::-;5129:19;:17;:19::i;:::-;6190:4:::1;6180:7;;:14;;;;;;;;;;;;;;;;;;6210:20;6217:12;:10;:12::i;:::-;6210:20;;;;;;:::i;:::-;;;;;;;;6120:118::o:0;64783:166::-;64891:8;64869:10;:19;64880:7;64869:19;;;;;;;;;;;:30;;;;;;:::i;:::-;;64933:7;64915:26;64919:12;64923:7;64919:3;:12::i;:::-;64915:26;;;;;;:::i;:::-;;;;;;;;64783:166;;:::o;38870:297::-;38991:8;38982:17;;:5;:17;;;38974:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39094:8;39056:18;:25;39075:5;39056:25;;;;;;;;;;;;;;;:35;39082:8;39056:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39140:8;39118:41;;39133:5;39118:41;;;39150:8;39118:41;;;;;;:::i;:::-;;;;;;;;38870:297;;;:::o;30772:974::-;30974:1;30960:16;;:2;:16;;;30952:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31031:16;31050:12;:10;:12::i;:::-;31031:31;;31073:20;31096:21;31114:2;31096:17;:21::i;:::-;31073:44;;31128:24;31155:25;31173:6;31155:17;:25::i;:::-;31128:52;;31193:60;31214:8;31224:4;31230:2;31234:3;31239:7;31248:4;31193:20;:60::i;:::-;31266:19;31288:9;:13;31298:2;31288:13;;;;;;;;;;;:19;31302:4;31288:19;;;;;;;;;;;;;;;;31266:41;;31341:6;31326:11;:21;;31318:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;31466:6;31452:11;:20;31430:9;:13;31440:2;31430:13;;;;;;;;;;;:19;31444:4;31430:19;;;;;;;;;;;;;;;:42;;;;31515:6;31494:9;:13;31504:2;31494:13;;;;;;;;;;;:17;31508:2;31494:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;31570:2;31539:46;;31564:4;31539:46;;31554:8;31539:46;;;31574:2;31578:6;31539:46;;;;;;;:::i;:::-;;;;;;;;31598:59;31618:8;31628:4;31634:2;31638:3;31643:7;31652:4;31598:19;:59::i;:::-;31670:68;31701:8;31711:4;31717:2;31721;31725:6;31733:4;31670:30;:68::i;:::-;30941:805;;;;30772:974;;;;;:::o;43102:198::-;43168:16;43197:22;43236:1;43222:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43197:41;;43260:7;43249:5;43255:1;43249:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;43287:5;43280:12;;;43102:198;;;:::o;67978:343::-;5129:19;:17;:19::i;:::-;68247:66:::1;68274:8;68284:4;68290:2;68294:3;68299:7;68308:4;68247:26;:66::i;:::-;67978:343:::0;;;;;;:::o;41301:220::-;;;;;;;:::o;41529:744::-;41744:15;:2;:13;;;:15::i;:::-;41740:526;;;41797:2;41780:38;;;41819:8;41829:4;41835:2;41839:6;41847:4;41780:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41776:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;42128:6;42121:14;;;;;;;;;;;:::i;:::-;;;;;;;;41776:479;;;42177:62;;;;;;;;;;:::i;:::-;;;;;;;;41776:479;41914:43;;;41902:55;;;:8;:55;;;;41898:154;;41982:50;;;;;;;;;;:::i;:::-;;;;;;;;41898:154;41853:214;41740:526;41529:744;;;;;;:::o;27696:105::-;27756:13;27789:4;27782:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27696:105;;;:::o;42281:813::-;42521:15;:2;:13;;;:15::i;:::-;42517:570;;;42574:2;42557:43;;;42601:8;42611:4;42617:3;42622:7;42631:4;42557:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42553:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;42949:6;42942:14;;;;;;;;;;;:::i;:::-;;;;;;;;42553:523;;;42998:62;;;;;;;;;;:::i;:::-;;;;;;;;42553:523;42730:48;;;42718:60;;;:8;:60;;;;42714:159;;42803:50;;;;;;;;;;:::i;:::-;;;;;;;;42714:159;42637:251;42517:570;42281:813;;;;;;:::o;5868:108::-;5935:8;:6;:8::i;:::-;5927:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;5868:108::o;5683:::-;5754:8;:6;:8::i;:::-;5753:9;5745:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5683:108::o;44510:931::-;44749:66;44776:8;44786:4;44792:2;44796:3;44801:7;44810:4;44749:26;:66::i;:::-;44848:1;44832:18;;:4;:18;;;44828:160;;44872:9;44867:110;44891:3;:10;44887:1;:14;44867:110;;;44951:7;44959:1;44951:10;;;;;;;;:::i;:::-;;;;;;;;44927:12;:20;44940:3;44944:1;44940:6;;;;;;;;:::i;:::-;;;;;;;;44927:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;44903:3;;;;:::i;:::-;;;44867:110;;;;44828:160;45018:1;45004:16;;:2;:16;;;45000:434;;45042:9;45037:386;45061:3;:10;45057:1;:14;45037:386;;;45097:10;45110:3;45114:1;45110:6;;;;;;;;:::i;:::-;;;;;;;;45097:19;;45135:14;45152:7;45160:1;45152:10;;;;;;;;:::i;:::-;;;;;;;;45135:27;;45181:14;45198:12;:16;45211:2;45198:16;;;;;;;;;;;;45181:33;;45251:6;45241;:16;;45233:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;45382:6;45373;:15;45354:12;:16;45367:2;45354:16;;;;;;;;;;;:34;;;;45078:345;;;45073:3;;;;:::i;:::-;;;45037:386;;;;45000:434;44510:931;;;;;;:::o;16585:326::-;16645:4;16902:1;16880:7;:19;;;:23;16873:30;;16585:326;;;:::o;40125:221::-;;;;;;;:::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:246::-;3574:1;3584:113;3598:6;3595:1;3592:13;3584:113;;;3683:1;3678:3;3674:11;3668:18;3664:1;3659:3;3655:11;3648:39;3620:2;3617:1;3613:10;3608:15;;3584:113;;;3731:1;3722:6;3717:3;3713:16;3706:27;3555:184;3493:246;;;:::o;3745:102::-;3786:6;3837:2;3833:7;3828:2;3821:5;3817:14;3813:28;3803:38;;3745:102;;;:::o;3853:377::-;3941:3;3969:39;4002:5;3969:39;:::i;:::-;4024:71;4088:6;4083:3;4024:71;:::i;:::-;4017:78;;4104:65;4162:6;4157:3;4150:4;4143:5;4139:16;4104:65;:::i;:::-;4194:29;4216:6;4194:29;:::i;:::-;4189:3;4185:39;4178:46;;3945:285;3853:377;;;;:::o;4236:313::-;4349:4;4387:2;4376:9;4372:18;4364:26;;4436:9;4430:4;4426:20;4422:1;4411:9;4407:17;4400:47;4464:78;4537:4;4528:6;4464:78;:::i;:::-;4456:86;;4236:313;;;;:::o;4555:329::-;4614:6;4663:2;4651:9;4642:7;4638:23;4634:32;4631:119;;;4669:79;;:::i;:::-;4631:119;4789:1;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4760:117;4555:329;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:307::-;5805:4;5895:18;5887:6;5884:30;5881:56;;;5917:18;;:::i;:::-;5881:56;5955:29;5977:6;5955:29;:::i;:::-;5947:37;;6039:4;6033;6029:15;6021:23;;5744:307;;;:::o;6057:146::-;6154:6;6149:3;6144;6131:30;6195:1;6186:6;6181:3;6177:16;6170:27;6057:146;;;:::o;6209:423::-;6286:5;6311:65;6327:48;6368:6;6327:48;:::i;:::-;6311:65;:::i;:::-;6302:74;;6399:6;6392:5;6385:21;6437:4;6430:5;6426:16;6475:3;6466:6;6461:3;6457:16;6454:25;6451:112;;;6482:79;;:::i;:::-;6451:112;6572:54;6619:6;6614:3;6609;6572:54;:::i;:::-;6292:340;6209:423;;;;;:::o;6651:338::-;6706:5;6755:3;6748:4;6740:6;6736:17;6732:27;6722:122;;6763:79;;:::i;:::-;6722:122;6880:6;6867:20;6905:78;6979:3;6971:6;6964:4;6956:6;6952:17;6905:78;:::i;:::-;6896:87;;6712:277;6651:338;;;;:::o;6995:797::-;7081:6;7089;7097;7146:2;7134:9;7125:7;7121:23;7117:32;7114:119;;;7152:79;;:::i;:::-;7114:119;7272:1;7297:53;7342:7;7333:6;7322:9;7318:22;7297:53;:::i;:::-;7287:63;;7243:117;7399:2;7425:53;7470:7;7461:6;7450:9;7446:22;7425:53;:::i;:::-;7415:63;;7370:118;7555:2;7544:9;7540:18;7527:32;7586:18;7578:6;7575:30;7572:117;;;7608:79;;:::i;:::-;7572:117;7713:62;7767:7;7758:6;7747:9;7743:22;7713:62;:::i;:::-;7703:72;;7498:287;6995:797;;;;;:::o;7798:311::-;7875:4;7965:18;7957:6;7954:30;7951:56;;;7987:18;;:::i;:::-;7951:56;8037:4;8029:6;8025:17;8017:25;;8097:4;8091;8087:15;8079:23;;7798:311;;;:::o;8115:117::-;8224:1;8221;8214:12;8255:710;8351:5;8376:81;8392:64;8449:6;8392:64;:::i;:::-;8376:81;:::i;:::-;8367:90;;8477:5;8506:6;8499:5;8492:21;8540:4;8533:5;8529:16;8522:23;;8593:4;8585:6;8581:17;8573:6;8569:30;8622:3;8614:6;8611:15;8608:122;;;8641:79;;:::i;:::-;8608:122;8756:6;8739:220;8773:6;8768:3;8765:15;8739:220;;;8848:3;8877:37;8910:3;8898:10;8877:37;:::i;:::-;8872:3;8865:50;8944:4;8939:3;8935:14;8928:21;;8815:144;8799:4;8794:3;8790:14;8783:21;;8739:220;;;8743:21;8357:608;;8255:710;;;;;:::o;8988:370::-;9059:5;9108:3;9101:4;9093:6;9089:17;9085:27;9075:122;;9116:79;;:::i;:::-;9075:122;9233:6;9220:20;9258:94;9348:3;9340:6;9333:4;9325:6;9321:17;9258:94;:::i;:::-;9249:103;;9065:293;8988:370;;;;:::o;9364:1363::-;9509:6;9517;9525;9533;9582:3;9570:9;9561:7;9557:23;9553:33;9550:120;;;9589:79;;:::i;:::-;9550:120;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9864:2;9853:9;9849:18;9836:32;9895:18;9887:6;9884:30;9881:117;;;9917:79;;:::i;:::-;9881:117;10022:78;10092:7;10083:6;10072:9;10068:22;10022:78;:::i;:::-;10012:88;;9807:303;10177:2;10166:9;10162:18;10149:32;10208:18;10200:6;10197:30;10194:117;;;10230:79;;:::i;:::-;10194:117;10335:78;10405:7;10396:6;10385:9;10381:22;10335:78;:::i;:::-;10325:88;;10120:303;10490:2;10479:9;10475:18;10462:32;10521:18;10513:6;10510:30;10507:117;;;10543:79;;:::i;:::-;10507:117;10648:62;10702:7;10693:6;10682:9;10678:22;10648:62;:::i;:::-;10638:72;;10433:287;9364:1363;;;;;;;:::o;10733:329::-;10792:6;10841:2;10829:9;10820:7;10816:23;10812:32;10809:119;;;10847:79;;:::i;:::-;10809:119;10967:1;10992:53;11037:7;11028:6;11017:9;11013:22;10992:53;:::i;:::-;10982:63;;10938:117;10733:329;;;;:::o;11068:1509::-;11222:6;11230;11238;11246;11254;11303:3;11291:9;11282:7;11278:23;11274:33;11271:120;;;11310:79;;:::i;:::-;11271:120;11430:1;11455:53;11500:7;11491:6;11480:9;11476:22;11455:53;:::i;:::-;11445:63;;11401:117;11557:2;11583:53;11628:7;11619:6;11608:9;11604:22;11583:53;:::i;:::-;11573:63;;11528:118;11713:2;11702:9;11698:18;11685:32;11744:18;11736:6;11733:30;11730:117;;;11766:79;;:::i;:::-;11730:117;11871:78;11941:7;11932:6;11921:9;11917:22;11871:78;:::i;:::-;11861:88;;11656:303;12026:2;12015:9;12011:18;11998:32;12057:18;12049:6;12046:30;12043:117;;;12079:79;;:::i;:::-;12043:117;12184:78;12254:7;12245:6;12234:9;12230:22;12184:78;:::i;:::-;12174:88;;11969:303;12339:3;12328:9;12324:19;12311:33;12371:18;12363:6;12360:30;12357:117;;;12393:79;;:::i;:::-;12357:117;12498:62;12552:7;12543:6;12532:9;12528:22;12498:62;:::i;:::-;12488:72;;12282:288;11068:1509;;;;;;;;:::o;12583:474::-;12651:6;12659;12708:2;12696:9;12687:7;12683:23;12679:32;12676:119;;;12714:79;;:::i;:::-;12676:119;12834:1;12859:53;12904:7;12895:6;12884:9;12880:22;12859:53;:::i;:::-;12849:63;;12805:117;12961:2;12987:53;13032:7;13023:6;13012:9;13008:22;12987:53;:::i;:::-;12977:63;;12932:118;12583:474;;;;;:::o;13063:311::-;13140:4;13230:18;13222:6;13219:30;13216:56;;;13252:18;;:::i;:::-;13216:56;13302:4;13294:6;13290:17;13282:25;;13362:4;13356;13352:15;13344:23;;13063:311;;;:::o;13397:710::-;13493:5;13518:81;13534:64;13591:6;13534:64;:::i;:::-;13518:81;:::i;:::-;13509:90;;13619:5;13648:6;13641:5;13634:21;13682:4;13675:5;13671:16;13664:23;;13735:4;13727:6;13723:17;13715:6;13711:30;13764:3;13756:6;13753:15;13750:122;;;13783:79;;:::i;:::-;13750:122;13898:6;13881:220;13915:6;13910:3;13907:15;13881:220;;;13990:3;14019:37;14052:3;14040:10;14019:37;:::i;:::-;14014:3;14007:50;14086:4;14081:3;14077:14;14070:21;;13957:144;13941:4;13936:3;13932:14;13925:21;;13881:220;;;13885:21;13499:608;;13397:710;;;;;:::o;14130:370::-;14201:5;14250:3;14243:4;14235:6;14231:17;14227:27;14217:122;;14258:79;;:::i;:::-;14217:122;14375:6;14362:20;14400:94;14490:3;14482:6;14475:4;14467:6;14463:17;14400:94;:::i;:::-;14391:103;;14207:293;14130:370;;;;:::o;14506:894::-;14624:6;14632;14681:2;14669:9;14660:7;14656:23;14652:32;14649:119;;;14687:79;;:::i;:::-;14649:119;14835:1;14824:9;14820:17;14807:31;14865:18;14857:6;14854:30;14851:117;;;14887:79;;:::i;:::-;14851:117;14992:78;15062:7;15053:6;15042:9;15038:22;14992:78;:::i;:::-;14982:88;;14778:302;15147:2;15136:9;15132:18;15119:32;15178:18;15170:6;15167:30;15164:117;;;15200:79;;:::i;:::-;15164:117;15305:78;15375:7;15366:6;15355:9;15351:22;15305:78;:::i;:::-;15295:88;;15090:303;14506:894;;;;;:::o;15406:114::-;15473:6;15507:5;15501:12;15491:22;;15406:114;;;:::o;15526:184::-;15625:11;15659:6;15654:3;15647:19;15699:4;15694:3;15690:14;15675:29;;15526:184;;;;:::o;15716:132::-;15783:4;15806:3;15798:11;;15836:4;15831:3;15827:14;15819:22;;15716:132;;;:::o;15854:108::-;15931:24;15949:5;15931:24;:::i;:::-;15926:3;15919:37;15854:108;;:::o;15968:179::-;16037:10;16058:46;16100:3;16092:6;16058:46;:::i;:::-;16136:4;16131:3;16127:14;16113:28;;15968:179;;;;:::o;16153:113::-;16223:4;16255;16250:3;16246:14;16238:22;;16153:113;;;:::o;16302:732::-;16421:3;16450:54;16498:5;16450:54;:::i;:::-;16520:86;16599:6;16594:3;16520:86;:::i;:::-;16513:93;;16630:56;16680:5;16630:56;:::i;:::-;16709:7;16740:1;16725:284;16750:6;16747:1;16744:13;16725:284;;;16826:6;16820:13;16853:63;16912:3;16897:13;16853:63;:::i;:::-;16846:70;;16939:60;16992:6;16939:60;:::i;:::-;16929:70;;16785:224;16772:1;16769;16765:9;16760:14;;16725:284;;;16729:14;17025:3;17018:10;;16426:608;;;16302:732;;;;:::o;17040:373::-;17183:4;17221:2;17210:9;17206:18;17198:26;;17270:9;17264:4;17260:20;17256:1;17245:9;17241:17;17234:47;17298:108;17401:4;17392:6;17298:108;:::i;:::-;17290:116;;17040:373;;;;:::o;17419:118::-;17506:24;17524:5;17506:24;:::i;:::-;17501:3;17494:37;17419:118;;:::o;17543:222::-;17636:4;17674:2;17663:9;17659:18;17651:26;;17687:71;17755:1;17744:9;17740:17;17731:6;17687:71;:::i;:::-;17543:222;;;;:::o;17771:943::-;17866:6;17874;17882;17890;17939:3;17927:9;17918:7;17914:23;17910:33;17907:120;;;17946:79;;:::i;:::-;17907:120;18066:1;18091:53;18136:7;18127:6;18116:9;18112:22;18091:53;:::i;:::-;18081:63;;18037:117;18193:2;18219:53;18264:7;18255:6;18244:9;18240:22;18219:53;:::i;:::-;18209:63;;18164:118;18321:2;18347:53;18392:7;18383:6;18372:9;18368:22;18347:53;:::i;:::-;18337:63;;18292:118;18477:2;18466:9;18462:18;18449:32;18508:18;18500:6;18497:30;18494:117;;;18530:79;;:::i;:::-;18494:117;18635:62;18689:7;18680:6;18669:9;18665:22;18635:62;:::i;:::-;18625:72;;18420:287;17771:943;;;;;;;:::o;18720:116::-;18790:21;18805:5;18790:21;:::i;:::-;18783:5;18780:32;18770:60;;18826:1;18823;18816:12;18770:60;18720:116;:::o;18842:133::-;18885:5;18923:6;18910:20;18901:29;;18939:30;18963:5;18939:30;:::i;:::-;18842:133;;;;:::o;18981:468::-;19046:6;19054;19103:2;19091:9;19082:7;19078:23;19074:32;19071:119;;;19109:79;;:::i;:::-;19071:119;19229:1;19254:53;19299:7;19290:6;19279:9;19275:22;19254:53;:::i;:::-;19244:63;;19200:117;19356:2;19382:50;19424:7;19415:6;19404:9;19400:22;19382:50;:::i;:::-;19372:60;;19327:115;18981:468;;;;;:::o;19455:308::-;19517:4;19607:18;19599:6;19596:30;19593:56;;;19629:18;;:::i;:::-;19593:56;19667:29;19689:6;19667:29;:::i;:::-;19659:37;;19751:4;19745;19741:15;19733:23;;19455:308;;;:::o;19769:425::-;19847:5;19872:66;19888:49;19930:6;19888:49;:::i;:::-;19872:66;:::i;:::-;19863:75;;19961:6;19954:5;19947:21;19999:4;19992:5;19988:16;20037:3;20028:6;20023:3;20019:16;20016:25;20013:112;;;20044:79;;:::i;:::-;20013:112;20134:54;20181:6;20176:3;20171;20134:54;:::i;:::-;19853:341;19769:425;;;;;:::o;20214:340::-;20270:5;20319:3;20312:4;20304:6;20300:17;20296:27;20286:122;;20327:79;;:::i;:::-;20286:122;20444:6;20431:20;20469:79;20544:3;20536:6;20529:4;20521:6;20517:17;20469:79;:::i;:::-;20460:88;;20276:278;20214:340;;;;:::o;20560:654::-;20638:6;20646;20695:2;20683:9;20674:7;20670:23;20666:32;20663:119;;;20701:79;;:::i;:::-;20663:119;20821:1;20846:53;20891:7;20882:6;20871:9;20867:22;20846:53;:::i;:::-;20836:63;;20792:117;20976:2;20965:9;20961:18;20948:32;21007:18;20999:6;20996:30;20993:117;;;21029:79;;:::i;:::-;20993:117;21134:63;21189:7;21180:6;21169:9;21165:22;21134:63;:::i;:::-;21124:73;;20919:288;20560:654;;;;;:::o;21220:468::-;21285:6;21293;21342:2;21330:9;21321:7;21317:23;21313:32;21310:119;;;21348:79;;:::i;:::-;21310:119;21468:1;21493:53;21538:7;21529:6;21518:9;21514:22;21493:53;:::i;:::-;21483:63;;21439:117;21595:2;21621:50;21663:7;21654:6;21643:9;21639:22;21621:50;:::i;:::-;21611:60;;21566:115;21220:468;;;;;:::o;21694:474::-;21762:6;21770;21819:2;21807:9;21798:7;21794:23;21790:32;21787:119;;;21825:79;;:::i;:::-;21787:119;21945:1;21970:53;22015:7;22006:6;21995:9;21991:22;21970:53;:::i;:::-;21960:63;;21916:117;22072:2;22098:53;22143:7;22134:6;22123:9;22119:22;22098:53;:::i;:::-;22088:63;;22043:118;21694:474;;;;;:::o;22174:1089::-;22278:6;22286;22294;22302;22310;22359:3;22347:9;22338:7;22334:23;22330:33;22327:120;;;22366:79;;:::i;:::-;22327:120;22486:1;22511:53;22556:7;22547:6;22536:9;22532:22;22511:53;:::i;:::-;22501:63;;22457:117;22613:2;22639:53;22684:7;22675:6;22664:9;22660:22;22639:53;:::i;:::-;22629:63;;22584:118;22741:2;22767:53;22812:7;22803:6;22792:9;22788:22;22767:53;:::i;:::-;22757:63;;22712:118;22869:2;22895:53;22940:7;22931:6;22920:9;22916:22;22895:53;:::i;:::-;22885:63;;22840:118;23025:3;23014:9;23010:19;22997:33;23057:18;23049:6;23046:30;23043:117;;;23079:79;;:::i;:::-;23043:117;23184:62;23238:7;23229:6;23218:9;23214:22;23184:62;:::i;:::-;23174:72;;22968:288;22174:1089;;;;;;;;:::o;23269:229::-;23409:34;23405:1;23397:6;23393:14;23386:58;23478:12;23473:2;23465:6;23461:15;23454:37;23269:229;:::o;23504:366::-;23646:3;23667:67;23731:2;23726:3;23667:67;:::i;:::-;23660:74;;23743:93;23832:3;23743:93;:::i;:::-;23861:2;23856:3;23852:12;23845:19;;23504:366;;;:::o;23876:419::-;24042:4;24080:2;24069:9;24065:18;24057:26;;24129:9;24123:4;24119:20;24115:1;24104:9;24100:17;24093:47;24157:131;24283:4;24157:131;:::i;:::-;24149:139;;23876:419;;;:::o;24301:180::-;24349:77;24346:1;24339:88;24446:4;24443:1;24436:15;24470:4;24467:1;24460:15;24487:320;24531:6;24568:1;24562:4;24558:12;24548:22;;24615:1;24609:4;24605:12;24636:18;24626:81;;24692:4;24684:6;24680:17;24670:27;;24626:81;24754:2;24746:6;24743:14;24723:18;24720:38;24717:84;;24773:18;;:::i;:::-;24717:84;24538:269;24487:320;;;:::o;24813:173::-;24953:25;24949:1;24941:6;24937:14;24930:49;24813:173;:::o;24992:366::-;25134:3;25155:67;25219:2;25214:3;25155:67;:::i;:::-;25148:74;;25231:93;25320:3;25231:93;:::i;:::-;25349:2;25344:3;25340:12;25333:19;;24992:366;;;:::o;25364:419::-;25530:4;25568:2;25557:9;25553:18;25545:26;;25617:9;25611:4;25607:20;25603:1;25592:9;25588:17;25581:47;25645:131;25771:4;25645:131;:::i;:::-;25637:139;;25364:419;;;:::o;25789:179::-;25929:31;25925:1;25917:6;25913:14;25906:55;25789:179;:::o;25974:366::-;26116:3;26137:67;26201:2;26196:3;26137:67;:::i;:::-;26130:74;;26213:93;26302:3;26213:93;:::i;:::-;26331:2;26326:3;26322:12;26315:19;;25974:366;;;:::o;26346:419::-;26512:4;26550:2;26539:9;26535:18;26527:26;;26599:9;26593:4;26589:20;26585:1;26574:9;26570:17;26563:47;26627:131;26753:4;26627:131;:::i;:::-;26619:139;;26346:419;;;:::o;26771:180::-;26819:77;26816:1;26809:88;26916:4;26913:1;26906:15;26940:4;26937:1;26930:15;26957:410;26997:7;27020:20;27038:1;27020:20;:::i;:::-;27015:25;;27054:20;27072:1;27054:20;:::i;:::-;27049:25;;27109:1;27106;27102:9;27131:30;27149:11;27131:30;:::i;:::-;27120:41;;27310:1;27301:7;27297:15;27294:1;27291:22;27271:1;27264:9;27244:83;27221:139;;27340:18;;:::i;:::-;27221:139;27005:362;26957:410;;;;:::o;27373:168::-;27513:20;27509:1;27501:6;27497:14;27490:44;27373:168;:::o;27547:366::-;27689:3;27710:67;27774:2;27769:3;27710:67;:::i;:::-;27703:74;;27786:93;27875:3;27786:93;:::i;:::-;27904:2;27899:3;27895:12;27888:19;;27547:366;;;:::o;27919:419::-;28085:4;28123:2;28112:9;28108:18;28100:26;;28172:9;28166:4;28162:20;28158:1;28147:9;28143:17;28136:47;28200:131;28326:4;28200:131;:::i;:::-;28192:139;;27919:419;;;:::o;28344:191::-;28384:3;28403:20;28421:1;28403:20;:::i;:::-;28398:25;;28437:20;28455:1;28437:20;:::i;:::-;28432:25;;28480:1;28477;28473:9;28466:16;;28501:3;28498:1;28495:10;28492:36;;;28508:18;;:::i;:::-;28492:36;28344:191;;;;:::o;28541:168::-;28681:20;28677:1;28669:6;28665:14;28658:44;28541:168;:::o;28715:366::-;28857:3;28878:67;28942:2;28937:3;28878:67;:::i;:::-;28871:74;;28954:93;29043:3;28954:93;:::i;:::-;29072:2;29067:3;29063:12;29056:19;;28715:366;;;:::o;29087:419::-;29253:4;29291:2;29280:9;29276:18;29268:26;;29340:9;29334:4;29330:20;29326:1;29315:9;29311:17;29304:47;29368:131;29494:4;29368:131;:::i;:::-;29360:139;;29087:419;;;:::o;29512:178::-;29652:30;29648:1;29640:6;29636:14;29629:54;29512:178;:::o;29696:366::-;29838:3;29859:67;29923:2;29918:3;29859:67;:::i;:::-;29852:74;;29935:93;30024:3;29935:93;:::i;:::-;30053:2;30048:3;30044:12;30037:19;;29696:366;;;:::o;30068:419::-;30234:4;30272:2;30261:9;30257:18;30249:26;;30321:9;30315:4;30311:20;30307:1;30296:9;30292:17;30285:47;30349:131;30475:4;30349:131;:::i;:::-;30341:139;;30068:419;;;:::o;30493:174::-;30633:26;30629:1;30621:6;30617:14;30610:50;30493:174;:::o;30673:366::-;30815:3;30836:67;30900:2;30895:3;30836:67;:::i;:::-;30829:74;;30912:93;31001:3;30912:93;:::i;:::-;31030:2;31025:3;31021:12;31014:19;;30673:366;;;:::o;31045:419::-;31211:4;31249:2;31238:9;31234:18;31226:26;;31298:9;31292:4;31288:20;31284:1;31273:9;31269:17;31262:47;31326:131;31452:4;31326:131;:::i;:::-;31318:139;;31045:419;;;:::o;31470:297::-;31610:34;31606:1;31598:6;31594:14;31587:58;31679:34;31674:2;31666:6;31662:15;31655:59;31748:11;31743:2;31735:6;31731:15;31724:36;31470:297;:::o;31773:366::-;31915:3;31936:67;32000:2;31995:3;31936:67;:::i;:::-;31929:74;;32012:93;32101:3;32012:93;:::i;:::-;32130:2;32125:3;32121:12;32114:19;;31773:366;;;:::o;32145:419::-;32311:4;32349:2;32338:9;32334:18;32326:26;;32398:9;32392:4;32388:20;32384:1;32373:9;32369:17;32362:47;32426:131;32552:4;32426:131;:::i;:::-;32418:139;;32145:419;;;:::o;32570:180::-;32618:77;32615:1;32608:88;32715:4;32712:1;32705:15;32739:4;32736:1;32729:15;32756:233;32795:3;32818:24;32836:5;32818:24;:::i;:::-;32809:33;;32864:66;32857:5;32854:77;32851:103;;32934:18;;:::i;:::-;32851:103;32981:1;32974:5;32970:13;32963:20;;32756:233;;;:::o;32995:::-;33135:34;33131:1;33123:6;33119:14;33112:58;33204:16;33199:2;33191:6;33187:15;33180:41;32995:233;:::o;33234:366::-;33376:3;33397:67;33461:2;33456:3;33397:67;:::i;:::-;33390:74;;33473:93;33562:3;33473:93;:::i;:::-;33591:2;33586:3;33582:12;33575:19;;33234:366;;;:::o;33606:419::-;33772:4;33810:2;33799:9;33795:18;33787:26;;33859:9;33853:4;33849:20;33845:1;33834:9;33830:17;33823:47;33887:131;34013:4;33887:131;:::i;:::-;33879:139;;33606:419;;;:::o;34031:147::-;34132:11;34169:3;34154:18;;34031:147;;;;:::o;34184:114::-;;:::o;34304:398::-;34463:3;34484:83;34565:1;34560:3;34484:83;:::i;:::-;34477:90;;34576:93;34665:3;34576:93;:::i;:::-;34694:1;34689:3;34685:11;34678:18;;34304:398;;;:::o;34708:379::-;34892:3;34914:147;35057:3;34914:147;:::i;:::-;34907:154;;35078:3;35071:10;;34708:379;;;:::o;35093:166::-;35233:18;35229:1;35221:6;35217:14;35210:42;35093:166;:::o;35265:366::-;35407:3;35428:67;35492:2;35487:3;35428:67;:::i;:::-;35421:74;;35504:93;35593:3;35504:93;:::i;:::-;35622:2;35617:3;35613:12;35606:19;;35265:366;;;:::o;35637:419::-;35803:4;35841:2;35830:9;35826:18;35818:26;;35890:9;35884:4;35880:20;35876:1;35865:9;35861:17;35854:47;35918:131;36044:4;35918:131;:::i;:::-;35910:139;;35637:419;;;:::o;36062:228::-;36202:34;36198:1;36190:6;36186:14;36179:58;36271:11;36266:2;36258:6;36254:15;36247:36;36062:228;:::o;36296:366::-;36438:3;36459:67;36523:2;36518:3;36459:67;:::i;:::-;36452:74;;36535:93;36624:3;36535:93;:::i;:::-;36653:2;36648:3;36644:12;36637:19;;36296:366;;;:::o;36668:419::-;36834:4;36872:2;36861:9;36857:18;36849:26;;36921:9;36915:4;36911:20;36907:1;36896:9;36892:17;36885:47;36949:131;37075:4;36949:131;:::i;:::-;36941:139;;36668:419;;;:::o;37093:225::-;37233:34;37229:1;37221:6;37217:14;37210:58;37302:8;37297:2;37289:6;37285:15;37278:33;37093:225;:::o;37324:366::-;37466:3;37487:67;37551:2;37546:3;37487:67;:::i;:::-;37480:74;;37563:93;37652:3;37563:93;:::i;:::-;37681:2;37676:3;37672:12;37665:19;;37324:366;;;:::o;37696:419::-;37862:4;37900:2;37889:9;37885:18;37877:26;;37949:9;37943:4;37939:20;37935:1;37924:9;37920:17;37913:47;37977:131;38103:4;37977:131;:::i;:::-;37969:139;;37696:419;;;:::o;38121:220::-;38261:34;38257:1;38249:6;38245:14;38238:58;38330:3;38325:2;38317:6;38313:15;38306:28;38121:220;:::o;38347:366::-;38489:3;38510:67;38574:2;38569:3;38510:67;:::i;:::-;38503:74;;38586:93;38675:3;38586:93;:::i;:::-;38704:2;38699:3;38695:12;38688:19;;38347:366;;;:::o;38719:419::-;38885:4;38923:2;38912:9;38908:18;38900:26;;38972:9;38966:4;38962:20;38958:1;38947:9;38943:17;38936:47;39000:131;39126:4;39000:131;:::i;:::-;38992:139;;38719:419;;;:::o;39144:332::-;39265:4;39303:2;39292:9;39288:18;39280:26;;39316:71;39384:1;39373:9;39369:17;39360:6;39316:71;:::i;:::-;39397:72;39465:2;39454:9;39450:18;39441:6;39397:72;:::i;:::-;39144:332;;;;;:::o;39482:148::-;39584:11;39621:3;39606:18;;39482:148;;;;:::o;39636:141::-;39685:4;39708:3;39700:11;;39731:3;39728:1;39721:14;39765:4;39762:1;39752:18;39744:26;;39636:141;;;:::o;39807:874::-;39910:3;39947:5;39941:12;39976:36;40002:9;39976:36;:::i;:::-;40028:89;40110:6;40105:3;40028:89;:::i;:::-;40021:96;;40148:1;40137:9;40133:17;40164:1;40159:166;;;;40339:1;40334:341;;;;40126:549;;40159:166;40243:4;40239:9;40228;40224:25;40219:3;40212:38;40305:6;40298:14;40291:22;40283:6;40279:35;40274:3;40270:45;40263:52;;40159:166;;40334:341;40401:38;40433:5;40401:38;:::i;:::-;40461:1;40475:154;40489:6;40486:1;40483:13;40475:154;;;40563:7;40557:14;40553:1;40548:3;40544:11;40537:35;40613:1;40604:7;40600:15;40589:26;;40511:4;40508:1;40504:12;40499:17;;40475:154;;;40658:6;40653:3;40649:16;40642:23;;40341:334;;40126:549;;39914:767;;39807:874;;;;:::o;40687:390::-;40793:3;40821:39;40854:5;40821:39;:::i;:::-;40876:89;40958:6;40953:3;40876:89;:::i;:::-;40869:96;;40974:65;41032:6;41027:3;41020:4;41013:5;41009:16;40974:65;:::i;:::-;41064:6;41059:3;41055:16;41048:23;;40797:280;40687:390;;;;:::o;41083:429::-;41260:3;41282:92;41370:3;41361:6;41282:92;:::i;:::-;41275:99;;41391:95;41482:3;41473:6;41391:95;:::i;:::-;41384:102;;41503:3;41496:10;;41083:429;;;;;:::o;41518:182::-;41658:34;41654:1;41646:6;41642:14;41635:58;41518:182;:::o;41706:366::-;41848:3;41869:67;41933:2;41928:3;41869:67;:::i;:::-;41862:74;;41945:93;42034:3;41945:93;:::i;:::-;42063:2;42058:3;42054:12;42047:19;;41706:366;;;:::o;42078:419::-;42244:4;42282:2;42271:9;42267:18;42259:26;;42331:9;42325:4;42321:20;42317:1;42306:9;42302:17;42295:47;42359:131;42485:4;42359:131;:::i;:::-;42351:139;;42078:419;;;:::o;42503:227::-;42643:34;42639:1;42631:6;42627:14;42620:58;42712:10;42707:2;42699:6;42695:15;42688:35;42503:227;:::o;42736:366::-;42878:3;42899:67;42963:2;42958:3;42899:67;:::i;:::-;42892:74;;42975:93;43064:3;42975:93;:::i;:::-;43093:2;43088:3;43084:12;43077:19;;42736:366;;;:::o;43108:419::-;43274:4;43312:2;43301:9;43297:18;43289:26;;43361:9;43355:4;43351:20;43347:1;43336:9;43332:17;43325:47;43389:131;43515:4;43389:131;:::i;:::-;43381:139;;43108:419;;;:::o;43533:634::-;43754:4;43792:2;43781:9;43777:18;43769:26;;43841:9;43835:4;43831:20;43827:1;43816:9;43812:17;43805:47;43869:108;43972:4;43963:6;43869:108;:::i;:::-;43861:116;;44024:9;44018:4;44014:20;44009:2;43998:9;43994:18;43987:48;44052:108;44155:4;44146:6;44052:108;:::i;:::-;44044:116;;43533:634;;;;;:::o;44173:224::-;44313:34;44309:1;44301:6;44297:14;44290:58;44382:7;44377:2;44369:6;44365:15;44358:32;44173:224;:::o;44403:366::-;44545:3;44566:67;44630:2;44625:3;44566:67;:::i;:::-;44559:74;;44642:93;44731:3;44642:93;:::i;:::-;44760:2;44755:3;44751:12;44744:19;;44403:366;;;:::o;44775:419::-;44941:4;44979:2;44968:9;44964:18;44956:26;;45028:9;45022:4;45018:20;45014:1;45003:9;44999:17;44992:47;45056:131;45182:4;45056:131;:::i;:::-;45048:139;;44775:419;;;:::o;45200:229::-;45340:34;45336:1;45328:6;45324:14;45317:58;45409:12;45404:2;45396:6;45392:15;45385:37;45200:229;:::o;45435:366::-;45577:3;45598:67;45662:2;45657:3;45598:67;:::i;:::-;45591:74;;45674:93;45763:3;45674:93;:::i;:::-;45792:2;45787:3;45783:12;45776:19;;45435:366;;;:::o;45807:419::-;45973:4;46011:2;46000:9;45996:18;45988:26;;46060:9;46054:4;46050:20;46046:1;46035:9;46031:17;46024:47;46088:131;46214:4;46088:131;:::i;:::-;46080:139;;45807:419;;;:::o;46232:93::-;46269:6;46316:2;46311;46304:5;46300:14;46296:23;46286:33;;46232:93;;;:::o;46331:107::-;46375:8;46425:5;46419:4;46415:16;46394:37;;46331:107;;;;:::o;46444:393::-;46513:6;46563:1;46551:10;46547:18;46586:97;46616:66;46605:9;46586:97;:::i;:::-;46704:39;46734:8;46723:9;46704:39;:::i;:::-;46692:51;;46776:4;46772:9;46765:5;46761:21;46752:30;;46825:4;46815:8;46811:19;46804:5;46801:30;46791:40;;46520:317;;46444:393;;;;;:::o;46843:60::-;46871:3;46892:5;46885:12;;46843:60;;;:::o;46909:142::-;46959:9;46992:53;47010:34;47019:24;47037:5;47019:24;:::i;:::-;47010:34;:::i;:::-;46992:53;:::i;:::-;46979:66;;46909:142;;;:::o;47057:75::-;47100:3;47121:5;47114:12;;47057:75;;;:::o;47138:269::-;47248:39;47279:7;47248:39;:::i;:::-;47309:91;47358:41;47382:16;47358:41;:::i;:::-;47350:6;47343:4;47337:11;47309:91;:::i;:::-;47303:4;47296:105;47214:193;47138:269;;;:::o;47413:73::-;47458:3;47413:73;:::o;47492:189::-;47569:32;;:::i;:::-;47610:65;47668:6;47660;47654:4;47610:65;:::i;:::-;47545:136;47492:189;;:::o;47687:186::-;47747:120;47764:3;47757:5;47754:14;47747:120;;;47818:39;47855:1;47848:5;47818:39;:::i;:::-;47791:1;47784:5;47780:13;47771:22;;47747:120;;;47687:186;;:::o;47879:543::-;47980:2;47975:3;47972:11;47969:446;;;48014:38;48046:5;48014:38;:::i;:::-;48098:29;48116:10;48098:29;:::i;:::-;48088:8;48084:44;48281:2;48269:10;48266:18;48263:49;;;48302:8;48287:23;;48263:49;48325:80;48381:22;48399:3;48381:22;:::i;:::-;48371:8;48367:37;48354:11;48325:80;:::i;:::-;47984:431;;47969:446;47879:543;;;:::o;48428:117::-;48482:8;48532:5;48526:4;48522:16;48501:37;;48428:117;;;;:::o;48551:169::-;48595:6;48628:51;48676:1;48672:6;48664:5;48661:1;48657:13;48628:51;:::i;:::-;48624:56;48709:4;48703;48699:15;48689:25;;48602:118;48551:169;;;;:::o;48725:295::-;48801:4;48947:29;48972:3;48966:4;48947:29;:::i;:::-;48939:37;;49009:3;49006:1;49002:11;48996:4;48993:21;48985:29;;48725:295;;;;:::o;49025:1395::-;49142:37;49175:3;49142:37;:::i;:::-;49244:18;49236:6;49233:30;49230:56;;;49266:18;;:::i;:::-;49230:56;49310:38;49342:4;49336:11;49310:38;:::i;:::-;49395:67;49455:6;49447;49441:4;49395:67;:::i;:::-;49489:1;49513:4;49500:17;;49545:2;49537:6;49534:14;49562:1;49557:618;;;;50219:1;50236:6;50233:77;;;50285:9;50280:3;50276:19;50270:26;50261:35;;50233:77;50336:67;50396:6;50389:5;50336:67;:::i;:::-;50330:4;50323:81;50192:222;49527:887;;49557:618;49609:4;49605:9;49597:6;49593:22;49643:37;49675:4;49643:37;:::i;:::-;49702:1;49716:208;49730:7;49727:1;49724:14;49716:208;;;49809:9;49804:3;49800:19;49794:26;49786:6;49779:42;49860:1;49852:6;49848:14;49838:24;;49907:2;49896:9;49892:18;49879:31;;49753:4;49750:1;49746:12;49741:17;;49716:208;;;49952:6;49943:7;49940:19;49937:179;;;50010:9;50005:3;50001:19;49995:26;50053:48;50095:4;50087:6;50083:17;50072:9;50053:48;:::i;:::-;50045:6;50038:64;49960:156;49937:179;50162:1;50158;50150:6;50146:14;50142:22;50136:4;50129:36;49564:611;;;49527:887;;49117:1303;;;49025:1395;;:::o;50426:228::-;50566:34;50562:1;50554:6;50550:14;50543:58;50635:11;50630:2;50622:6;50618:15;50611:36;50426:228;:::o;50660:366::-;50802:3;50823:67;50887:2;50882:3;50823:67;:::i;:::-;50816:74;;50899:93;50988:3;50899:93;:::i;:::-;51017:2;51012:3;51008:12;51001:19;;50660:366;;;:::o;51032:419::-;51198:4;51236:2;51225:9;51221:18;51213:26;;51285:9;51279:4;51275:20;51271:1;51260:9;51256:17;51249:47;51313:131;51439:4;51313:131;:::i;:::-;51305:139;;51032:419;;;:::o;51457:98::-;51508:6;51542:5;51536:12;51526:22;;51457:98;;;:::o;51561:168::-;51644:11;51678:6;51673:3;51666:19;51718:4;51713:3;51709:14;51694:29;;51561:168;;;;:::o;51735:373::-;51821:3;51849:38;51881:5;51849:38;:::i;:::-;51903:70;51966:6;51961:3;51903:70;:::i;:::-;51896:77;;51982:65;52040:6;52035:3;52028:4;52021:5;52017:16;51982:65;:::i;:::-;52072:29;52094:6;52072:29;:::i;:::-;52067:3;52063:39;52056:46;;51825:283;51735:373;;;;:::o;52114:751::-;52337:4;52375:3;52364:9;52360:19;52352:27;;52389:71;52457:1;52446:9;52442:17;52433:6;52389:71;:::i;:::-;52470:72;52538:2;52527:9;52523:18;52514:6;52470:72;:::i;:::-;52552;52620:2;52609:9;52605:18;52596:6;52552:72;:::i;:::-;52634;52702:2;52691:9;52687:18;52678:6;52634:72;:::i;:::-;52754:9;52748:4;52744:20;52738:3;52727:9;52723:19;52716:49;52782:76;52853:4;52844:6;52782:76;:::i;:::-;52774:84;;52114:751;;;;;;;;:::o;52871:141::-;52927:5;52958:6;52952:13;52943:22;;52974:32;53000:5;52974:32;:::i;:::-;52871:141;;;;:::o;53018:349::-;53087:6;53136:2;53124:9;53115:7;53111:23;53107:32;53104:119;;;53142:79;;:::i;:::-;53104:119;53262:1;53287:63;53342:7;53333:6;53322:9;53318:22;53287:63;:::i;:::-;53277:73;;53233:127;53018:349;;;;:::o;53373:106::-;53417:8;53466:5;53461:3;53457:15;53436:36;;53373:106;;;:::o;53485:183::-;53520:3;53558:1;53540:16;53537:23;53534:128;;;53596:1;53593;53590;53575:23;53618:34;53649:1;53643:8;53618:34;:::i;:::-;53611:41;;53534:128;53485:183;:::o;53674:711::-;53713:3;53751:4;53733:16;53730:26;53759:5;53727:39;53788:20;;:::i;:::-;53863:1;53845:16;53841:24;53838:1;53832:4;53817:49;53896:4;53890:11;53995:16;53988:4;53980:6;53976:17;53973:39;53940:18;53932:6;53929:30;53913:113;53910:146;;;54041:5;;;;53910:146;54087:6;54081:4;54077:17;54123:3;54117:10;54150:18;54142:6;54139:30;54136:43;;;54172:5;;;;;;54136:43;54220:6;54213:4;54208:3;54204:14;54200:27;54279:1;54261:16;54257:24;54251:4;54247:35;54242:3;54239:44;54236:57;;;54286:5;;;;;;;54236:57;54303;54351:6;54345:4;54341:17;54333:6;54329:30;54323:4;54303:57;:::i;:::-;54376:3;54369:10;;53717:668;;;;;53674:711;;:::o;54391:239::-;54531:34;54527:1;54519:6;54515:14;54508:58;54600:22;54595:2;54587:6;54583:15;54576:47;54391:239;:::o;54636:366::-;54778:3;54799:67;54863:2;54858:3;54799:67;:::i;:::-;54792:74;;54875:93;54964:3;54875:93;:::i;:::-;54993:2;54988:3;54984:12;54977:19;;54636:366;;;:::o;55008:419::-;55174:4;55212:2;55201:9;55197:18;55189:26;;55261:9;55255:4;55251:20;55247:1;55236:9;55232:17;55225:47;55289:131;55415:4;55289:131;:::i;:::-;55281:139;;55008:419;;;:::o;55433:227::-;55573:34;55569:1;55561:6;55557:14;55550:58;55642:10;55637:2;55629:6;55625:15;55618:35;55433:227;:::o;55666:366::-;55808:3;55829:67;55893:2;55888:3;55829:67;:::i;:::-;55822:74;;55905:93;55994:3;55905:93;:::i;:::-;56023:2;56018:3;56014:12;56007:19;;55666:366;;;:::o;56038:419::-;56204:4;56242:2;56231:9;56227:18;56219:26;;56291:9;56285:4;56281:20;56277:1;56266:9;56262:17;56255:47;56319:131;56445:4;56319:131;:::i;:::-;56311:139;;56038:419;;;:::o;56463:1053::-;56786:4;56824:3;56813:9;56809:19;56801:27;;56838:71;56906:1;56895:9;56891:17;56882:6;56838:71;:::i;:::-;56919:72;56987:2;56976:9;56972:18;56963:6;56919:72;:::i;:::-;57038:9;57032:4;57028:20;57023:2;57012:9;57008:18;57001:48;57066:108;57169:4;57160:6;57066:108;:::i;:::-;57058:116;;57221:9;57215:4;57211:20;57206:2;57195:9;57191:18;57184:48;57249:108;57352:4;57343:6;57249:108;:::i;:::-;57241:116;;57405:9;57399:4;57395:20;57389:3;57378:9;57374:19;57367:49;57433:76;57504:4;57495:6;57433:76;:::i;:::-;57425:84;;56463:1053;;;;;;;;:::o;57522:170::-;57662:22;57658:1;57650:6;57646:14;57639:46;57522:170;:::o;57698:366::-;57840:3;57861:67;57925:2;57920:3;57861:67;:::i;:::-;57854:74;;57937:93;58026:3;57937:93;:::i;:::-;58055:2;58050:3;58046:12;58039:19;;57698:366;;;:::o;58070:419::-;58236:4;58274:2;58263:9;58259:18;58251:26;;58323:9;58317:4;58313:20;58309:1;58298:9;58294:17;58287:47;58351:131;58477:4;58351:131;:::i;:::-;58343:139;;58070:419;;;:::o;58495:166::-;58635:18;58631:1;58623:6;58619:14;58612:42;58495:166;:::o;58667:366::-;58809:3;58830:67;58894:2;58889:3;58830:67;:::i;:::-;58823:74;;58906:93;58995:3;58906:93;:::i;:::-;59024:2;59019:3;59015:12;59008:19;;58667:366;;;:::o;59039:419::-;59205:4;59243:2;59232:9;59228:18;59220:26;;59292:9;59286:4;59282:20;59278:1;59267:9;59263:17;59256:47;59320:131;59446:4;59320:131;:::i;:::-;59312:139;;59039:419;;;:::o;59464:227::-;59604:34;59600:1;59592:6;59588:14;59581:58;59673:10;59668:2;59660:6;59656:15;59649:35;59464:227;:::o;59697:366::-;59839:3;59860:67;59924:2;59919:3;59860:67;:::i;:::-;59853:74;;59936:93;60025:3;59936:93;:::i;:::-;60054:2;60049:3;60045:12;60038:19;;59697:366;;;:::o;60069:419::-;60235:4;60273:2;60262:9;60258:18;60250:26;;60322:9;60316:4;60312:20;60308:1;60297:9;60293:17;60286:47;60350:131;60476:4;60350:131;:::i;:::-;60342:139;;60069:419;;;:::o

Swarm Source

ipfs://5eaf4986f793c642b2422bfdc64110708a0308be374d4a291531469a5ba86324
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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