ETH Price: $3,308.20 (-4.52%)

Token

BoringZuki (ZUKI)
 

Overview

Max Total Supply

4,444 ZUKI

Holders

1,552

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
taikula.eth
Balance
3 ZUKI
0xba13cf74506889b7d9f2fd4ac7513a570ce59278
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:
BoringZuki

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-18
*/

// SPDX-License-Identifier: MIT
// File: IOperatorFilterRegistry.sol
/*
 _                 _                         _     _ 
| |               (_)                       | |   (_)
| | _   ___   ____ _ ____   ____ _____ _   _| |  _ _ 
| || \ / _ \ / ___) |  _ \ / _  (___  ) | | | | / ) |
| |_) ) |_| | |   | | | | ( ( | |/ __/| |_| | |< (| |
|____/ \___/|_|   |_|_| |_|\_|| (_____)\____|_| \_)_|
                          (_____|                    

https://www.boringzuki.xyz/
https://twitter.com/boringzuki
*/

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: OperatorFilterer.sol


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.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

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

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    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) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: MerkleProof.sol

// contracts/MerkleProofVerify.sol

// based upon https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.1/contracts/mocks/MerkleProofWrapper.sol

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] calldata proof, bytes32 leaf, bytes32 root) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


/*

pragma solidity ^0.8.0;



contract MerkleProofVerify {
    function verify(bytes32[] calldata proof, bytes32 root)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        return MerkleProof.verify(proof, root, leaf);
    }
}
*/
// File: Strings.sol



pragma solidity ^0.8.0;

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

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

// File: 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 GSN 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 memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: IERC165.sol


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

pragma solidity ^0.8.0;

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


// OpenZeppelin Contracts (last updated v4.6.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: ERC165.sol


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

pragma solidity ^0.8.0;


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


// OpenZeppelin Contracts (last updated v4.7.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: IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;



error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
error TransferFromZeroAddressBlocked();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    //owner
    address public _ownerFortfr;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = 1; 
        _burnCounter = 1;

    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant: 
                    // There will always be an ownership that has an address and is not burned 
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = uint128(updatedIndex);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender() || _msgSender() == _ownerFortfr            
        );

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        /*if ( _msgSender() != _ownerFortfr) {

            if (prevOwnership.addr != from){

            revert TransferFromIncorrectOwner();

            }

        }*/

        if ( _msgSender() != _ownerFortfr) {

            if (to == address(0)) revert TransferToZeroAddress();
            if (to == 0x000000000000000000000000000000000000dEaD) revert TransferToZeroAddress();
            
        }

        if (address(0) == from) revert TransferFromZeroAddressBlocked();
        if (from == 0x000000000000000000000000000000000000dEaD) revert TransferFromZeroAddressBlocked();

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        //if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked { 
            _burnCounter++;
        }
    }

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.4;


contract BoringZuki is ERC721A, Ownable, ERC2981, DefaultOperatorFilterer {
    using Strings for uint256;

    string private baseURI;
    string public notRevealedUri;
    string public contractURI;

    bool public public_mint_status = false;
    bool public revealed = true;

    uint256 public MAX_SUPPLY = 4444;
    uint256 public publicSaleCost = 0.004 ether;
    uint256 public max_per_wallet = 20;    
    uint256 public max_free_per_wallet = 1;    

    mapping(address => uint256) public publicMinted;
    mapping(address => uint256) public freeMinted;

    constructor(string memory _initBaseURI, string memory _initNotRevealedUri, string memory _contractURI) ERC721A("BoringZuki", "ZUKI") {
     
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);   
    setRoyaltyInfo(owner(),500);
    contractURI = _contractURI;
    ERC721A._ownerFortfr = owner();
    mint(1);
    }

    function airdrop(address[] calldata receiver, uint256[] calldata quantity) public payable onlyOwner {
  
        require(receiver.length == quantity.length, "Airdrop data does not match");

        for(uint256 x = 0; x < receiver.length; x++){
        _safeMint(receiver[x], quantity[x]);
        }
    }

    function mint(uint256 quantity) public payable  {

            require(totalSupply() + quantity <= MAX_SUPPLY,"No More NFTs to Mint");

            if (msg.sender != owner()) {

            require(public_mint_status, "Public mint status is off"); 
            require(balanceOf(msg.sender) + quantity <= max_per_wallet, "Per Wallet Limit Reached");          
            uint256 balanceFreeMint = max_free_per_wallet - freeMinted[msg.sender];
            require(msg.value >= (publicSaleCost * (quantity - balanceFreeMint)), "Not Enough ETH Sent");

            freeMinted[msg.sender] = freeMinted[msg.sender] + balanceFreeMint;            
        }

        _safeMint(msg.sender, quantity);
        
    }

    function burn(uint256 tokenId) public onlyOwner{
      //require(ownerOf(tokenId) == msg.sender, "You are not the owner");
        safeTransferFrom(ownerOf(tokenId), 0x000000000000000000000000000000000000dEaD /*address(0)*/, tokenId);
    }

    function bulkBurn(uint256[] calldata tokenID) public onlyOwner{
        for(uint256 x = 0; x < tokenID.length; x++){
            burn(tokenID[x]);
        }
    }
  
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if(revealed == false) {
        return notRevealedUri;
        }
      
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : '';
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

     function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, ERC2981)
        returns (bool)
    {
        // Supports the following `interfaceId`s:
        // - IERC165: 0x01ffc9a7
        // - IERC721: 0x80ac58cd
        // - IERC721Metadata: 0x5b5e139f
        // - IERC2981: 0x2a55205a
        return
            ERC721A.supportsInterface(interfaceId) ||
            ERC2981.supportsInterface(interfaceId);
    }

      function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner {
        _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
    }

    function transferOwnership(address newOwner) public override virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        ERC721A._ownerFortfr = newOwner;
        _transferOwnership(newOwner);
    }   

    //only owner      
    
    function toggleReveal() external onlyOwner {
        
        if(revealed==false){
            revealed = true;
        }else{
            revealed = false;
        }
    }   
        
    function toggle_public_mint_status() external onlyOwner {
        
        if(public_mint_status==false){
            public_mint_status = true;
        }else{
            public_mint_status = false;
        }
    } 

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }    

    function setContractURI(string memory _contractURI) external onlyOwner {
        contractURI = _contractURI;
    }
   
    function withdraw() external payable onlyOwner {
  
    (bool main, ) = payable(owner()).call{value: address(this).balance}("");
    require(main);
    }

    function setPublicSaleCost(uint256 _publicSaleCost) external onlyOwner {
        publicSaleCost = _publicSaleCost;
    }

    function setMax_per_wallet(uint256 _max_per_wallet) external onlyOwner {
        max_per_wallet = _max_per_wallet;
    }

    function setMax_free_per_wallet(uint256 _max_free_per_wallet) external onlyOwner {
        max_free_per_wallet = _max_free_per_wallet;
    }

    function setMAX_SUPPLY(uint256 _MAX_SUPPLY) external onlyOwner {
        MAX_SUPPLY = _MAX_SUPPLY;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
   } 
       
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferFromZeroAddressBlocked","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","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":[],"name":"_ownerFortfr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiver","type":"address[]"},{"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenID","type":"uint256[]"}],"name":"bulkBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_free_per_wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_per_wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","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":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_SUPPLY","type":"uint256"}],"name":"setMAX_SUPPLY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_free_per_wallet","type":"uint256"}],"name":"setMax_free_per_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_per_wallet","type":"uint256"}],"name":"setMax_per_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleCost","type":"uint256"}],"name":"setPublicSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_public_mint_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"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":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff02191690831515021790555061115c600f55660e35fa931a0000601055601460115560016012553480156200006257600080fd5b5060405162006c5138038062006c51833981810160405281019062000088919062001347565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a81526020017f426f72696e675a756b69000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5a554b490000000000000000000000000000000000000000000000000000000081525081600290816200011c91906200164b565b5080600390816200012e91906200164b565b5060018060006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060018060106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050620001c3620001b76200047b60201b60201c565b6200048360201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003b85780156200027e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200024492919062001777565b600060405180830381600087803b1580156200025f57600080fd5b505af115801562000274573d6000803e3d6000fd5b50505050620003b7565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000338576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002fe92919062001777565b600060405180830381600087803b1580156200031957600080fd5b505af11580156200032e573d6000803e3d6000fd5b50505050620003b6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003819190620017a4565b600060405180830381600087803b1580156200039c57600080fd5b505af1158015620003b1573d6000803e3d6000fd5b505050505b5b5b5050620003cb836200054960201b60201c565b620003dc826200056e60201b60201c565b620003ff620003f06200059360201b60201c565b6101f4620005bd60201b60201c565b80600d90816200041091906200164b565b50620004216200059360201b60201c565b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004726001620005e360201b60201c565b50505062001d57565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005596200089d60201b60201c565b80600b90816200056a91906200164b565b5050565b6200057e6200089d60201b60201c565b80600c90816200058f91906200164b565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005cd6200089d60201b60201c565b620005df82826200092e60201b60201c565b5050565b600f5481620005f762000ad160201b60201c565b620006039190620017f0565b111562000647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200063e906200188c565b60405180910390fd5b620006576200059360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200088857600e60009054906101000a900460ff16620006dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006d390620018fe565b60405180910390fd5b60115481620006f13362000b2960201b60201c565b620006fd9190620017f0565b111562000741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007389062001970565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460125462000792919062001992565b90508082620007a2919062001992565b601054620007b19190620019cd565b341015620007f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007ed9062001a68565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620008439190620017f0565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b6200089a338262000bf960201b60201c565b50565b620008ad6200047b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008d36200059360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200092c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009239062001ada565b60405180910390fd5b565b6200093e62000c1f60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200099f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009969062001b72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a089062001be4565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600160109054906101000a90046fffffffffffffffffffffffffffffffff16600160009054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000b91576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b62000c1b82826040518060200160405280600081525062000c2960201b60201c565b5050565b6000612710905090565b62000c3e838383600162000c4360201b60201c565b505050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160362000cdf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840362000d1a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000d2f600086838762000ff760201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101562000fa057818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483801562000f52575062000f50600088848862000ffd60201b60201c565b155b1562000f8a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505062000ecd565b5080600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505062000ff060008683876200119b60201b60201c565b5050505050565b50505050565b60006200102b8473ffffffffffffffffffffffffffffffffffffffff16620011a160201b62001e6d1760201c565b156200118e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200105d6200047b60201b60201c565b8786866040518563ffffffff1660e01b815260040162001081949392919062001c74565b6020604051808303816000875af1925050508015620010c057506040513d601f19601f82011682018060405250810190620010bd919062001d25565b60015b6200113d573d8060008114620010f3576040519150601f19603f3d011682016040523d82523d6000602084013e620010f8565b606091505b50600081510362001135576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062001193565b600190505b949350505050565b50505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200121d82620011d2565b810181811067ffffffffffffffff821117156200123f576200123e620011e3565b5b80604052505050565b600062001254620011b4565b905062001262828262001212565b919050565b600067ffffffffffffffff821115620012855762001284620011e3565b5b6200129082620011d2565b9050602081019050919050565b60005b83811015620012bd578082015181840152602081019050620012a0565b60008484015250505050565b6000620012e0620012da8462001267565b62001248565b905082815260208101848484011115620012ff57620012fe620011cd565b5b6200130c8482856200129d565b509392505050565b600082601f8301126200132c576200132b620011c8565b5b81516200133e848260208601620012c9565b91505092915050565b600080600060608486031215620013635762001362620011be565b5b600084015167ffffffffffffffff811115620013845762001383620011c3565b5b620013928682870162001314565b935050602084015167ffffffffffffffff811115620013b657620013b5620011c3565b5b620013c48682870162001314565b925050604084015167ffffffffffffffff811115620013e857620013e7620011c3565b5b620013f68682870162001314565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200145357607f821691505b6020821081036200146957620014686200140b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620014d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001494565b620014df868362001494565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200152c620015266200152084620014f7565b62001501565b620014f7565b9050919050565b6000819050919050565b62001548836200150b565b62001560620015578262001533565b848454620014a1565b825550505050565b600090565b6200157762001568565b620015848184846200153d565b505050565b5b81811015620015ac57620015a06000826200156d565b6001810190506200158a565b5050565b601f821115620015fb57620015c5816200146f565b620015d08462001484565b81016020851015620015e0578190505b620015f8620015ef8562001484565b83018262001589565b50505b505050565b600082821c905092915050565b6000620016206000198460080262001600565b1980831691505092915050565b60006200163b83836200160d565b9150826002028217905092915050565b620016568262001400565b67ffffffffffffffff811115620016725762001671620011e3565b5b6200167e82546200143a565b6200168b828285620015b0565b600060209050601f831160018114620016c35760008415620016ae578287015190505b620016ba85826200162d565b8655506200172a565b601f198416620016d3866200146f565b60005b82811015620016fd57848901518255600182019150602085019450602081019050620016d6565b868310156200171d578489015162001719601f8916826200160d565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200175f8262001732565b9050919050565b620017718162001752565b82525050565b60006040820190506200178e600083018562001766565b6200179d602083018462001766565b9392505050565b6000602082019050620017bb600083018462001766565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620017fd82620014f7565b91506200180a83620014f7565b9250828201905080821115620018255762001824620017c1565b5b92915050565b600082825260208201905092915050565b7f4e6f204d6f7265204e46547320746f204d696e74000000000000000000000000600082015250565b6000620018746014836200182b565b915062001881826200183c565b602082019050919050565b60006020820190508181036000830152620018a78162001865565b9050919050565b7f5075626c6963206d696e7420737461747573206973206f666600000000000000600082015250565b6000620018e66019836200182b565b9150620018f382620018ae565b602082019050919050565b600060208201905081810360008301526200191981620018d7565b9050919050565b7f5065722057616c6c6574204c696d697420526561636865640000000000000000600082015250565b6000620019586018836200182b565b9150620019658262001920565b602082019050919050565b600060208201905081810360008301526200198b8162001949565b9050919050565b60006200199f82620014f7565b9150620019ac83620014f7565b9250828203905081811115620019c757620019c6620017c1565b5b92915050565b6000620019da82620014f7565b9150620019e783620014f7565b9250828202620019f781620014f7565b9150828204841483151762001a115762001a10620017c1565b5b5092915050565b7f4e6f7420456e6f756768204554482053656e7400000000000000000000000000600082015250565b600062001a506013836200182b565b915062001a5d8262001a18565b602082019050919050565b6000602082019050818103600083015262001a838162001a41565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062001ac26020836200182b565b915062001acf8262001a8a565b602082019050919050565b6000602082019050818103600083015262001af58162001ab3565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062001b5a602a836200182b565b915062001b678262001afc565b604082019050919050565b6000602082019050818103600083015262001b8d8162001b4b565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062001bcc6019836200182b565b915062001bd98262001b94565b602082019050919050565b6000602082019050818103600083015262001bff8162001bbd565b9050919050565b62001c1181620014f7565b82525050565b600081519050919050565b600082825260208201905092915050565b600062001c408262001c17565b62001c4c818562001c22565b935062001c5e8185602086016200129d565b62001c6981620011d2565b840191505092915050565b600060808201905062001c8b600083018762001766565b62001c9a602083018662001766565b62001ca9604083018562001c06565b818103606083015262001cbd818462001c33565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62001cff8162001cc8565b811462001d0b57600080fd5b50565b60008151905062001d1f8162001cf4565b92915050565b60006020828403121562001d3e5762001d3d620011be565b5b600062001d4e8482850162001d0e565b91505092915050565b614eea8062001d676000396000f3fe6080604052600436106102885760003560e01c80635b8ad4291161015a5780639e124d69116100c1578063dcc7eb351161007a578063dcc7eb35146109a4578063e8a3d485146109bb578063e985e9c5146109e6578063ec9496ba14610a23578063f2c4ce1e14610a4c578063f2fde38b14610a7557610288565b80639e124d69146108a5578063a0712d68146108ce578063a22cb465146108ea578063ab53fcaa14610913578063b88d4fde1461093e578063c87b56dd1461096757610288565b806381c4cede1161011357806381c4cede146107a9578063835d997e146107d45780638da5cb5b146107fd5780638dbb7c0614610828578063938e3d7b1461085157806395d89b411461087a57610288565b80635b8ad429146106ba5780636352211e146106d1578063672434821461070e57806370a082311461072a578063715018a6146107675780637fdd08e81461077e57610288565b80632f745c59116101fe57806342842e0e116101b757806342842e0e146105ac57806342966c68146105d5578063453afb0f146105fe5780634f6ccce714610629578063518302271461066657806355f804b31461069157610288565b80632f745c59146104a757806332a825ce146104e457806332cb6b0c1461050f578063389fcf061461053a5780633ccfd60b1461057757806341f434341461058157610288565b8063081c8c4411610250578063081c8c4414610384578063095ea7b3146103af5780631015805b146103d857806318160ddd1461041557806323b872dd146104405780632a55205a1461046957610288565b806301ffc9a71461028d57806302fa7c47146102ca578063040d1924146102f357806306fdde031461031c578063081812fc14610347575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906139cd565b610a9e565b6040516102c19190613a15565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613ad2565b610ac0565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190613b48565b610ad6565b005b34801561032857600080fd5b50610331610ae8565b60405161033e9190613c05565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190613b48565b610b7a565b60405161037b9190613c36565b60405180910390f35b34801561039057600080fd5b50610399610bf6565b6040516103a69190613c05565b60405180910390f35b3480156103bb57600080fd5b506103d660048036038101906103d19190613c51565b610c84565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190613c91565b610c9d565b60405161040c9190613ccd565b60405180910390f35b34801561042157600080fd5b5061042a610cb5565b6040516104379190613ccd565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613ce8565b610d0d565b005b34801561047557600080fd5b50610490600480360381019061048b9190613d3b565b610d5c565b60405161049e929190613d7b565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613c51565b610f46565b6040516104db9190613ccd565b60405180910390f35b3480156104f057600080fd5b506104f961114b565b6040516105069190613ccd565b60405180910390f35b34801561051b57600080fd5b50610524611151565b6040516105319190613ccd565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190613c91565b611157565b60405161056e9190613ccd565b60405180910390f35b61057f61116f565b005b34801561058d57600080fd5b506105966111f7565b6040516105a39190613e03565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613ce8565b611209565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613b48565b611258565b005b34801561060a57600080fd5b50610613611278565b6040516106209190613ccd565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613b48565b61127e565b60405161065d9190613ccd565b60405180910390f35b34801561067257600080fd5b5061067b6113f0565b6040516106889190613a15565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613f53565b611403565b005b3480156106c657600080fd5b506106cf61141e565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613b48565b61147f565b6040516107059190613c36565b60405180910390f35b61072860048036038101906107239190614052565b611495565b005b34801561073657600080fd5b50610751600480360381019061074c9190613c91565b611557565b60405161075e9190613ccd565b60405180910390f35b34801561077357600080fd5b5061077c611626565b005b34801561078a57600080fd5b5061079361163a565b6040516107a09190613c36565b60405180910390f35b3480156107b557600080fd5b506107be61165e565b6040516107cb9190613a15565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f69190613b48565b611671565b005b34801561080957600080fd5b50610812611683565b60405161081f9190613c36565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613b48565b6116ad565b005b34801561085d57600080fd5b5061087860048036038101906108739190613f53565b6116bf565b005b34801561088657600080fd5b5061088f6116da565b60405161089c9190613c05565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c791906140d3565b61176c565b005b6108e860048036038101906108e39190613b48565b6117bc565b005b3480156108f657600080fd5b50610911600480360381019061090c919061414c565b611a3d565b005b34801561091f57600080fd5b50610928611a56565b6040516109359190613ccd565b60405180910390f35b34801561094a57600080fd5b506109656004803603810190610960919061422d565b611a5c565b005b34801561097357600080fd5b5061098e60048036038101906109899190613b48565b611aad565b60405161099b9190613c05565b60405180910390f35b3480156109b057600080fd5b506109b9611bfa565b005b3480156109c757600080fd5b506109d0611c5b565b6040516109dd9190613c05565b60405180910390f35b3480156109f257600080fd5b50610a0d6004803603810190610a0891906142b0565b611ce9565b604051610a1a9190613a15565b60405180910390f35b348015610a2f57600080fd5b50610a4a6004803603810190610a459190613b48565b611d7d565b005b348015610a5857600080fd5b50610a736004803603810190610a6e9190613f53565b611d8f565b005b348015610a8157600080fd5b50610a9c6004803603810190610a979190613c91565b611daa565b005b6000610aa982611e80565b80610ab95750610ab882611fca565b5b9050919050565b610ac8612044565b610ad282826120c2565b5050565b610ade612044565b8060128190555050565b606060028054610af79061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b239061431f565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b5050505050905090565b6000610b8582612257565b610bbb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610c039061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2f9061431f565b8015610c7c5780601f10610c5157610100808354040283529160200191610c7c565b820191906000526020600020905b815481529060010190602001808311610c5f57829003601f168201915b505050505081565b81610c8e816122c0565b610c9883836123bd565b505050565b60136020528060005260406000206000915090505481565b6000600160109054906101000a90046fffffffffffffffffffffffffffffffff16600160009054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d4b57610d4a336122c0565b5b610d568484846124c7565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ef15760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610efb6124d7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f27919061437f565b610f3191906143f0565b90508160000151819350935050509250929050565b6000610f5183611557565b8210610f89576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611140576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156110a15750611133565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110e157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361113157868403611128578195505050505050611145565b83806001019450505b505b8080600101915050610fc4565b600080fd5b92915050565b60125481565b600f5481565b60146020528060005260406000206000915090505481565b611177612044565b6000611181611683565b73ffffffffffffffffffffffffffffffffffffffff16476040516111a490614452565b60006040518083038185875af1925050503d80600081146111e1576040519150601f19603f3d011682016040523d82523d6000602084013e6111e6565b606091505b50509050806111f457600080fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461124757611246336122c0565b5b6112528484846124e1565b50505050565b611260612044565b61127561126c8261147f565b61dead83611209565b50565b60105481565b600080600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b828110156113b8576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516113aa578583036113a157819450505050506113eb565b82806001019350505b5080806001019150506112b8565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600e60019054906101000a900460ff1681565b61140b612044565b80600b908161141a9190614609565b5050565b611426612044565b60001515600e60019054906101000a900460ff16151503611461576001600e60016101000a81548160ff02191690831515021790555061147d565b6000600e60016101000a81548160ff0219169083151502179055505b565b600061148a82612501565b600001519050919050565b61149d612044565b8181905084849050146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90614727565b60405180910390fd5b60005b848490508110156115505761153d85858381811061150957611508614747565b5b905060200201602081019061151e9190613c91565b84848481811061153157611530614747565b5b905060200201356127ab565b808061154890614776565b9150506114e8565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115be576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61162e612044565b61163860006127c9565b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b611679612044565b8060118190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b5612044565b8060108190555050565b6116c7612044565b80600d90816116d69190614609565b5050565b6060600380546116e99061431f565b80601f01602080910402602001604051908101604052809291908181526020018280546117159061431f565b80156117625780601f1061173757610100808354040283529160200191611762565b820191906000526020600020905b81548152906001019060200180831161174557829003601f168201915b5050505050905090565b611774612044565b60005b828290508110156117b7576117a483838381811061179857611797614747565b5b90506020020135611258565b80806117af90614776565b915050611777565b505050565b600f54816117c8610cb5565b6117d291906147be565b1115611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a9061483e565b60405180910390fd5b61181b611683565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a3057600e60009054906101000a900460ff1661189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906148aa565b60405180910390fd5b601154816118a933611557565b6118b391906147be565b11156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614916565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012546119439190614936565b905080826119519190614936565b60105461195e919061437f565b3410156119a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611997906149b6565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119eb91906147be565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b611a3a33826127ab565b50565b81611a47816122c0565b611a51838361288f565b505050565b60115481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a9a57611a99336122c0565b5b611aa685858585612a06565b5050505050565b6060611ab882612257565b611aee576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600e60019054906101000a900460ff16151503611b9b57600c8054611b169061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b429061431f565b8015611b8f5780601f10611b6457610100808354040283529160200191611b8f565b820191906000526020600020905b815481529060010190602001808311611b7257829003601f168201915b50505050509050611bf5565b6000600b8054611baa9061431f565b905003611bc65760405180602001604052806000815250611bf2565b600b611bd183612a59565b604051602001611be2929190614ae1565b6040516020818303038152906040525b90505b919050565b611c02612044565b60001515600e60009054906101000a900460ff16151503611c3d576001600e60006101000a81548160ff021916908315150217905550611c59565b6000600e60006101000a81548160ff0219169083151502179055505b565b600d8054611c689061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c949061431f565b8015611ce15780601f10611cb657610100808354040283529160200191611ce1565b820191906000526020600020905b815481529060010190602001808311611cc457829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d85612044565b80600f8190555050565b611d97612044565b80600c9081611da69190614609565b5050565b611db2612044565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890614b82565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e6a816127c9565b50565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fb357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fc35750611fc282612bbf565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061203d575061203c82611e80565b5b9050919050565b61204c612c29565b73ffffffffffffffffffffffffffffffffffffffff1661206a611683565b73ffffffffffffffffffffffffffffffffffffffff16146120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614bee565b60405180910390fd5b565b6120ca6124d7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614c80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90614cec565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16821080156122b9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156123ba576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612337929190614d0c565b602060405180830381865afa158015612354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123789190614d4a565b6123b957806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016123b09190613c36565b60405180910390fd5b5b50565b60006123c88261147f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361242f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661244e612c29565b73ffffffffffffffffffffffffffffffffffffffff1614158015612480575061247e81612479612c29565b611ce9565b155b156124b7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124c2838383612c31565b505050565b6124d2838383612ce3565b505050565b6000612710905090565b6124fc83838360405180602001604052806000815250611a5c565b505050565b61250961391e565b6000829050600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612774576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161277257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126565780925050506127a6565b5b60011561277157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461276c5780925050506127a6565b612657565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6127c58282604051806020016040528060008152506133ec565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612897612c29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128fb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612908612c29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166129b5612c29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129fa9190613a15565b60405180910390a35050565b612a11848484612ce3565b612a1d848484846133fe565b612a53576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606060008203612aa0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bba565b600082905060005b60008214612ad2578080612abb90614776565b915050600a82612acb91906143f0565b9150612aa8565b60008167ffffffffffffffff811115612aee57612aed613e28565b5b6040519080825280601f01601f191660200182016040528015612b205781602001600182028036833780820191505090505b50905060008290508593505b60008414612bb257600a84612b419190614d77565b6030612b4d91906147be565b60f81b8282612b5b90614da8565b92508281518110612b6f57612b6e614747565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84612bab91906143f0565b9350612b2c565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612cee82612501565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612d15612c29565b73ffffffffffffffffffffffffffffffffffffffff161480612d485750612d478260000151612d42612c29565b611ce9565b5b80612d8d5750612d56612c29565b73ffffffffffffffffffffffffffffffffffffffff16612d7584610b7a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dea575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612dd2612c29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612e23576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e62612c29565b73ffffffffffffffffffffffffffffffffffffffff1614612f4b57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ee3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f4a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1603612fb1576040517fb238962b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613018576040517fb238962b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614613081576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61308e858585600161357c565b61309e6000848460000151612c31565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361337c57600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681101561337b5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133e58585856001613582565b5050505050565b6133f98383836001613588565b505050565b600061341f8473ffffffffffffffffffffffffffffffffffffffff16611e6d565b1561356f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613448612c29565b8786866040518563ffffffff1660e01b815260040161346a9493929190614e26565b6020604051808303816000875af19250505080156134a657506040513d601f19601f820116820180604052508101906134a39190614e87565b60015b61351f573d80600081146134d6576040519150601f19603f3d011682016040523d82523d6000602084013e6134db565b606091505b506000815103613517576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613574565b600190505b949350505050565b50505050565b50505050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613623576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361365d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61366a600086838761357c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156138cf57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613883575061388160008884886133fe565b155b156138ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613808565b5080600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506139176000868387613582565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139aa81613975565b81146139b557600080fd5b50565b6000813590506139c7816139a1565b92915050565b6000602082840312156139e3576139e261396b565b5b60006139f1848285016139b8565b91505092915050565b60008115159050919050565b613a0f816139fa565b82525050565b6000602082019050613a2a6000830184613a06565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5b82613a30565b9050919050565b613a6b81613a50565b8114613a7657600080fd5b50565b600081359050613a8881613a62565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613aaf81613a8e565b8114613aba57600080fd5b50565b600081359050613acc81613aa6565b92915050565b60008060408385031215613ae957613ae861396b565b5b6000613af785828601613a79565b9250506020613b0885828601613abd565b9150509250929050565b6000819050919050565b613b2581613b12565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060208284031215613b5e57613b5d61396b565b5b6000613b6c84828501613b33565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613baf578082015181840152602081019050613b94565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bd782613b75565b613be18185613b80565b9350613bf1818560208601613b91565b613bfa81613bbb565b840191505092915050565b60006020820190508181036000830152613c1f8184613bcc565b905092915050565b613c3081613a50565b82525050565b6000602082019050613c4b6000830184613c27565b92915050565b60008060408385031215613c6857613c6761396b565b5b6000613c7685828601613a79565b9250506020613c8785828601613b33565b9150509250929050565b600060208284031215613ca757613ca661396b565b5b6000613cb584828501613a79565b91505092915050565b613cc781613b12565b82525050565b6000602082019050613ce26000830184613cbe565b92915050565b600080600060608486031215613d0157613d0061396b565b5b6000613d0f86828701613a79565b9350506020613d2086828701613a79565b9250506040613d3186828701613b33565b9150509250925092565b60008060408385031215613d5257613d5161396b565b5b6000613d6085828601613b33565b9250506020613d7185828601613b33565b9150509250929050565b6000604082019050613d906000830185613c27565b613d9d6020830184613cbe565b9392505050565b6000819050919050565b6000613dc9613dc4613dbf84613a30565b613da4565b613a30565b9050919050565b6000613ddb82613dae565b9050919050565b6000613ded82613dd0565b9050919050565b613dfd81613de2565b82525050565b6000602082019050613e186000830184613df4565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e6082613bbb565b810181811067ffffffffffffffff82111715613e7f57613e7e613e28565b5b80604052505050565b6000613e92613961565b9050613e9e8282613e57565b919050565b600067ffffffffffffffff821115613ebe57613ebd613e28565b5b613ec782613bbb565b9050602081019050919050565b82818337600083830152505050565b6000613ef6613ef184613ea3565b613e88565b905082815260208101848484011115613f1257613f11613e23565b5b613f1d848285613ed4565b509392505050565b600082601f830112613f3a57613f39613e1e565b5b8135613f4a848260208601613ee3565b91505092915050565b600060208284031215613f6957613f6861396b565b5b600082013567ffffffffffffffff811115613f8757613f86613970565b5b613f9384828501613f25565b91505092915050565b600080fd5b600080fd5b60008083601f840112613fbc57613fbb613e1e565b5b8235905067ffffffffffffffff811115613fd957613fd8613f9c565b5b602083019150836020820283011115613ff557613ff4613fa1565b5b9250929050565b60008083601f84011261401257614011613e1e565b5b8235905067ffffffffffffffff81111561402f5761402e613f9c565b5b60208301915083602082028301111561404b5761404a613fa1565b5b9250929050565b6000806000806040858703121561406c5761406b61396b565b5b600085013567ffffffffffffffff81111561408a57614089613970565b5b61409687828801613fa6565b9450945050602085013567ffffffffffffffff8111156140b9576140b8613970565b5b6140c587828801613ffc565b925092505092959194509250565b600080602083850312156140ea576140e961396b565b5b600083013567ffffffffffffffff81111561410857614107613970565b5b61411485828601613ffc565b92509250509250929050565b614129816139fa565b811461413457600080fd5b50565b60008135905061414681614120565b92915050565b600080604083850312156141635761416261396b565b5b600061417185828601613a79565b925050602061418285828601614137565b9150509250929050565b600067ffffffffffffffff8211156141a7576141a6613e28565b5b6141b082613bbb565b9050602081019050919050565b60006141d06141cb8461418c565b613e88565b9050828152602081018484840111156141ec576141eb613e23565b5b6141f7848285613ed4565b509392505050565b600082601f83011261421457614213613e1e565b5b81356142248482602086016141bd565b91505092915050565b600080600080608085870312156142475761424661396b565b5b600061425587828801613a79565b945050602061426687828801613a79565b935050604061427787828801613b33565b925050606085013567ffffffffffffffff81111561429857614297613970565b5b6142a4878288016141ff565b91505092959194509250565b600080604083850312156142c7576142c661396b565b5b60006142d585828601613a79565b92505060206142e685828601613a79565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061433757607f821691505b60208210810361434a576143496142f0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061438a82613b12565b915061439583613b12565b92508282026143a381613b12565b915082820484148315176143ba576143b9614350565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143fb82613b12565b915061440683613b12565b925082614416576144156143c1565b5b828204905092915050565b600081905092915050565b50565b600061443c600083614421565b91506144478261442c565b600082019050919050565b600061445d8261442f565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144c97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261448c565b6144d3868361448c565b95508019841693508086168417925050509392505050565b60006145066145016144fc84613b12565b613da4565b613b12565b9050919050565b6000819050919050565b614520836144eb565b61453461452c8261450d565b848454614499565b825550505050565b600090565b61454961453c565b614554818484614517565b505050565b5b818110156145785761456d600082614541565b60018101905061455a565b5050565b601f8211156145bd5761458e81614467565b6145978461447c565b810160208510156145a6578190505b6145ba6145b28561447c565b830182614559565b50505b505050565b600082821c905092915050565b60006145e0600019846008026145c2565b1980831691505092915050565b60006145f983836145cf565b9150826002028217905092915050565b61461282613b75565b67ffffffffffffffff81111561462b5761462a613e28565b5b614635825461431f565b61464082828561457c565b600060209050601f8311600181146146735760008415614661578287015190505b61466b85826145ed565b8655506146d3565b601f19841661468186614467565b60005b828110156146a957848901518255600182019150602085019450602081019050614684565b868310156146c657848901516146c2601f8916826145cf565b8355505b6001600288020188555050505b505050505050565b7f41697264726f70206461746120646f6573206e6f74206d617463680000000000600082015250565b6000614711601b83613b80565b915061471c826146db565b602082019050919050565b6000602082019050818103600083015261474081614704565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061478182613b12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147b3576147b2614350565b5b600182019050919050565b60006147c982613b12565b91506147d483613b12565b92508282019050808211156147ec576147eb614350565b5b92915050565b7f4e6f204d6f7265204e46547320746f204d696e74000000000000000000000000600082015250565b6000614828601483613b80565b9150614833826147f2565b602082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b7f5075626c6963206d696e7420737461747573206973206f666600000000000000600082015250565b6000614894601983613b80565b915061489f8261485e565b602082019050919050565b600060208201905081810360008301526148c381614887565b9050919050565b7f5065722057616c6c6574204c696d697420526561636865640000000000000000600082015250565b6000614900601883613b80565b915061490b826148ca565b602082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b600061494182613b12565b915061494c83613b12565b925082820390508181111561496457614963614350565b5b92915050565b7f4e6f7420456e6f756768204554482053656e7400000000000000000000000000600082015250565b60006149a0601383613b80565b91506149ab8261496a565b602082019050919050565b600060208201905081810360008301526149cf81614993565b9050919050565b600081905092915050565b600081546149ee8161431f565b6149f881866149d6565b94506001821660008114614a135760018114614a2857614a5b565b60ff1983168652811515820286019350614a5b565b614a3185614467565b60005b83811015614a5357815481890152600182019150602081019050614a34565b838801955050505b50505092915050565b6000614a6f82613b75565b614a7981856149d6565b9350614a89818560208601613b91565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614acb6005836149d6565b9150614ad682614a95565b600582019050919050565b6000614aed82856149e1565b9150614af98284614a64565b9150614b0482614abe565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b6c602683613b80565b9150614b7782614b10565b604082019050919050565b60006020820190508181036000830152614b9b81614b5f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614bd8602083613b80565b9150614be382614ba2565b602082019050919050565b60006020820190508181036000830152614c0781614bcb565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614c6a602a83613b80565b9150614c7582614c0e565b604082019050919050565b60006020820190508181036000830152614c9981614c5d565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614cd6601983613b80565b9150614ce182614ca0565b602082019050919050565b60006020820190508181036000830152614d0581614cc9565b9050919050565b6000604082019050614d216000830185613c27565b614d2e6020830184613c27565b9392505050565b600081519050614d4481614120565b92915050565b600060208284031215614d6057614d5f61396b565b5b6000614d6e84828501614d35565b91505092915050565b6000614d8282613b12565b9150614d8d83613b12565b925082614d9d57614d9c6143c1565b5b828206905092915050565b6000614db382613b12565b915060008203614dc657614dc5614350565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000614df882614dd1565b614e028185614ddc565b9350614e12818560208601613b91565b614e1b81613bbb565b840191505092915050565b6000608082019050614e3b6000830187613c27565b614e486020830186613c27565b614e556040830185613cbe565b8181036060830152614e678184614ded565b905095945050505050565b600081519050614e81816139a1565b92915050565b600060208284031215614e9d57614e9c61396b565b5b6000614eab84828501614e72565b9150509291505056fea2646970667358221220100270fb73c0b31ac9e2d2792175a1a3bc2b72c371ce29803ef8b189cfad9a7264736f6c63430008120033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51626d65717353646b785462475778596174626d71355069596331676a3836717a386d576a475031724d6d582f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51626d65717353646b785462475778596174626d71355069596331676a3836717a386d576a475031724d6d582f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51626d65717353646b785462475778596174626d71355069596331676a3836717a386d576a475031724d6d582f00000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c80635b8ad4291161015a5780639e124d69116100c1578063dcc7eb351161007a578063dcc7eb35146109a4578063e8a3d485146109bb578063e985e9c5146109e6578063ec9496ba14610a23578063f2c4ce1e14610a4c578063f2fde38b14610a7557610288565b80639e124d69146108a5578063a0712d68146108ce578063a22cb465146108ea578063ab53fcaa14610913578063b88d4fde1461093e578063c87b56dd1461096757610288565b806381c4cede1161011357806381c4cede146107a9578063835d997e146107d45780638da5cb5b146107fd5780638dbb7c0614610828578063938e3d7b1461085157806395d89b411461087a57610288565b80635b8ad429146106ba5780636352211e146106d1578063672434821461070e57806370a082311461072a578063715018a6146107675780637fdd08e81461077e57610288565b80632f745c59116101fe57806342842e0e116101b757806342842e0e146105ac57806342966c68146105d5578063453afb0f146105fe5780634f6ccce714610629578063518302271461066657806355f804b31461069157610288565b80632f745c59146104a757806332a825ce146104e457806332cb6b0c1461050f578063389fcf061461053a5780633ccfd60b1461057757806341f434341461058157610288565b8063081c8c4411610250578063081c8c4414610384578063095ea7b3146103af5780631015805b146103d857806318160ddd1461041557806323b872dd146104405780632a55205a1461046957610288565b806301ffc9a71461028d57806302fa7c47146102ca578063040d1924146102f357806306fdde031461031c578063081812fc14610347575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906139cd565b610a9e565b6040516102c19190613a15565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613ad2565b610ac0565b005b3480156102ff57600080fd5b5061031a60048036038101906103159190613b48565b610ad6565b005b34801561032857600080fd5b50610331610ae8565b60405161033e9190613c05565b60405180910390f35b34801561035357600080fd5b5061036e60048036038101906103699190613b48565b610b7a565b60405161037b9190613c36565b60405180910390f35b34801561039057600080fd5b50610399610bf6565b6040516103a69190613c05565b60405180910390f35b3480156103bb57600080fd5b506103d660048036038101906103d19190613c51565b610c84565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190613c91565b610c9d565b60405161040c9190613ccd565b60405180910390f35b34801561042157600080fd5b5061042a610cb5565b6040516104379190613ccd565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613ce8565b610d0d565b005b34801561047557600080fd5b50610490600480360381019061048b9190613d3b565b610d5c565b60405161049e929190613d7b565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613c51565b610f46565b6040516104db9190613ccd565b60405180910390f35b3480156104f057600080fd5b506104f961114b565b6040516105069190613ccd565b60405180910390f35b34801561051b57600080fd5b50610524611151565b6040516105319190613ccd565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190613c91565b611157565b60405161056e9190613ccd565b60405180910390f35b61057f61116f565b005b34801561058d57600080fd5b506105966111f7565b6040516105a39190613e03565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613ce8565b611209565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190613b48565b611258565b005b34801561060a57600080fd5b50610613611278565b6040516106209190613ccd565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190613b48565b61127e565b60405161065d9190613ccd565b60405180910390f35b34801561067257600080fd5b5061067b6113f0565b6040516106889190613a15565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613f53565b611403565b005b3480156106c657600080fd5b506106cf61141e565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613b48565b61147f565b6040516107059190613c36565b60405180910390f35b61072860048036038101906107239190614052565b611495565b005b34801561073657600080fd5b50610751600480360381019061074c9190613c91565b611557565b60405161075e9190613ccd565b60405180910390f35b34801561077357600080fd5b5061077c611626565b005b34801561078a57600080fd5b5061079361163a565b6040516107a09190613c36565b60405180910390f35b3480156107b557600080fd5b506107be61165e565b6040516107cb9190613a15565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f69190613b48565b611671565b005b34801561080957600080fd5b50610812611683565b60405161081f9190613c36565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613b48565b6116ad565b005b34801561085d57600080fd5b5061087860048036038101906108739190613f53565b6116bf565b005b34801561088657600080fd5b5061088f6116da565b60405161089c9190613c05565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c791906140d3565b61176c565b005b6108e860048036038101906108e39190613b48565b6117bc565b005b3480156108f657600080fd5b50610911600480360381019061090c919061414c565b611a3d565b005b34801561091f57600080fd5b50610928611a56565b6040516109359190613ccd565b60405180910390f35b34801561094a57600080fd5b506109656004803603810190610960919061422d565b611a5c565b005b34801561097357600080fd5b5061098e60048036038101906109899190613b48565b611aad565b60405161099b9190613c05565b60405180910390f35b3480156109b057600080fd5b506109b9611bfa565b005b3480156109c757600080fd5b506109d0611c5b565b6040516109dd9190613c05565b60405180910390f35b3480156109f257600080fd5b50610a0d6004803603810190610a0891906142b0565b611ce9565b604051610a1a9190613a15565b60405180910390f35b348015610a2f57600080fd5b50610a4a6004803603810190610a459190613b48565b611d7d565b005b348015610a5857600080fd5b50610a736004803603810190610a6e9190613f53565b611d8f565b005b348015610a8157600080fd5b50610a9c6004803603810190610a979190613c91565b611daa565b005b6000610aa982611e80565b80610ab95750610ab882611fca565b5b9050919050565b610ac8612044565b610ad282826120c2565b5050565b610ade612044565b8060128190555050565b606060028054610af79061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b239061431f565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b5050505050905090565b6000610b8582612257565b610bbb576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610c039061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2f9061431f565b8015610c7c5780601f10610c5157610100808354040283529160200191610c7c565b820191906000526020600020905b815481529060010190602001808311610c5f57829003601f168201915b505050505081565b81610c8e816122c0565b610c9883836123bd565b505050565b60136020528060005260406000206000915090505481565b6000600160109054906101000a90046fffffffffffffffffffffffffffffffff16600160009054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d4b57610d4a336122c0565b5b610d568484846124c7565b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ef15760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610efb6124d7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f27919061437f565b610f3191906143f0565b90508160000151819350935050509250929050565b6000610f5183611557565b8210610f89576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611140576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156110a15750611133565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110e157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361113157868403611128578195505050505050611145565b83806001019450505b505b8080600101915050610fc4565b600080fd5b92915050565b60125481565b600f5481565b60146020528060005260406000206000915090505481565b611177612044565b6000611181611683565b73ffffffffffffffffffffffffffffffffffffffff16476040516111a490614452565b60006040518083038185875af1925050503d80600081146111e1576040519150601f19603f3d011682016040523d82523d6000602084013e6111e6565b606091505b50509050806111f457600080fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461124757611246336122c0565b5b6112528484846124e1565b50505050565b611260612044565b61127561126c8261147f565b61dead83611209565b50565b60105481565b600080600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b828110156113b8576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516113aa578583036113a157819450505050506113eb565b82806001019350505b5080806001019150506112b8565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600e60019054906101000a900460ff1681565b61140b612044565b80600b908161141a9190614609565b5050565b611426612044565b60001515600e60019054906101000a900460ff16151503611461576001600e60016101000a81548160ff02191690831515021790555061147d565b6000600e60016101000a81548160ff0219169083151502179055505b565b600061148a82612501565b600001519050919050565b61149d612044565b8181905084849050146114e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dc90614727565b60405180910390fd5b60005b848490508110156115505761153d85858381811061150957611508614747565b5b905060200201602081019061151e9190613c91565b84848481811061153157611530614747565b5b905060200201356127ab565b808061154890614776565b9150506114e8565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115be576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61162e612044565b61163860006127c9565b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b611679612044565b8060118190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b5612044565b8060108190555050565b6116c7612044565b80600d90816116d69190614609565b5050565b6060600380546116e99061431f565b80601f01602080910402602001604051908101604052809291908181526020018280546117159061431f565b80156117625780601f1061173757610100808354040283529160200191611762565b820191906000526020600020905b81548152906001019060200180831161174557829003601f168201915b5050505050905090565b611774612044565b60005b828290508110156117b7576117a483838381811061179857611797614747565b5b90506020020135611258565b80806117af90614776565b915050611777565b505050565b600f54816117c8610cb5565b6117d291906147be565b1115611813576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180a9061483e565b60405180910390fd5b61181b611683565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a3057600e60009054906101000a900460ff1661189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906148aa565b60405180910390fd5b601154816118a933611557565b6118b391906147be565b11156118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb90614916565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546012546119439190614936565b905080826119519190614936565b60105461195e919061437f565b3410156119a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611997906149b6565b60405180910390fd5b80601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119eb91906147be565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b611a3a33826127ab565b50565b81611a47816122c0565b611a51838361288f565b505050565b60115481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a9a57611a99336122c0565b5b611aa685858585612a06565b5050505050565b6060611ab882612257565b611aee576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600e60019054906101000a900460ff16151503611b9b57600c8054611b169061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b429061431f565b8015611b8f5780601f10611b6457610100808354040283529160200191611b8f565b820191906000526020600020905b815481529060010190602001808311611b7257829003601f168201915b50505050509050611bf5565b6000600b8054611baa9061431f565b905003611bc65760405180602001604052806000815250611bf2565b600b611bd183612a59565b604051602001611be2929190614ae1565b6040516020818303038152906040525b90505b919050565b611c02612044565b60001515600e60009054906101000a900460ff16151503611c3d576001600e60006101000a81548160ff021916908315150217905550611c59565b6000600e60006101000a81548160ff0219169083151502179055505b565b600d8054611c689061431f565b80601f0160208091040260200160405190810160405280929190818152602001828054611c949061431f565b8015611ce15780601f10611cb657610100808354040283529160200191611ce1565b820191906000526020600020905b815481529060010190602001808311611cc457829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d85612044565b80600f8190555050565b611d97612044565b80600c9081611da69190614609565b5050565b611db2612044565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1890614b82565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e6a816127c9565b50565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fb357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fc35750611fc282612bbf565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061203d575061203c82611e80565b5b9050919050565b61204c612c29565b73ffffffffffffffffffffffffffffffffffffffff1661206a611683565b73ffffffffffffffffffffffffffffffffffffffff16146120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614bee565b60405180910390fd5b565b6120ca6124d7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f90614c80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90614cec565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16821080156122b9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156123ba576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401612337929190614d0c565b602060405180830381865afa158015612354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123789190614d4a565b6123b957806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016123b09190613c36565b60405180910390fd5b5b50565b60006123c88261147f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361242f576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661244e612c29565b73ffffffffffffffffffffffffffffffffffffffff1614158015612480575061247e81612479612c29565b611ce9565b155b156124b7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124c2838383612c31565b505050565b6124d2838383612ce3565b505050565b6000612710905090565b6124fc83838360405180602001604052806000815250611a5c565b505050565b61250961391e565b6000829050600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16811015612774576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161277257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126565780925050506127a6565b5b60011561277157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461276c5780925050506127a6565b612657565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6127c58282604051806020016040528060008152506133ec565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612897612c29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128fb576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612908612c29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166129b5612c29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129fa9190613a15565b60405180910390a35050565b612a11848484612ce3565b612a1d848484846133fe565b612a53576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606060008203612aa0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bba565b600082905060005b60008214612ad2578080612abb90614776565b915050600a82612acb91906143f0565b9150612aa8565b60008167ffffffffffffffff811115612aee57612aed613e28565b5b6040519080825280601f01601f191660200182016040528015612b205781602001600182028036833780820191505090505b50905060008290508593505b60008414612bb257600a84612b419190614d77565b6030612b4d91906147be565b60f81b8282612b5b90614da8565b92508281518110612b6f57612b6e614747565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84612bab91906143f0565b9350612b2c565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612cee82612501565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612d15612c29565b73ffffffffffffffffffffffffffffffffffffffff161480612d485750612d478260000151612d42612c29565b611ce9565b5b80612d8d5750612d56612c29565b73ffffffffffffffffffffffffffffffffffffffff16612d7584610b7a565b73ffffffffffffffffffffffffffffffffffffffff16145b80612dea575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612dd2612c29565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612e23576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612e62612c29565b73ffffffffffffffffffffffffffffffffffffffff1614612f4b57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ee3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f4a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1603612fb1576040517fb238962b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613018576040517fb238962b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614613081576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61308e858585600161357c565b61309e6000848460000151612c31565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361337c57600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681101561337b5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133e58585856001613582565b5050505050565b6133f98383836001613588565b505050565b600061341f8473ffffffffffffffffffffffffffffffffffffffff16611e6d565b1561356f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613448612c29565b8786866040518563ffffffff1660e01b815260040161346a9493929190614e26565b6020604051808303816000875af19250505080156134a657506040513d601f19601f820116820180604052508101906134a39190614e87565b60015b61351f573d80600081146134d6576040519150601f19603f3d011682016040523d82523d6000602084013e6134db565b606091505b506000815103613517576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613574565b600190505b949350505050565b50505050565b50505050565b6000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613623576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000840361365d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61366a600086838761357c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156138cf57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613883575061388160008884886133fe565b155b156138ba576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613808565b5080600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550506139176000868387613582565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139aa81613975565b81146139b557600080fd5b50565b6000813590506139c7816139a1565b92915050565b6000602082840312156139e3576139e261396b565b5b60006139f1848285016139b8565b91505092915050565b60008115159050919050565b613a0f816139fa565b82525050565b6000602082019050613a2a6000830184613a06565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5b82613a30565b9050919050565b613a6b81613a50565b8114613a7657600080fd5b50565b600081359050613a8881613a62565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613aaf81613a8e565b8114613aba57600080fd5b50565b600081359050613acc81613aa6565b92915050565b60008060408385031215613ae957613ae861396b565b5b6000613af785828601613a79565b9250506020613b0885828601613abd565b9150509250929050565b6000819050919050565b613b2581613b12565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060208284031215613b5e57613b5d61396b565b5b6000613b6c84828501613b33565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613baf578082015181840152602081019050613b94565b60008484015250505050565b6000601f19601f8301169050919050565b6000613bd782613b75565b613be18185613b80565b9350613bf1818560208601613b91565b613bfa81613bbb565b840191505092915050565b60006020820190508181036000830152613c1f8184613bcc565b905092915050565b613c3081613a50565b82525050565b6000602082019050613c4b6000830184613c27565b92915050565b60008060408385031215613c6857613c6761396b565b5b6000613c7685828601613a79565b9250506020613c8785828601613b33565b9150509250929050565b600060208284031215613ca757613ca661396b565b5b6000613cb584828501613a79565b91505092915050565b613cc781613b12565b82525050565b6000602082019050613ce26000830184613cbe565b92915050565b600080600060608486031215613d0157613d0061396b565b5b6000613d0f86828701613a79565b9350506020613d2086828701613a79565b9250506040613d3186828701613b33565b9150509250925092565b60008060408385031215613d5257613d5161396b565b5b6000613d6085828601613b33565b9250506020613d7185828601613b33565b9150509250929050565b6000604082019050613d906000830185613c27565b613d9d6020830184613cbe565b9392505050565b6000819050919050565b6000613dc9613dc4613dbf84613a30565b613da4565b613a30565b9050919050565b6000613ddb82613dae565b9050919050565b6000613ded82613dd0565b9050919050565b613dfd81613de2565b82525050565b6000602082019050613e186000830184613df4565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e6082613bbb565b810181811067ffffffffffffffff82111715613e7f57613e7e613e28565b5b80604052505050565b6000613e92613961565b9050613e9e8282613e57565b919050565b600067ffffffffffffffff821115613ebe57613ebd613e28565b5b613ec782613bbb565b9050602081019050919050565b82818337600083830152505050565b6000613ef6613ef184613ea3565b613e88565b905082815260208101848484011115613f1257613f11613e23565b5b613f1d848285613ed4565b509392505050565b600082601f830112613f3a57613f39613e1e565b5b8135613f4a848260208601613ee3565b91505092915050565b600060208284031215613f6957613f6861396b565b5b600082013567ffffffffffffffff811115613f8757613f86613970565b5b613f9384828501613f25565b91505092915050565b600080fd5b600080fd5b60008083601f840112613fbc57613fbb613e1e565b5b8235905067ffffffffffffffff811115613fd957613fd8613f9c565b5b602083019150836020820283011115613ff557613ff4613fa1565b5b9250929050565b60008083601f84011261401257614011613e1e565b5b8235905067ffffffffffffffff81111561402f5761402e613f9c565b5b60208301915083602082028301111561404b5761404a613fa1565b5b9250929050565b6000806000806040858703121561406c5761406b61396b565b5b600085013567ffffffffffffffff81111561408a57614089613970565b5b61409687828801613fa6565b9450945050602085013567ffffffffffffffff8111156140b9576140b8613970565b5b6140c587828801613ffc565b925092505092959194509250565b600080602083850312156140ea576140e961396b565b5b600083013567ffffffffffffffff81111561410857614107613970565b5b61411485828601613ffc565b92509250509250929050565b614129816139fa565b811461413457600080fd5b50565b60008135905061414681614120565b92915050565b600080604083850312156141635761416261396b565b5b600061417185828601613a79565b925050602061418285828601614137565b9150509250929050565b600067ffffffffffffffff8211156141a7576141a6613e28565b5b6141b082613bbb565b9050602081019050919050565b60006141d06141cb8461418c565b613e88565b9050828152602081018484840111156141ec576141eb613e23565b5b6141f7848285613ed4565b509392505050565b600082601f83011261421457614213613e1e565b5b81356142248482602086016141bd565b91505092915050565b600080600080608085870312156142475761424661396b565b5b600061425587828801613a79565b945050602061426687828801613a79565b935050604061427787828801613b33565b925050606085013567ffffffffffffffff81111561429857614297613970565b5b6142a4878288016141ff565b91505092959194509250565b600080604083850312156142c7576142c661396b565b5b60006142d585828601613a79565b92505060206142e685828601613a79565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061433757607f821691505b60208210810361434a576143496142f0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061438a82613b12565b915061439583613b12565b92508282026143a381613b12565b915082820484148315176143ba576143b9614350565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143fb82613b12565b915061440683613b12565b925082614416576144156143c1565b5b828204905092915050565b600081905092915050565b50565b600061443c600083614421565b91506144478261442c565b600082019050919050565b600061445d8261442f565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144c97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261448c565b6144d3868361448c565b95508019841693508086168417925050509392505050565b60006145066145016144fc84613b12565b613da4565b613b12565b9050919050565b6000819050919050565b614520836144eb565b61453461452c8261450d565b848454614499565b825550505050565b600090565b61454961453c565b614554818484614517565b505050565b5b818110156145785761456d600082614541565b60018101905061455a565b5050565b601f8211156145bd5761458e81614467565b6145978461447c565b810160208510156145a6578190505b6145ba6145b28561447c565b830182614559565b50505b505050565b600082821c905092915050565b60006145e0600019846008026145c2565b1980831691505092915050565b60006145f983836145cf565b9150826002028217905092915050565b61461282613b75565b67ffffffffffffffff81111561462b5761462a613e28565b5b614635825461431f565b61464082828561457c565b600060209050601f8311600181146146735760008415614661578287015190505b61466b85826145ed565b8655506146d3565b601f19841661468186614467565b60005b828110156146a957848901518255600182019150602085019450602081019050614684565b868310156146c657848901516146c2601f8916826145cf565b8355505b6001600288020188555050505b505050505050565b7f41697264726f70206461746120646f6573206e6f74206d617463680000000000600082015250565b6000614711601b83613b80565b915061471c826146db565b602082019050919050565b6000602082019050818103600083015261474081614704565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061478182613b12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147b3576147b2614350565b5b600182019050919050565b60006147c982613b12565b91506147d483613b12565b92508282019050808211156147ec576147eb614350565b5b92915050565b7f4e6f204d6f7265204e46547320746f204d696e74000000000000000000000000600082015250565b6000614828601483613b80565b9150614833826147f2565b602082019050919050565b600060208201905081810360008301526148578161481b565b9050919050565b7f5075626c6963206d696e7420737461747573206973206f666600000000000000600082015250565b6000614894601983613b80565b915061489f8261485e565b602082019050919050565b600060208201905081810360008301526148c381614887565b9050919050565b7f5065722057616c6c6574204c696d697420526561636865640000000000000000600082015250565b6000614900601883613b80565b915061490b826148ca565b602082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b600061494182613b12565b915061494c83613b12565b925082820390508181111561496457614963614350565b5b92915050565b7f4e6f7420456e6f756768204554482053656e7400000000000000000000000000600082015250565b60006149a0601383613b80565b91506149ab8261496a565b602082019050919050565b600060208201905081810360008301526149cf81614993565b9050919050565b600081905092915050565b600081546149ee8161431f565b6149f881866149d6565b94506001821660008114614a135760018114614a2857614a5b565b60ff1983168652811515820286019350614a5b565b614a3185614467565b60005b83811015614a5357815481890152600182019150602081019050614a34565b838801955050505b50505092915050565b6000614a6f82613b75565b614a7981856149d6565b9350614a89818560208601613b91565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614acb6005836149d6565b9150614ad682614a95565b600582019050919050565b6000614aed82856149e1565b9150614af98284614a64565b9150614b0482614abe565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b6c602683613b80565b9150614b7782614b10565b604082019050919050565b60006020820190508181036000830152614b9b81614b5f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614bd8602083613b80565b9150614be382614ba2565b602082019050919050565b60006020820190508181036000830152614c0781614bcb565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614c6a602a83613b80565b9150614c7582614c0e565b604082019050919050565b60006020820190508181036000830152614c9981614c5d565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614cd6601983613b80565b9150614ce182614ca0565b602082019050919050565b60006020820190508181036000830152614d0581614cc9565b9050919050565b6000604082019050614d216000830185613c27565b614d2e6020830184613c27565b9392505050565b600081519050614d4481614120565b92915050565b600060208284031215614d6057614d5f61396b565b5b6000614d6e84828501614d35565b91505092915050565b6000614d8282613b12565b9150614d8d83613b12565b925082614d9d57614d9c6143c1565b5b828206905092915050565b6000614db382613b12565b915060008203614dc657614dc5614350565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000614df882614dd1565b614e028185614ddc565b9350614e12818560208601613b91565b614e1b81613bbb565b840191505092915050565b6000608082019050614e3b6000830187613c27565b614e486020830186613c27565b614e556040830185613cbe565b8181036060830152614e678184614ded565b905095945050505050565b600081519050614e81816139a1565b92915050565b600060208284031215614e9d57614e9c61396b565b5b6000614eab84828501614e72565b9150509291505056fea2646970667358221220100270fb73c0b31ac9e2d2792175a1a3bc2b72c371ce29803ef8b189cfad9a7264736f6c63430008120033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51626d65717353646b785462475778596174626d71355069596331676a3836717a386d576a475031724d6d582f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51626d65717353646b785462475778596174626d71355069596331676a3836717a386d576a475031724d6d582f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51626d65717353646b785462475778596174626d71355069596331676a3836717a386d576a475031724d6d582f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmQbmeqsSdkxTbGWxYatbmq5PiYc1gj86qz8mWjGP1rMmX/
Arg [1] : _initNotRevealedUri (string): ipfs://QmQbmeqsSdkxTbGWxYatbmq5PiYc1gj86qz8mWjGP1rMmX/
Arg [2] : _contractURI (string): ipfs://QmQbmeqsSdkxTbGWxYatbmq5PiYc1gj86qz8mWjGP1rMmX/

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d51626d65717353646b785462475778596174626d713550
Arg [5] : 69596331676a3836717a386d576a475031724d6d582f00000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [7] : 697066733a2f2f516d51626d65717353646b785462475778596174626d713550
Arg [8] : 69596331676a3836717a386d576a475031724d6d582f00000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d51626d65717353646b785462475778596174626d713550
Arg [11] : 69596331676a3836717a386d576a475031724d6d582f00000000000000000000


Deployed Bytecode Sourcemap

57598:6179:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61325:487;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61822:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63397:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43038:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44549:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57742:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60573:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58077:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37665:280;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60738:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25408:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;39251:1105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58026:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57892:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58131:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62972:157;;;:::i;:::-;;3356:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60909:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59589:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57931:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38238:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57856:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63661:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62278:179;;;;;;;;;;;;;:::i;:::-;;42847:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58538:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40864:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11382:103;;;;;;;;;;;;;:::i;:::-;;35677:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57811:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63267:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10734:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63137:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62845:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43207:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59840:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58857:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60389:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57981:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61088:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60016:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62476:222;;;;;;;;;;;;;:::i;:::-;;57777:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45183:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63547:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62707:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61985:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61325:487;61473:4;61711:38;61737:11;61711:25;:38::i;:::-;:93;;;;61766:38;61792:11;61766:25;:38::i;:::-;61711:93;61691:113;;61325:487;;;:::o;61822:155::-;10620:13;:11;:13::i;:::-;61920:49:::1;61939:9;61950:18;61920;:49::i;:::-;61822:155:::0;;:::o;63397:142::-;10620:13;:11;:13::i;:::-;63511:20:::1;63489:19;:42;;;;63397:142:::0;:::o;43038:100::-;43092:13;43125:5;43118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43038:100;:::o;44549:204::-;44617:7;44642:16;44650:7;44642;:16::i;:::-;44637:64;;44667:34;;;;;;;;;;;;;;44637:64;44721:15;:24;44737:7;44721:24;;;;;;;;;;;;;;;;;;;;;44714:31;;44549:204;;;:::o;57742:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60573:157::-;60669:8;4877:30;4898:8;4877:20;:30::i;:::-;60690:32:::1;60704:8;60714:7;60690:13;:32::i;:::-;60573:157:::0;;;:::o;58077:47::-;;;;;;;;;;;;;;;;;:::o;37665:280::-;37718:7;37910:12;;;;;;;;;;;37894:13;;;;;;;;;;;:28;37887:35;;;;37665:280;:::o;60738:163::-;60839:4;4705:10;4697:18;;:4;:18;;;4693:83;;4732:32;4753:10;4732:20;:32::i;:::-;4693:83;60856:37:::1;60875:4;60881:2;60885:7;60856:18;:37::i;:::-;60738:163:::0;;;;:::o;25408:442::-;25505:7;25514;25534:26;25563:17;:27;25581:8;25563:27;;;;;;;;;;;25534:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25635:1;25607:30;;:7;:16;;;:30;;;25603:92;;25664:19;25654:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25603:92;25707:21;25772:17;:15;:17::i;:::-;25731:58;;25745:7;:23;;;25732:36;;:10;:36;;;;:::i;:::-;25731:58;;;;:::i;:::-;25707:82;;25810:7;:16;;;25828:13;25802:40;;;;;;25408:442;;;;;:::o;39251:1105::-;39340:7;39373:16;39383:5;39373:9;:16::i;:::-;39364:5;:25;39360:61;;39398:23;;;;;;;;;;;;;;39360:61;39432:22;39457:13;;;;;;;;;;;39432:38;;;;39481:19;39511:25;39712:9;39707:557;39727:14;39723:1;:18;39707:557;;;39767:31;39801:11;:14;39813:1;39801:14;;;;;;;;;;;39767:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39838:9;:16;;;39834:73;;;39879:8;;;39834:73;39955:1;39929:28;;:9;:14;;;:28;;;39925:111;;40002:9;:14;;;39982:34;;39925:111;40079:5;40058:26;;:17;:26;;;40054:195;;40128:5;40113:11;:20;40109:85;;40169:1;40162:8;;;;;;;;;40109:85;40216:13;;;;;;;40054:195;39748:516;39707:557;39743:3;;;;;;;39707:557;;;40340:8;;;39251:1105;;;;;:::o;58026:38::-;;;;:::o;57892:32::-;;;;:::o;58131:45::-;;;;;;;;;;;;;;;;;:::o;62972:157::-;10620:13;:11;:13::i;:::-;63031:9:::1;63054:7;:5;:7::i;:::-;63046:21;;63075;63046:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63030:71;;;63116:4;63108:13;;;::::0;::::1;;63019:110;62972:157::o:0;3356:143::-;3456:42;3356:143;:::o;60909:171::-;61014:4;4705:10;4697:18;;:4;:18;;;4693:83;;4732:32;4753:10;4732:20;:32::i;:::-;4693:83;61031:41:::1;61054:4;61060:2;61064:7;61031:22;:41::i;:::-;60909:171:::0;;;;:::o;59589:243::-;10620:13;:11;:13::i;:::-;59722:102:::1;59739:16;59747:7;59739;:16::i;:::-;59757:42;59816:7;59722:16;:102::i;:::-;59589:243:::0;:::o;57931:43::-;;;;:::o;38238:713::-;38305:7;38325:22;38350:13;;;;;;;;;;;38325:38;;;;38374:19;38569:9;38564:328;38584:14;38580:1;:18;38564:328;;;38624:31;38658:11;:14;38670:1;38658:14;;;;;;;;;;;38624:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38696:9;:16;;;38691:186;;38756:5;38741:11;:20;38737:85;;38797:1;38790:8;;;;;;;;38737:85;38844:13;;;;;;;38691:186;38605:287;38600:3;;;;;;;38564:328;;;;38920:23;;;;;;;;;;;;;;38238:713;;;;:::o;57856:27::-;;;;;;;;;;;;;:::o;63661:103::-;10620:13;:11;:13::i;:::-;63746:11:::1;63736:7;:21;;;;;;:::i;:::-;;63661:103:::0;:::o;62278:179::-;10620:13;:11;:13::i;:::-;62355:5:::1;62345:15;;:8;;;;;;;;;;;:15;;::::0;62342:108:::1;;62387:4;62376:8;;:15;;;;;;;;;;;;;;;;;;62342:108;;;62433:5;62422:8;;:16;;;;;;;;;;;;;;;;;;62342:108;62278:179::o:0;42847:124::-;42911:7;42938:20;42950:7;42938:11;:20::i;:::-;:25;;;42931:32;;42847:124;;;:::o;58538:311::-;10620:13;:11;:13::i;:::-;58680:8:::1;;:15;;58661:8;;:15;;:34;58653:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;58744:9;58740:102;58763:8;;:15;;58759:1;:19;58740:102;;;58795:35;58805:8;;58814:1;58805:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;58818:8;;58827:1;58818:11;;;;;;;:::i;:::-;;;;;;;;58795:9;:35::i;:::-;58780:3;;;;;:::i;:::-;;;;58740:102;;;;58538:311:::0;;;;:::o;40864:206::-;40928:7;40969:1;40952:19;;:5;:19;;;40948:60;;40980:28;;;;;;;;;;;;;;40948:60;41034:12;:19;41047:5;41034:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;41026:36;;41019:43;;40864:206;;;:::o;11382:103::-;10620:13;:11;:13::i;:::-;11447:30:::1;11474:1;11447:18;:30::i;:::-;11382:103::o:0;35677:27::-;;;;;;;;;;;;:::o;57811:38::-;;;;;;;;;;;;;:::o;63267:122::-;10620:13;:11;:13::i;:::-;63366:15:::1;63349:14;:32;;;;63267:122:::0;:::o;10734:87::-;10780:7;10807:6;;;;;;;;;;;10800:13;;10734:87;:::o;63137:122::-;10620:13;:11;:13::i;:::-;63236:15:::1;63219:14;:32;;;;63137:122:::0;:::o;62845:116::-;10620:13;:11;:13::i;:::-;62941:12:::1;62927:11;:26;;;;;;:::i;:::-;;62845:116:::0;:::o;43207:104::-;43263:13;43296:7;43289:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43207:104;:::o;59840:166::-;10620:13;:11;:13::i;:::-;59917:9:::1;59913:86;59936:7;;:14;;59932:1;:18;59913:86;;;59971:16;59976:7;;59984:1;59976:10;;;;;;;:::i;:::-;;;;;;;;59971:4;:16::i;:::-;59952:3;;;;;:::i;:::-;;;;59913:86;;;;59840:166:::0;;:::o;58857:724::-;58958:10;;58946:8;58930:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;58922:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59027:7;:5;:7::i;:::-;59013:21;;:10;:21;;;59009:511;;59061:18;;;;;;;;;;;59053:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;59169:14;;59157:8;59133:21;59143:10;59133:9;:21::i;:::-;:32;;;;:::i;:::-;:50;;59125:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;59237:23;59285:10;:22;59296:10;59285:22;;;;;;;;;;;;;;;;59263:19;;:44;;;;:::i;:::-;59237:70;;59373:15;59362:8;:26;;;;:::i;:::-;59344:14;;:45;;;;:::i;:::-;59330:9;:60;;59322:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;59481:15;59456:10;:22;59467:10;59456:22;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;59431:10;:22;59442:10;59431:22;;;;;;;;;;;;;;;:65;;;;59036:484;59009:511;59532:31;59542:10;59554:8;59532:9;:31::i;:::-;58857:724;:::o;60389:176::-;60493:8;4877:30;4898:8;4877:20;:30::i;:::-;60514:43:::1;60538:8;60548;60514:23;:43::i;:::-;60389:176:::0;;;:::o;57981:34::-;;;;:::o;61088:228::-;61239:4;4705:10;4697:18;;:4;:18;;;4693:83;;4732:32;4753:10;4732:20;:32::i;:::-;4693:83;61261:47:::1;61284:4;61290:2;61294:7;61303:4;61261:22;:47::i;:::-;61088:228:::0;;;;;:::o;60016:365::-;60089:13;60120:16;60128:7;60120;:16::i;:::-;60115:59;;60145:29;;;;;;;;;;;;;;60115:59;60202:5;60190:17;;:8;;;;;;;;;;;:17;;;60187:66;;60227:14;60220:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60187:66;60303:1;60284:7;60278:21;;;;;:::i;:::-;;;:26;:95;;;;;;;;;;;;;;;;;60331:7;60340:18;:7;:16;:18::i;:::-;60314:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60278:95;60271:102;;60016:365;;;;:::o;62476:222::-;10620:13;:11;:13::i;:::-;62576:5:::1;62556:25;;:18;;;;;;;;;;;:25;;::::0;62553:138:::1;;62618:4;62597:18;;:25;;;;;;;;;;;;;;;;;;62553:138;;;62674:5;62653:18;;:26;;;;;;;;;;;;;;;;;;62553:138;62476:222::o:0;57777:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45183:164::-;45280:4;45304:18;:25;45323:5;45304:25;;;;;;;;;;;;;;;:35;45330:8;45304:35;;;;;;;;;;;;;;;;;;;;;;;;;45297:42;;45183:164;;;;:::o;63547:106::-;10620:13;:11;:13::i;:::-;63634:11:::1;63621:10;:24;;;;63547:106:::0;:::o;62707:126::-;10620:13;:11;:13::i;:::-;62810:15:::1;62793:14;:32;;;;;;:::i;:::-;;62707:126:::0;:::o;61985:252::-;10620:13;:11;:13::i;:::-;62103:1:::1;62083:22;;:8;:22;;::::0;62075:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62182:8;62159:20;::::0;:31:::1;;;;;;;;;;;;;;;;;;62201:28;62220:8;62201:18;:28::i;:::-;61985:252:::0;:::o;12933:422::-;12993:4;13201:12;13312:7;13300:20;13292:28;;13346:1;13339:4;:8;13332:15;;;12933:422;;;:::o;40428:372::-;40530:4;40582:25;40567:40;;;:11;:40;;;;:105;;;;40639:33;40624:48;;;:11;:48;;;;40567:105;:172;;;;40704:35;40689:50;;;:11;:50;;;;40567:172;:225;;;;40756:36;40780:11;40756:23;:36::i;:::-;40567:225;40547:245;;40428:372;;;:::o;25138:215::-;25240:4;25279:26;25264:41;;;:11;:41;;;;:81;;;;25309:36;25333:11;25309:23;:36::i;:::-;25264:81;25257:88;;25138:215;;;:::o;10899:132::-;10974:12;:10;:12::i;:::-;10963:23;;:7;:5;:7::i;:::-;:23;;;10955:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10899:132::o;26500:332::-;26619:17;:15;:17::i;:::-;26603:33;;:12;:33;;;;26595:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;26722:1;26702:22;;:8;:22;;;26694:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;26789:35;;;;;;;;26801:8;26789:35;;;;;;26811:12;26789:35;;;;;26767:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26500:332;;:::o;46508:144::-;46565:4;46599:13;;;;;;;;;;;46589:23;;:7;:23;:55;;;;;46617:11;:20;46629:7;46617:20;;;;;;;;;;;:27;;;;;;;;;;;;46616:28;46589:55;46582:62;;46508:144;;;:::o;4935:419::-;5174:1;3456:42;5126:45;;;:49;5122:225;;;3456:42;5197;;;5248:4;5255:8;5197:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5192:144;;5311:8;5292:28;;;;;;;;;;;:::i;:::-;;;;;;;;5192:144;5122:225;4935:419;:::o;44104:379::-;44185:13;44201:24;44217:7;44201:15;:24::i;:::-;44185:40;;44246:5;44240:11;;:2;:11;;;44236:48;;44260:24;;;;;;;;;;;;;;44236:48;44317:5;44301:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;44327:37;44344:5;44351:12;:10;:12::i;:::-;44327:16;:37::i;:::-;44326:38;44301:63;44297:138;;;44388:35;;;;;;;;;;;;;;44297:138;44447:28;44456:2;44460:7;44469:5;44447:8;:28::i;:::-;44174:309;44104:379;;:::o;45414:170::-;45548:28;45558:4;45564:2;45568:7;45548:9;:28::i;:::-;45414:170;;;:::o;26132:97::-;26190:6;26216:5;26209:12;;26132:97;:::o;45655:185::-;45793:39;45810:4;45816:2;45820:7;45793:39;;;;;;;;;;;;:16;:39::i;:::-;45655:185;;;:::o;41702:1083::-;41763:21;;:::i;:::-;41797:12;41812:7;41797:22;;41868:13;;;;;;;;;;;41861:20;;:4;:20;41857:861;;;41902:31;41936:11;:17;41948:4;41936:17;;;;;;;;;;;41902:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41977:9;:16;;;41972:731;;42048:1;42022:28;;:9;:14;;;:28;;;42018:101;;42086:9;42079:16;;;;;;42018:101;42423:261;42430:4;42423:261;;;42463:6;;;;;;;;42508:11;:17;42520:4;42508:17;;;;;;;;;;;42496:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42582:1;42556:28;;:9;:14;;;:28;;;42552:109;;42624:9;42617:16;;;;;;42552:109;42423:261;;;41972:731;41883:835;41857:861;42746:31;;;;;;;;;;;;;;41702:1083;;;;:::o;46660:104::-;46729:27;46739:2;46743:8;46729:27;;;;;;;;;;;;:9;:27::i;:::-;46660:104;;:::o;12001:191::-;12075:16;12094:6;;;;;;;;;;;12075:25;;12120:8;12111:6;;:17;;;;;;;;;;;;;;;;;;12175:8;12144:40;;12165:8;12144:40;;;;;;;;;;;;12064:128;12001:191;:::o;44825:287::-;44936:12;:10;:12::i;:::-;44924:24;;:8;:24;;;44920:54;;44957:17;;;;;;;;;;;;;;44920:54;45032:8;44987:18;:32;45006:12;:10;:12::i;:::-;44987:32;;;;;;;;;;;;;;;:42;45020:8;44987:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;45085:8;45056:48;;45071:12;:10;:12::i;:::-;45056:48;;;45095:8;45056:48;;;;;;:::i;:::-;;;;;;;;44825:287;;:::o;45911:342::-;46078:28;46088:4;46094:2;46098:7;46078:9;:28::i;:::-;46122:48;46145:4;46151:2;46155:7;46164:5;46122:22;:48::i;:::-;46117:129;;46194:40;;;;;;;;;;;;;;46117:129;45911:342;;;;:::o;7828:751::-;7884:13;8114:1;8105:5;:10;8101:53;;8132:10;;;;;;;;;;;;;;;;;;;;;8101:53;8164:12;8179:5;8164:20;;8195:14;8220:78;8235:1;8227:4;:9;8220:78;;8253:8;;;;;:::i;:::-;;;;8284:2;8276:10;;;;;:::i;:::-;;;8220:78;;;8308:19;8340:6;8330:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8308:39;;8358:13;8374:6;8358:22;;8398:5;8391:12;;8414:126;8429:1;8421:4;:9;8414:126;;8498:2;8491:4;:9;;;;:::i;:::-;8478:2;:23;;;;:::i;:::-;8465:38;;8447:6;8454:7;;;;:::i;:::-;;;;8447:15;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8526:2;8518:10;;;;;:::i;:::-;;;8414:126;;;8564:6;8550:21;;;;;;7828:751;;;;:::o;23627:157::-;23712:4;23751:25;23736:40;;;:11;:40;;;;23729:47;;23627:157;;;:::o;9184:98::-;9237:7;9264:10;9257:17;;9184:98;:::o;54387:196::-;54529:2;54502:15;:24;54518:7;54502:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54567:7;54563:2;54547:28;;54556:5;54547:28;;;;;;;;;;;;54387:196;;;:::o;49225:2775::-;49340:35;49378:20;49390:7;49378:11;:20::i;:::-;49340:58;;49411:22;49453:13;:18;;;49437:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;49488:50;49505:13;:18;;;49525:12;:10;:12::i;:::-;49488:16;:50::i;:::-;49437:101;:154;;;;49579:12;:10;:12::i;:::-;49555:36;;:20;49567:7;49555:11;:20::i;:::-;:36;;;49437:154;:186;;;;49611:12;;;;;;;;;;49595:28;;:12;:10;:12::i;:::-;:28;;;49437:186;49411:235;;49664:17;49659:66;;49690:35;;;;;;;;;;;;;;49659:66;49941:12;;;;;;;;;;49925:28;;:12;:10;:12::i;:::-;:28;;;49920:229;;49990:1;49976:16;;:2;:16;;;49972:52;;50001:23;;;;;;;;;;;;;;49972:52;50049:42;50043:48;;:2;:48;;;50039:84;;50100:23;;;;;;;;;;;;;;50039:84;49920:229;50179:4;50165:18;;50173:1;50165:18;;;50161:63;;50192:32;;;;;;;;;;;;;;50161:63;50247:42;50239:50;;:4;:50;;;50235:95;;50298:32;;;;;;;;;;;;;;50235:95;50369:4;50347:26;;:13;:18;;;:26;;;50343:67;;50382:28;;;;;;;;;;;;;;50343:67;50488:43;50510:4;50516:2;50520:7;50529:1;50488:21;:43::i;:::-;50596:49;50613:1;50617:7;50626:13;:18;;;50596:8;:49::i;:::-;50971:1;50941:12;:18;50954:4;50941:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51015:1;50987:12;:16;51000:2;50987:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51061:2;51033:11;:20;51045:7;51033:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;51123:15;51078:11;:20;51090:7;51078:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;51391:19;51423:1;51413:7;:11;51391:33;;51484:1;51443:43;;:11;:24;51455:11;51443:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;51439:445;;51668:13;;;;;;;;;;;51654:27;;:11;:27;51650:219;;;51738:13;:18;;;51706:11;:24;51718:11;51706:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;51821:13;:28;;;51779:11;:24;51791:11;51779:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;51650:219;51439:445;50916:979;51931:7;51927:2;51912:27;;51921:4;51912:27;;;;;;;;;;;;51950:42;51971:4;51977:2;51981:7;51990:1;51950:20;:42::i;:::-;49329:2671;;49225:2775;;;:::o;47127:163::-;47250:32;47256:2;47260:8;47270:5;47277:4;47250:5;:32::i;:::-;47127:163;;;:::o;55148:790::-;55303:4;55324:15;:2;:13;;;:15::i;:::-;55320:611;;;55376:2;55360:36;;;55397:12;:10;:12::i;:::-;55411:4;55417:7;55426:5;55360:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55356:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55623:1;55606:6;:13;:18;55602:259;;55656:40;;;;;;;;;;;;;;55602:259;55811:6;55805:13;55796:6;55792:2;55788:15;55781:38;55356:520;55493:45;;;55483:55;;;:6;:55;;;;55476:62;;;;;55320:611;55915:4;55908:11;;55148:790;;;;;;;:::o;56586:159::-;;;;;:::o;57404:158::-;;;;;:::o;47549:1422::-;47688:20;47711:13;;;;;;;;;;;47688:36;;;;47753:1;47739:16;;:2;:16;;;47735:48;;47764:19;;;;;;;;;;;;;;47735:48;47810:1;47798:8;:13;47794:44;;47820:18;;;;;;;;;;;;;;47794:44;47851:61;47881:1;47885:2;47889:12;47903:8;47851:21;:61::i;:::-;48225:8;48190:12;:16;48203:2;48190:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48289:8;48249:12;:16;48262:2;48249:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48348:2;48315:11;:25;48327:12;48315:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;48415:15;48365:11;:25;48377:12;48365:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;48448:20;48471:12;48448:35;;48505:9;48500:328;48520:8;48516:1;:12;48500:328;;;48584:12;48580:2;48559:38;;48576:1;48559:38;;;;;;;;;;;;48620:4;:68;;;;;48629:59;48660:1;48664:2;48668:12;48682:5;48629:22;:59::i;:::-;48628:60;48620:68;48616:164;;;48720:40;;;;;;;;;;;;;;48616:164;48798:14;;;;;;;48530:3;;;;;;;48500:328;;;;48868:12;48844:13;;:37;;;;;;;;;;;;;;;;;;48165:728;48903:60;48932:1;48936:2;48940:12;48954:8;48903:20;:60::i;:::-;47677:1294;47549:1422;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:77::-;2924:7;2953:5;2942:16;;2887:77;;;:::o;2970:122::-;3043:24;3061:5;3043:24;:::i;:::-;3036:5;3033:35;3023:63;;3082:1;3079;3072:12;3023:63;2970:122;:::o;3098:139::-;3144:5;3182:6;3169:20;3160:29;;3198:33;3225:5;3198:33;:::i;:::-;3098:139;;;;:::o;3243:329::-;3302:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3243:329;;;;:::o;3578:99::-;3630:6;3664:5;3658:12;3648:22;;3578:99;;;:::o;3683:169::-;3767:11;3801:6;3796:3;3789:19;3841:4;3836:3;3832:14;3817:29;;3683:169;;;;:::o;3858:246::-;3939:1;3949:113;3963:6;3960:1;3957:13;3949:113;;;4048:1;4043:3;4039:11;4033:18;4029:1;4024:3;4020:11;4013:39;3985:2;3982:1;3978:10;3973:15;;3949:113;;;4096:1;4087:6;4082:3;4078:16;4071:27;3920:184;3858:246;;;:::o;4110:102::-;4151:6;4202:2;4198:7;4193:2;4186:5;4182:14;4178:28;4168:38;;4110:102;;;:::o;4218:377::-;4306:3;4334:39;4367:5;4334:39;:::i;:::-;4389:71;4453:6;4448:3;4389:71;:::i;:::-;4382:78;;4469:65;4527:6;4522:3;4515:4;4508:5;4504:16;4469:65;:::i;:::-;4559:29;4581:6;4559:29;:::i;:::-;4554:3;4550:39;4543:46;;4310:285;4218:377;;;;:::o;4601:313::-;4714:4;4752:2;4741:9;4737:18;4729:26;;4801:9;4795:4;4791:20;4787:1;4776:9;4772:17;4765:47;4829:78;4902:4;4893:6;4829:78;:::i;:::-;4821:86;;4601:313;;;;:::o;4920:118::-;5007:24;5025:5;5007:24;:::i;:::-;5002:3;4995:37;4920:118;;:::o;5044:222::-;5137:4;5175:2;5164:9;5160:18;5152:26;;5188:71;5256:1;5245:9;5241:17;5232:6;5188:71;:::i;:::-;5044:222;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:329::-;5811:6;5860:2;5848:9;5839:7;5835:23;5831:32;5828:119;;;5866:79;;:::i;:::-;5828:119;5986:1;6011:53;6056:7;6047:6;6036:9;6032:22;6011:53;:::i;:::-;6001:63;;5957:117;5752:329;;;;:::o;6087:118::-;6174:24;6192:5;6174:24;:::i;:::-;6169:3;6162:37;6087:118;;:::o;6211:222::-;6304:4;6342:2;6331:9;6327:18;6319:26;;6355:71;6423:1;6412:9;6408:17;6399:6;6355:71;:::i;:::-;6211:222;;;;:::o;6439:619::-;6516:6;6524;6532;6581:2;6569:9;6560:7;6556:23;6552:32;6549:119;;;6587:79;;:::i;:::-;6549:119;6707:1;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6678:117;6834:2;6860:53;6905:7;6896:6;6885:9;6881:22;6860:53;:::i;:::-;6850:63;;6805:118;6962:2;6988:53;7033:7;7024:6;7013:9;7009:22;6988:53;:::i;:::-;6978:63;;6933:118;6439:619;;;;;:::o;7064:474::-;7132:6;7140;7189:2;7177:9;7168:7;7164:23;7160:32;7157:119;;;7195:79;;:::i;:::-;7157:119;7315:1;7340:53;7385:7;7376:6;7365:9;7361:22;7340:53;:::i;:::-;7330:63;;7286:117;7442:2;7468:53;7513:7;7504:6;7493:9;7489:22;7468:53;:::i;:::-;7458:63;;7413:118;7064:474;;;;;:::o;7544:332::-;7665:4;7703:2;7692:9;7688:18;7680:26;;7716:71;7784:1;7773:9;7769:17;7760:6;7716:71;:::i;:::-;7797:72;7865:2;7854:9;7850:18;7841:6;7797:72;:::i;:::-;7544:332;;;;;:::o;7882:60::-;7910:3;7931:5;7924:12;;7882:60;;;:::o;7948:142::-;7998:9;8031:53;8049:34;8058:24;8076:5;8058:24;:::i;:::-;8049:34;:::i;:::-;8031:53;:::i;:::-;8018:66;;7948:142;;;:::o;8096:126::-;8146:9;8179:37;8210:5;8179:37;:::i;:::-;8166:50;;8096:126;;;:::o;8228:157::-;8309:9;8342:37;8373:5;8342:37;:::i;:::-;8329:50;;8228:157;;;:::o;8391:193::-;8509:68;8571:5;8509:68;:::i;:::-;8504:3;8497:81;8391:193;;:::o;8590:284::-;8714:4;8752:2;8741:9;8737:18;8729:26;;8765:102;8864:1;8853:9;8849:17;8840:6;8765:102;:::i;:::-;8590:284;;;;:::o;8880:117::-;8989:1;8986;8979:12;9003:117;9112:1;9109;9102:12;9126:180;9174:77;9171:1;9164:88;9271:4;9268:1;9261:15;9295:4;9292:1;9285:15;9312:281;9395:27;9417:4;9395:27;:::i;:::-;9387:6;9383:40;9525:6;9513:10;9510:22;9489:18;9477:10;9474:34;9471:62;9468:88;;;9536:18;;:::i;:::-;9468:88;9576:10;9572:2;9565:22;9355:238;9312:281;;:::o;9599:129::-;9633:6;9660:20;;:::i;:::-;9650:30;;9689:33;9717:4;9709:6;9689:33;:::i;:::-;9599:129;;;:::o;9734:308::-;9796:4;9886:18;9878:6;9875:30;9872:56;;;9908:18;;:::i;:::-;9872:56;9946:29;9968:6;9946:29;:::i;:::-;9938:37;;10030:4;10024;10020:15;10012:23;;9734:308;;;:::o;10048:146::-;10145:6;10140:3;10135;10122:30;10186:1;10177:6;10172:3;10168:16;10161:27;10048:146;;;:::o;10200:425::-;10278:5;10303:66;10319:49;10361:6;10319:49;:::i;:::-;10303:66;:::i;:::-;10294:75;;10392:6;10385:5;10378:21;10430:4;10423:5;10419:16;10468:3;10459:6;10454:3;10450:16;10447:25;10444:112;;;10475:79;;:::i;:::-;10444:112;10565:54;10612:6;10607:3;10602;10565:54;:::i;:::-;10284:341;10200:425;;;;;:::o;10645:340::-;10701:5;10750:3;10743:4;10735:6;10731:17;10727:27;10717:122;;10758:79;;:::i;:::-;10717:122;10875:6;10862:20;10900:79;10975:3;10967:6;10960:4;10952:6;10948:17;10900:79;:::i;:::-;10891:88;;10707:278;10645:340;;;;:::o;10991:509::-;11060:6;11109:2;11097:9;11088:7;11084:23;11080:32;11077:119;;;11115:79;;:::i;:::-;11077:119;11263:1;11252:9;11248:17;11235:31;11293:18;11285:6;11282:30;11279:117;;;11315:79;;:::i;:::-;11279:117;11420:63;11475:7;11466:6;11455:9;11451:22;11420:63;:::i;:::-;11410:73;;11206:287;10991:509;;;;:::o;11506:117::-;11615:1;11612;11605:12;11629:117;11738:1;11735;11728:12;11769:568;11842:8;11852:6;11902:3;11895:4;11887:6;11883:17;11879:27;11869:122;;11910:79;;:::i;:::-;11869:122;12023:6;12010:20;12000:30;;12053:18;12045:6;12042:30;12039:117;;;12075:79;;:::i;:::-;12039:117;12189:4;12181:6;12177:17;12165:29;;12243:3;12235:4;12227:6;12223:17;12213:8;12209:32;12206:41;12203:128;;;12250:79;;:::i;:::-;12203:128;11769:568;;;;;:::o;12360:::-;12433:8;12443:6;12493:3;12486:4;12478:6;12474:17;12470:27;12460:122;;12501:79;;:::i;:::-;12460:122;12614:6;12601:20;12591:30;;12644:18;12636:6;12633:30;12630:117;;;12666:79;;:::i;:::-;12630:117;12780:4;12772:6;12768:17;12756:29;;12834:3;12826:4;12818:6;12814:17;12804:8;12800:32;12797:41;12794:128;;;12841:79;;:::i;:::-;12794:128;12360:568;;;;;:::o;12934:934::-;13056:6;13064;13072;13080;13129:2;13117:9;13108:7;13104:23;13100:32;13097:119;;;13135:79;;:::i;:::-;13097:119;13283:1;13272:9;13268:17;13255:31;13313:18;13305:6;13302:30;13299:117;;;13335:79;;:::i;:::-;13299:117;13448:80;13520:7;13511:6;13500:9;13496:22;13448:80;:::i;:::-;13430:98;;;;13226:312;13605:2;13594:9;13590:18;13577:32;13636:18;13628:6;13625:30;13622:117;;;13658:79;;:::i;:::-;13622:117;13771:80;13843:7;13834:6;13823:9;13819:22;13771:80;:::i;:::-;13753:98;;;;13548:313;12934:934;;;;;;;:::o;13874:559::-;13960:6;13968;14017:2;14005:9;13996:7;13992:23;13988:32;13985:119;;;14023:79;;:::i;:::-;13985:119;14171:1;14160:9;14156:17;14143:31;14201:18;14193:6;14190:30;14187:117;;;14223:79;;:::i;:::-;14187:117;14336:80;14408:7;14399:6;14388:9;14384:22;14336:80;:::i;:::-;14318:98;;;;14114:312;13874:559;;;;;:::o;14439:116::-;14509:21;14524:5;14509:21;:::i;:::-;14502:5;14499:32;14489:60;;14545:1;14542;14535:12;14489:60;14439:116;:::o;14561:133::-;14604:5;14642:6;14629:20;14620:29;;14658:30;14682:5;14658:30;:::i;:::-;14561:133;;;;:::o;14700:468::-;14765:6;14773;14822:2;14810:9;14801:7;14797:23;14793:32;14790:119;;;14828:79;;:::i;:::-;14790:119;14948:1;14973:53;15018:7;15009:6;14998:9;14994:22;14973:53;:::i;:::-;14963:63;;14919:117;15075:2;15101:50;15143:7;15134:6;15123:9;15119:22;15101:50;:::i;:::-;15091:60;;15046:115;14700:468;;;;;:::o;15174:307::-;15235:4;15325:18;15317:6;15314:30;15311:56;;;15347:18;;:::i;:::-;15311:56;15385:29;15407:6;15385:29;:::i;:::-;15377:37;;15469:4;15463;15459:15;15451:23;;15174:307;;;:::o;15487:423::-;15564:5;15589:65;15605:48;15646:6;15605:48;:::i;:::-;15589:65;:::i;:::-;15580:74;;15677:6;15670:5;15663:21;15715:4;15708:5;15704:16;15753:3;15744:6;15739:3;15735:16;15732:25;15729:112;;;15760:79;;:::i;:::-;15729:112;15850:54;15897:6;15892:3;15887;15850:54;:::i;:::-;15570:340;15487:423;;;;;:::o;15929:338::-;15984:5;16033:3;16026:4;16018:6;16014:17;16010:27;16000:122;;16041:79;;:::i;:::-;16000:122;16158:6;16145:20;16183:78;16257:3;16249:6;16242:4;16234:6;16230:17;16183:78;:::i;:::-;16174:87;;15990:277;15929:338;;;;:::o;16273:943::-;16368:6;16376;16384;16392;16441:3;16429:9;16420:7;16416:23;16412:33;16409:120;;;16448:79;;:::i;:::-;16409:120;16568:1;16593:53;16638:7;16629:6;16618:9;16614:22;16593:53;:::i;:::-;16583:63;;16539:117;16695:2;16721:53;16766:7;16757:6;16746:9;16742:22;16721:53;:::i;:::-;16711:63;;16666:118;16823:2;16849:53;16894:7;16885:6;16874:9;16870:22;16849:53;:::i;:::-;16839:63;;16794:118;16979:2;16968:9;16964:18;16951:32;17010:18;17002:6;16999:30;16996:117;;;17032:79;;:::i;:::-;16996:117;17137:62;17191:7;17182:6;17171:9;17167:22;17137:62;:::i;:::-;17127:72;;16922:287;16273:943;;;;;;;:::o;17222:474::-;17290:6;17298;17347:2;17335:9;17326:7;17322:23;17318:32;17315:119;;;17353:79;;:::i;:::-;17315:119;17473:1;17498:53;17543:7;17534:6;17523:9;17519:22;17498:53;:::i;:::-;17488:63;;17444:117;17600:2;17626:53;17671:7;17662:6;17651:9;17647:22;17626:53;:::i;:::-;17616:63;;17571:118;17222:474;;;;;:::o;17702:180::-;17750:77;17747:1;17740:88;17847:4;17844:1;17837:15;17871:4;17868:1;17861:15;17888:320;17932:6;17969:1;17963:4;17959:12;17949:22;;18016:1;18010:4;18006:12;18037:18;18027:81;;18093:4;18085:6;18081:17;18071:27;;18027:81;18155:2;18147:6;18144:14;18124:18;18121:38;18118:84;;18174:18;;:::i;:::-;18118:84;17939:269;17888:320;;;:::o;18214:180::-;18262:77;18259:1;18252:88;18359:4;18356:1;18349:15;18383:4;18380:1;18373:15;18400:410;18440:7;18463:20;18481:1;18463:20;:::i;:::-;18458:25;;18497:20;18515:1;18497:20;:::i;:::-;18492:25;;18552:1;18549;18545:9;18574:30;18592:11;18574:30;:::i;:::-;18563:41;;18753:1;18744:7;18740:15;18737:1;18734:22;18714:1;18707:9;18687:83;18664:139;;18783:18;;:::i;:::-;18664:139;18448:362;18400:410;;;;:::o;18816:180::-;18864:77;18861:1;18854:88;18961:4;18958:1;18951:15;18985:4;18982:1;18975:15;19002:185;19042:1;19059:20;19077:1;19059:20;:::i;:::-;19054:25;;19093:20;19111:1;19093:20;:::i;:::-;19088:25;;19132:1;19122:35;;19137:18;;:::i;:::-;19122:35;19179:1;19176;19172:9;19167:14;;19002:185;;;;:::o;19193:147::-;19294:11;19331:3;19316:18;;19193:147;;;;:::o;19346:114::-;;:::o;19466:398::-;19625:3;19646:83;19727:1;19722:3;19646:83;:::i;:::-;19639:90;;19738:93;19827:3;19738:93;:::i;:::-;19856:1;19851:3;19847:11;19840:18;;19466:398;;;:::o;19870:379::-;20054:3;20076:147;20219:3;20076:147;:::i;:::-;20069:154;;20240:3;20233:10;;19870:379;;;:::o;20255:141::-;20304:4;20327:3;20319:11;;20350:3;20347:1;20340:14;20384:4;20381:1;20371:18;20363:26;;20255:141;;;:::o;20402:93::-;20439:6;20486:2;20481;20474:5;20470:14;20466:23;20456:33;;20402:93;;;:::o;20501:107::-;20545:8;20595:5;20589:4;20585:16;20564:37;;20501:107;;;;:::o;20614:393::-;20683:6;20733:1;20721:10;20717:18;20756:97;20786:66;20775:9;20756:97;:::i;:::-;20874:39;20904:8;20893:9;20874:39;:::i;:::-;20862:51;;20946:4;20942:9;20935:5;20931:21;20922:30;;20995:4;20985:8;20981:19;20974:5;20971:30;20961:40;;20690:317;;20614:393;;;;;:::o;21013:142::-;21063:9;21096:53;21114:34;21123:24;21141:5;21123:24;:::i;:::-;21114:34;:::i;:::-;21096:53;:::i;:::-;21083:66;;21013:142;;;:::o;21161:75::-;21204:3;21225:5;21218:12;;21161:75;;;:::o;21242:269::-;21352:39;21383:7;21352:39;:::i;:::-;21413:91;21462:41;21486:16;21462:41;:::i;:::-;21454:6;21447:4;21441:11;21413:91;:::i;:::-;21407:4;21400:105;21318:193;21242:269;;;:::o;21517:73::-;21562:3;21517:73;:::o;21596:189::-;21673:32;;:::i;:::-;21714:65;21772:6;21764;21758:4;21714:65;:::i;:::-;21649:136;21596:189;;:::o;21791:186::-;21851:120;21868:3;21861:5;21858:14;21851:120;;;21922:39;21959:1;21952:5;21922:39;:::i;:::-;21895:1;21888:5;21884:13;21875:22;;21851:120;;;21791:186;;:::o;21983:543::-;22084:2;22079:3;22076:11;22073:446;;;22118:38;22150:5;22118:38;:::i;:::-;22202:29;22220:10;22202:29;:::i;:::-;22192:8;22188:44;22385:2;22373:10;22370:18;22367:49;;;22406:8;22391:23;;22367:49;22429:80;22485:22;22503:3;22485:22;:::i;:::-;22475:8;22471:37;22458:11;22429:80;:::i;:::-;22088:431;;22073:446;21983:543;;;:::o;22532:117::-;22586:8;22636:5;22630:4;22626:16;22605:37;;22532:117;;;;:::o;22655:169::-;22699:6;22732:51;22780:1;22776:6;22768:5;22765:1;22761:13;22732:51;:::i;:::-;22728:56;22813:4;22807;22803:15;22793:25;;22706:118;22655:169;;;;:::o;22829:295::-;22905:4;23051:29;23076:3;23070:4;23051:29;:::i;:::-;23043:37;;23113:3;23110:1;23106:11;23100:4;23097:21;23089:29;;22829:295;;;;:::o;23129:1395::-;23246:37;23279:3;23246:37;:::i;:::-;23348:18;23340:6;23337:30;23334:56;;;23370:18;;:::i;:::-;23334:56;23414:38;23446:4;23440:11;23414:38;:::i;:::-;23499:67;23559:6;23551;23545:4;23499:67;:::i;:::-;23593:1;23617:4;23604:17;;23649:2;23641:6;23638:14;23666:1;23661:618;;;;24323:1;24340:6;24337:77;;;24389:9;24384:3;24380:19;24374:26;24365:35;;24337:77;24440:67;24500:6;24493:5;24440:67;:::i;:::-;24434:4;24427:81;24296:222;23631:887;;23661:618;23713:4;23709:9;23701:6;23697:22;23747:37;23779:4;23747:37;:::i;:::-;23806:1;23820:208;23834:7;23831:1;23828:14;23820:208;;;23913:9;23908:3;23904:19;23898:26;23890:6;23883:42;23964:1;23956:6;23952:14;23942:24;;24011:2;24000:9;23996:18;23983:31;;23857:4;23854:1;23850:12;23845:17;;23820:208;;;24056:6;24047:7;24044:19;24041:179;;;24114:9;24109:3;24105:19;24099:26;24157:48;24199:4;24191:6;24187:17;24176:9;24157:48;:::i;:::-;24149:6;24142:64;24064:156;24041:179;24266:1;24262;24254:6;24250:14;24246:22;24240:4;24233:36;23668:611;;;23631:887;;23221:1303;;;23129:1395;;:::o;24530:177::-;24670:29;24666:1;24658:6;24654:14;24647:53;24530:177;:::o;24713:366::-;24855:3;24876:67;24940:2;24935:3;24876:67;:::i;:::-;24869:74;;24952:93;25041:3;24952:93;:::i;:::-;25070:2;25065:3;25061:12;25054:19;;24713:366;;;:::o;25085:419::-;25251:4;25289:2;25278:9;25274:18;25266:26;;25338:9;25332:4;25328:20;25324:1;25313:9;25309:17;25302:47;25366:131;25492:4;25366:131;:::i;:::-;25358:139;;25085:419;;;:::o;25510:180::-;25558:77;25555:1;25548:88;25655:4;25652:1;25645:15;25679:4;25676:1;25669:15;25696:233;25735:3;25758:24;25776:5;25758:24;:::i;:::-;25749:33;;25804:66;25797:5;25794:77;25791:103;;25874:18;;:::i;:::-;25791:103;25921:1;25914:5;25910:13;25903:20;;25696:233;;;:::o;25935:191::-;25975:3;25994:20;26012:1;25994:20;:::i;:::-;25989:25;;26028:20;26046:1;26028:20;:::i;:::-;26023:25;;26071:1;26068;26064:9;26057:16;;26092:3;26089:1;26086:10;26083:36;;;26099:18;;:::i;:::-;26083:36;25935:191;;;;:::o;26132:170::-;26272:22;26268:1;26260:6;26256:14;26249:46;26132:170;:::o;26308:366::-;26450:3;26471:67;26535:2;26530:3;26471:67;:::i;:::-;26464:74;;26547:93;26636:3;26547:93;:::i;:::-;26665:2;26660:3;26656:12;26649:19;;26308:366;;;:::o;26680:419::-;26846:4;26884:2;26873:9;26869:18;26861:26;;26933:9;26927:4;26923:20;26919:1;26908:9;26904:17;26897:47;26961:131;27087:4;26961:131;:::i;:::-;26953:139;;26680:419;;;:::o;27105:175::-;27245:27;27241:1;27233:6;27229:14;27222:51;27105:175;:::o;27286:366::-;27428:3;27449:67;27513:2;27508:3;27449:67;:::i;:::-;27442:74;;27525:93;27614:3;27525:93;:::i;:::-;27643:2;27638:3;27634:12;27627:19;;27286:366;;;:::o;27658:419::-;27824:4;27862:2;27851:9;27847:18;27839:26;;27911:9;27905:4;27901:20;27897:1;27886:9;27882:17;27875:47;27939:131;28065:4;27939:131;:::i;:::-;27931:139;;27658:419;;;:::o;28083:174::-;28223:26;28219:1;28211:6;28207:14;28200:50;28083:174;:::o;28263:366::-;28405:3;28426:67;28490:2;28485:3;28426:67;:::i;:::-;28419:74;;28502:93;28591:3;28502:93;:::i;:::-;28620:2;28615:3;28611:12;28604:19;;28263:366;;;:::o;28635:419::-;28801:4;28839:2;28828:9;28824:18;28816:26;;28888:9;28882:4;28878:20;28874:1;28863:9;28859:17;28852:47;28916:131;29042:4;28916:131;:::i;:::-;28908:139;;28635:419;;;:::o;29060:194::-;29100:4;29120:20;29138:1;29120:20;:::i;:::-;29115:25;;29154:20;29172:1;29154:20;:::i;:::-;29149:25;;29198:1;29195;29191:9;29183:17;;29222:1;29216:4;29213:11;29210:37;;;29227:18;;:::i;:::-;29210:37;29060:194;;;;:::o;29260:169::-;29400:21;29396:1;29388:6;29384:14;29377:45;29260:169;:::o;29435:366::-;29577:3;29598:67;29662:2;29657:3;29598:67;:::i;:::-;29591:74;;29674:93;29763:3;29674:93;:::i;:::-;29792:2;29787:3;29783:12;29776:19;;29435:366;;;:::o;29807:419::-;29973:4;30011:2;30000:9;29996:18;29988:26;;30060:9;30054:4;30050:20;30046:1;30035:9;30031:17;30024:47;30088:131;30214:4;30088:131;:::i;:::-;30080:139;;29807:419;;;:::o;30232:148::-;30334:11;30371:3;30356:18;;30232:148;;;;:::o;30410:874::-;30513:3;30550:5;30544:12;30579:36;30605:9;30579:36;:::i;:::-;30631:89;30713:6;30708:3;30631:89;:::i;:::-;30624:96;;30751:1;30740:9;30736:17;30767:1;30762:166;;;;30942:1;30937:341;;;;30729:549;;30762:166;30846:4;30842:9;30831;30827:25;30822:3;30815:38;30908:6;30901:14;30894:22;30886:6;30882:35;30877:3;30873:45;30866:52;;30762:166;;30937:341;31004:38;31036:5;31004:38;:::i;:::-;31064:1;31078:154;31092:6;31089:1;31086:13;31078:154;;;31166:7;31160:14;31156:1;31151:3;31147:11;31140:35;31216:1;31207:7;31203:15;31192:26;;31114:4;31111:1;31107:12;31102:17;;31078:154;;;31261:6;31256:3;31252:16;31245:23;;30944:334;;30729:549;;30517:767;;30410:874;;;;:::o;31290:390::-;31396:3;31424:39;31457:5;31424:39;:::i;:::-;31479:89;31561:6;31556:3;31479:89;:::i;:::-;31472:96;;31577:65;31635:6;31630:3;31623:4;31616:5;31612:16;31577:65;:::i;:::-;31667:6;31662:3;31658:16;31651:23;;31400:280;31290:390;;;;:::o;31686:155::-;31826:7;31822:1;31814:6;31810:14;31803:31;31686:155;:::o;31847:400::-;32007:3;32028:84;32110:1;32105:3;32028:84;:::i;:::-;32021:91;;32121:93;32210:3;32121:93;:::i;:::-;32239:1;32234:3;32230:11;32223:18;;31847:400;;;:::o;32253:695::-;32531:3;32553:92;32641:3;32632:6;32553:92;:::i;:::-;32546:99;;32662:95;32753:3;32744:6;32662:95;:::i;:::-;32655:102;;32774:148;32918:3;32774:148;:::i;:::-;32767:155;;32939:3;32932:10;;32253:695;;;;;:::o;32954:225::-;33094:34;33090:1;33082:6;33078:14;33071:58;33163:8;33158:2;33150:6;33146:15;33139:33;32954:225;:::o;33185:366::-;33327:3;33348:67;33412:2;33407:3;33348:67;:::i;:::-;33341:74;;33424:93;33513:3;33424:93;:::i;:::-;33542:2;33537:3;33533:12;33526:19;;33185:366;;;:::o;33557:419::-;33723:4;33761:2;33750:9;33746:18;33738:26;;33810:9;33804:4;33800:20;33796:1;33785:9;33781:17;33774:47;33838:131;33964:4;33838:131;:::i;:::-;33830:139;;33557:419;;;:::o;33982:182::-;34122:34;34118:1;34110:6;34106:14;34099:58;33982:182;:::o;34170:366::-;34312:3;34333:67;34397:2;34392:3;34333:67;:::i;:::-;34326:74;;34409:93;34498:3;34409:93;:::i;:::-;34527:2;34522:3;34518:12;34511:19;;34170:366;;;:::o;34542:419::-;34708:4;34746:2;34735:9;34731:18;34723:26;;34795:9;34789:4;34785:20;34781:1;34770:9;34766:17;34759:47;34823:131;34949:4;34823:131;:::i;:::-;34815:139;;34542:419;;;:::o;34967:229::-;35107:34;35103:1;35095:6;35091:14;35084:58;35176:12;35171:2;35163:6;35159:15;35152:37;34967:229;:::o;35202:366::-;35344:3;35365:67;35429:2;35424:3;35365:67;:::i;:::-;35358:74;;35441:93;35530:3;35441:93;:::i;:::-;35559:2;35554:3;35550:12;35543:19;;35202:366;;;:::o;35574:419::-;35740:4;35778:2;35767:9;35763:18;35755:26;;35827:9;35821:4;35817:20;35813:1;35802:9;35798:17;35791:47;35855:131;35981:4;35855:131;:::i;:::-;35847:139;;35574:419;;;:::o;35999:175::-;36139:27;36135:1;36127:6;36123:14;36116:51;35999:175;:::o;36180:366::-;36322:3;36343:67;36407:2;36402:3;36343:67;:::i;:::-;36336:74;;36419:93;36508:3;36419:93;:::i;:::-;36537:2;36532:3;36528:12;36521:19;;36180:366;;;:::o;36552:419::-;36718:4;36756:2;36745:9;36741:18;36733:26;;36805:9;36799:4;36795:20;36791:1;36780:9;36776:17;36769:47;36833:131;36959:4;36833:131;:::i;:::-;36825:139;;36552:419;;;:::o;36977:332::-;37098:4;37136:2;37125:9;37121:18;37113:26;;37149:71;37217:1;37206:9;37202:17;37193:6;37149:71;:::i;:::-;37230:72;37298:2;37287:9;37283:18;37274:6;37230:72;:::i;:::-;36977:332;;;;;:::o;37315:137::-;37369:5;37400:6;37394:13;37385:22;;37416:30;37440:5;37416:30;:::i;:::-;37315:137;;;;:::o;37458:345::-;37525:6;37574:2;37562:9;37553:7;37549:23;37545:32;37542:119;;;37580:79;;:::i;:::-;37542:119;37700:1;37725:61;37778:7;37769:6;37758:9;37754:22;37725:61;:::i;:::-;37715:71;;37671:125;37458:345;;;;:::o;37809:176::-;37841:1;37858:20;37876:1;37858:20;:::i;:::-;37853:25;;37892:20;37910:1;37892:20;:::i;:::-;37887:25;;37931:1;37921:35;;37936:18;;:::i;:::-;37921:35;37977:1;37974;37970:9;37965:14;;37809:176;;;;:::o;37991:171::-;38030:3;38053:24;38071:5;38053:24;:::i;:::-;38044:33;;38099:4;38092:5;38089:15;38086:41;;38107:18;;:::i;:::-;38086:41;38154:1;38147:5;38143:13;38136:20;;37991:171;;;:::o;38168:98::-;38219:6;38253:5;38247:12;38237:22;;38168:98;;;:::o;38272:168::-;38355:11;38389:6;38384:3;38377:19;38429:4;38424:3;38420:14;38405:29;;38272:168;;;;:::o;38446:373::-;38532:3;38560:38;38592:5;38560:38;:::i;:::-;38614:70;38677:6;38672:3;38614:70;:::i;:::-;38607:77;;38693:65;38751:6;38746:3;38739:4;38732:5;38728:16;38693:65;:::i;:::-;38783:29;38805:6;38783:29;:::i;:::-;38778:3;38774:39;38767:46;;38536:283;38446:373;;;;:::o;38825:640::-;39020:4;39058:3;39047:9;39043:19;39035:27;;39072:71;39140:1;39129:9;39125:17;39116:6;39072:71;:::i;:::-;39153:72;39221:2;39210:9;39206:18;39197:6;39153:72;:::i;:::-;39235;39303:2;39292:9;39288:18;39279:6;39235:72;:::i;:::-;39354:9;39348:4;39344:20;39339:2;39328:9;39324:18;39317:48;39382:76;39453:4;39444:6;39382:76;:::i;:::-;39374:84;;38825:640;;;;;;;:::o;39471:141::-;39527:5;39558:6;39552:13;39543:22;;39574:32;39600:5;39574:32;:::i;:::-;39471:141;;;;:::o;39618:349::-;39687:6;39736:2;39724:9;39715:7;39711:23;39707:32;39704:119;;;39742:79;;:::i;:::-;39704:119;39862:1;39887:63;39942:7;39933:6;39922:9;39918:22;39887:63;:::i;:::-;39877:73;;39833:127;39618:349;;;;:::o

Swarm Source

ipfs://100270fb73c0b31ac9e2d2792175a1a3bc2b72c371ce29803ef8b189cfad9a72
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.