ETH Price: $3,497.34 (+1.99%)
Gas: 2 Gwei

Token

Sky Castle Companions - Concepts ()
 

Overview

Max Total Supply

178

Holders

158

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x1f56b7ac8d5c4a7b90b2a7d2edfa61ff2c15d7cb
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:
SCAIToken

Compiler Version
v0.8.16+commit.07a7930e

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-17
*/

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

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

// 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]


// 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/utils/introspection/[email protected]


// 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/interfaces/[email protected]


// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(
        uint256 tokenId,
        uint256 salePrice
    ) external view returns (address receiver, uint256 royaltyAmount);
}


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


// 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]


// 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/common/[email protected]


// OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


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


// 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]


// 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]


// 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]


// 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/token/ERC1155/[email protected]


// 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/utils/math/[email protected]


// 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]


// 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]


// 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/security/[email protected]


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}


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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File operator-filter-registry/src/lib/[email protected]


pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

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

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}


// File contracts/SCAIToken.sol


// SCAI NFTs are governed by the following terms and conditions: https://www.skycastle.ai/nft-terms

pragma solidity 0.8.16;








/**
 * @author SkycastleAI Team
 * @title Skycastle Concepts NFT
 * @dev By default, the owner account will be the one that deploys the contract. This will be
 * changed with {transferOwnership} to a multisig to secure the NFT Contract. The transfer will occur
 * AFTER setting up the basics like Opensea Collections etc.
 */
contract SCAIToken is ERC1155, ERC2981, Ownable, Pausable, ReentrancyGuard, DefaultOperatorFilterer {
    using Counters for Counters.Counter;

    string public constant name = "Sky Castle Companions - Concepts";
    uint256 public constant MINT_PRICE = 0.001 ether;
    uint256 private constant MAX_SUPPLY = 480;
    uint256 private constant MAX_MINT_PER_CHARACTER = 60;
    uint256 private constant AMOUNT_OF_DIFFERENT_CHARACTERS = 8;
    /// GMT Time - end of 2024
    uint256 private constant TIMESTAMP_END_OF_2024 = 1735689599;

    /// Base URI
    string private baseURI;

    /// unix timestamp of trading date
    uint256 public releaseTimestamp;

    /// flag for when public purchase allowed
    bool public isPublicPurchaseOpened;

    /// flag for when contract is locked
    bool public contractLocked = false;

    /**
    * @notice counter for the mapping of token type id to the number of tokens of that type
    * @dev this does not change even when theres burning occuring
    */
    mapping(uint256 => Counters.Counter ) private _tokenCounts;

    /// tracker for total & burned tokens
    mapping(uint256 => uint256) private _totalSupply;

    /// tracker for total burned tokens
    mapping(uint256 => uint256) private _totalBurnedTokens;

    /// emit events for critical state updates
    /// For URI updating
    event UriUpdated(string newURI);
    /// For Release Timestamp Updates
    event ReleaseTimestamp(uint256 newReleaseTimestamp);
    /// For Opened to Public Purchase Updates
    event OpenForPublicPurchase(bool isPublicPurchaseOpened);

    /// Modifier to Prevent Trading / Transfer of NFT until after releaseTimestamp
    modifier onlyAfterRelease() {
        require(block.timestamp >= releaseTimestamp, "Trading is not allowed until release");
        _;
    }

    /// Modifier to Prevent Public purchase of NFT until after isPublicPurchaseOpened is set to true
    modifier onlyDuringOpenedForPublicPurchase() {
        require(isPublicPurchaseOpened, "Please wait for public purchase to open");
        _;
    }

    /**
    * @dev constructor
    *
    * @param _royaltyFeesInBasisPoints // value of 100 to 1000 (in bips) 1000 = 10%
    * @param _contractURI // base url of the metadata. this will be in IPFS
    * @param _releaseTimestamp //unix timestamp, must be before end december 2024
    */
    constructor(uint16 _royaltyFeesInBasisPoints, string memory _contractURI, uint256 _releaseTimestamp) ERC1155(_contractURI) {
        // validating release timestamp here, and not using setReleaseTimestamp because it should not emit an event in constructor
        require(_releaseTimestamp <= TIMESTAMP_END_OF_2024, "Please use a timestamp BEFORE end of 2024.");

        baseURI = _contractURI;
        setRoyaltyInfo(msg.sender, _royaltyFeesInBasisPoints);
        releaseTimestamp = _releaseTimestamp;
    }

    /**
    * @notice Purchase function is used in public sale when it gets opened by scai
    * @dev this is dependent on isPublicPurchaseOpened variable for public access
    *
    * @param tokenId the id of token type to mint
    */
    function purchase(uint256 tokenId) payable external whenNotPaused onlyDuringOpenedForPublicPurchase {
        // Check if the user has the required funds
        require(msg.value == MINT_PRICE, "Purchase: Incorrect payment");
        require(totalMinted() + 1 <= MAX_SUPPLY, "Mint: Max supply reached");
        // get current token count
        uint256 currentTokenCount = getCurrentTokenCounter(tokenId);
        // test for overflow.
        require((currentTokenCount + 1) <= MAX_MINT_PER_CHARACTER, "Mint: Max supply reached for character type");
        _safeMint(msg.sender, tokenId, 1);
    }

    /**
    * @notice this is for the contract owner to airdrop tokens to specific users.
    * @dev wrapping the mint function for airdrop
    *
    * @param toAddress //address of eth to send to
    * @param tokenId // the token type to mint
    * @param amount  //amount of tokens to mint for account
    */
    function mint(address toAddress, uint256 tokenId, uint256 amount) external onlyOwner whenNotPaused
    {
        require(totalMinted() + amount <= MAX_SUPPLY, "Mint: Max supply reached");
        uint256 currentTokenCount = getCurrentTokenCounter(tokenId);
        require((currentTokenCount + amount ) <= MAX_MINT_PER_CHARACTER, "Mint: Max supply reached for character type");

        _safeMint(toAddress, tokenId, amount);
    }

    /**
     * @notice Burn Function to reduce total supply.
     * @dev burn function for sender.
     * @param _tokenId // the token type to burn
     * @param _amount  //amount of tokens to burn for account
     */
    function burn(uint256 _tokenId, uint256 _amount) external whenNotPaused {
        require(balanceOf(msg.sender, _tokenId) >= _amount, "Insufficient balance");
        _burn(msg.sender, _tokenId, _amount);
        _totalBurnedTokens[_tokenId] += _amount;
        _totalSupply[_tokenId] -= _amount;
    }

    /**
     * @dev Updates the base URI that will be used to retrieve metadata.
     * @param _newuri The base URI to be used.
     */
    function setURI(string memory _newuri) external onlyOwner
    {
        require(contractLocked == false, "The contract has been locked and the Base URI cannot be changed");
        baseURI = _newuri;
        emit UriUpdated(_newuri);
    }

    /**
     * @notice SCAI has regulatory compliance on when this NFT can be traded. New Values cannot be beyond 31st Dec 2024
     * @dev Updates the releaseTimestamp should situation change.
     * @param _newTimestamp The new timestamp that should be used.
     */
    function setReleaseTimestamp(uint256 _newTimestamp) external onlyOwner {
        require(_newTimestamp <= TIMESTAMP_END_OF_2024, "Please use a timestamp BEFORE end of 2024.");
        releaseTimestamp = _newTimestamp;
        emit ReleaseTimestamp(_newTimestamp);
    }

    /**
     * @notice Allows the owner to open or close public purchases for NFT of this contract
     * @dev Updates the condition on whether public purchases is opened.
     * @param _isPublicPurchaseOpened boolean flag to toggle open or close
     */
    function setIsPublicPurchaseOpen(bool _isPublicPurchaseOpened) external onlyOwner
    {
        isPublicPurchaseOpened = _isPublicPurchaseOpened;
        emit OpenForPublicPurchase(_isPublicPurchaseOpened);
    }

    /**
     * @notice tracker to obtain total burned tokens by token type
     * @param _tokenId the token type
     */
    function getTotalBurnedTokensByType(uint256 _tokenId) external view returns (uint256) {
        return _totalBurnedTokens[_tokenId];
    }

    /**
     * @notice tracker to obtain amount of tokens of a token type left, which are available to mint
     * @param _tokenId the token type
     */
    function getAmountAvailableToMintByTokenType(uint256 _tokenId) external view returns (uint256) {
        uint256 currentTokenCount = getCurrentTokenCounter(_tokenId);
        return (MAX_MINT_PER_CHARACTER - currentTokenCount);
    }

    /**
     * @dev Withdraws the amount to owner address
     */
    function withdraw() external onlyOwner nonReentrant
    {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(owner()), balance);
    }

    /**
     * @notice For the Permanent Locking the URI of the Contract
     * @dev Make sure Function is called only when URI's metadata has been confirmed to be correct
     */
    function lockContract() public onlyOwner {
        contractLocked = true;
    }

    /**
     * @notice for the pausing of contract in emergencies only
     */
    function pause() public onlyOwner {
        _pause();
    }

    /**
     * @notice for the unpausing of contract when emergencies are rectified
     */
    function unpause() public onlyOwner {
        _unpause();
    }

    /**
     * @notice Updates the Royalty Amount should situation changes
     * @dev Allows the owner to update the royalty information
     * @param _receiver the receiver of the royalty
     * @param _royaltyFeesInBasisPoints in basis points. ie. 1000 bips = 10%
     */
    function setRoyaltyInfo(address _receiver, uint16 _royaltyFeesInBasisPoints) public onlyOwner
    {
        _setDefaultRoyalty(_receiver, _royaltyFeesInBasisPoints);
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     *      In this contract, the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     *      In this contract, the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     * @notice you might have to use [] for the last argument
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        uint256 amount,
        bytes memory data
    )
        public override onlyAllowedOperator(from) onlyAfterRelease
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     *      In this contract, the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) onlyAfterRelease {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {
        return ERC1155.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
    }

    /**
     * @notice gets the metadata uri of the specific token id. eg. https://public-accessibles.com/dev/metadata/concepts/1.json
     * @dev concatenates the baseUri with the tokenId to get the token specific uri
     * @param _tokenId The token id (nft type) of token
     */
    function uri(uint256 _tokenId) override public view returns (string memory) 
    {
        require(_tokenId >= 0 && _tokenId < AMOUNT_OF_DIFFERENT_CHARACTERS, "Incorrect Token Type");
        return string (
            abi.encodePacked(
                baseURI,
                Strings.toString(_tokenId),
                ".json"
            )
        );
    }

    /**
     * @notice gets the contract uri of the project. eg. https://public-accessibles.com/dev/metadata/concepts/contractMetadata.json
     * @dev concatenates the base uri and contractMetadata.json to derive the contract Uri
     */
    function contractURI() public view returns (string memory) {
        return string (
            abi.encodePacked(
                baseURI,
                "contractMetadata.json"
            )
        );
    }

    /**
     * @notice gets the total minted NFTs of the NFT Project
     * @dev uses the _tokenCounts, which includes mint only
     */
    function totalMinted() public view virtual returns (uint256)
    {
        uint256 currentSupply = 0;
        // Initialize the token counts
        for (uint256 i = 0; i < AMOUNT_OF_DIFFERENT_CHARACTERS; i++) {
            currentSupply += (_tokenCounts[i].current());
        }
        return currentSupply;
    }

    /**
     * @notice check the total supply
     * @dev uses the _totalSupply that includes mint + burn
     */
    function totalSupply() public view virtual returns (uint256)
    {
        uint256 totalTokens = 0;
        // Initialize the token counts
        for (uint256 i = 0; i < AMOUNT_OF_DIFFERENT_CHARACTERS; i++) {
            totalTokens += _totalSupply[i];
        }
        return totalTokens;
    }

    /**
     * @dev Hook function that is called before any token transfer.
     *
     * This function is part of the ERC-1155 standard and is used to implement additional checks or
     * perform actions before a token transfer occurs.
     */
    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        internal
        whenNotPaused
        override(ERC1155)
    {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

    /**
     * @notice Calls the _mint of the ERC1155 Contract and Increment SCAI Counters on Mint.
     * @dev calls _mint of the ERC1155 contract.
     * @param _to // receiver
     * @param _tokenId // token type
     * @param _amount // amount of tokens to mint
     */
    function _safeMint(address _to, uint256 _tokenId, uint256 _amount) private whenNotPaused
    {
        _mint(_to, _tokenId, _amount, "");
        //increment appropriate counters
        incrementCurrentTokenCounter(_tokenId, _amount);
        _totalSupply[_tokenId] += _amount;
    }

    /**
     * @notice increment the tracker of Token Supply for the specified token Id
     * @dev increment the token counter of the supply of a specific tokenId
     * @param _tokenId The token id (nft type) of token
     * @param _amount The amount to increment
     */
    function incrementCurrentTokenCounter(uint256 _tokenId, uint256 _amount) private
    {
        require(_tokenId >= 0 && _tokenId < AMOUNT_OF_DIFFERENT_CHARACTERS, "Incorrect Token Type");
        for (uint256 i = 0; i < _amount; i++) {
            _tokenCounts[_tokenId].increment();
        }
    }

    /**
     * @notice Get current token supply of specified token id.
     * @dev gets current token counter of the supply
     * @param _tokenId The token id (nft type) of token
     */
    function getCurrentTokenCounter(uint256 _tokenId) private view returns(uint256)
    {
        require(_tokenId >= 0 && _tokenId < AMOUNT_OF_DIFFERENT_CHARACTERS, "Incorrect Token Type");
        return _tokenCounts[_tokenId].current();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint16","name":"_royaltyFeesInBasisPoints","type":"uint16"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"uint256","name":"_releaseTimestamp","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPublicPurchaseOpened","type":"bool"}],"name":"OpenForPublicPurchase","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":false,"internalType":"uint256","name":"newReleaseTimestamp","type":"uint256"}],"name":"ReleaseTimestamp","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"UriUpdated","type":"event"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAmountAvailableToMintByTokenType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTotalBurnedTokensByType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"isPublicPurchaseOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","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":"tokenId","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"releaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"tokenId","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":"bool","name":"_isPublicPurchaseOpened","type":"bool"}],"name":"setIsPublicPurchaseOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTimestamp","type":"uint256"}],"name":"setReleaseTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint16","name":"_royaltyFeesInBasisPoints","type":"uint16"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newuri","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960016101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051620066f9380380620066f98339818101604052810190620000529190620008b6565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001836200007b816200033460201b60201c565b506200009c620000906200034960201b60201c565b6200035160201b60201c565b6000600560146101000a81548160ff021916908315150217905550600160068190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002b45780156200017a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200014092919062000976565b600060405180830381600087803b1580156200015b57600080fd5b505af115801562000170573d6000803e3d6000fd5b50505050620002b3565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000234576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001fa92919062000976565b600060405180830381600087803b1580156200021557600080fd5b505af11580156200022a573d6000803e3d6000fd5b50505050620002b2565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200027d9190620009a3565b600060405180830381600087803b1580156200029857600080fd5b505af1158015620002ad573d6000803e3d6000fd5b505050505b5b5b5050636774857f81111562000300576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f79062000a47565b60405180910390fd5b816007908162000311919062000caa565b506200032433846200041760201b60201c565b8060088190555050505062000f0d565b806002908162000345919062000caa565b5050565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004276200044160201b60201c565b6200043d828261ffff16620004d260201b60201c565b5050565b620004516200034960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004776200067560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004c79062000de1565b60405180910390fd5b565b620004e26200069f60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053a9062000e79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ac9062000eeb565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612710905090565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b620006d681620006bd565b8114620006e257600080fd5b50565b600081519050620006f681620006cb565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620007518262000706565b810181811067ffffffffffffffff8211171562000773576200077262000717565b5b80604052505050565b600062000788620006a9565b905062000796828262000746565b919050565b600067ffffffffffffffff821115620007b957620007b862000717565b5b620007c48262000706565b9050602081019050919050565b60005b83811015620007f1578082015181840152602081019050620007d4565b60008484015250505050565b6000620008146200080e846200079b565b6200077c565b90508281526020810184848401111562000833576200083262000701565b5b62000840848285620007d1565b509392505050565b600082601f83011262000860576200085f620006fc565b5b815162000872848260208601620007fd565b91505092915050565b6000819050919050565b62000890816200087b565b81146200089c57600080fd5b50565b600081519050620008b08162000885565b92915050565b600080600060608486031215620008d257620008d1620006b3565b5b6000620008e286828701620006e5565b935050602084015167ffffffffffffffff811115620009065762000905620006b8565b5b620009148682870162000848565b925050604062000927868287016200089f565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200095e8262000931565b9050919050565b620009708162000951565b82525050565b60006040820190506200098d600083018562000965565b6200099c602083018462000965565b9392505050565b6000602082019050620009ba600083018462000965565b92915050565b600082825260208201905092915050565b7f506c656173652075736520612074696d657374616d70204245464f524520656e60008201527f64206f6620323032342e00000000000000000000000000000000000000000000602082015250565b600062000a2f602a83620009c0565b915062000a3c82620009d1565b604082019050919050565b6000602082019050818103600083015262000a628162000a20565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000abc57607f821691505b60208210810362000ad25762000ad162000a74565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b3c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000afd565b62000b48868362000afd565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b8b62000b8562000b7f846200087b565b62000b60565b6200087b565b9050919050565b6000819050919050565b62000ba78362000b6a565b62000bbf62000bb68262000b92565b84845462000b0a565b825550505050565b600090565b62000bd662000bc7565b62000be381848462000b9c565b505050565b5b8181101562000c0b5762000bff60008262000bcc565b60018101905062000be9565b5050565b601f82111562000c5a5762000c248162000ad8565b62000c2f8462000aed565b8101602085101562000c3f578190505b62000c5762000c4e8562000aed565b83018262000be8565b50505b505050565b600082821c905092915050565b600062000c7f6000198460080262000c5f565b1980831691505092915050565b600062000c9a838362000c6c565b9150826002028217905092915050565b62000cb58262000a69565b67ffffffffffffffff81111562000cd15762000cd062000717565b5b62000cdd825462000aa3565b62000cea82828562000c0f565b600060209050601f83116001811462000d22576000841562000d0d578287015190505b62000d19858262000c8c565b86555062000d89565b601f19841662000d328662000ad8565b60005b8281101562000d5c5784890151825560018201915060208501945060208101905062000d35565b8683101562000d7c578489015162000d78601f89168262000c6c565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000dc9602083620009c0565b915062000dd68262000d91565b602082019050919050565b6000602082019050818103600083015262000dfc8162000dba565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000e61602a83620009c0565b915062000e6e8262000e03565b604082019050919050565b6000602082019050818103600083015262000e948162000e52565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000ed3601983620009c0565b915062000ee08262000e9b565b602082019050919050565b6000602082019050818103600083015262000f068162000ec4565b9050919050565b6157dc8062000f1d6000396000f3fe6080604052600436106102035760003560e01c8063547ae6af11610118578063a2309ff8116100a0578063e8a3d4851161006f578063e8a3d4851461071d578063e985e9c514610748578063efef39a114610785578063f242432a146107a1578063f2fde38b146107ca57610203565b8063a2309ff814610661578063b390c0ab1461068c578063c002d23d146106b5578063d334026c146106e057610203565b8063753868e3116100e7578063753868e3146105a25780638456cb59146105b95780638da5cb5b146105d05780639baf797e146105fb578063a22cb4651461063857610203565b8063547ae6af1461050c5780635c975abb14610537578063715018a61461056257806372504a241461057957610203565b80632a55205a1161019b5780633f4ba83a1161016a5780633f4ba83a1461043b57806341f43434146104525780634c1dc4f71461047d5780634d91f9a6146104a65780634e1273f4146104cf57610203565b80632a55205a146103925780632eb2c2d6146103d0578063324cb3cb146103f95780633ccfd60b1461042457610203565b80630a3f013f116101d75780630a3f013f146102d65780630e89341c14610301578063156e29f61461033e57806318160ddd1461036757610203565b8062fdd58e1461020857806301ffc9a71461024557806302fe53051461028257806306fdde03146102ab575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a919061334d565b6107f3565b60405161023c919061339c565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061340f565b6108bb565b6040516102799190613457565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906135b8565b6108dd565b005b3480156102b757600080fd5b506102c0610985565b6040516102cd9190613680565b60405180910390f35b3480156102e257600080fd5b506102eb6109be565b6040516102f8919061339c565b60405180910390f35b34801561030d57600080fd5b50610328600480360381019061032391906136a2565b6109c4565b6040516103359190613680565b60405180910390f35b34801561034a57600080fd5b50610365600480360381019061036091906136cf565b610a48565b005b34801561037357600080fd5b5061037c610b1c565b604051610389919061339c565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190613722565b610b6b565b6040516103c7929190613771565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190613903565b610d55565b005b34801561040557600080fd5b5061040e610ded565b60405161041b9190613457565b60405180910390f35b34801561043057600080fd5b50610439610e00565b005b34801561044757600080fd5b50610450610e31565b005b34801561045e57600080fd5b50610467610e43565b6040516104749190613a31565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f91906136a2565b610e55565b005b3480156104b257600080fd5b506104cd60048036038101906104c89190613a78565b610ee5565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613b68565b610f41565b6040516105039190613c9e565b60405180910390f35b34801561051857600080fd5b5061052161105a565b60405161052e9190613457565b60405180910390f35b34801561054357600080fd5b5061054c61106d565b6040516105599190613457565b60405180910390f35b34801561056e57600080fd5b50610577611084565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613cfa565b611098565b005b3480156105ae57600080fd5b506105b76110b2565b005b3480156105c557600080fd5b506105ce6110d7565b005b3480156105dc57600080fd5b506105e56110e9565b6040516105f29190613d3a565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906136a2565b611113565b60405161062f919061339c565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a9190613d55565b611130565b005b34801561066d57600080fd5b50610676611149565b604051610683919061339c565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190613722565b61119f565b005b3480156106c157600080fd5b506106ca611256565b6040516106d7919061339c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906136a2565b611261565b604051610714919061339c565b60405180910390f35b34801561072957600080fd5b50610732611284565b60405161073f9190613680565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613d95565b6112ac565b60405161077c9190613457565b60405180910390f35b61079f600480360381019061079a91906136a2565b611340565b005b3480156107ad57600080fd5b506107c860048036038101906107c39190613dd5565b6114a5565b005b3480156107d657600080fd5b506107f160048036038101906107ec9190613e6c565b61153d565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90613f0b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006108c6826115c0565b806108d657506108d5826116a2565b5b9050919050565b6108e561171c565b60001515600960019054906101000a900460ff1615151461093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290613f9d565b60405180910390fd5b806007908161094a91906141bf565b507f4405f9f72187d24d444b6d55ef67bfb2ef76aacbc07d6d642a5763dd5fd77cbf8160405161097a9190613680565b60405180910390a150565b6040518060400160405280602081526020017f536b7920436173746c6520436f6d70616e696f6e73202d20436f6e636570747381525081565b60085481565b6060600082101580156109d75750600882105b610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d906142dd565b60405180910390fd5b6007610a218361179a565b604051602001610a32929190614408565b6040516020818303038152906040529050919050565b610a5061171c565b610a58611868565b6101e081610a64611149565b610a6e9190614466565b1115610aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa6906144e6565b60405180910390fd5b6000610aba836118b2565b9050603c8282610aca9190614466565b1115610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614578565b60405180910390fd5b610b16848484611925565b50505050565b6000806000905060005b6008811015610b6357600b60008281526020019081526020016000205482610b4e9190614466565b91508080610b5b90614598565b915050610b26565b508091505090565b6000806000600460008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d005760036040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d0a611981565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d3691906145e0565b610d409190614669565b90508160000151819350935050509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d9357610d923361198b565b5b600854421015610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf9061470c565b60405180910390fd5b610de58686868686611a88565b505050505050565b600960019054906101000a900460ff1681565b610e0861171c565b610e10611b29565b6000479050610e26610e206110e9565b82611b78565b50610e2f611c6c565b565b610e3961171c565b610e41611c76565b565b6daaeb6d7670e522a718067333cd4e81565b610e5d61171c565b636774857f811115610ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9b9061479e565b60405180910390fd5b806008819055507f6a85bd2d6aec41897887c591fe2ae93b08af4b810170c011fc1c6c85e678931981604051610eda919061339c565b60405180910390a150565b610eed61171c565b80600960006101000a81548160ff0219169083151502179055507f5cdd0d749205cd4104cd27579286af3e05b3dab9e3388d52353ec467b764e0cd81604051610f369190613457565b60405180910390a150565b60608151835114610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90614830565b60405180910390fd5b6000835167ffffffffffffffff811115610fa457610fa361348d565b5b604051908082528060200260200182016040528015610fd25781602001602082028036833780820191505090505b50905060005b845181101561104f5761101f858281518110610ff757610ff6614850565b5b602002602001015185838151811061101257611011614850565b5b60200260200101516107f3565b82828151811061103257611031614850565b5b6020026020010181815250508061104890614598565b9050610fd8565b508091505092915050565b600960009054906101000a900460ff1681565b6000600560149054906101000a900460ff16905090565b61108c61171c565b6110966000611cd9565b565b6110a061171c565b6110ae828261ffff16611d9f565b5050565b6110ba61171c565b6001600960016101000a81548160ff021916908315150217905550565b6110df61171c565b6110e7611f34565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c6000838152602001908152602001600020549050919050565b8161113a8161198b565b6111448383611f97565b505050565b6000806000905060005b600881101561119757611177600a6000838152602001908152602001600020611fad565b826111829190614466565b9150808061118f90614598565b915050611153565b508091505090565b6111a7611868565b806111b233846107f3565b10156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea906148cb565b60405180910390fd5b6111fe338383611fbb565b80600c600084815260200190815260200160002060008282546112219190614466565b9250508190555080600b6000848152602001908152602001600020600082825461124b91906148eb565b925050819055505050565b66038d7ea4c6800081565b60008061126d836118b2565b905080603c61127c91906148eb565b915050919050565b60606007604051602001611298919061496b565b604051602081830303815290604052905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611348611868565b600960009054906101000a900460ff16611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e906149ff565b60405180910390fd5b66038d7ea4c6800034146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614a6b565b60405180910390fd5b6101e060016113ed611149565b6113f79190614466565b1115611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906144e6565b60405180910390fd5b6000611443826118b2565b9050603c6001826114549190614466565b1115611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c90614578565b60405180910390fd5b6114a133836001611925565b5050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114e3576114e23361198b565b5b600854421015611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f9061470c565b60405180910390fd5b6115358686868686612201565b505050505050565b61154561171c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614afd565b60405180910390fd5b6115bd81611cd9565b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061168b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061169b575061169a826122a2565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117155750611714826115c0565b5b9050919050565b61172461230c565b73ffffffffffffffffffffffffffffffffffffffff166117426110e9565b73ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614b69565b60405180910390fd5b565b6060600060016117a984612314565b01905060008167ffffffffffffffff8111156117c8576117c761348d565b5b6040519080825280601f01601f1916602001820160405280156117fa5781602001600182028036833780820191505090505b509050600082602001820190505b60011561185d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816118515761185061463a565b5b04945060008503611808575b819350505050919050565b61187061106d565b156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a790614bd5565b60405180910390fd5b565b60008082101580156118c45750600882105b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa906142dd565b60405180910390fd5b61191e600a6000848152602001908152602001600020611fad565b9050919050565b61192d611868565b61194883838360405180602001604052806000815250612467565b6119528282612617565b80600b600084815260200190815260200160002060008282546119759190614466565b92505081905550505050565b6000612710905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a85576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a02929190614bf5565b602060405180830381865afa158015611a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a439190614c33565b611a8457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a7b9190613d3a565b60405180910390fd5b5b50565b611a9061230c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ad65750611ad585611ad061230c565b6112ac565b5b611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90614cd2565b60405180910390fd5b611b2285858585856126a5565b5050505050565b600260065403611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590614d3e565b60405180910390fd5b6002600681905550565b80471015611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614daa565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611be190614dfb565b60006040518083038185875af1925050503d8060008114611c1e576040519150601f19603f3d011682016040523d82523d6000602084013e611c23565b606091505b5050905080611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614e82565b60405180910390fd5b505050565b6001600681905550565b611c7e6129c6565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611cc261230c565b604051611ccf9190613d3a565b60405180910390a1565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611da7611981565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc90614f14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6b90614f80565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611f3c611868565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f8061230c565b604051611f8d9190613d3a565b60405180910390a1565b611fa9611fa261230c565b8383612a0f565b5050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202190615012565b60405180910390fd5b600061203461230c565b9050600061204184612b7b565b9050600061204e84612b7b565b905061206e83876000858560405180602001604052806000815250612bf5565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc906150a4565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516121d29291906150c4565b60405180910390a46121f884886000868660405180602001604052806000815250612c13565b50505050505050565b61220961230c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061224f575061224e8561224961230c565b6112ac565b5b61228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228590614cd2565b60405180910390fd5b61229b8585858585612c1b565b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612372577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816123685761236761463a565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106123af576d04ee2d6d415b85acef810000000083816123a5576123a461463a565b5b0492506020810190505b662386f26fc1000083106123de57662386f26fc1000083816123d4576123d361463a565b5b0492506010810190505b6305f5e1008310612407576305f5e10083816123fd576123fc61463a565b5b0492506008810190505b612710831061242c5761271083816124225761242161463a565b5b0492506004810190505b6064831061244f57606483816124455761244461463a565b5b0492506002810190505b600a831061245e576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd9061515f565b60405180910390fd5b60006124e061230c565b905060006124ed85612b7b565b905060006124fa85612b7b565b905061250b83600089858589612bf5565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256a9190614466565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516125e89291906150c4565b60405180910390a46125ff83600089858589612c13565b61260e83600089898989612eb6565b50505050505050565b600082101580156126285750600882105b612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e906142dd565b60405180910390fd5b60005b818110156126a05761268d600a600085815260200190815260200160002061308d565b808061269890614598565b91505061266a565b505050565b81518351146126e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e0906151f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274f90615283565b60405180910390fd5b600061276261230c565b9050612772818787878787612bf5565b60005b845181101561292357600085828151811061279357612792614850565b5b6020026020010151905060008583815181106127b2576127b1614850565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90615315565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129089190614466565b925050819055505050508061291c90614598565b9050612775565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161299a929190615335565b60405180910390a46129b0818787878787612c13565b6129be8187878787876130a3565b505050505050565b6129ce61106d565b612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a04906153b8565b60405180910390fd5b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a749061544a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b6e9190613457565b60405180910390a3505050565b60606000600167ffffffffffffffff811115612b9a57612b9961348d565b5b604051908082528060200260200182016040528015612bc85781602001602082028036833780820191505090505b5090508281600081518110612be057612bdf614850565b5b60200260200101818152505080915050919050565b612bfd611868565b612c0b86868686868661327a565b505050505050565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190615283565b60405180910390fd5b6000612c9461230c565b90506000612ca185612b7b565b90506000612cae85612b7b565b9050612cbe838989858589612bf5565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4c90615315565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e0a9190614466565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612e879291906150c4565b60405180910390a4612e9d848a8a86868a612c13565b612eab848a8a8a8a8a612eb6565b505050505050505050565b612ed58473ffffffffffffffffffffffffffffffffffffffff16613282565b15613085578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612f1b9594939291906154bf565b6020604051808303816000875af1925050508015612f5757506040513d601f19601f82011682018060405250810190612f54919061552e565b60015b612ffc57612f63615568565b806308c379a003612fbf5750612f7761558a565b80612f825750612fc1565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb69190613680565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff39061568c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a9061571e565b60405180910390fd5b505b505050505050565b6001816000016000828254019250508190555050565b6130c28473ffffffffffffffffffffffffffffffffffffffff16613282565b15613272578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161310895949392919061573e565b6020604051808303816000875af192505050801561314457506040513d601f19601f82011682018060405250810190613141919061552e565b60015b6131e957613150615568565b806308c379a0036131ac575061316461558a565b8061316f57506131ae565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a39190613680565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e09061568c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132679061571e565b60405180910390fd5b505b505050505050565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132e4826132b9565b9050919050565b6132f4816132d9565b81146132ff57600080fd5b50565b600081359050613311816132eb565b92915050565b6000819050919050565b61332a81613317565b811461333557600080fd5b50565b60008135905061334781613321565b92915050565b60008060408385031215613364576133636132af565b5b600061337285828601613302565b925050602061338385828601613338565b9150509250929050565b61339681613317565b82525050565b60006020820190506133b1600083018461338d565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133ec816133b7565b81146133f757600080fd5b50565b600081359050613409816133e3565b92915050565b600060208284031215613425576134246132af565b5b6000613433848285016133fa565b91505092915050565b60008115159050919050565b6134518161343c565b82525050565b600060208201905061346c6000830184613448565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134c58261347c565b810181811067ffffffffffffffff821117156134e4576134e361348d565b5b80604052505050565b60006134f76132a5565b905061350382826134bc565b919050565b600067ffffffffffffffff8211156135235761352261348d565b5b61352c8261347c565b9050602081019050919050565b82818337600083830152505050565b600061355b61355684613508565b6134ed565b90508281526020810184848401111561357757613576613477565b5b613582848285613539565b509392505050565b600082601f83011261359f5761359e613472565b5b81356135af848260208601613548565b91505092915050565b6000602082840312156135ce576135cd6132af565b5b600082013567ffffffffffffffff8111156135ec576135eb6132b4565b5b6135f88482850161358a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561363b578082015181840152602081019050613620565b60008484015250505050565b600061365282613601565b61365c818561360c565b935061366c81856020860161361d565b6136758161347c565b840191505092915050565b6000602082019050818103600083015261369a8184613647565b905092915050565b6000602082840312156136b8576136b76132af565b5b60006136c684828501613338565b91505092915050565b6000806000606084860312156136e8576136e76132af565b5b60006136f686828701613302565b935050602061370786828701613338565b925050604061371886828701613338565b9150509250925092565b60008060408385031215613739576137386132af565b5b600061374785828601613338565b925050602061375885828601613338565b9150509250929050565b61376b816132d9565b82525050565b60006040820190506137866000830185613762565b613793602083018461338d565b9392505050565b600067ffffffffffffffff8211156137b5576137b461348d565b5b602082029050602081019050919050565b600080fd5b60006137de6137d98461379a565b6134ed565b90508083825260208201905060208402830185811115613801576138006137c6565b5b835b8181101561382a57806138168882613338565b845260208401935050602081019050613803565b5050509392505050565b600082601f83011261384957613848613472565b5b81356138598482602086016137cb565b91505092915050565b600067ffffffffffffffff82111561387d5761387c61348d565b5b6138868261347c565b9050602081019050919050565b60006138a66138a184613862565b6134ed565b9050828152602081018484840111156138c2576138c1613477565b5b6138cd848285613539565b509392505050565b600082601f8301126138ea576138e9613472565b5b81356138fa848260208601613893565b91505092915050565b600080600080600060a0868803121561391f5761391e6132af565b5b600061392d88828901613302565b955050602061393e88828901613302565b945050604086013567ffffffffffffffff81111561395f5761395e6132b4565b5b61396b88828901613834565b935050606086013567ffffffffffffffff81111561398c5761398b6132b4565b5b61399888828901613834565b925050608086013567ffffffffffffffff8111156139b9576139b86132b4565b5b6139c5888289016138d5565b9150509295509295909350565b6000819050919050565b60006139f76139f26139ed846132b9565b6139d2565b6132b9565b9050919050565b6000613a09826139dc565b9050919050565b6000613a1b826139fe565b9050919050565b613a2b81613a10565b82525050565b6000602082019050613a466000830184613a22565b92915050565b613a558161343c565b8114613a6057600080fd5b50565b600081359050613a7281613a4c565b92915050565b600060208284031215613a8e57613a8d6132af565b5b6000613a9c84828501613a63565b91505092915050565b600067ffffffffffffffff821115613ac057613abf61348d565b5b602082029050602081019050919050565b6000613ae4613adf84613aa5565b6134ed565b90508083825260208201905060208402830185811115613b0757613b066137c6565b5b835b81811015613b305780613b1c8882613302565b845260208401935050602081019050613b09565b5050509392505050565b600082601f830112613b4f57613b4e613472565b5b8135613b5f848260208601613ad1565b91505092915050565b60008060408385031215613b7f57613b7e6132af565b5b600083013567ffffffffffffffff811115613b9d57613b9c6132b4565b5b613ba985828601613b3a565b925050602083013567ffffffffffffffff811115613bca57613bc96132b4565b5b613bd685828601613834565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c1581613317565b82525050565b6000613c278383613c0c565b60208301905092915050565b6000602082019050919050565b6000613c4b82613be0565b613c558185613beb565b9350613c6083613bfc565b8060005b83811015613c91578151613c788882613c1b565b9750613c8383613c33565b925050600181019050613c64565b5085935050505092915050565b60006020820190508181036000830152613cb88184613c40565b905092915050565b600061ffff82169050919050565b613cd781613cc0565b8114613ce257600080fd5b50565b600081359050613cf481613cce565b92915050565b60008060408385031215613d1157613d106132af565b5b6000613d1f85828601613302565b9250506020613d3085828601613ce5565b9150509250929050565b6000602082019050613d4f6000830184613762565b92915050565b60008060408385031215613d6c57613d6b6132af565b5b6000613d7a85828601613302565b9250506020613d8b85828601613a63565b9150509250929050565b60008060408385031215613dac57613dab6132af565b5b6000613dba85828601613302565b9250506020613dcb85828601613302565b9150509250929050565b600080600080600060a08688031215613df157613df06132af565b5b6000613dff88828901613302565b9550506020613e1088828901613302565b9450506040613e2188828901613338565b9350506060613e3288828901613338565b925050608086013567ffffffffffffffff811115613e5357613e526132b4565b5b613e5f888289016138d5565b9150509295509295909350565b600060208284031215613e8257613e816132af565b5b6000613e9084828501613302565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613ef5602a8361360c565b9150613f0082613e99565b604082019050919050565b60006020820190508181036000830152613f2481613ee8565b9050919050565b7f54686520636f6e747261637420686173206265656e206c6f636b656420616e6460008201527f207468652042617365205552492063616e6e6f74206265206368616e67656400602082015250565b6000613f87603f8361360c565b9150613f9282613f2b565b604082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061400457607f821691505b60208210810361401757614016613fbd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261407f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614042565b6140898683614042565b95508019841693508086168417925050509392505050565b60006140bc6140b76140b284613317565b6139d2565b613317565b9050919050565b6000819050919050565b6140d6836140a1565b6140ea6140e2826140c3565b84845461404f565b825550505050565b600090565b6140ff6140f2565b61410a8184846140cd565b505050565b5b8181101561412e576141236000826140f7565b600181019050614110565b5050565b601f821115614173576141448161401d565b61414d84614032565b8101602085101561415c578190505b61417061416885614032565b83018261410f565b50505b505050565b600082821c905092915050565b600061419660001984600802614178565b1980831691505092915050565b60006141af8383614185565b9150826002028217905092915050565b6141c882613601565b67ffffffffffffffff8111156141e1576141e061348d565b5b6141eb8254613fec565b6141f6828285614132565b600060209050601f8311600181146142295760008415614217578287015190505b61422185826141a3565b865550614289565b601f1984166142378661401d565b60005b8281101561425f5784890151825560018201915060208501945060208101905061423a565b8683101561427c5784890151614278601f891682614185565b8355505b6001600288020188555050505b505050505050565b7f496e636f727265637420546f6b656e2054797065000000000000000000000000600082015250565b60006142c760148361360c565b91506142d282614291565b602082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b600081905092915050565b6000815461431581613fec565b61431f81866142fd565b9450600182166000811461433a576001811461434f57614382565b60ff1983168652811515820286019350614382565b6143588561401d565b60005b8381101561437a5781548189015260018201915060208101905061435b565b838801955050505b50505092915050565b600061439682613601565b6143a081856142fd565b93506143b081856020860161361d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006143f26005836142fd565b91506143fd826143bc565b600582019050919050565b60006144148285614308565b9150614420828461438b565b915061442b826143e5565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061447182613317565b915061447c83613317565b925082820190508082111561449457614493614437565b5b92915050565b7f4d696e743a204d617820737570706c7920726561636865640000000000000000600082015250565b60006144d060188361360c565b91506144db8261449a565b602082019050919050565b600060208201905081810360008301526144ff816144c3565b9050919050565b7f4d696e743a204d617820737570706c79207265616368656420666f722063686160008201527f7261637465722074797065000000000000000000000000000000000000000000602082015250565b6000614562602b8361360c565b915061456d82614506565b604082019050919050565b6000602082019050818103600083015261459181614555565b9050919050565b60006145a382613317565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145d5576145d4614437565b5b600182019050919050565b60006145eb82613317565b91506145f683613317565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561462f5761462e614437565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061467482613317565b915061467f83613317565b92508261468f5761468e61463a565b5b828204905092915050565b7f54726164696e67206973206e6f7420616c6c6f77656420756e74696c2072656c60008201527f6561736500000000000000000000000000000000000000000000000000000000602082015250565b60006146f660248361360c565b91506147018261469a565b604082019050919050565b60006020820190508181036000830152614725816146e9565b9050919050565b7f506c656173652075736520612074696d657374616d70204245464f524520656e60008201527f64206f6620323032342e00000000000000000000000000000000000000000000602082015250565b6000614788602a8361360c565b91506147938261472c565b604082019050919050565b600060208201905081810360008301526147b78161477b565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061481a60298361360c565b9150614825826147be565b604082019050919050565b600060208201905081810360008301526148498161480d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b60006148b560148361360c565b91506148c08261487f565b602082019050919050565b600060208201905081810360008301526148e4816148a8565b9050919050565b60006148f682613317565b915061490183613317565b925082820390508181111561491957614918614437565b5b92915050565b7f636f6e74726163744d657461646174612e6a736f6e0000000000000000000000600082015250565b60006149556015836142fd565b91506149608261491f565b601582019050919050565b60006149778284614308565b915061498282614948565b915081905092915050565b7f506c65617365207761697420666f72207075626c69632070757263686173652060008201527f746f206f70656e00000000000000000000000000000000000000000000000000602082015250565b60006149e960278361360c565b91506149f48261498d565b604082019050919050565b60006020820190508181036000830152614a18816149dc565b9050919050565b7f50757263686173653a20496e636f7272656374207061796d656e740000000000600082015250565b6000614a55601b8361360c565b9150614a6082614a1f565b602082019050919050565b60006020820190508181036000830152614a8481614a48565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ae760268361360c565b9150614af282614a8b565b604082019050919050565b60006020820190508181036000830152614b1681614ada565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b5360208361360c565b9150614b5e82614b1d565b602082019050919050565b60006020820190508181036000830152614b8281614b46565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614bbf60108361360c565b9150614bca82614b89565b602082019050919050565b60006020820190508181036000830152614bee81614bb2565b9050919050565b6000604082019050614c0a6000830185613762565b614c176020830184613762565b9392505050565b600081519050614c2d81613a4c565b92915050565b600060208284031215614c4957614c486132af565b5b6000614c5784828501614c1e565b91505092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614cbc602e8361360c565b9150614cc782614c60565b604082019050919050565b60006020820190508181036000830152614ceb81614caf565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614d28601f8361360c565b9150614d3382614cf2565b602082019050919050565b60006020820190508181036000830152614d5781614d1b565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614d94601d8361360c565b9150614d9f82614d5e565b602082019050919050565b60006020820190508181036000830152614dc381614d87565b9050919050565b600081905092915050565b50565b6000614de5600083614dca565b9150614df082614dd5565b600082019050919050565b6000614e0682614dd8565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614e6c603a8361360c565b9150614e7782614e10565b604082019050919050565b60006020820190508181036000830152614e9b81614e5f565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614efe602a8361360c565b9150614f0982614ea2565b604082019050919050565b60006020820190508181036000830152614f2d81614ef1565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614f6a60198361360c565b9150614f7582614f34565b602082019050919050565b60006020820190508181036000830152614f9981614f5d565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614ffc60238361360c565b915061500782614fa0565b604082019050919050565b6000602082019050818103600083015261502b81614fef565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061508e60248361360c565b915061509982615032565b604082019050919050565b600060208201905081810360008301526150bd81615081565b9050919050565b60006040820190506150d9600083018561338d565b6150e6602083018461338d565b9392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061514960218361360c565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006151db60288361360c565b91506151e68261517f565b604082019050919050565b6000602082019050818103600083015261520a816151ce565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061526d60258361360c565b915061527882615211565b604082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006152ff602a8361360c565b915061530a826152a3565b604082019050919050565b6000602082019050818103600083015261532e816152f2565b9050919050565b6000604082019050818103600083015261534f8185613c40565b905081810360208301526153638184613c40565b90509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006153a260148361360c565b91506153ad8261536c565b602082019050919050565b600060208201905081810360008301526153d181615395565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061543460298361360c565b915061543f826153d8565b604082019050919050565b6000602082019050818103600083015261546381615427565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006154918261546a565b61549b8185615475565b93506154ab81856020860161361d565b6154b48161347c565b840191505092915050565b600060a0820190506154d46000830188613762565b6154e16020830187613762565b6154ee604083018661338d565b6154fb606083018561338d565b818103608083015261550d8184615486565b90509695505050505050565b600081519050615528816133e3565b92915050565b600060208284031215615544576155436132af565b5b600061555284828501615519565b91505092915050565b60008160e01c9050919050565b600060033d11156155875760046000803e61558460005161555b565b90505b90565b600060443d106156175761559c6132a5565b60043d036004823e80513d602482011167ffffffffffffffff821117156155c4575050615617565b808201805167ffffffffffffffff8111156155e25750505050615617565b80602083010160043d0385018111156155ff575050505050615617565b61560e826020018501866134bc565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061567660348361360c565b91506156818261561a565b604082019050919050565b600060208201905081810360008301526156a581615669565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061570860288361360c565b9150615713826156ac565b604082019050919050565b60006020820190508181036000830152615737816156fb565b9050919050565b600060a0820190506157536000830188613762565b6157606020830187613762565b81810360408301526157728186613c40565b905081810360608301526157868185613c40565b9050818103608083015261579a8184615486565b9050969550505050505056fea26469706673582212203a88a2b17ed1f11b3123af8b66304781ba56362239291c4532d2acb54e6e437564736f6c6343000810003300000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000006774857f000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f7075626c69632d61636365737369626c65732e73332e616d617a6f6e6177732e636f6d2f70726f642f6d657461646174612f636f6e63657074732f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102035760003560e01c8063547ae6af11610118578063a2309ff8116100a0578063e8a3d4851161006f578063e8a3d4851461071d578063e985e9c514610748578063efef39a114610785578063f242432a146107a1578063f2fde38b146107ca57610203565b8063a2309ff814610661578063b390c0ab1461068c578063c002d23d146106b5578063d334026c146106e057610203565b8063753868e3116100e7578063753868e3146105a25780638456cb59146105b95780638da5cb5b146105d05780639baf797e146105fb578063a22cb4651461063857610203565b8063547ae6af1461050c5780635c975abb14610537578063715018a61461056257806372504a241461057957610203565b80632a55205a1161019b5780633f4ba83a1161016a5780633f4ba83a1461043b57806341f43434146104525780634c1dc4f71461047d5780634d91f9a6146104a65780634e1273f4146104cf57610203565b80632a55205a146103925780632eb2c2d6146103d0578063324cb3cb146103f95780633ccfd60b1461042457610203565b80630a3f013f116101d75780630a3f013f146102d65780630e89341c14610301578063156e29f61461033e57806318160ddd1461036757610203565b8062fdd58e1461020857806301ffc9a71461024557806302fe53051461028257806306fdde03146102ab575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a919061334d565b6107f3565b60405161023c919061339c565b60405180910390f35b34801561025157600080fd5b5061026c6004803603810190610267919061340f565b6108bb565b6040516102799190613457565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906135b8565b6108dd565b005b3480156102b757600080fd5b506102c0610985565b6040516102cd9190613680565b60405180910390f35b3480156102e257600080fd5b506102eb6109be565b6040516102f8919061339c565b60405180910390f35b34801561030d57600080fd5b50610328600480360381019061032391906136a2565b6109c4565b6040516103359190613680565b60405180910390f35b34801561034a57600080fd5b50610365600480360381019061036091906136cf565b610a48565b005b34801561037357600080fd5b5061037c610b1c565b604051610389919061339c565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190613722565b610b6b565b6040516103c7929190613771565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190613903565b610d55565b005b34801561040557600080fd5b5061040e610ded565b60405161041b9190613457565b60405180910390f35b34801561043057600080fd5b50610439610e00565b005b34801561044757600080fd5b50610450610e31565b005b34801561045e57600080fd5b50610467610e43565b6040516104749190613a31565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f91906136a2565b610e55565b005b3480156104b257600080fd5b506104cd60048036038101906104c89190613a78565b610ee5565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613b68565b610f41565b6040516105039190613c9e565b60405180910390f35b34801561051857600080fd5b5061052161105a565b60405161052e9190613457565b60405180910390f35b34801561054357600080fd5b5061054c61106d565b6040516105599190613457565b60405180910390f35b34801561056e57600080fd5b50610577611084565b005b34801561058557600080fd5b506105a0600480360381019061059b9190613cfa565b611098565b005b3480156105ae57600080fd5b506105b76110b2565b005b3480156105c557600080fd5b506105ce6110d7565b005b3480156105dc57600080fd5b506105e56110e9565b6040516105f29190613d3a565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d91906136a2565b611113565b60405161062f919061339c565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a9190613d55565b611130565b005b34801561066d57600080fd5b50610676611149565b604051610683919061339c565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190613722565b61119f565b005b3480156106c157600080fd5b506106ca611256565b6040516106d7919061339c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906136a2565b611261565b604051610714919061339c565b60405180910390f35b34801561072957600080fd5b50610732611284565b60405161073f9190613680565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613d95565b6112ac565b60405161077c9190613457565b60405180910390f35b61079f600480360381019061079a91906136a2565b611340565b005b3480156107ad57600080fd5b506107c860048036038101906107c39190613dd5565b6114a5565b005b3480156107d657600080fd5b506107f160048036038101906107ec9190613e6c565b61153d565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90613f0b565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006108c6826115c0565b806108d657506108d5826116a2565b5b9050919050565b6108e561171c565b60001515600960019054906101000a900460ff1615151461093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093290613f9d565b60405180910390fd5b806007908161094a91906141bf565b507f4405f9f72187d24d444b6d55ef67bfb2ef76aacbc07d6d642a5763dd5fd77cbf8160405161097a9190613680565b60405180910390a150565b6040518060400160405280602081526020017f536b7920436173746c6520436f6d70616e696f6e73202d20436f6e636570747381525081565b60085481565b6060600082101580156109d75750600882105b610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d906142dd565b60405180910390fd5b6007610a218361179a565b604051602001610a32929190614408565b6040516020818303038152906040529050919050565b610a5061171c565b610a58611868565b6101e081610a64611149565b610a6e9190614466565b1115610aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa6906144e6565b60405180910390fd5b6000610aba836118b2565b9050603c8282610aca9190614466565b1115610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614578565b60405180910390fd5b610b16848484611925565b50505050565b6000806000905060005b6008811015610b6357600b60008281526020019081526020016000205482610b4e9190614466565b91508080610b5b90614598565b915050610b26565b508091505090565b6000806000600460008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d005760036040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610d0a611981565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d3691906145e0565b610d409190614669565b90508160000151819350935050509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d9357610d923361198b565b5b600854421015610dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcf9061470c565b60405180910390fd5b610de58686868686611a88565b505050505050565b600960019054906101000a900460ff1681565b610e0861171c565b610e10611b29565b6000479050610e26610e206110e9565b82611b78565b50610e2f611c6c565b565b610e3961171c565b610e41611c76565b565b6daaeb6d7670e522a718067333cd4e81565b610e5d61171c565b636774857f811115610ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9b9061479e565b60405180910390fd5b806008819055507f6a85bd2d6aec41897887c591fe2ae93b08af4b810170c011fc1c6c85e678931981604051610eda919061339c565b60405180910390a150565b610eed61171c565b80600960006101000a81548160ff0219169083151502179055507f5cdd0d749205cd4104cd27579286af3e05b3dab9e3388d52353ec467b764e0cd81604051610f369190613457565b60405180910390a150565b60608151835114610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e90614830565b60405180910390fd5b6000835167ffffffffffffffff811115610fa457610fa361348d565b5b604051908082528060200260200182016040528015610fd25781602001602082028036833780820191505090505b50905060005b845181101561104f5761101f858281518110610ff757610ff6614850565b5b602002602001015185838151811061101257611011614850565b5b60200260200101516107f3565b82828151811061103257611031614850565b5b6020026020010181815250508061104890614598565b9050610fd8565b508091505092915050565b600960009054906101000a900460ff1681565b6000600560149054906101000a900460ff16905090565b61108c61171c565b6110966000611cd9565b565b6110a061171c565b6110ae828261ffff16611d9f565b5050565b6110ba61171c565b6001600960016101000a81548160ff021916908315150217905550565b6110df61171c565b6110e7611f34565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c6000838152602001908152602001600020549050919050565b8161113a8161198b565b6111448383611f97565b505050565b6000806000905060005b600881101561119757611177600a6000838152602001908152602001600020611fad565b826111829190614466565b9150808061118f90614598565b915050611153565b508091505090565b6111a7611868565b806111b233846107f3565b10156111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea906148cb565b60405180910390fd5b6111fe338383611fbb565b80600c600084815260200190815260200160002060008282546112219190614466565b9250508190555080600b6000848152602001908152602001600020600082825461124b91906148eb565b925050819055505050565b66038d7ea4c6800081565b60008061126d836118b2565b905080603c61127c91906148eb565b915050919050565b60606007604051602001611298919061496b565b604051602081830303815290604052905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611348611868565b600960009054906101000a900460ff16611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138e906149ff565b60405180910390fd5b66038d7ea4c6800034146113e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d790614a6b565b60405180910390fd5b6101e060016113ed611149565b6113f79190614466565b1115611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f906144e6565b60405180910390fd5b6000611443826118b2565b9050603c6001826114549190614466565b1115611495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148c90614578565b60405180910390fd5b6114a133836001611925565b5050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114e3576114e23361198b565b5b600854421015611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f9061470c565b60405180910390fd5b6115358686868686612201565b505050505050565b61154561171c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614afd565b60405180910390fd5b6115bd81611cd9565b50565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061168b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061169b575061169a826122a2565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117155750611714826115c0565b5b9050919050565b61172461230c565b73ffffffffffffffffffffffffffffffffffffffff166117426110e9565b73ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614b69565b60405180910390fd5b565b6060600060016117a984612314565b01905060008167ffffffffffffffff8111156117c8576117c761348d565b5b6040519080825280601f01601f1916602001820160405280156117fa5781602001600182028036833780820191505090505b509050600082602001820190505b60011561185d578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816118515761185061463a565b5b04945060008503611808575b819350505050919050565b61187061106d565b156118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a790614bd5565b60405180910390fd5b565b60008082101580156118c45750600882105b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa906142dd565b60405180910390fd5b61191e600a6000848152602001908152602001600020611fad565b9050919050565b61192d611868565b61194883838360405180602001604052806000815250612467565b6119528282612617565b80600b600084815260200190815260200160002060008282546119759190614466565b92505081905550505050565b6000612710905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a85576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a02929190614bf5565b602060405180830381865afa158015611a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a439190614c33565b611a8457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a7b9190613d3a565b60405180910390fd5b5b50565b611a9061230c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ad65750611ad585611ad061230c565b6112ac565b5b611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c90614cd2565b60405180910390fd5b611b2285858585856126a5565b5050505050565b600260065403611b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6590614d3e565b60405180910390fd5b6002600681905550565b80471015611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614daa565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611be190614dfb565b60006040518083038185875af1925050503d8060008114611c1e576040519150601f19603f3d011682016040523d82523d6000602084013e611c23565b606091505b5050905080611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614e82565b60405180910390fd5b505050565b6001600681905550565b611c7e6129c6565b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611cc261230c565b604051611ccf9190613d3a565b60405180910390a1565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611da7611981565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc90614f14565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6b90614f80565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600360008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611f3c611868565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f8061230c565b604051611f8d9190613d3a565b60405180910390a1565b611fa9611fa261230c565b8383612a0f565b5050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361202a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202190615012565b60405180910390fd5b600061203461230c565b9050600061204184612b7b565b9050600061204e84612b7b565b905061206e83876000858560405180602001604052806000815250612bf5565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc906150a4565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516121d29291906150c4565b60405180910390a46121f884886000868660405180602001604052806000815250612c13565b50505050505050565b61220961230c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061224f575061224e8561224961230c565b6112ac565b5b61228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228590614cd2565b60405180910390fd5b61229b8585858585612c1b565b5050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612372577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816123685761236761463a565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106123af576d04ee2d6d415b85acef810000000083816123a5576123a461463a565b5b0492506020810190505b662386f26fc1000083106123de57662386f26fc1000083816123d4576123d361463a565b5b0492506010810190505b6305f5e1008310612407576305f5e10083816123fd576123fc61463a565b5b0492506008810190505b612710831061242c5761271083816124225761242161463a565b5b0492506004810190505b6064831061244f57606483816124455761244461463a565b5b0492506002810190505b600a831061245e576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cd9061515f565b60405180910390fd5b60006124e061230c565b905060006124ed85612b7b565b905060006124fa85612b7b565b905061250b83600089858589612bf5565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256a9190614466565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516125e89291906150c4565b60405180910390a46125ff83600089858589612c13565b61260e83600089898989612eb6565b50505050505050565b600082101580156126285750600882105b612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e906142dd565b60405180910390fd5b60005b818110156126a05761268d600a600085815260200190815260200160002061308d565b808061269890614598565b91505061266a565b505050565b81518351146126e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e0906151f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274f90615283565b60405180910390fd5b600061276261230c565b9050612772818787878787612bf5565b60005b845181101561292357600085828151811061279357612792614850565b5b6020026020010151905060008583815181106127b2576127b1614850565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90615315565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129089190614466565b925050819055505050508061291c90614598565b9050612775565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161299a929190615335565b60405180910390a46129b0818787878787612c13565b6129be8187878787876130a3565b505050505050565b6129ce61106d565b612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a04906153b8565b60405180910390fd5b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a749061544a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b6e9190613457565b60405180910390a3505050565b60606000600167ffffffffffffffff811115612b9a57612b9961348d565b5b604051908082528060200260200182016040528015612bc85781602001602082028036833780820191505090505b5090508281600081518110612be057612bdf614850565b5b60200260200101818152505080915050919050565b612bfd611868565b612c0b86868686868661327a565b505050505050565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8190615283565b60405180910390fd5b6000612c9461230c565b90506000612ca185612b7b565b90506000612cae85612b7b565b9050612cbe838989858589612bf5565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4c90615315565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e0a9190614466565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612e879291906150c4565b60405180910390a4612e9d848a8a86868a612c13565b612eab848a8a8a8a8a612eb6565b505050505050505050565b612ed58473ffffffffffffffffffffffffffffffffffffffff16613282565b15613085578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612f1b9594939291906154bf565b6020604051808303816000875af1925050508015612f5757506040513d601f19601f82011682018060405250810190612f54919061552e565b60015b612ffc57612f63615568565b806308c379a003612fbf5750612f7761558a565b80612f825750612fc1565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb69190613680565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff39061568c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a9061571e565b60405180910390fd5b505b505050505050565b6001816000016000828254019250508190555050565b6130c28473ffffffffffffffffffffffffffffffffffffffff16613282565b15613272578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161310895949392919061573e565b6020604051808303816000875af192505050801561314457506040513d601f19601f82011682018060405250810190613141919061552e565b60015b6131e957613150615568565b806308c379a0036131ac575061316461558a565b8061316f57506131ae565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a39190613680565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e09061568c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132679061571e565b60405180910390fd5b505b505050505050565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132e4826132b9565b9050919050565b6132f4816132d9565b81146132ff57600080fd5b50565b600081359050613311816132eb565b92915050565b6000819050919050565b61332a81613317565b811461333557600080fd5b50565b60008135905061334781613321565b92915050565b60008060408385031215613364576133636132af565b5b600061337285828601613302565b925050602061338385828601613338565b9150509250929050565b61339681613317565b82525050565b60006020820190506133b1600083018461338d565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133ec816133b7565b81146133f757600080fd5b50565b600081359050613409816133e3565b92915050565b600060208284031215613425576134246132af565b5b6000613433848285016133fa565b91505092915050565b60008115159050919050565b6134518161343c565b82525050565b600060208201905061346c6000830184613448565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134c58261347c565b810181811067ffffffffffffffff821117156134e4576134e361348d565b5b80604052505050565b60006134f76132a5565b905061350382826134bc565b919050565b600067ffffffffffffffff8211156135235761352261348d565b5b61352c8261347c565b9050602081019050919050565b82818337600083830152505050565b600061355b61355684613508565b6134ed565b90508281526020810184848401111561357757613576613477565b5b613582848285613539565b509392505050565b600082601f83011261359f5761359e613472565b5b81356135af848260208601613548565b91505092915050565b6000602082840312156135ce576135cd6132af565b5b600082013567ffffffffffffffff8111156135ec576135eb6132b4565b5b6135f88482850161358a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561363b578082015181840152602081019050613620565b60008484015250505050565b600061365282613601565b61365c818561360c565b935061366c81856020860161361d565b6136758161347c565b840191505092915050565b6000602082019050818103600083015261369a8184613647565b905092915050565b6000602082840312156136b8576136b76132af565b5b60006136c684828501613338565b91505092915050565b6000806000606084860312156136e8576136e76132af565b5b60006136f686828701613302565b935050602061370786828701613338565b925050604061371886828701613338565b9150509250925092565b60008060408385031215613739576137386132af565b5b600061374785828601613338565b925050602061375885828601613338565b9150509250929050565b61376b816132d9565b82525050565b60006040820190506137866000830185613762565b613793602083018461338d565b9392505050565b600067ffffffffffffffff8211156137b5576137b461348d565b5b602082029050602081019050919050565b600080fd5b60006137de6137d98461379a565b6134ed565b90508083825260208201905060208402830185811115613801576138006137c6565b5b835b8181101561382a57806138168882613338565b845260208401935050602081019050613803565b5050509392505050565b600082601f83011261384957613848613472565b5b81356138598482602086016137cb565b91505092915050565b600067ffffffffffffffff82111561387d5761387c61348d565b5b6138868261347c565b9050602081019050919050565b60006138a66138a184613862565b6134ed565b9050828152602081018484840111156138c2576138c1613477565b5b6138cd848285613539565b509392505050565b600082601f8301126138ea576138e9613472565b5b81356138fa848260208601613893565b91505092915050565b600080600080600060a0868803121561391f5761391e6132af565b5b600061392d88828901613302565b955050602061393e88828901613302565b945050604086013567ffffffffffffffff81111561395f5761395e6132b4565b5b61396b88828901613834565b935050606086013567ffffffffffffffff81111561398c5761398b6132b4565b5b61399888828901613834565b925050608086013567ffffffffffffffff8111156139b9576139b86132b4565b5b6139c5888289016138d5565b9150509295509295909350565b6000819050919050565b60006139f76139f26139ed846132b9565b6139d2565b6132b9565b9050919050565b6000613a09826139dc565b9050919050565b6000613a1b826139fe565b9050919050565b613a2b81613a10565b82525050565b6000602082019050613a466000830184613a22565b92915050565b613a558161343c565b8114613a6057600080fd5b50565b600081359050613a7281613a4c565b92915050565b600060208284031215613a8e57613a8d6132af565b5b6000613a9c84828501613a63565b91505092915050565b600067ffffffffffffffff821115613ac057613abf61348d565b5b602082029050602081019050919050565b6000613ae4613adf84613aa5565b6134ed565b90508083825260208201905060208402830185811115613b0757613b066137c6565b5b835b81811015613b305780613b1c8882613302565b845260208401935050602081019050613b09565b5050509392505050565b600082601f830112613b4f57613b4e613472565b5b8135613b5f848260208601613ad1565b91505092915050565b60008060408385031215613b7f57613b7e6132af565b5b600083013567ffffffffffffffff811115613b9d57613b9c6132b4565b5b613ba985828601613b3a565b925050602083013567ffffffffffffffff811115613bca57613bc96132b4565b5b613bd685828601613834565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613c1581613317565b82525050565b6000613c278383613c0c565b60208301905092915050565b6000602082019050919050565b6000613c4b82613be0565b613c558185613beb565b9350613c6083613bfc565b8060005b83811015613c91578151613c788882613c1b565b9750613c8383613c33565b925050600181019050613c64565b5085935050505092915050565b60006020820190508181036000830152613cb88184613c40565b905092915050565b600061ffff82169050919050565b613cd781613cc0565b8114613ce257600080fd5b50565b600081359050613cf481613cce565b92915050565b60008060408385031215613d1157613d106132af565b5b6000613d1f85828601613302565b9250506020613d3085828601613ce5565b9150509250929050565b6000602082019050613d4f6000830184613762565b92915050565b60008060408385031215613d6c57613d6b6132af565b5b6000613d7a85828601613302565b9250506020613d8b85828601613a63565b9150509250929050565b60008060408385031215613dac57613dab6132af565b5b6000613dba85828601613302565b9250506020613dcb85828601613302565b9150509250929050565b600080600080600060a08688031215613df157613df06132af565b5b6000613dff88828901613302565b9550506020613e1088828901613302565b9450506040613e2188828901613338565b9350506060613e3288828901613338565b925050608086013567ffffffffffffffff811115613e5357613e526132b4565b5b613e5f888289016138d5565b9150509295509295909350565b600060208284031215613e8257613e816132af565b5b6000613e9084828501613302565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613ef5602a8361360c565b9150613f0082613e99565b604082019050919050565b60006020820190508181036000830152613f2481613ee8565b9050919050565b7f54686520636f6e747261637420686173206265656e206c6f636b656420616e6460008201527f207468652042617365205552492063616e6e6f74206265206368616e67656400602082015250565b6000613f87603f8361360c565b9150613f9282613f2b565b604082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061400457607f821691505b60208210810361401757614016613fbd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261407f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614042565b6140898683614042565b95508019841693508086168417925050509392505050565b60006140bc6140b76140b284613317565b6139d2565b613317565b9050919050565b6000819050919050565b6140d6836140a1565b6140ea6140e2826140c3565b84845461404f565b825550505050565b600090565b6140ff6140f2565b61410a8184846140cd565b505050565b5b8181101561412e576141236000826140f7565b600181019050614110565b5050565b601f821115614173576141448161401d565b61414d84614032565b8101602085101561415c578190505b61417061416885614032565b83018261410f565b50505b505050565b600082821c905092915050565b600061419660001984600802614178565b1980831691505092915050565b60006141af8383614185565b9150826002028217905092915050565b6141c882613601565b67ffffffffffffffff8111156141e1576141e061348d565b5b6141eb8254613fec565b6141f6828285614132565b600060209050601f8311600181146142295760008415614217578287015190505b61422185826141a3565b865550614289565b601f1984166142378661401d565b60005b8281101561425f5784890151825560018201915060208501945060208101905061423a565b8683101561427c5784890151614278601f891682614185565b8355505b6001600288020188555050505b505050505050565b7f496e636f727265637420546f6b656e2054797065000000000000000000000000600082015250565b60006142c760148361360c565b91506142d282614291565b602082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b600081905092915050565b6000815461431581613fec565b61431f81866142fd565b9450600182166000811461433a576001811461434f57614382565b60ff1983168652811515820286019350614382565b6143588561401d565b60005b8381101561437a5781548189015260018201915060208101905061435b565b838801955050505b50505092915050565b600061439682613601565b6143a081856142fd565b93506143b081856020860161361d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006143f26005836142fd565b91506143fd826143bc565b600582019050919050565b60006144148285614308565b9150614420828461438b565b915061442b826143e5565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061447182613317565b915061447c83613317565b925082820190508082111561449457614493614437565b5b92915050565b7f4d696e743a204d617820737570706c7920726561636865640000000000000000600082015250565b60006144d060188361360c565b91506144db8261449a565b602082019050919050565b600060208201905081810360008301526144ff816144c3565b9050919050565b7f4d696e743a204d617820737570706c79207265616368656420666f722063686160008201527f7261637465722074797065000000000000000000000000000000000000000000602082015250565b6000614562602b8361360c565b915061456d82614506565b604082019050919050565b6000602082019050818103600083015261459181614555565b9050919050565b60006145a382613317565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145d5576145d4614437565b5b600182019050919050565b60006145eb82613317565b91506145f683613317565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561462f5761462e614437565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061467482613317565b915061467f83613317565b92508261468f5761468e61463a565b5b828204905092915050565b7f54726164696e67206973206e6f7420616c6c6f77656420756e74696c2072656c60008201527f6561736500000000000000000000000000000000000000000000000000000000602082015250565b60006146f660248361360c565b91506147018261469a565b604082019050919050565b60006020820190508181036000830152614725816146e9565b9050919050565b7f506c656173652075736520612074696d657374616d70204245464f524520656e60008201527f64206f6620323032342e00000000000000000000000000000000000000000000602082015250565b6000614788602a8361360c565b91506147938261472c565b604082019050919050565b600060208201905081810360008301526147b78161477b565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061481a60298361360c565b9150614825826147be565b604082019050919050565b600060208201905081810360008301526148498161480d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b60006148b560148361360c565b91506148c08261487f565b602082019050919050565b600060208201905081810360008301526148e4816148a8565b9050919050565b60006148f682613317565b915061490183613317565b925082820390508181111561491957614918614437565b5b92915050565b7f636f6e74726163744d657461646174612e6a736f6e0000000000000000000000600082015250565b60006149556015836142fd565b91506149608261491f565b601582019050919050565b60006149778284614308565b915061498282614948565b915081905092915050565b7f506c65617365207761697420666f72207075626c69632070757263686173652060008201527f746f206f70656e00000000000000000000000000000000000000000000000000602082015250565b60006149e960278361360c565b91506149f48261498d565b604082019050919050565b60006020820190508181036000830152614a18816149dc565b9050919050565b7f50757263686173653a20496e636f7272656374207061796d656e740000000000600082015250565b6000614a55601b8361360c565b9150614a6082614a1f565b602082019050919050565b60006020820190508181036000830152614a8481614a48565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ae760268361360c565b9150614af282614a8b565b604082019050919050565b60006020820190508181036000830152614b1681614ada565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614b5360208361360c565b9150614b5e82614b1d565b602082019050919050565b60006020820190508181036000830152614b8281614b46565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614bbf60108361360c565b9150614bca82614b89565b602082019050919050565b60006020820190508181036000830152614bee81614bb2565b9050919050565b6000604082019050614c0a6000830185613762565b614c176020830184613762565b9392505050565b600081519050614c2d81613a4c565b92915050565b600060208284031215614c4957614c486132af565b5b6000614c5784828501614c1e565b91505092915050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b6000614cbc602e8361360c565b9150614cc782614c60565b604082019050919050565b60006020820190508181036000830152614ceb81614caf565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614d28601f8361360c565b9150614d3382614cf2565b602082019050919050565b60006020820190508181036000830152614d5781614d1b565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614d94601d8361360c565b9150614d9f82614d5e565b602082019050919050565b60006020820190508181036000830152614dc381614d87565b9050919050565b600081905092915050565b50565b6000614de5600083614dca565b9150614df082614dd5565b600082019050919050565b6000614e0682614dd8565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614e6c603a8361360c565b9150614e7782614e10565b604082019050919050565b60006020820190508181036000830152614e9b81614e5f565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614efe602a8361360c565b9150614f0982614ea2565b604082019050919050565b60006020820190508181036000830152614f2d81614ef1565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614f6a60198361360c565b9150614f7582614f34565b602082019050919050565b60006020820190508181036000830152614f9981614f5d565b9050919050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614ffc60238361360c565b915061500782614fa0565b604082019050919050565b6000602082019050818103600083015261502b81614fef565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061508e60248361360c565b915061509982615032565b604082019050919050565b600060208201905081810360008301526150bd81615081565b9050919050565b60006040820190506150d9600083018561338d565b6150e6602083018461338d565b9392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061514960218361360c565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006151db60288361360c565b91506151e68261517f565b604082019050919050565b6000602082019050818103600083015261520a816151ce565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061526d60258361360c565b915061527882615211565b604082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006152ff602a8361360c565b915061530a826152a3565b604082019050919050565b6000602082019050818103600083015261532e816152f2565b9050919050565b6000604082019050818103600083015261534f8185613c40565b905081810360208301526153638184613c40565b90509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b60006153a260148361360c565b91506153ad8261536c565b602082019050919050565b600060208201905081810360008301526153d181615395565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061543460298361360c565b915061543f826153d8565b604082019050919050565b6000602082019050818103600083015261546381615427565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006154918261546a565b61549b8185615475565b93506154ab81856020860161361d565b6154b48161347c565b840191505092915050565b600060a0820190506154d46000830188613762565b6154e16020830187613762565b6154ee604083018661338d565b6154fb606083018561338d565b818103608083015261550d8184615486565b90509695505050505050565b600081519050615528816133e3565b92915050565b600060208284031215615544576155436132af565b5b600061555284828501615519565b91505092915050565b60008160e01c9050919050565b600060033d11156155875760046000803e61558460005161555b565b90505b90565b600060443d106156175761559c6132a5565b60043d036004823e80513d602482011167ffffffffffffffff821117156155c4575050615617565b808201805167ffffffffffffffff8111156155e25750505050615617565b80602083010160043d0385018111156155ff575050505050615617565b61560e826020018501866134bc565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061567660348361360c565b91506156818261561a565b604082019050919050565b600060208201905081810360008301526156a581615669565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b600061570860288361360c565b9150615713826156ac565b604082019050919050565b60006020820190508181036000830152615737816156fb565b9050919050565b600060a0820190506157536000830188613762565b6157606020830187613762565b81810360408301526157728186613c40565b905081810360608301526157868185613c40565b9050818103608083015261579a8184615486565b9050969550505050505056fea26469706673582212203a88a2b17ed1f11b3123af8b66304781ba56362239291c4532d2acb54e6e437564736f6c63430008100033

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

00000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000006774857f000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f7075626c69632d61636365737369626c65732e73332e616d617a6f6e6177732e636f6d2f70726f642f6d657461646174612f636f6e63657074732f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _royaltyFeesInBasisPoints (uint16): 1000
Arg [1] : _contractURI (string): https://public-accessibles.s3.amazonaws.com/prod/metadata/concepts/
Arg [2] : _releaseTimestamp (uint256): 1735689599

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 000000000000000000000000000000000000000000000000000000006774857f
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [4] : 68747470733a2f2f7075626c69632d61636365737369626c65732e73332e616d
Arg [5] : 617a6f6e6177732e636f6d2f70726f642f6d657461646174612f636f6e636570
Arg [6] : 74732f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

81537:14443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32481:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91547:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86778:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81688:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82176:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92058:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85653:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93495:305;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10879:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;91156:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82348:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88813:170;;;;;;;;;;;;;:::i;:::-;;89510:65;;;;;;;;;;;;;:::i;:::-;;77660:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87304:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87845:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32877:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82263:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7200:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2877:103;;;;;;;;;;;;;:::i;:::-;;89864:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89175:81;;;;;;;;;;;;;:::i;:::-;;89346:61;;;;;;;;;;;;;:::i;:::-;;2236:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88194:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90229:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93046:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86323:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81759:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88500:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92680:217;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33676:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84715:611;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90658:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3135:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32481:230;32567:7;32614:1;32595:21;;:7;:21;;;32587:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32681:9;:13;32691:2;32681:13;;;;;;;;;;;:22;32695:7;32681:22;;;;;;;;;;;;;;;;32674:29;;32481:230;;;;:::o;91547:215::-;91650:4;91674:38;91700:11;91674:25;:38::i;:::-;:80;;;;91716:38;91742:11;91716:25;:38::i;:::-;91674:80;91667:87;;91547:215;;;:::o;86778:244::-;2122:13;:11;:13::i;:::-;86878:5:::1;86860:23;;:14;;;;;;;;;;;:23;;;86852:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;86972:7;86962;:17;;;;;;:::i;:::-;;86995:19;87006:7;86995:19;;;;;;:::i;:::-;;;;;;;;86778:244:::0;:::o;81688:64::-;;;;;;;;;;;;;;;;;;;:::o;82176:31::-;;;;:::o;92058:371::-;92119:13;92171:1;92159:8;:13;;:58;;;;;81979:1;92176:8;:41;92159:58;92151:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;92317:7;92343:26;92360:8;92343:16;:26::i;:::-;92282:128;;;;;;;;;:::i;:::-;;;;;;;;;;;;;92253:168;;92058:371;;;:::o;85653:438::-;2122:13;:11;:13::i;:::-;6805:19:::1;:17;:19::i;:::-;81852:3:::2;85792:6;85776:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;85768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;85852:25;85880:31;85903:7;85880:22;:31::i;:::-;85852:59;;81912:2;85951:6;85931:17;:26;;;;:::i;:::-;85930:55;;85922:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;86046:37;86056:9;86067:7;86076:6;86046:9;:37::i;:::-;85757:334;85653:438:::0;;;:::o;93495:305::-;93547:7;93572:19;93594:1;93572:23;;93651:9;93646:118;81979:1;93666;:34;93646:118;;;93737:12;:15;93750:1;93737:15;;;;;;;;;;;;93722:30;;;;;:::i;:::-;;;93702:3;;;;;:::i;:::-;;;;93646:118;;;;93781:11;93774:18;;;93495:305;:::o;10879:438::-;10974:7;10983;11003:26;11032:17;:26;11050:7;11032:26;;;;;;;;;;;11003:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11103:1;11075:30;;:7;:16;;;:30;;;11071:92;;11132:19;11122:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11071:92;11175:21;11239:17;:15;:17::i;:::-;11199:57;;11212:7;:23;;;11200:35;;:9;:35;;;;:::i;:::-;11199:57;;;;:::i;:::-;11175:81;;11277:7;:16;;;11295:13;11269:40;;;;;;10879:438;;;;;:::o;91156:319::-;91376:4;79176:10;79168:18;;:4;:18;;;79164:83;;79203:32;79224:10;79203:20;:32::i;:::-;79164:83;83310:16:::1;;83291:15;:35;;83283:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;91410:57:::2;91438:4;91444:2;91448:3;91453:7;91462:4;91410:27;:57::i;:::-;91156:319:::0;;;;;;:::o;82348:34::-;;;;;;;;;;;;;:::o;88813:170::-;2122:13;:11;:13::i;:::-;67533:21:::1;:19;:21::i;:::-;88881:15:::2;88899:21;88881:39;;88931:44;88957:7;:5;:7::i;:::-;88967;88931:17;:44::i;:::-;88870:113;67577:20:::1;:18;:20::i;:::-;88813:170::o:0;89510:65::-;2122:13;:11;:13::i;:::-;89557:10:::1;:8;:10::i;:::-;89510:65::o:0;77660:143::-;70060:42;77660:143;:::o;87304:273::-;2122:13;:11;:13::i;:::-;82068:10:::1;87394:13;:38;;87386:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;87509:13;87490:16;:32;;;;87538:31;87555:13;87538:31;;;;;;:::i;:::-;;;;;;;;87304:273:::0;:::o;87845:216::-;2122:13;:11;:13::i;:::-;87968:23:::1;87943:22;;:48;;;;;;;;;;;;;;;;;;88007:46;88029:23;88007:46;;;;;;:::i;:::-;;;;;;;;87845:216:::0;:::o;32877:499::-;33013:16;33069:3;:10;33050:8;:15;:29;33042:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;33138:30;33185:8;:15;33171:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33138:63;;33219:9;33214:122;33238:8;:15;33234:1;:19;33214:122;;;33294:30;33304:8;33313:1;33304:11;;;;;;;;:::i;:::-;;;;;;;;33317:3;33321:1;33317:6;;;;;;;;:::i;:::-;;;;;;;;33294:9;:30::i;:::-;33275:13;33289:1;33275:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;33255:3;;;;:::i;:::-;;;33214:122;;;;33355:13;33348:20;;;32877:499;;;;:::o;82263:34::-;;;;;;;;;;;;;:::o;7200:86::-;7247:4;7271:7;;;;;;;;;;;7264:14;;7200:86;:::o;2877:103::-;2122:13;:11;:13::i;:::-;2942:30:::1;2969:1;2942:18;:30::i;:::-;2877:103::o:0;89864:174::-;2122:13;:11;:13::i;:::-;89974:56:::1;89993:9;90004:25;89974:56;;:18;:56::i;:::-;89864:174:::0;;:::o;89175:81::-;2122:13;:11;:13::i;:::-;89244:4:::1;89227:14;;:21;;;;;;;;;;;;;;;;;;89175:81::o:0;89346:61::-;2122:13;:11;:13::i;:::-;89391:8:::1;:6;:8::i;:::-;89346:61::o:0;2236:87::-;2282:7;2309:6;;;;;;;;;;;2302:13;;2236:87;:::o;88194:140::-;88271:7;88298:18;:28;88317:8;88298:28;;;;;;;;;;;;88291:35;;88194:140;;;:::o;90229:176::-;90333:8;79442:30;79463:8;79442:20;:30::i;:::-;90354:43:::1;90378:8;90388;90354:23;:43::i;:::-;90229:176:::0;;;:::o;93046:323::-;93098:7;93123:21;93147:1;93123:25;;93204:9;93199:132;81979:1;93219;:34;93199:132;;;93293:25;:12;:15;93306:1;93293:15;;;;;;;;;;;:23;:25::i;:::-;93275:44;;;;;:::i;:::-;;;93255:3;;;;;:::i;:::-;;;;93199:132;;;;93348:13;93341:20;;;93046:323;:::o;86323:307::-;6805:19;:17;:19::i;:::-;86449:7:::1;86414:31;86424:10;86436:8;86414:9;:31::i;:::-;:42;;86406:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;86492:36;86498:10;86510:8;86520:7;86492:5;:36::i;:::-;86571:7;86539:18;:28;86558:8;86539:28;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;86615:7;86589:12;:22;86602:8;86589:22;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;86323:307:::0;;:::o;81759:48::-;81796:11;81759:48;:::o;88500:236::-;88586:7;88606:25;88634:32;88657:8;88634:22;:32::i;:::-;88606:60;;88710:17;81912:2;88685:42;;;;:::i;:::-;88677:51;;;88500:236;;;:::o;92680:217::-;92724:13;92814:7;92779:99;;;;;;;;:::i;:::-;;;;;;;;;;;;;92750:139;;92680:217;:::o;33676:168::-;33775:4;33799:18;:27;33818:7;33799:27;;;;;;;;;;;;;;;:37;33827:8;33799:37;;;;;;;;;;;;;;;;;;;;;;;;;33792:44;;33676:168;;;;:::o;84715:611::-;6805:19;:17;:19::i;:::-;83561:22:::1;;;;;;;;;;;83553:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;81796:11:::2;84887:9;:23;84879:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;81852:3;84977:1;84961:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;84953:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;85068:25;85096:31;85119:7;85096:22;:31::i;:::-;85068:59;;81912:2;85198:1;85178:17;:21;;;;:::i;:::-;85177:49;;85169:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;85285:33;85295:10;85307:7;85316:1;85285:9;:33::i;:::-;84815:511;84715:611:::0;:::o;90658:303::-;90859:4;79176:10;79168:18;;:4;:18;;;79164:83;;79203:32;79224:10;79203:20;:32::i;:::-;79164:83;83310:16:::1;;83291:15;:35;;83283:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;90898:55:::2;90921:4;90927:2;90931:7;90940:6;90948:4;90898:22;:55::i;:::-;90658:303:::0;;;;;;:::o;3135:201::-;2122:13;:11;:13::i;:::-;3244:1:::1;3224:22;;:8;:22;;::::0;3216:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3300:28;3319:8;3300:18;:28::i;:::-;3135:201:::0;:::o;31504:310::-;31606:4;31658:26;31643:41;;;:11;:41;;;;:110;;;;31716:37;31701:52;;;:11;:52;;;;31643:110;:163;;;;31770:36;31794:11;31770:23;:36::i;:::-;31643:163;31623:183;;31504:310;;;:::o;10609:215::-;10711:4;10750:26;10735:41;;;:11;:41;;;;:81;;;;10780:36;10804:11;10780:23;:36::i;:::-;10735:81;10728:88;;10609:215;;;:::o;2401:132::-;2476:12;:10;:12::i;:::-;2465:23;;:7;:5;:7::i;:::-;:23;;;2457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2401:132::o;62778:716::-;62834:13;62885:14;62922:1;62902:17;62913:5;62902:10;:17::i;:::-;:21;62885:38;;62938:20;62972:6;62961:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62938:41;;62994:11;63123:6;63119:2;63115:15;63107:6;63103:28;63096:35;;63160:288;63167:4;63160:288;;;63192:5;;;;;;;;63334:8;63329:2;63322:5;63318:14;63313:30;63308:3;63300:44;63390:2;63381:11;;;;;;:::i;:::-;;;;;63424:1;63415:5;:10;63160:288;63411:21;63160:288;63469:6;63462:13;;;;;62778:716;;;:::o;7359:108::-;7430:8;:6;:8::i;:::-;7429:9;7421:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;7359:108::o;95732:245::-;95803:7;95848:1;95836:8;:13;;:58;;;;;81979:1;95853:8;:41;95836:58;95828:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;95937:32;:12;:22;95950:8;95937:22;;;;;;;;;;;:30;:32::i;:::-;95930:39;;95732:245;;;:::o;94648:290::-;6805:19;:17;:19::i;:::-;94753:33:::1;94759:3;94764:8;94774:7;94753:33;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;94839:47;94868:8;94878:7;94839:28;:47::i;:::-;94923:7;94897:12;:22;94910:8;94897:22;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;94648:290:::0;;;:::o;11599:97::-;11657:6;11683:5;11676:12;;11599:97;:::o;79585:647::-;79824:1;70060:42;79776:45;;;:49;79772:453;;;70060:42;80075;;;80126:4;80133:8;80075:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80070:144;;80189:8;80170:28;;;;;;;;;;;:::i;:::-;;;;;;;;80070:144;79772:453;79585:647;:::o;34399:438::-;34640:12;:10;:12::i;:::-;34632:20;;:4;:20;;;:60;;;;34656:36;34673:4;34679:12;:10;:12::i;:::-;34656:16;:36::i;:::-;34632:60;34610:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;34777:52;34800:4;34806:2;34810:3;34815:7;34824:4;34777:22;:52::i;:::-;34399:438;;;;;:::o;67613:293::-;67015:1;67747:7;;:19;67739:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;67015:1;67880:7;:18;;;;67613:293::o;23506:317::-;23621:6;23596:21;:31;;23588:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23675:12;23693:9;:14;;23715:6;23693:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23674:52;;;23745:7;23737:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;23577:246;23506:317;;:::o;67914:213::-;66971:1;68097:7;:22;;;;67914:213::o;8055:120::-;7064:16;:14;:16::i;:::-;8124:5:::1;8114:7;;:15;;;;;;;;;;;;;;;;;;8145:22;8154:12;:10;:12::i;:::-;8145:22;;;;;;:::i;:::-;;;;;;;;8055:120::o:0;3496:191::-;3570:16;3589:6;;;;;;;;;;;3570:25;;3615:8;3606:6;;:17;;;;;;;;;;;;;;;;;;3670:8;3639:40;;3660:8;3639:40;;;;;;;;;;;;3559:128;3496:191;:::o;11967:332::-;12086:17;:15;:17::i;:::-;12070:33;;:12;:33;;;;12062:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;12189:1;12169:22;;:8;:22;;;12161:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;12256:35;;;;;;;;12268:8;12256:35;;;;;;12278:12;12256:35;;;;;12234:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11967:332;;:::o;7796:118::-;6805:19;:17;:19::i;:::-;7866:4:::1;7856:7;;:14;;;;;;;;;;;;;;;;;;7886:20;7893:12;:10;:12::i;:::-;7886:20;;;;;;:::i;:::-;;;;;;;;7796:118::o:0;33449:155::-;33544:52;33563:12;:10;:12::i;:::-;33577:8;33587;33544:18;:52::i;:::-;33449:155;;:::o;69308:114::-;69373:7;69400;:14;;;69393:21;;69308:114;;;:::o;41297:774::-;41406:1;41390:18;;:4;:18;;;41382:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41461:16;41480:12;:10;:12::i;:::-;41461:31;;41503:20;41526:21;41544:2;41526:17;:21::i;:::-;41503:44;;41558:24;41585:25;41603:6;41585:17;:25::i;:::-;41558:52;;41623:66;41644:8;41654:4;41668:1;41672:3;41677:7;41623:66;;;;;;;;;;;;:20;:66::i;:::-;41702:19;41724:9;:13;41734:2;41724:13;;;;;;;;;;;:19;41738:4;41724:19;;;;;;;;;;;;;;;;41702:41;;41777:6;41762:11;:21;;41754:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41896:6;41882:11;:20;41860:9;:13;41870:2;41860:13;;;;;;;;;;;:19;41874:4;41860:19;;;;;;;;;;;;;;;:42;;;;41970:1;41931:54;;41956:4;41931:54;;41946:8;41931:54;;;41974:2;41978:6;41931:54;;;;;;;:::i;:::-;;;;;;;;41998:65;42018:8;42028:4;42042:1;42046:3;42051:7;41998:65;;;;;;;;;;;;:19;:65::i;:::-;41371:700;;;;41297:774;;;:::o;33916:406::-;34132:12;:10;:12::i;:::-;34124:20;;:4;:20;;;:60;;;;34148:36;34165:4;34171:12;:10;:12::i;:::-;34148:16;:36::i;:::-;34124:60;34102:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;34269:45;34287:4;34293:2;34297;34301:6;34309:4;34269:17;:45::i;:::-;33916:406;;;;;:::o;9053:157::-;9138:4;9177:25;9162:40;;;:11;:40;;;;9155:47;;9053:157;;;:::o;781:98::-;834:7;861:10;854:17;;781:98;:::o;58259:948::-;58312:7;58332:14;58349:1;58332:18;;58399:8;58390:5;:17;58386:106;;58437:8;58428:17;;;;;;:::i;:::-;;;;;58474:2;58464:12;;;;58386:106;58519:8;58510:5;:17;58506:106;;58557:8;58548:17;;;;;;:::i;:::-;;;;;58594:2;58584:12;;;;58506:106;58639:8;58630:5;:17;58626:106;;58677:8;58668:17;;;;;;:::i;:::-;;;;;58714:2;58704:12;;;;58626:106;58759:7;58750:5;:16;58746:103;;58796:7;58787:16;;;;;;:::i;:::-;;;;;58832:1;58822:11;;;;58746:103;58876:7;58867:5;:16;58863:103;;58913:7;58904:16;;;;;;:::i;:::-;;;;;58949:1;58939:11;;;;58863:103;58993:7;58984:5;:16;58980:103;;59030:7;59021:16;;;;;;:::i;:::-;;;;;59066:1;59056:11;;;;58980:103;59110:7;59101:5;:16;59097:68;;59148:1;59138:11;;;;59097:68;59193:6;59186:13;;;58259:948;;;:::o;39097:686::-;39221:1;39207:16;;:2;:16;;;39199:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;39274:16;39293:12;:10;:12::i;:::-;39274:31;;39316:20;39339:21;39357:2;39339:17;:21::i;:::-;39316:44;;39371:24;39398:25;39416:6;39398:17;:25::i;:::-;39371:52;;39436:66;39457:8;39475:1;39479:2;39483:3;39488:7;39497:4;39436:20;:66::i;:::-;39536:6;39515:9;:13;39525:2;39515:13;;;;;;;;;;;:17;39529:2;39515:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;39595:2;39558:52;;39591:1;39558:52;;39573:8;39558:52;;;39599:2;39603:6;39558:52;;;;;;;:::i;:::-;;;;;;;;39623:65;39643:8;39661:1;39665:2;39669:3;39674:7;39683:4;39623:19;:65::i;:::-;39701:74;39732:8;39750:1;39754:2;39758;39762:6;39770:4;39701:30;:74::i;:::-;39188:595;;;39097:686;;;;:::o;95226:305::-;95343:1;95331:8;:13;;:58;;;;;81979:1;95348:8;:41;95331:58;95323:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;95430:9;95425:99;95449:7;95445:1;:11;95425:99;;;95478:34;:12;:22;95491:8;95478:22;;;;;;;;;;;:32;:34::i;:::-;95458:3;;;;;:::i;:::-;;;;95425:99;;;;95226:305;;:::o;36633:1146::-;36860:7;:14;36846:3;:10;:28;36838:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36952:1;36938:16;;:2;:16;;;36930:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37009:16;37028:12;:10;:12::i;:::-;37009:31;;37053:60;37074:8;37084:4;37090:2;37094:3;37099:7;37108:4;37053:20;:60::i;:::-;37131:9;37126:421;37150:3;:10;37146:1;:14;37126:421;;;37182:10;37195:3;37199:1;37195:6;;;;;;;;:::i;:::-;;;;;;;;37182:19;;37216:14;37233:7;37241:1;37233:10;;;;;;;;:::i;:::-;;;;;;;;37216:27;;37260:19;37282:9;:13;37292:2;37282:13;;;;;;;;;;;:19;37296:4;37282:19;;;;;;;;;;;;;;;;37260:41;;37339:6;37324:11;:21;;37316:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37472:6;37458:11;:20;37436:9;:13;37446:2;37436:13;;;;;;;;;;;:19;37450:4;37436:19;;;;;;;;;;;;;;;:42;;;;37529:6;37508:9;:13;37518:2;37508:13;;;;;;;;;;;:17;37522:2;37508:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;37167:380;;;37162:3;;;;:::i;:::-;;;37126:421;;;;37594:2;37564:47;;37588:4;37564:47;;37578:8;37564:47;;;37598:3;37603:7;37564:47;;;;;;;:::i;:::-;;;;;;;;37624:59;37644:8;37654:4;37660:2;37664:3;37669:7;37678:4;37624:19;:59::i;:::-;37696:75;37732:8;37742:4;37748:2;37752:3;37757:7;37766:4;37696:35;:75::i;:::-;36827:952;36633:1146;;;;;:::o;7544:108::-;7611:8;:6;:8::i;:::-;7603:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;7544:108::o;43399:297::-;43520:8;43511:17;;:5;:17;;;43503:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43623:8;43585:18;:25;43604:5;43585:25;;;;;;;;;;;;;;;:35;43611:8;43585:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43669:8;43647:41;;43662:5;43647:41;;;43679:8;43647:41;;;;;;:::i;:::-;;;;;;;;43399:297;;;:::o;47631:198::-;47697:16;47726:22;47765:1;47751:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47726:41;;47789:7;47778:5;47784:1;47778:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;47816:5;47809:12;;;47631:198;;;:::o;94060:299::-;6805:19;:17;:19::i;:::-;94285:66:::1;94312:8;94322:4;94328:2;94332:3;94337:7;94346:4;94285:26;:66::i;:::-;94060:299:::0;;;;;;:::o;45830:220::-;;;;;;;:::o;35301:974::-;35503:1;35489:16;;:2;:16;;;35481:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35560:16;35579:12;:10;:12::i;:::-;35560:31;;35602:20;35625:21;35643:2;35625:17;:21::i;:::-;35602:44;;35657:24;35684:25;35702:6;35684:17;:25::i;:::-;35657:52;;35722:60;35743:8;35753:4;35759:2;35763:3;35768:7;35777:4;35722:20;:60::i;:::-;35795:19;35817:9;:13;35827:2;35817:13;;;;;;;;;;;:19;35831:4;35817:19;;;;;;;;;;;;;;;;35795:41;;35870:6;35855:11;:21;;35847:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35995:6;35981:11;:20;35959:9;:13;35969:2;35959:13;;;;;;;;;;;:19;35973:4;35959:19;;;;;;;;;;;;;;;:42;;;;36044:6;36023:9;:13;36033:2;36023:13;;;;;;;;;;;:17;36037:2;36023:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;36099:2;36068:46;;36093:4;36068:46;;36083:8;36068:46;;;36103:2;36107:6;36068:46;;;;;;;:::i;:::-;;;;;;;;36127:59;36147:8;36157:4;36163:2;36167:3;36172:7;36181:4;36127:19;:59::i;:::-;36199:68;36230:8;36240:4;36246:2;36250;36254:6;36262:4;36199:30;:68::i;:::-;35470:805;;;;35301:974;;;;;:::o;46058:744::-;46273:15;:2;:13;;;:15::i;:::-;46269:526;;;46326:2;46309:38;;;46348:8;46358:4;46364:2;46368:6;46376:4;46309:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46305:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;46657:6;46650:14;;;;;;;;;;;:::i;:::-;;;;;;;;46305:479;;;46706:62;;;;;;;;;;:::i;:::-;;;;;;;;46305:479;46443:43;;;46431:55;;;:8;:55;;;;46427:154;;46511:50;;;;;;;;;;:::i;:::-;;;;;;;;46427:154;46382:214;46269:526;46058:744;;;;;;:::o;69430:127::-;69537:1;69519:7;:14;;;:19;;;;;;;;;;;69430:127;:::o;46810:813::-;47050:15;:2;:13;;;:15::i;:::-;47046:570;;;47103:2;47086:43;;;47130:8;47140:4;47146:3;47151:7;47160:4;47086:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47082:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;47478:6;47471:14;;;;;;;;;;;:::i;:::-;;;;;;;;47082:523;;;47527:62;;;;;;;;;;:::i;:::-;;;;;;;;47082:523;47259:48;;;47247:60;;;:8;:60;;;;47243:159;;47332:50;;;;;;;;;;:::i;:::-;;;;;;;;47243:159;47166:251;47046:570;46810:813;;;;;;:::o;44654:221::-;;;;;;;:::o;22247:326::-;22307:4;22564:1;22542:7;:19;;;:23;22535:30;;22247:326;;;:::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:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:619::-;7593:6;7601;7609;7658:2;7646:9;7637:7;7633:23;7629:32;7626:119;;;7664:79;;:::i;:::-;7626:119;7784:1;7809:53;7854:7;7845:6;7834:9;7830:22;7809:53;:::i;:::-;7799:63;;7755:117;7911:2;7937:53;7982:7;7973:6;7962:9;7958:22;7937:53;:::i;:::-;7927:63;;7882:118;8039:2;8065:53;8110:7;8101:6;8090:9;8086:22;8065:53;:::i;:::-;8055:63;;8010:118;7516:619;;;;;:::o;8141:474::-;8209:6;8217;8266:2;8254:9;8245:7;8241:23;8237:32;8234:119;;;8272:79;;:::i;:::-;8234:119;8392:1;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8363:117;8519:2;8545:53;8590:7;8581:6;8570:9;8566:22;8545:53;:::i;:::-;8535:63;;8490:118;8141:474;;;;;:::o;8621:118::-;8708:24;8726:5;8708:24;:::i;:::-;8703:3;8696:37;8621:118;;:::o;8745:332::-;8866:4;8904:2;8893:9;8889:18;8881:26;;8917:71;8985:1;8974:9;8970:17;8961:6;8917:71;:::i;:::-;8998:72;9066:2;9055:9;9051:18;9042:6;8998:72;:::i;:::-;8745:332;;;;;:::o;9083:311::-;9160:4;9250:18;9242:6;9239:30;9236:56;;;9272:18;;:::i;:::-;9236:56;9322:4;9314:6;9310:17;9302:25;;9382:4;9376;9372:15;9364:23;;9083:311;;;:::o;9400:117::-;9509:1;9506;9499:12;9540:710;9636:5;9661:81;9677:64;9734:6;9677:64;:::i;:::-;9661:81;:::i;:::-;9652:90;;9762:5;9791:6;9784:5;9777:21;9825:4;9818:5;9814:16;9807:23;;9878:4;9870:6;9866:17;9858:6;9854:30;9907:3;9899:6;9896:15;9893:122;;;9926:79;;:::i;:::-;9893:122;10041:6;10024:220;10058:6;10053:3;10050:15;10024:220;;;10133:3;10162:37;10195:3;10183:10;10162:37;:::i;:::-;10157:3;10150:50;10229:4;10224:3;10220:14;10213:21;;10100:144;10084:4;10079:3;10075:14;10068:21;;10024:220;;;10028:21;9642:608;;9540:710;;;;;:::o;10273:370::-;10344:5;10393:3;10386:4;10378:6;10374:17;10370:27;10360:122;;10401:79;;:::i;:::-;10360:122;10518:6;10505:20;10543:94;10633:3;10625:6;10618:4;10610:6;10606:17;10543:94;:::i;:::-;10534:103;;10350:293;10273:370;;;;:::o;10649:307::-;10710:4;10800:18;10792:6;10789:30;10786:56;;;10822:18;;:::i;:::-;10786:56;10860:29;10882:6;10860:29;:::i;:::-;10852:37;;10944:4;10938;10934:15;10926:23;;10649:307;;;:::o;10962:423::-;11039:5;11064:65;11080:48;11121:6;11080:48;:::i;:::-;11064:65;:::i;:::-;11055:74;;11152:6;11145:5;11138:21;11190:4;11183:5;11179:16;11228:3;11219:6;11214:3;11210:16;11207:25;11204:112;;;11235:79;;:::i;:::-;11204:112;11325:54;11372:6;11367:3;11362;11325:54;:::i;:::-;11045:340;10962:423;;;;;:::o;11404:338::-;11459:5;11508:3;11501:4;11493:6;11489:17;11485:27;11475:122;;11516:79;;:::i;:::-;11475:122;11633:6;11620:20;11658:78;11732:3;11724:6;11717:4;11709:6;11705:17;11658:78;:::i;:::-;11649:87;;11465:277;11404:338;;;;:::o;11748:1509::-;11902:6;11910;11918;11926;11934;11983:3;11971:9;11962:7;11958:23;11954:33;11951:120;;;11990:79;;:::i;:::-;11951:120;12110:1;12135:53;12180:7;12171:6;12160:9;12156:22;12135:53;:::i;:::-;12125:63;;12081:117;12237:2;12263:53;12308:7;12299:6;12288:9;12284:22;12263:53;:::i;:::-;12253:63;;12208:118;12393:2;12382:9;12378:18;12365:32;12424:18;12416:6;12413:30;12410:117;;;12446:79;;:::i;:::-;12410:117;12551:78;12621:7;12612:6;12601:9;12597:22;12551:78;:::i;:::-;12541:88;;12336:303;12706:2;12695:9;12691:18;12678:32;12737:18;12729:6;12726:30;12723:117;;;12759:79;;:::i;:::-;12723:117;12864:78;12934:7;12925:6;12914:9;12910:22;12864:78;:::i;:::-;12854:88;;12649:303;13019:3;13008:9;13004:19;12991:33;13051:18;13043:6;13040:30;13037:117;;;13073:79;;:::i;:::-;13037:117;13178:62;13232:7;13223:6;13212:9;13208:22;13178:62;:::i;:::-;13168:72;;12962:288;11748:1509;;;;;;;;:::o;13263:60::-;13291:3;13312:5;13305:12;;13263:60;;;:::o;13329:142::-;13379:9;13412:53;13430:34;13439:24;13457:5;13439:24;:::i;:::-;13430:34;:::i;:::-;13412:53;:::i;:::-;13399:66;;13329:142;;;:::o;13477:126::-;13527:9;13560:37;13591:5;13560:37;:::i;:::-;13547:50;;13477:126;;;:::o;13609:158::-;13691:9;13724:37;13755:5;13724:37;:::i;:::-;13711:50;;13609:158;;;:::o;13773:195::-;13892:69;13955:5;13892:69;:::i;:::-;13887:3;13880:82;13773:195;;:::o;13974:286::-;14099:4;14137:2;14126:9;14122:18;14114:26;;14150:103;14250:1;14239:9;14235:17;14226:6;14150:103;:::i;:::-;13974:286;;;;:::o;14266:116::-;14336:21;14351:5;14336:21;:::i;:::-;14329:5;14326:32;14316:60;;14372:1;14369;14362:12;14316:60;14266:116;:::o;14388:133::-;14431:5;14469:6;14456:20;14447:29;;14485:30;14509:5;14485:30;:::i;:::-;14388:133;;;;:::o;14527:323::-;14583:6;14632:2;14620:9;14611:7;14607:23;14603:32;14600:119;;;14638:79;;:::i;:::-;14600:119;14758:1;14783:50;14825:7;14816:6;14805:9;14801:22;14783:50;:::i;:::-;14773:60;;14729:114;14527:323;;;;:::o;14856:311::-;14933:4;15023:18;15015:6;15012:30;15009:56;;;15045:18;;:::i;:::-;15009:56;15095:4;15087:6;15083:17;15075:25;;15155:4;15149;15145:15;15137:23;;14856:311;;;:::o;15190:710::-;15286:5;15311:81;15327:64;15384:6;15327:64;:::i;:::-;15311:81;:::i;:::-;15302:90;;15412:5;15441:6;15434:5;15427:21;15475:4;15468:5;15464:16;15457:23;;15528:4;15520:6;15516:17;15508:6;15504:30;15557:3;15549:6;15546:15;15543:122;;;15576:79;;:::i;:::-;15543:122;15691:6;15674:220;15708:6;15703:3;15700:15;15674:220;;;15783:3;15812:37;15845:3;15833:10;15812:37;:::i;:::-;15807:3;15800:50;15879:4;15874:3;15870:14;15863:21;;15750:144;15734:4;15729:3;15725:14;15718:21;;15674:220;;;15678:21;15292:608;;15190:710;;;;;:::o;15923:370::-;15994:5;16043:3;16036:4;16028:6;16024:17;16020:27;16010:122;;16051:79;;:::i;:::-;16010:122;16168:6;16155:20;16193:94;16283:3;16275:6;16268:4;16260:6;16256:17;16193:94;:::i;:::-;16184:103;;16000:293;15923:370;;;;:::o;16299:894::-;16417:6;16425;16474:2;16462:9;16453:7;16449:23;16445:32;16442:119;;;16480:79;;:::i;:::-;16442:119;16628:1;16617:9;16613:17;16600:31;16658:18;16650:6;16647:30;16644:117;;;16680:79;;:::i;:::-;16644:117;16785:78;16855:7;16846:6;16835:9;16831:22;16785:78;:::i;:::-;16775:88;;16571:302;16940:2;16929:9;16925:18;16912:32;16971:18;16963:6;16960:30;16957:117;;;16993:79;;:::i;:::-;16957:117;17098:78;17168:7;17159:6;17148:9;17144:22;17098:78;:::i;:::-;17088:88;;16883:303;16299:894;;;;;:::o;17199:114::-;17266:6;17300:5;17294:12;17284:22;;17199:114;;;:::o;17319:184::-;17418:11;17452:6;17447:3;17440:19;17492:4;17487:3;17483:14;17468:29;;17319:184;;;;:::o;17509:132::-;17576:4;17599:3;17591:11;;17629:4;17624:3;17620:14;17612:22;;17509:132;;;:::o;17647:108::-;17724:24;17742:5;17724:24;:::i;:::-;17719:3;17712:37;17647:108;;:::o;17761:179::-;17830:10;17851:46;17893:3;17885:6;17851:46;:::i;:::-;17929:4;17924:3;17920:14;17906:28;;17761:179;;;;:::o;17946:113::-;18016:4;18048;18043:3;18039:14;18031:22;;17946:113;;;:::o;18095:732::-;18214:3;18243:54;18291:5;18243:54;:::i;:::-;18313:86;18392:6;18387:3;18313:86;:::i;:::-;18306:93;;18423:56;18473:5;18423:56;:::i;:::-;18502:7;18533:1;18518:284;18543:6;18540:1;18537:13;18518:284;;;18619:6;18613:13;18646:63;18705:3;18690:13;18646:63;:::i;:::-;18639:70;;18732:60;18785:6;18732:60;:::i;:::-;18722:70;;18578:224;18565:1;18562;18558:9;18553:14;;18518:284;;;18522:14;18818:3;18811:10;;18219:608;;;18095:732;;;;:::o;18833:373::-;18976:4;19014:2;19003:9;18999:18;18991:26;;19063:9;19057:4;19053:20;19049:1;19038:9;19034:17;19027:47;19091:108;19194:4;19185:6;19091:108;:::i;:::-;19083:116;;18833:373;;;;:::o;19212:89::-;19248:7;19288:6;19281:5;19277:18;19266:29;;19212:89;;;:::o;19307:120::-;19379:23;19396:5;19379:23;:::i;:::-;19372:5;19369:34;19359:62;;19417:1;19414;19407:12;19359:62;19307:120;:::o;19433:137::-;19478:5;19516:6;19503:20;19494:29;;19532:32;19558:5;19532:32;:::i;:::-;19433:137;;;;:::o;19576:472::-;19643:6;19651;19700:2;19688:9;19679:7;19675:23;19671:32;19668:119;;;19706:79;;:::i;:::-;19668:119;19826:1;19851:53;19896:7;19887:6;19876:9;19872:22;19851:53;:::i;:::-;19841:63;;19797:117;19953:2;19979:52;20023:7;20014:6;20003:9;19999:22;19979:52;:::i;:::-;19969:62;;19924:117;19576:472;;;;;:::o;20054:222::-;20147:4;20185:2;20174:9;20170:18;20162:26;;20198:71;20266:1;20255:9;20251:17;20242:6;20198:71;:::i;:::-;20054:222;;;;:::o;20282:468::-;20347:6;20355;20404:2;20392:9;20383:7;20379:23;20375:32;20372:119;;;20410:79;;:::i;:::-;20372:119;20530:1;20555:53;20600:7;20591:6;20580:9;20576:22;20555:53;:::i;:::-;20545:63;;20501:117;20657:2;20683:50;20725:7;20716:6;20705:9;20701:22;20683:50;:::i;:::-;20673:60;;20628:115;20282:468;;;;;:::o;20756:474::-;20824:6;20832;20881:2;20869:9;20860:7;20856:23;20852:32;20849:119;;;20887:79;;:::i;:::-;20849:119;21007:1;21032:53;21077:7;21068:6;21057:9;21053:22;21032:53;:::i;:::-;21022:63;;20978:117;21134:2;21160:53;21205:7;21196:6;21185:9;21181:22;21160:53;:::i;:::-;21150:63;;21105:118;20756:474;;;;;:::o;21236:1089::-;21340:6;21348;21356;21364;21372;21421:3;21409:9;21400:7;21396:23;21392:33;21389:120;;;21428:79;;:::i;:::-;21389:120;21548:1;21573:53;21618:7;21609:6;21598:9;21594:22;21573:53;:::i;:::-;21563:63;;21519:117;21675:2;21701:53;21746:7;21737:6;21726:9;21722:22;21701:53;:::i;:::-;21691:63;;21646:118;21803:2;21829:53;21874:7;21865:6;21854:9;21850:22;21829:53;:::i;:::-;21819:63;;21774:118;21931:2;21957:53;22002:7;21993:6;21982:9;21978:22;21957:53;:::i;:::-;21947:63;;21902:118;22087:3;22076:9;22072:19;22059:33;22119:18;22111:6;22108:30;22105:117;;;22141:79;;:::i;:::-;22105:117;22246:62;22300:7;22291:6;22280:9;22276:22;22246:62;:::i;:::-;22236:72;;22030:288;21236:1089;;;;;;;;:::o;22331:329::-;22390:6;22439:2;22427:9;22418:7;22414:23;22410:32;22407:119;;;22445:79;;:::i;:::-;22407:119;22565:1;22590:53;22635:7;22626:6;22615:9;22611:22;22590:53;:::i;:::-;22580:63;;22536:117;22331:329;;;;:::o;22666:229::-;22806:34;22802:1;22794:6;22790:14;22783:58;22875:12;22870:2;22862:6;22858:15;22851:37;22666:229;:::o;22901:366::-;23043:3;23064:67;23128:2;23123:3;23064:67;:::i;:::-;23057:74;;23140:93;23229:3;23140:93;:::i;:::-;23258:2;23253:3;23249:12;23242:19;;22901:366;;;:::o;23273:419::-;23439:4;23477:2;23466:9;23462:18;23454:26;;23526:9;23520:4;23516:20;23512:1;23501:9;23497:17;23490:47;23554:131;23680:4;23554:131;:::i;:::-;23546:139;;23273:419;;;:::o;23698:250::-;23838:34;23834:1;23826:6;23822:14;23815:58;23907:33;23902:2;23894:6;23890:15;23883:58;23698:250;:::o;23954:366::-;24096:3;24117:67;24181:2;24176:3;24117:67;:::i;:::-;24110:74;;24193:93;24282:3;24193:93;:::i;:::-;24311:2;24306:3;24302:12;24295:19;;23954:366;;;:::o;24326:419::-;24492:4;24530:2;24519:9;24515:18;24507:26;;24579:9;24573:4;24569:20;24565:1;24554:9;24550:17;24543:47;24607:131;24733:4;24607:131;:::i;:::-;24599:139;;24326:419;;;:::o;24751:180::-;24799:77;24796:1;24789:88;24896:4;24893:1;24886:15;24920:4;24917:1;24910:15;24937:320;24981:6;25018:1;25012:4;25008:12;24998:22;;25065:1;25059:4;25055:12;25086:18;25076:81;;25142:4;25134:6;25130:17;25120:27;;25076:81;25204:2;25196:6;25193:14;25173:18;25170:38;25167:84;;25223:18;;:::i;:::-;25167:84;24988:269;24937:320;;;:::o;25263:141::-;25312:4;25335:3;25327:11;;25358:3;25355:1;25348:14;25392:4;25389:1;25379:18;25371:26;;25263:141;;;:::o;25410:93::-;25447:6;25494:2;25489;25482:5;25478:14;25474:23;25464:33;;25410:93;;;:::o;25509:107::-;25553:8;25603:5;25597:4;25593:16;25572:37;;25509:107;;;;:::o;25622:393::-;25691:6;25741:1;25729:10;25725:18;25764:97;25794:66;25783:9;25764:97;:::i;:::-;25882:39;25912:8;25901:9;25882:39;:::i;:::-;25870:51;;25954:4;25950:9;25943:5;25939:21;25930:30;;26003:4;25993:8;25989:19;25982:5;25979:30;25969:40;;25698:317;;25622:393;;;;;:::o;26021:142::-;26071:9;26104:53;26122:34;26131:24;26149:5;26131:24;:::i;:::-;26122:34;:::i;:::-;26104:53;:::i;:::-;26091:66;;26021:142;;;:::o;26169:75::-;26212:3;26233:5;26226:12;;26169:75;;;:::o;26250:269::-;26360:39;26391:7;26360:39;:::i;:::-;26421:91;26470:41;26494:16;26470:41;:::i;:::-;26462:6;26455:4;26449:11;26421:91;:::i;:::-;26415:4;26408:105;26326:193;26250:269;;;:::o;26525:73::-;26570:3;26525:73;:::o;26604:189::-;26681:32;;:::i;:::-;26722:65;26780:6;26772;26766:4;26722:65;:::i;:::-;26657:136;26604:189;;:::o;26799:186::-;26859:120;26876:3;26869:5;26866:14;26859:120;;;26930:39;26967:1;26960:5;26930:39;:::i;:::-;26903:1;26896:5;26892:13;26883:22;;26859:120;;;26799:186;;:::o;26991:543::-;27092:2;27087:3;27084:11;27081:446;;;27126:38;27158:5;27126:38;:::i;:::-;27210:29;27228:10;27210:29;:::i;:::-;27200:8;27196:44;27393:2;27381:10;27378:18;27375:49;;;27414:8;27399:23;;27375:49;27437:80;27493:22;27511:3;27493:22;:::i;:::-;27483:8;27479:37;27466:11;27437:80;:::i;:::-;27096:431;;27081:446;26991:543;;;:::o;27540:117::-;27594:8;27644:5;27638:4;27634:16;27613:37;;27540:117;;;;:::o;27663:169::-;27707:6;27740:51;27788:1;27784:6;27776:5;27773:1;27769:13;27740:51;:::i;:::-;27736:56;27821:4;27815;27811:15;27801:25;;27714:118;27663:169;;;;:::o;27837:295::-;27913:4;28059:29;28084:3;28078:4;28059:29;:::i;:::-;28051:37;;28121:3;28118:1;28114:11;28108:4;28105:21;28097:29;;27837:295;;;;:::o;28137:1395::-;28254:37;28287:3;28254:37;:::i;:::-;28356:18;28348:6;28345:30;28342:56;;;28378:18;;:::i;:::-;28342:56;28422:38;28454:4;28448:11;28422:38;:::i;:::-;28507:67;28567:6;28559;28553:4;28507:67;:::i;:::-;28601:1;28625:4;28612:17;;28657:2;28649:6;28646:14;28674:1;28669:618;;;;29331:1;29348:6;29345:77;;;29397:9;29392:3;29388:19;29382:26;29373:35;;29345:77;29448:67;29508:6;29501:5;29448:67;:::i;:::-;29442:4;29435:81;29304:222;28639:887;;28669:618;28721:4;28717:9;28709:6;28705:22;28755:37;28787:4;28755:37;:::i;:::-;28814:1;28828:208;28842:7;28839:1;28836:14;28828:208;;;28921:9;28916:3;28912:19;28906:26;28898:6;28891:42;28972:1;28964:6;28960:14;28950:24;;29019:2;29008:9;29004:18;28991:31;;28865:4;28862:1;28858:12;28853:17;;28828:208;;;29064:6;29055:7;29052:19;29049:179;;;29122:9;29117:3;29113:19;29107:26;29165:48;29207:4;29199:6;29195:17;29184:9;29165:48;:::i;:::-;29157:6;29150:64;29072:156;29049:179;29274:1;29270;29262:6;29258:14;29254:22;29248:4;29241:36;28676:611;;;28639:887;;28229:1303;;;28137:1395;;:::o;29538:170::-;29678:22;29674:1;29666:6;29662:14;29655:46;29538:170;:::o;29714:366::-;29856:3;29877:67;29941:2;29936:3;29877:67;:::i;:::-;29870:74;;29953:93;30042:3;29953:93;:::i;:::-;30071:2;30066:3;30062:12;30055:19;;29714:366;;;:::o;30086:419::-;30252:4;30290:2;30279:9;30275:18;30267:26;;30339:9;30333:4;30329:20;30325:1;30314:9;30310:17;30303:47;30367:131;30493:4;30367:131;:::i;:::-;30359:139;;30086:419;;;:::o;30511:148::-;30613:11;30650:3;30635:18;;30511:148;;;;:::o;30689:874::-;30792:3;30829:5;30823:12;30858:36;30884:9;30858:36;:::i;:::-;30910:89;30992:6;30987:3;30910:89;:::i;:::-;30903:96;;31030:1;31019:9;31015:17;31046:1;31041:166;;;;31221:1;31216:341;;;;31008:549;;31041:166;31125:4;31121:9;31110;31106:25;31101:3;31094:38;31187:6;31180:14;31173:22;31165:6;31161:35;31156:3;31152:45;31145:52;;31041:166;;31216:341;31283:38;31315:5;31283:38;:::i;:::-;31343:1;31357:154;31371:6;31368:1;31365:13;31357:154;;;31445:7;31439:14;31435:1;31430:3;31426:11;31419:35;31495:1;31486:7;31482:15;31471:26;;31393:4;31390:1;31386:12;31381:17;;31357:154;;;31540:6;31535:3;31531:16;31524:23;;31223:334;;31008:549;;30796:767;;30689:874;;;;:::o;31569:390::-;31675:3;31703:39;31736:5;31703:39;:::i;:::-;31758:89;31840:6;31835:3;31758:89;:::i;:::-;31751:96;;31856:65;31914:6;31909:3;31902:4;31895:5;31891:16;31856:65;:::i;:::-;31946:6;31941:3;31937:16;31930:23;;31679:280;31569:390;;;;:::o;31965:155::-;32105:7;32101:1;32093:6;32089:14;32082:31;31965:155;:::o;32126:400::-;32286:3;32307:84;32389:1;32384:3;32307:84;:::i;:::-;32300:91;;32400:93;32489:3;32400:93;:::i;:::-;32518:1;32513:3;32509:11;32502:18;;32126:400;;;:::o;32532:695::-;32810:3;32832:92;32920:3;32911:6;32832:92;:::i;:::-;32825:99;;32941:95;33032:3;33023:6;32941:95;:::i;:::-;32934:102;;33053:148;33197:3;33053:148;:::i;:::-;33046:155;;33218:3;33211:10;;32532:695;;;;;:::o;33233:180::-;33281:77;33278:1;33271:88;33378:4;33375:1;33368:15;33402:4;33399:1;33392:15;33419:191;33459:3;33478:20;33496:1;33478:20;:::i;:::-;33473:25;;33512:20;33530:1;33512:20;:::i;:::-;33507:25;;33555:1;33552;33548:9;33541:16;;33576:3;33573:1;33570:10;33567:36;;;33583:18;;:::i;:::-;33567:36;33419:191;;;;:::o;33616:174::-;33756:26;33752:1;33744:6;33740:14;33733:50;33616:174;:::o;33796:366::-;33938:3;33959:67;34023:2;34018:3;33959:67;:::i;:::-;33952:74;;34035:93;34124:3;34035:93;:::i;:::-;34153:2;34148:3;34144:12;34137:19;;33796:366;;;:::o;34168:419::-;34334:4;34372:2;34361:9;34357:18;34349:26;;34421:9;34415:4;34411:20;34407:1;34396:9;34392:17;34385:47;34449:131;34575:4;34449:131;:::i;:::-;34441:139;;34168:419;;;:::o;34593:230::-;34733:34;34729:1;34721:6;34717:14;34710:58;34802:13;34797:2;34789:6;34785:15;34778:38;34593:230;:::o;34829:366::-;34971:3;34992:67;35056:2;35051:3;34992:67;:::i;:::-;34985:74;;35068:93;35157:3;35068:93;:::i;:::-;35186:2;35181:3;35177:12;35170:19;;34829:366;;;:::o;35201:419::-;35367:4;35405:2;35394:9;35390:18;35382:26;;35454:9;35448:4;35444:20;35440:1;35429:9;35425:17;35418:47;35482:131;35608:4;35482:131;:::i;:::-;35474:139;;35201:419;;;:::o;35626:233::-;35665:3;35688:24;35706:5;35688:24;:::i;:::-;35679:33;;35734:66;35727:5;35724:77;35721:103;;35804:18;;:::i;:::-;35721:103;35851:1;35844:5;35840:13;35833:20;;35626:233;;;:::o;35865:348::-;35905:7;35928:20;35946:1;35928:20;:::i;:::-;35923:25;;35962:20;35980:1;35962:20;:::i;:::-;35957:25;;36150:1;36082:66;36078:74;36075:1;36072:81;36067:1;36060:9;36053:17;36049:105;36046:131;;;36157:18;;:::i;:::-;36046:131;36205:1;36202;36198:9;36187:20;;35865:348;;;;:::o;36219:180::-;36267:77;36264:1;36257:88;36364:4;36361:1;36354:15;36388:4;36385:1;36378:15;36405:185;36445:1;36462:20;36480:1;36462:20;:::i;:::-;36457:25;;36496:20;36514:1;36496:20;:::i;:::-;36491:25;;36535:1;36525:35;;36540:18;;:::i;:::-;36525:35;36582:1;36579;36575:9;36570:14;;36405:185;;;;:::o;36596:223::-;36736:34;36732:1;36724:6;36720:14;36713:58;36805:6;36800:2;36792:6;36788:15;36781:31;36596:223;:::o;36825:366::-;36967:3;36988:67;37052:2;37047:3;36988:67;:::i;:::-;36981:74;;37064:93;37153:3;37064:93;:::i;:::-;37182:2;37177:3;37173:12;37166:19;;36825:366;;;:::o;37197:419::-;37363:4;37401:2;37390:9;37386:18;37378:26;;37450:9;37444:4;37440:20;37436:1;37425:9;37421:17;37414:47;37478:131;37604:4;37478:131;:::i;:::-;37470:139;;37197:419;;;:::o;37622:229::-;37762:34;37758:1;37750:6;37746:14;37739:58;37831:12;37826:2;37818:6;37814:15;37807:37;37622:229;:::o;37857:366::-;37999:3;38020:67;38084:2;38079:3;38020:67;:::i;:::-;38013:74;;38096:93;38185:3;38096:93;:::i;:::-;38214:2;38209:3;38205:12;38198:19;;37857:366;;;:::o;38229:419::-;38395:4;38433:2;38422:9;38418:18;38410:26;;38482:9;38476:4;38472:20;38468:1;38457:9;38453:17;38446:47;38510:131;38636:4;38510:131;:::i;:::-;38502:139;;38229:419;;;:::o;38654:228::-;38794:34;38790:1;38782:6;38778:14;38771:58;38863:11;38858:2;38850:6;38846:15;38839:36;38654:228;:::o;38888:366::-;39030:3;39051:67;39115:2;39110:3;39051:67;:::i;:::-;39044:74;;39127:93;39216:3;39127:93;:::i;:::-;39245:2;39240:3;39236:12;39229:19;;38888:366;;;:::o;39260:419::-;39426:4;39464:2;39453:9;39449:18;39441:26;;39513:9;39507:4;39503:20;39499:1;39488:9;39484:17;39477:47;39541:131;39667:4;39541:131;:::i;:::-;39533:139;;39260:419;;;:::o;39685:180::-;39733:77;39730:1;39723:88;39830:4;39827:1;39820:15;39854:4;39851:1;39844:15;39871:170;40011:22;40007:1;39999:6;39995:14;39988:46;39871:170;:::o;40047:366::-;40189:3;40210:67;40274:2;40269:3;40210:67;:::i;:::-;40203:74;;40286:93;40375:3;40286:93;:::i;:::-;40404:2;40399:3;40395:12;40388:19;;40047:366;;;:::o;40419:419::-;40585:4;40623:2;40612:9;40608:18;40600:26;;40672:9;40666:4;40662:20;40658:1;40647:9;40643:17;40636:47;40700:131;40826:4;40700:131;:::i;:::-;40692:139;;40419:419;;;:::o;40844:194::-;40884:4;40904:20;40922:1;40904:20;:::i;:::-;40899:25;;40938:20;40956:1;40938:20;:::i;:::-;40933:25;;40982:1;40979;40975:9;40967:17;;41006:1;41000:4;40997:11;40994:37;;;41011:18;;:::i;:::-;40994:37;40844:194;;;;:::o;41044:171::-;41184:23;41180:1;41172:6;41168:14;41161:47;41044:171;:::o;41221:402::-;41381:3;41402:85;41484:2;41479:3;41402:85;:::i;:::-;41395:92;;41496:93;41585:3;41496:93;:::i;:::-;41614:2;41609:3;41605:12;41598:19;;41221:402;;;:::o;41629:535::-;41859:3;41881:92;41969:3;41960:6;41881:92;:::i;:::-;41874:99;;41990:148;42134:3;41990:148;:::i;:::-;41983:155;;42155:3;42148:10;;41629:535;;;;:::o;42170:226::-;42310:34;42306:1;42298:6;42294:14;42287:58;42379:9;42374:2;42366:6;42362:15;42355:34;42170:226;:::o;42402:366::-;42544:3;42565:67;42629:2;42624:3;42565:67;:::i;:::-;42558:74;;42641:93;42730:3;42641:93;:::i;:::-;42759:2;42754:3;42750:12;42743:19;;42402:366;;;:::o;42774:419::-;42940:4;42978:2;42967:9;42963:18;42955:26;;43027:9;43021:4;43017:20;43013:1;43002:9;42998:17;42991:47;43055:131;43181:4;43055:131;:::i;:::-;43047:139;;42774:419;;;:::o;43199:177::-;43339:29;43335:1;43327:6;43323:14;43316:53;43199:177;:::o;43382:366::-;43524:3;43545:67;43609:2;43604:3;43545:67;:::i;:::-;43538:74;;43621:93;43710:3;43621:93;:::i;:::-;43739:2;43734:3;43730:12;43723:19;;43382:366;;;:::o;43754:419::-;43920:4;43958:2;43947:9;43943:18;43935:26;;44007:9;44001:4;43997:20;43993:1;43982:9;43978:17;43971:47;44035:131;44161:4;44035:131;:::i;:::-;44027:139;;43754:419;;;:::o;44179:225::-;44319:34;44315:1;44307:6;44303:14;44296:58;44388:8;44383:2;44375:6;44371:15;44364:33;44179:225;:::o;44410:366::-;44552:3;44573:67;44637:2;44632:3;44573:67;:::i;:::-;44566:74;;44649:93;44738:3;44649:93;:::i;:::-;44767:2;44762:3;44758:12;44751:19;;44410:366;;;:::o;44782:419::-;44948:4;44986:2;44975:9;44971:18;44963:26;;45035:9;45029:4;45025:20;45021:1;45010:9;45006:17;44999:47;45063:131;45189:4;45063:131;:::i;:::-;45055:139;;44782:419;;;:::o;45207:182::-;45347:34;45343:1;45335:6;45331:14;45324:58;45207:182;:::o;45395:366::-;45537:3;45558:67;45622:2;45617:3;45558:67;:::i;:::-;45551:74;;45634:93;45723:3;45634:93;:::i;:::-;45752:2;45747:3;45743:12;45736:19;;45395:366;;;:::o;45767:419::-;45933:4;45971:2;45960:9;45956:18;45948:26;;46020:9;46014:4;46010:20;46006:1;45995:9;45991:17;45984:47;46048:131;46174:4;46048:131;:::i;:::-;46040:139;;45767:419;;;:::o;46192:166::-;46332:18;46328:1;46320:6;46316:14;46309:42;46192:166;:::o;46364:366::-;46506:3;46527:67;46591:2;46586:3;46527:67;:::i;:::-;46520:74;;46603:93;46692:3;46603:93;:::i;:::-;46721:2;46716:3;46712:12;46705:19;;46364:366;;;:::o;46736:419::-;46902:4;46940:2;46929:9;46925:18;46917:26;;46989:9;46983:4;46979:20;46975:1;46964:9;46960:17;46953:47;47017:131;47143:4;47017:131;:::i;:::-;47009:139;;46736:419;;;:::o;47161:332::-;47282:4;47320:2;47309:9;47305:18;47297:26;;47333:71;47401:1;47390:9;47386:17;47377:6;47333:71;:::i;:::-;47414:72;47482:2;47471:9;47467:18;47458:6;47414:72;:::i;:::-;47161:332;;;;;:::o;47499:137::-;47553:5;47584:6;47578:13;47569:22;;47600:30;47624:5;47600:30;:::i;:::-;47499:137;;;;:::o;47642:345::-;47709:6;47758:2;47746:9;47737:7;47733:23;47729:32;47726:119;;;47764:79;;:::i;:::-;47726:119;47884:1;47909:61;47962:7;47953:6;47942:9;47938:22;47909:61;:::i;:::-;47899:71;;47855:125;47642:345;;;;:::o;47993:233::-;48133:34;48129:1;48121:6;48117:14;48110:58;48202:16;48197:2;48189:6;48185:15;48178:41;47993:233;:::o;48232:366::-;48374:3;48395:67;48459:2;48454:3;48395:67;:::i;:::-;48388:74;;48471:93;48560:3;48471:93;:::i;:::-;48589:2;48584:3;48580:12;48573:19;;48232:366;;;:::o;48604:419::-;48770:4;48808:2;48797:9;48793:18;48785:26;;48857:9;48851:4;48847:20;48843:1;48832:9;48828:17;48821:47;48885:131;49011:4;48885:131;:::i;:::-;48877:139;;48604:419;;;:::o;49029:181::-;49169:33;49165:1;49157:6;49153:14;49146:57;49029:181;:::o;49216:366::-;49358:3;49379:67;49443:2;49438:3;49379:67;:::i;:::-;49372:74;;49455:93;49544:3;49455:93;:::i;:::-;49573:2;49568:3;49564:12;49557:19;;49216:366;;;:::o;49588:419::-;49754:4;49792:2;49781:9;49777:18;49769:26;;49841:9;49835:4;49831:20;49827:1;49816:9;49812:17;49805:47;49869:131;49995:4;49869:131;:::i;:::-;49861:139;;49588:419;;;:::o;50013:179::-;50153:31;50149:1;50141:6;50137:14;50130:55;50013:179;:::o;50198:366::-;50340:3;50361:67;50425:2;50420:3;50361:67;:::i;:::-;50354:74;;50437:93;50526:3;50437:93;:::i;:::-;50555:2;50550:3;50546:12;50539:19;;50198:366;;;:::o;50570:419::-;50736:4;50774:2;50763:9;50759:18;50751:26;;50823:9;50817:4;50813:20;50809:1;50798:9;50794:17;50787:47;50851:131;50977:4;50851:131;:::i;:::-;50843:139;;50570:419;;;:::o;50995:147::-;51096:11;51133:3;51118:18;;50995:147;;;;:::o;51148:114::-;;:::o;51268:398::-;51427:3;51448:83;51529:1;51524:3;51448:83;:::i;:::-;51441:90;;51540:93;51629:3;51540:93;:::i;:::-;51658:1;51653:3;51649:11;51642:18;;51268:398;;;:::o;51672:379::-;51856:3;51878:147;52021:3;51878:147;:::i;:::-;51871:154;;52042:3;52035:10;;51672:379;;;:::o;52057:245::-;52197:34;52193:1;52185:6;52181:14;52174:58;52266:28;52261:2;52253:6;52249:15;52242:53;52057:245;:::o;52308:366::-;52450:3;52471:67;52535:2;52530:3;52471:67;:::i;:::-;52464:74;;52547:93;52636:3;52547:93;:::i;:::-;52665:2;52660:3;52656:12;52649:19;;52308:366;;;:::o;52680:419::-;52846:4;52884:2;52873:9;52869:18;52861:26;;52933:9;52927:4;52923:20;52919:1;52908:9;52904:17;52897:47;52961:131;53087:4;52961:131;:::i;:::-;52953:139;;52680:419;;;:::o;53105:229::-;53245:34;53241:1;53233:6;53229:14;53222:58;53314:12;53309:2;53301:6;53297:15;53290:37;53105:229;:::o;53340:366::-;53482:3;53503:67;53567:2;53562:3;53503:67;:::i;:::-;53496:74;;53579:93;53668:3;53579:93;:::i;:::-;53697:2;53692:3;53688:12;53681:19;;53340:366;;;:::o;53712:419::-;53878:4;53916:2;53905:9;53901:18;53893:26;;53965:9;53959:4;53955:20;53951:1;53940:9;53936:17;53929:47;53993:131;54119:4;53993:131;:::i;:::-;53985:139;;53712:419;;;:::o;54137:175::-;54277:27;54273:1;54265:6;54261:14;54254:51;54137:175;:::o;54318:366::-;54460:3;54481:67;54545:2;54540:3;54481:67;:::i;:::-;54474:74;;54557:93;54646:3;54557:93;:::i;:::-;54675:2;54670:3;54666:12;54659:19;;54318:366;;;:::o;54690:419::-;54856:4;54894:2;54883:9;54879:18;54871:26;;54943:9;54937:4;54933:20;54929:1;54918:9;54914:17;54907:47;54971:131;55097:4;54971:131;:::i;:::-;54963:139;;54690:419;;;:::o;55115:222::-;55255:34;55251:1;55243:6;55239:14;55232:58;55324:5;55319:2;55311:6;55307:15;55300:30;55115:222;:::o;55343:366::-;55485:3;55506:67;55570:2;55565:3;55506:67;:::i;:::-;55499:74;;55582:93;55671:3;55582:93;:::i;:::-;55700:2;55695:3;55691:12;55684:19;;55343:366;;;:::o;55715:419::-;55881:4;55919:2;55908:9;55904:18;55896:26;;55968:9;55962:4;55958:20;55954:1;55943:9;55939:17;55932:47;55996:131;56122:4;55996:131;:::i;:::-;55988:139;;55715:419;;;:::o;56140:223::-;56280:34;56276:1;56268:6;56264:14;56257:58;56349:6;56344:2;56336:6;56332:15;56325:31;56140:223;:::o;56369:366::-;56511:3;56532:67;56596:2;56591:3;56532:67;:::i;:::-;56525:74;;56608:93;56697:3;56608:93;:::i;:::-;56726:2;56721:3;56717:12;56710:19;;56369:366;;;:::o;56741:419::-;56907:4;56945:2;56934:9;56930:18;56922:26;;56994:9;56988:4;56984:20;56980:1;56969:9;56965:17;56958:47;57022:131;57148:4;57022:131;:::i;:::-;57014:139;;56741:419;;;:::o;57166:332::-;57287:4;57325:2;57314:9;57310:18;57302:26;;57338:71;57406:1;57395:9;57391:17;57382:6;57338:71;:::i;:::-;57419:72;57487:2;57476:9;57472:18;57463:6;57419:72;:::i;:::-;57166:332;;;;;:::o;57504:220::-;57644:34;57640:1;57632:6;57628:14;57621:58;57713:3;57708:2;57700:6;57696:15;57689:28;57504:220;:::o;57730:366::-;57872:3;57893:67;57957:2;57952:3;57893:67;:::i;:::-;57886:74;;57969:93;58058:3;57969:93;:::i;:::-;58087:2;58082:3;58078:12;58071:19;;57730:366;;;:::o;58102:419::-;58268:4;58306:2;58295:9;58291:18;58283:26;;58355:9;58349:4;58345:20;58341:1;58330:9;58326:17;58319:47;58383:131;58509:4;58383:131;:::i;:::-;58375:139;;58102:419;;;:::o;58527:227::-;58667:34;58663:1;58655:6;58651:14;58644:58;58736:10;58731:2;58723:6;58719:15;58712:35;58527:227;:::o;58760:366::-;58902:3;58923:67;58987:2;58982:3;58923:67;:::i;:::-;58916:74;;58999:93;59088:3;58999:93;:::i;:::-;59117:2;59112:3;59108:12;59101:19;;58760:366;;;:::o;59132:419::-;59298:4;59336:2;59325:9;59321:18;59313:26;;59385:9;59379:4;59375:20;59371:1;59360:9;59356:17;59349:47;59413:131;59539:4;59413:131;:::i;:::-;59405:139;;59132:419;;;:::o;59557:224::-;59697:34;59693:1;59685:6;59681:14;59674:58;59766:7;59761:2;59753:6;59749:15;59742:32;59557:224;:::o;59787:366::-;59929:3;59950:67;60014:2;60009:3;59950:67;:::i;:::-;59943:74;;60026:93;60115:3;60026:93;:::i;:::-;60144:2;60139:3;60135:12;60128:19;;59787:366;;;:::o;60159:419::-;60325:4;60363:2;60352:9;60348:18;60340:26;;60412:9;60406:4;60402:20;60398:1;60387:9;60383:17;60376:47;60440:131;60566:4;60440:131;:::i;:::-;60432:139;;60159:419;;;:::o;60584:229::-;60724:34;60720:1;60712:6;60708:14;60701:58;60793:12;60788:2;60780:6;60776:15;60769:37;60584:229;:::o;60819:366::-;60961:3;60982:67;61046:2;61041:3;60982:67;:::i;:::-;60975:74;;61058:93;61147:3;61058:93;:::i;:::-;61176:2;61171:3;61167:12;61160:19;;60819:366;;;:::o;61191:419::-;61357:4;61395:2;61384:9;61380:18;61372:26;;61444:9;61438:4;61434:20;61430:1;61419:9;61415:17;61408:47;61472:131;61598:4;61472:131;:::i;:::-;61464:139;;61191:419;;;:::o;61616:634::-;61837:4;61875:2;61864:9;61860:18;61852:26;;61924:9;61918:4;61914:20;61910:1;61899:9;61895:17;61888:47;61952:108;62055:4;62046:6;61952:108;:::i;:::-;61944:116;;62107:9;62101:4;62097:20;62092:2;62081:9;62077:18;62070:48;62135:108;62238:4;62229:6;62135:108;:::i;:::-;62127:116;;61616:634;;;;;:::o;62256:170::-;62396:22;62392:1;62384:6;62380:14;62373:46;62256:170;:::o;62432:366::-;62574:3;62595:67;62659:2;62654:3;62595:67;:::i;:::-;62588:74;;62671:93;62760:3;62671:93;:::i;:::-;62789:2;62784:3;62780:12;62773:19;;62432:366;;;:::o;62804:419::-;62970:4;63008:2;62997:9;62993:18;62985:26;;63057:9;63051:4;63047:20;63043:1;63032:9;63028:17;63021:47;63085:131;63211:4;63085:131;:::i;:::-;63077:139;;62804:419;;;:::o;63229:228::-;63369:34;63365:1;63357:6;63353:14;63346:58;63438:11;63433:2;63425:6;63421:15;63414:36;63229:228;:::o;63463:366::-;63605:3;63626:67;63690:2;63685:3;63626:67;:::i;:::-;63619:74;;63702:93;63791:3;63702:93;:::i;:::-;63820:2;63815:3;63811:12;63804:19;;63463:366;;;:::o;63835:419::-;64001:4;64039:2;64028:9;64024:18;64016:26;;64088:9;64082:4;64078:20;64074:1;64063:9;64059:17;64052:47;64116:131;64242:4;64116:131;:::i;:::-;64108:139;;63835:419;;;:::o;64260:98::-;64311:6;64345:5;64339:12;64329:22;;64260:98;;;:::o;64364:168::-;64447:11;64481:6;64476:3;64469:19;64521:4;64516:3;64512:14;64497:29;;64364:168;;;;:::o;64538:373::-;64624:3;64652:38;64684:5;64652:38;:::i;:::-;64706:70;64769:6;64764:3;64706:70;:::i;:::-;64699:77;;64785:65;64843:6;64838:3;64831:4;64824:5;64820:16;64785:65;:::i;:::-;64875:29;64897:6;64875:29;:::i;:::-;64870:3;64866:39;64859:46;;64628:283;64538:373;;;;:::o;64917:751::-;65140:4;65178:3;65167:9;65163:19;65155:27;;65192:71;65260:1;65249:9;65245:17;65236:6;65192:71;:::i;:::-;65273:72;65341:2;65330:9;65326:18;65317:6;65273:72;:::i;:::-;65355;65423:2;65412:9;65408:18;65399:6;65355:72;:::i;:::-;65437;65505:2;65494:9;65490:18;65481:6;65437:72;:::i;:::-;65557:9;65551:4;65547:20;65541:3;65530:9;65526:19;65519:49;65585:76;65656:4;65647:6;65585:76;:::i;:::-;65577:84;;64917:751;;;;;;;;:::o;65674:141::-;65730:5;65761:6;65755:13;65746:22;;65777:32;65803:5;65777:32;:::i;:::-;65674:141;;;;:::o;65821:349::-;65890:6;65939:2;65927:9;65918:7;65914:23;65910:32;65907:119;;;65945:79;;:::i;:::-;65907:119;66065:1;66090:63;66145:7;66136:6;66125:9;66121:22;66090:63;:::i;:::-;66080:73;;66036:127;65821:349;;;;:::o;66176:106::-;66220:8;66269:5;66264:3;66260:15;66239:36;;66176:106;;;:::o;66288:183::-;66323:3;66361:1;66343:16;66340:23;66337:128;;;66399:1;66396;66393;66378:23;66421:34;66452:1;66446:8;66421:34;:::i;:::-;66414:41;;66337:128;66288:183;:::o;66477:711::-;66516:3;66554:4;66536:16;66533:26;66562:5;66530:39;66591:20;;:::i;:::-;66666:1;66648:16;66644:24;66641:1;66635:4;66620:49;66699:4;66693:11;66798:16;66791:4;66783:6;66779:17;66776:39;66743:18;66735:6;66732:30;66716:113;66713:146;;;66844:5;;;;66713:146;66890:6;66884:4;66880:17;66926:3;66920:10;66953:18;66945:6;66942:30;66939:43;;;66975:5;;;;;;66939:43;67023:6;67016:4;67011:3;67007:14;67003:27;67082:1;67064:16;67060:24;67054:4;67050:35;67045:3;67042:44;67039:57;;;67089:5;;;;;;;67039:57;67106;67154:6;67148:4;67144:17;67136:6;67132:30;67126:4;67106:57;:::i;:::-;67179:3;67172:10;;66520:668;;;;;66477:711;;:::o;67194:239::-;67334:34;67330:1;67322:6;67318:14;67311:58;67403:22;67398:2;67390:6;67386:15;67379:47;67194:239;:::o;67439:366::-;67581:3;67602:67;67666:2;67661:3;67602:67;:::i;:::-;67595:74;;67678:93;67767:3;67678:93;:::i;:::-;67796:2;67791:3;67787:12;67780:19;;67439:366;;;:::o;67811:419::-;67977:4;68015:2;68004:9;68000:18;67992:26;;68064:9;68058:4;68054:20;68050:1;68039:9;68035:17;68028:47;68092:131;68218:4;68092:131;:::i;:::-;68084:139;;67811:419;;;:::o;68236:227::-;68376:34;68372:1;68364:6;68360:14;68353:58;68445:10;68440:2;68432:6;68428:15;68421:35;68236:227;:::o;68469:366::-;68611:3;68632:67;68696:2;68691:3;68632:67;:::i;:::-;68625:74;;68708:93;68797:3;68708:93;:::i;:::-;68826:2;68821:3;68817:12;68810:19;;68469:366;;;:::o;68841:419::-;69007:4;69045:2;69034:9;69030:18;69022:26;;69094:9;69088:4;69084:20;69080:1;69069:9;69065:17;69058:47;69122:131;69248:4;69122:131;:::i;:::-;69114:139;;68841:419;;;:::o;69266:1053::-;69589:4;69627:3;69616:9;69612:19;69604:27;;69641:71;69709:1;69698:9;69694:17;69685:6;69641:71;:::i;:::-;69722:72;69790:2;69779:9;69775:18;69766:6;69722:72;:::i;:::-;69841:9;69835:4;69831:20;69826:2;69815:9;69811:18;69804:48;69869:108;69972:4;69963:6;69869:108;:::i;:::-;69861:116;;70024:9;70018:4;70014:20;70009:2;69998:9;69994:18;69987:48;70052:108;70155:4;70146:6;70052:108;:::i;:::-;70044:116;;70208:9;70202:4;70198:20;70192:3;70181:9;70177:19;70170:49;70236:76;70307:4;70298:6;70236:76;:::i;:::-;70228:84;;69266:1053;;;;;;;;:::o

Swarm Source

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