ETH Price: $3,022.38 (+2.13%)
Gas: 2 Gwei

Token

SHIBABEAST REBORN (SBREBORN)
 

Overview

Max Total Supply

1,000 SBREBORN

Holders

406

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SBREBORN
0x7179af9DBe43f1dBfed8733B83260ECac18515C4
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:
SBREBORN

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
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[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.0 (utils/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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/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/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 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**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // 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;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 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 = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * 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 (_startTokenId() <= curr && 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 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 (to.isContract() && !_checkContractOnERC721Received(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 _startTokenId() <= tokenId && 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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 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;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = 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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, 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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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))
                }
            }
        }
    }

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

// File: SHIBABEASTReborn.sol


pragma solidity ^0.8.13;

// @name:    SBREBORN
// @symbol:  SBR
// @founder: https://twitter.com/SMITH_SHIBA
// @artist:  https://www.instagram.com/kreoarts/
// @dev:     https://twitter.com/kinginthecode
// @project: https://twitter.com/shibabeast_nft
// @project: https://www.instagram.com/shibabeast_nft/
// @url:     https://www.shiba-beast.io/
// @code:    MT Blockchain Services

/* * * * * * * * * *
* ███████╗██████╗  *
* ██╔════╝██╔══██╗ *
* ███████╗██████╔╝ *
* ╚════██║██╔══██╗ *
* ███████║██████╔╝ *
* ╚══════╝╚═════╝  *
* * * * * * * * * */






contract SBREBORN is ERC721A, Ownable, ReentrancyGuard {
  using Strings for uint256;

  bool public sbreborn_revealed = false;
  bool public public_stage_activated = false;
  uint256 public max_supply = 2519;
  uint256 public current_cost = 0.085 ether;
  uint256 public current_stage_number = 0;
  bytes32 public stage_1_mkroot = 0x23595a3a92e2c88661161c6170861b35d5961f7c3dc1006eb0739bbb59b2d218;
  bytes32 public stage_2_mkroot = 0xe881784b8769b49242bc560a27c4fa9e5657b62def3383fc93765e424e3c35ee;
  bytes32 public stage_3_mkroot = 0x23595a3a92e2c88661161c6170861b35d5961f7c3dc1006eb0739bbb59b2d218;
  bytes32 public stage_4_mkroot = 0xe881784b8769b49242bc560a27c4fa9e5657b62def3383fc93765e424e3c35ee;
  bytes32 public stage_5_mkroot = 0x4a169d65c62315752a1bf5f2401bd24269aafef94e61993a9b42c734dba2f259;
  string public baseURI;
  string public revealURI;

  mapping(address => uint256) block_address;
  mapping(address => uint256) public wallet_balance;
  mapping(address => bool) public wallet_can_mint;
  
  constructor() ERC721A("SHIBABEAST REBORN", "SBREBORN") {}

  modifier blockVerifier() {
    require(tx.origin == msg.sender, "contracts_not_allowed_to_mint");
    require(block_address[msg.sender] < block.timestamp, "no_mint_on_the_same_block");
    _;
  }

  function sbrebornPurchase(uint256 _mint_amount, bytes32[] calldata _mkproof) external payable blockVerifier() nonReentrant {
    require(current_stage_number > 0, "mint_is_not_started");
    if(current_stage_number > 2) {
      require(msg.value >= current_cost * _mint_amount, "insufficient_funds");
    }

    uint256 supply = totalSupply();
    bytes32 current_mkroot = getMerkleRoot();

    if(!public_stage_activated) {
      bytes32 merkle_leaf_node = keccak256(abi.encodePacked(msg.sender));
      if(!wallet_can_mint[msg.sender]) {
        require(MerkleProof.verify(_mkproof, current_mkroot, merkle_leaf_node), "invalid_free_whitelist_merkle_proof");
      }
    }

    require(_mint_amount > 0, "quantity_is_required");
    require(_mint_amount + supply <= max_supply, "max_supply_exceedeed" );

    if(current_stage_number == 1) {
      require(wallet_balance[msg.sender] + _mint_amount <= 2, "max_stage_1_free_mint_exceeded");
    }
    if(current_stage_number == 2) {
      require(wallet_balance[msg.sender] + _mint_amount <= 1, "max_stage_2_free_mint_exceeded");
    }

    wallet_balance[msg.sender] += _mint_amount;
    _safeMint(msg.sender, _mint_amount);
  }

  function getMerkleRoot() internal virtual returns (bytes32 merkleroot) {
    bytes32 current_mkroot = keccak256(abi.encodePacked("no_stage_number_defined"));
    if(current_stage_number == 1) {
      current_mkroot = stage_1_mkroot;
    }
    else if(current_stage_number == 2) {
      current_mkroot = stage_2_mkroot;
    }
    else if(current_stage_number == 3) {
      current_mkroot = stage_3_mkroot;
    }
    else if(current_stage_number == 4) {
      current_mkroot = stage_4_mkroot;
    }
    else if(current_stage_number == 5) {
      current_mkroot = stage_5_mkroot;
    }
    return current_mkroot;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "non_existant_token");
    if (sbreborn_revealed) {
      return string(abi.encodePacked(baseURI, _tokenId.toString()));
    } else {
      return revealURI;
    }
  }

  function set_base_uri(string memory _new_base_uri) public onlyOwner {
    baseURI = _new_base_uri;
  }

  function set_reveal_uri(string memory _new_reveal_uri) public onlyOwner {
    revealURI = _new_reveal_uri;
  }

  function set_sbreborn_revealed(bool _new_sbreborn_revealed) public onlyOwner {
    sbreborn_revealed = _new_sbreborn_revealed;
  }

  function set_public_stage_activated(bool _new_public_stage_activated) public onlyOwner {
    public_stage_activated = _new_public_stage_activated;
  }

  function set_max_supply(uint256 _new_max_supply) public onlyOwner {
    max_supply = _new_max_supply;
  }

  function set_current_cost(uint256 _new_current_cost) public onlyOwner {
    current_cost = _new_current_cost;
  }

  function set_current_stage_number(uint256 _new_current_stage_number) public onlyOwner {
    current_stage_number = _new_current_stage_number;
  }

  function set_stage_1_mkroot(bytes32 _new_stage_1_mkroot) public onlyOwner {
    stage_1_mkroot = _new_stage_1_mkroot;
  }

  function set_stage_2_mkroot(bytes32 _new_stage_2_mkroot) public onlyOwner {
    stage_2_mkroot = _new_stage_2_mkroot;
  }

  function set_stage_3_mkroot(bytes32 _new_stage_3_mkroot) public onlyOwner {
    stage_3_mkroot = _new_stage_3_mkroot;
  }

  function set_stage_4_mkroot(bytes32 _new_stage_4_mkroot) public onlyOwner {
    stage_4_mkroot = _new_stage_4_mkroot;
  }

  function set_stage_5_mkroot(bytes32 _new_stage_5_mkroot) public onlyOwner {
    stage_5_mkroot = _new_stage_5_mkroot;
  }

  function add_mint_wallet(address _new_wallet_can_mint) public onlyOwner {
    wallet_can_mint[_new_wallet_can_mint] = true;
  }

  function burn(uint256 _tokenId) public onlyOwner {
    _burn(_tokenId);
  }

  function withdraw() public payable onlyOwner {
    uint256 contract_balance = address(this).balance;
    uint256 community_wallet = contract_balance * 10 / 100;
    uint256 investment_wallet = contract_balance * 40 / 100;
    uint256 marketing_wallet = contract_balance * 50 / 100;
    payable(0x61c9651b626B0aed8476243D2d27F4cdd0D2d881).transfer(community_wallet);
    payable(0x26E37142DbEF20f1683A5b8d8bAcFaA8c7525631).transfer(investment_wallet);
    payable(0xBd9e9915fC583bE672Bb882b79a7576C97a1cC6F).transfer(marketing_wallet);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","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":[{"internalType":"address","name":"_new_wallet_can_mint","type":"address"}],"name":"add_mint_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"current_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"current_stage_number","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_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_stage_activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"_mint_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_mkproof","type":"bytes32[]"}],"name":"sbrebornPurchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sbreborn_revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_new_base_uri","type":"string"}],"name":"set_base_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_current_cost","type":"uint256"}],"name":"set_current_cost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_current_stage_number","type":"uint256"}],"name":"set_current_stage_number","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new_max_supply","type":"uint256"}],"name":"set_max_supply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_new_public_stage_activated","type":"bool"}],"name":"set_public_stage_activated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new_reveal_uri","type":"string"}],"name":"set_reveal_uri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_new_sbreborn_revealed","type":"bool"}],"name":"set_sbreborn_revealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_new_stage_1_mkroot","type":"bytes32"}],"name":"set_stage_1_mkroot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_new_stage_2_mkroot","type":"bytes32"}],"name":"set_stage_2_mkroot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_new_stage_3_mkroot","type":"bytes32"}],"name":"set_stage_3_mkroot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_new_stage_4_mkroot","type":"bytes32"}],"name":"set_stage_4_mkroot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_new_stage_5_mkroot","type":"bytes32"}],"name":"set_stage_5_mkroot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stage_1_mkroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stage_2_mkroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stage_3_mkroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stage_4_mkroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stage_5_mkroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_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":[{"internalType":"address","name":"","type":"address"}],"name":"wallet_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wallet_can_mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506109d7600b5567012dfb0cb5e88000600c556000600d557f23595a3a92e2c88661161c6170861b35d5961f7c3dc1006eb0739bbb59b2d21860001b600e557fe881784b8769b49242bc560a27c4fa9e5657b62def3383fc93765e424e3c35ee60001b600f557f23595a3a92e2c88661161c6170861b35d5961f7c3dc1006eb0739bbb59b2d21860001b6010557fe881784b8769b49242bc560a27c4fa9e5657b62def3383fc93765e424e3c35ee60001b6011557f4a169d65c62315752a1bf5f2401bd24269aafef94e61993a9b42c734dba2f25960001b6012553480156200012157600080fd5b506040518060400160405280601181526020017f53484942414245415354205245424f524e0000000000000000000000000000008152506040518060400160405280600881526020017f53425245424f524e0000000000000000000000000000000000000000000000008152508160029080519060200190620001a6929190620002d9565b508060039080519060200190620001bf929190620002d9565b50620001d06200020660201b60201c565b6000819055505050620001f8620001ec6200020b60201b60201c565b6200021360201b60201c565b6001600981905550620003ed565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e790620003b8565b90600052602060002090601f0160209004810192826200030b576000855562000357565b82601f106200032657805160ff191683800117855562000357565b8280016001018555821562000357579182015b828111156200035657825182559160200191906001019062000339565b5b5090506200036691906200036a565b5090565b5b80821115620003855760008160009055506001016200036b565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003d157607f821691505b602082108103620003e757620003e662000389565b5b50919050565b614f0e80620003fd6000396000f3fe6080604052600436106102885760003560e01c80638da5cb5b1161015a578063cbc92499116100c1578063ecab70791161007a578063ecab707914610988578063eebb17f8146109b3578063effc9067146109dc578063f0b1292a14610a07578063f2fde38b14610a44578063fc27fc3914610a6d57610288565b8063cbc924991461087e578063cbd751f7146108a7578063d1f0ccd5146108d0578063e1bcb32e146108f9578063e706e5e814610922578063e985e9c51461094b57610288565b8063af1c521111610113578063af1c52111461077f578063b58bab36146107a8578063b88d4fde146107d3578063bd742dd8146107fc578063be1fd87314610825578063c87b56dd1461084157610288565b80638da5cb5b1461067f57806394767c99146106aa57806395d89b41146106d5578063a22cb46514610700578063a83cfbf514610729578063a976620f1461075457610288565b8063420ab222116101fe5780636c0360eb116101b75780636c0360eb1461058157806370a08231146105ac578063715018a6146105e95780637bed1ccf146106005780638a333b501461062b5780638a938f2f1461065657610288565b8063420ab2221461047357806342842e0e1461049c57806342966c68146104c557806357187412146104ee57806360fb5be2146105195780636352211e1461054457610288565b8063160fba5611610250578063160fba561461038457806318160ddd146103af5780631d4b37d0146103da5780631fa7b75d1461041757806323b872dd146104405780633ccfd60b1461046957610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b3146103325780630e467d6f1461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613c3f565b610a96565b6040516102c19190613c87565b60405180910390f35b3480156102d657600080fd5b506102df610b78565b6040516102ec9190613d3b565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613d93565b610c0a565b6040516103299190613e01565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613e48565b610c86565b005b34801561036757600080fd5b50610382600480360381019061037d9190613d93565b610d90565b005b34801561039057600080fd5b50610399610e16565b6040516103a69190613d3b565b60405180910390f35b3480156103bb57600080fd5b506103c4610ea4565b6040516103d19190613e97565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190613eb2565b610ebb565b60405161040e9190613c87565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190613eb2565b610edb565b005b34801561044c57600080fd5b5061046760048036038101906104629190613edf565b610fb2565b005b610471610fc2565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613f68565b6111b1565b005b3480156104a857600080fd5b506104c360048036038101906104be9190613edf565b611237565b005b3480156104d157600080fd5b506104ec60048036038101906104e79190613d93565b611257565b005b3480156104fa57600080fd5b506105036112df565b6040516105109190613c87565b60405180910390f35b34801561052557600080fd5b5061052e6112f2565b60405161053b9190613fa4565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613d93565b6112f8565b6040516105789190613e01565b60405180910390f35b34801561058d57600080fd5b5061059661130e565b6040516105a39190613d3b565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613eb2565b61139c565b6040516105e09190613e97565b60405180910390f35b3480156105f557600080fd5b506105fe61146b565b005b34801561060c57600080fd5b506106156114f3565b6040516106229190613c87565b60405180910390f35b34801561063757600080fd5b50610640611506565b60405161064d9190613e97565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190613d93565b61150c565b005b34801561068b57600080fd5b50610694611592565b6040516106a19190613e01565b60405180910390f35b3480156106b657600080fd5b506106bf6115bc565b6040516106cc9190613fa4565b60405180910390f35b3480156106e157600080fd5b506106ea6115c2565b6040516106f79190613d3b565b60405180910390f35b34801561070c57600080fd5b5061072760048036038101906107229190613feb565b611654565b005b34801561073557600080fd5b5061073e6117cb565b60405161074b9190613fa4565b60405180910390f35b34801561076057600080fd5b506107696117d1565b6040516107769190613e97565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190614160565b6117d7565b005b3480156107b457600080fd5b506107bd61186d565b6040516107ca9190613e97565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f5919061424a565b611873565b005b34801561080857600080fd5b50610823600480360381019061081e9190614160565b6118ef565b005b61083f600480360381019061083a919061432d565b611985565b005b34801561084d57600080fd5b5061086860048036038101906108639190613d93565b611ecc565b6040516108759190613d3b565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a09190613f68565b611ff0565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190613f68565b612076565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613d93565b6120fc565b005b34801561090557600080fd5b50610920600480360381019061091b9190613f68565b612182565b005b34801561092e57600080fd5b506109496004803603810190610944919061438d565b612208565b005b34801561095757600080fd5b50610972600480360381019061096d91906143ba565b6122a1565b60405161097f9190613c87565b60405180910390f35b34801561099457600080fd5b5061099d612335565b6040516109aa9190613fa4565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613f68565b61233b565b005b3480156109e857600080fd5b506109f16123c1565b6040516109fe9190613fa4565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613eb2565b6123c7565b604051610a3b9190613e97565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613eb2565b6123df565b005b348015610a7957600080fd5b50610a946004803603810190610a8f919061438d565b6124d6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b715750610b708261256f565b5b9050919050565b606060028054610b8790614429565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb390614429565b8015610c005780601f10610bd557610100808354040283529160200191610c00565b820191906000526020600020905b815481529060010190602001808311610be357829003601f168201915b5050505050905090565b6000610c15826125d9565b610c4b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c91826112f8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d17612627565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d495750610d4781610d42612627565b6122a1565b155b15610d80576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d8b83838361262f565b505050565b610d98612627565b73ffffffffffffffffffffffffffffffffffffffff16610db6611592565b73ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906144a6565b60405180910390fd5b80600d8190555050565b60148054610e2390614429565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f90614429565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b505050505081565b6000610eae6126e1565b6001546000540303905090565b60176020528060005260406000206000915054906101000a900460ff1681565b610ee3612627565b73ffffffffffffffffffffffffffffffffffffffff16610f01611592565b73ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906144a6565b60405180910390fd5b6001601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610fbd8383836126e6565b505050565b610fca612627565b73ffffffffffffffffffffffffffffffffffffffff16610fe8611592565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611035906144a6565b60405180910390fd5b600047905060006064600a8361105491906144f5565b61105e919061457e565b90506000606460288461107191906144f5565b61107b919061457e565b90506000606460328561108e91906144f5565b611098919061457e565b90507361c9651b626b0aed8476243d2d27f4cdd0d2d88173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156110f4573d6000803e3d6000fd5b507326e37142dbef20f1683a5b8d8bacfaa8c752563173ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561114f573d6000803e3d6000fd5b5073bd9e9915fc583be672bb882b79a7576c97a1cc6f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111aa573d6000803e3d6000fd5b5050505050565b6111b9612627565b73ffffffffffffffffffffffffffffffffffffffff166111d7611592565b73ffffffffffffffffffffffffffffffffffffffff161461122d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611224906144a6565b60405180910390fd5b8060118190555050565b61125283838360405180602001604052806000815250611873565b505050565b61125f612627565b73ffffffffffffffffffffffffffffffffffffffff1661127d611592565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca906144a6565b60405180910390fd5b6112dc81612b9a565b50565b600a60009054906101000a900460ff1681565b600f5481565b600061130382612ba8565b600001519050919050565b6013805461131b90614429565b80601f016020809104026020016040519081016040528092919081815260200182805461134790614429565b80156113945780601f1061136957610100808354040283529160200191611394565b820191906000526020600020905b81548152906001019060200180831161137757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611403576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611473612627565b73ffffffffffffffffffffffffffffffffffffffff16611491611592565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de906144a6565b60405180910390fd5b6114f16000612e37565b565b600a60019054906101000a900460ff1681565b600b5481565b611514612627565b73ffffffffffffffffffffffffffffffffffffffff16611532611592565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f906144a6565b60405180910390fd5b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6060600380546115d190614429565b80601f01602080910402602001604051908101604052809291908181526020018280546115fd90614429565b801561164a5780601f1061161f5761010080835404028352916020019161164a565b820191906000526020600020905b81548152906001019060200180831161162d57829003601f168201915b5050505050905090565b61165c612627565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116cd612627565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661177a612627565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117bf9190613c87565b60405180910390a35050565b60105481565b600c5481565b6117df612627565b73ffffffffffffffffffffffffffffffffffffffff166117fd611592565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a906144a6565b60405180910390fd5b8060139080519060200190611869929190613aed565b5050565b600d5481565b61187e8484846126e6565b61189d8373ffffffffffffffffffffffffffffffffffffffff16612efd565b80156118b257506118b084848484612f10565b155b156118e9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6118f7612627565b73ffffffffffffffffffffffffffffffffffffffff16611915611592565b73ffffffffffffffffffffffffffffffffffffffff161461196b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611962906144a6565b60405180910390fd5b8060149080519060200190611981929190613aed565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea906145fb565b60405180910390fd5b42601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90614667565b60405180910390fd5b600260095403611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab0906146d3565b60405180910390fd5b60026009819055506000600d5411611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd9061473f565b60405180910390fd5b6002600d541115611b625782600c54611b1f91906144f5565b341015611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906147ab565b60405180910390fd5b5b6000611b6c610ea4565b90506000611b78613060565b9050600a60019054906101000a900460ff16611c9857600033604051602001611ba19190614813565b604051602081830303815290604052805190602001209050601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c9657611c56858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836130f5565b611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c906148a0565b60405180910390fd5b5b505b60008511611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061490c565b60405180910390fd5b600b548286611cea919061492c565b1115611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d22906149ce565b60405180910390fd5b6001600d5403611dc457600285601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d82919061492c565b1115611dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dba90614a3a565b60405180910390fd5b5b6002600d5403611e5d57600185601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e1b919061492c565b1115611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390614aa6565b60405180910390fd5b5b84601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eac919061492c565b92505081905550611ebd338661310c565b50506001600981905550505050565b6060611ed7826125d9565b611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d90614b12565b60405180910390fd5b600a60009054906101000a900460ff1615611f5d576013611f368361312a565b604051602001611f47929190614c02565b6040516020818303038152906040529050611feb565b60148054611f6a90614429565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9690614429565b8015611fe35780601f10611fb857610100808354040283529160200191611fe3565b820191906000526020600020905b815481529060010190602001808311611fc657829003601f168201915b505050505090505b919050565b611ff8612627565b73ffffffffffffffffffffffffffffffffffffffff16612016611592565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612063906144a6565b60405180910390fd5b80600f8190555050565b61207e612627565b73ffffffffffffffffffffffffffffffffffffffff1661209c611592565b73ffffffffffffffffffffffffffffffffffffffff16146120f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e9906144a6565b60405180910390fd5b8060108190555050565b612104612627565b73ffffffffffffffffffffffffffffffffffffffff16612122611592565b73ffffffffffffffffffffffffffffffffffffffff1614612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f906144a6565b60405180910390fd5b80600c8190555050565b61218a612627565b73ffffffffffffffffffffffffffffffffffffffff166121a8611592565b73ffffffffffffffffffffffffffffffffffffffff16146121fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f5906144a6565b60405180910390fd5b80600e8190555050565b612210612627565b73ffffffffffffffffffffffffffffffffffffffff1661222e611592565b73ffffffffffffffffffffffffffffffffffffffff1614612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b906144a6565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b612343612627565b73ffffffffffffffffffffffffffffffffffffffff16612361611592565b73ffffffffffffffffffffffffffffffffffffffff16146123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae906144a6565b60405180910390fd5b8060128190555050565b60115481565b60166020528060005260406000206000915090505481565b6123e7612627565b73ffffffffffffffffffffffffffffffffffffffff16612405611592565b73ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612452906144a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c190614c98565b60405180910390fd5b6124d381612e37565b50565b6124de612627565b73ffffffffffffffffffffffffffffffffffffffff166124fc611592565b73ffffffffffffffffffffffffffffffffffffffff1614612552576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612549906144a6565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816125e46126e1565b111580156125f3575060005482105b8015612620575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006126f182612ba8565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461275c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661277d612627565b73ffffffffffffffffffffffffffffffffffffffff1614806127ac57506127ab856127a6612627565b6122a1565b5b806127f157506127ba612627565b73ffffffffffffffffffffffffffffffffffffffff166127d984610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061282a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612890576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289d858585600161328a565b6128a96000848761262f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b28576000548214612b2757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b938585856001613290565b5050505050565b612ba5816000613296565b50565b612bb0613b73565b600082905080612bbe6126e1565b11158015612bcd575060005481105b15612e00576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612dfe57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ce2578092505050612e32565b5b600115612dfd57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612df8578092505050612e32565b612ce3565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f36612627565b8786866040518563ffffffff1660e01b8152600401612f589493929190614d0d565b6020604051808303816000875af1925050508015612f9457506040513d601f19601f82011682018060405250810190612f919190614d6e565b60015b61300d573d8060008114612fc4576040519150601f19603f3d011682016040523d82523d6000602084013e612fc9565b606091505b506000815103613005576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008060405160200161307290614de7565b6040516020818303038152906040528051906020012090506001600d540361309e57600e5490506130ee565b6002600d54036130b257600f5490506130ed565b6003600d54036130c65760105490506130ec565b6004600d54036130da5760115490506130eb565b6005600d54036130ea5760125490505b5b5b5b5b8091505090565b6000826131028584613685565b1490509392505050565b6131268282604051806020016040528060008152506136fa565b5050565b606060008203613171576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613285565b600082905060005b600082146131a357808061318c90614dfc565b915050600a8261319c919061457e565b9150613179565b60008167ffffffffffffffff8111156131bf576131be614035565b5b6040519080825280601f01601f1916602001820160405280156131f15781602001600182028036833780820191505090505b5090505b6000851461327e5760018261320a9190614e44565b9150600a856132199190614e78565b6030613225919061492c565b60f81b81838151811061323b5761323a614ea9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613277919061457e565b94506131f5565b8093505050505b919050565b50505050565b50505050565b60006132a183612ba8565b905060008160000151905082156133825760008173ffffffffffffffffffffffffffffffffffffffff166132d3612627565b73ffffffffffffffffffffffffffffffffffffffff1614806133025750613301826132fc612627565b6122a1565b5b806133475750613310612627565b73ffffffffffffffffffffffffffffffffffffffff1661332f86610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613380576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61339081600086600161328a565b61339c6000858361262f565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036135ff5760005482146135fe57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461366d816000866001613290565b60016000815480929190600101919050555050505050565b60008082905060005b84518110156136ef5760008582815181106136ac576136ab614ea9565b5b602002602001015190508083116136ce576136c7838261370c565b92506136db565b6136d8818461370c565b92505b5080806136e790614dfc565b91505061368e565b508091505092915050565b6137078383836001613723565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361378f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036137c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137d6600086838761328a565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139a0575061399f8773ffffffffffffffffffffffffffffffffffffffff16612efd565b5b15613a65575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a156000888480600101955088612f10565b613a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036139a6578260005414613a6057600080fd5b613ad0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613a66575b816000819055505050613ae66000868387613290565b5050505050565b828054613af990614429565b90600052602060002090601f016020900481019282613b1b5760008555613b62565b82601f10613b3457805160ff1916838001178555613b62565b82800160010185558215613b62579182015b82811115613b61578251825591602001919060010190613b46565b5b509050613b6f9190613bb6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bcf576000816000905550600101613bb7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c1c81613be7565b8114613c2757600080fd5b50565b600081359050613c3981613c13565b92915050565b600060208284031215613c5557613c54613bdd565b5b6000613c6384828501613c2a565b91505092915050565b60008115159050919050565b613c8181613c6c565b82525050565b6000602082019050613c9c6000830184613c78565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cdc578082015181840152602081019050613cc1565b83811115613ceb576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d0d82613ca2565b613d178185613cad565b9350613d27818560208601613cbe565b613d3081613cf1565b840191505092915050565b60006020820190508181036000830152613d558184613d02565b905092915050565b6000819050919050565b613d7081613d5d565b8114613d7b57600080fd5b50565b600081359050613d8d81613d67565b92915050565b600060208284031215613da957613da8613bdd565b5b6000613db784828501613d7e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613deb82613dc0565b9050919050565b613dfb81613de0565b82525050565b6000602082019050613e166000830184613df2565b92915050565b613e2581613de0565b8114613e3057600080fd5b50565b600081359050613e4281613e1c565b92915050565b60008060408385031215613e5f57613e5e613bdd565b5b6000613e6d85828601613e33565b9250506020613e7e85828601613d7e565b9150509250929050565b613e9181613d5d565b82525050565b6000602082019050613eac6000830184613e88565b92915050565b600060208284031215613ec857613ec7613bdd565b5b6000613ed684828501613e33565b91505092915050565b600080600060608486031215613ef857613ef7613bdd565b5b6000613f0686828701613e33565b9350506020613f1786828701613e33565b9250506040613f2886828701613d7e565b9150509250925092565b6000819050919050565b613f4581613f32565b8114613f5057600080fd5b50565b600081359050613f6281613f3c565b92915050565b600060208284031215613f7e57613f7d613bdd565b5b6000613f8c84828501613f53565b91505092915050565b613f9e81613f32565b82525050565b6000602082019050613fb96000830184613f95565b92915050565b613fc881613c6c565b8114613fd357600080fd5b50565b600081359050613fe581613fbf565b92915050565b6000806040838503121561400257614001613bdd565b5b600061401085828601613e33565b925050602061402185828601613fd6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61406d82613cf1565b810181811067ffffffffffffffff8211171561408c5761408b614035565b5b80604052505050565b600061409f613bd3565b90506140ab8282614064565b919050565b600067ffffffffffffffff8211156140cb576140ca614035565b5b6140d482613cf1565b9050602081019050919050565b82818337600083830152505050565b60006141036140fe846140b0565b614095565b90508281526020810184848401111561411f5761411e614030565b5b61412a8482856140e1565b509392505050565b600082601f8301126141475761414661402b565b5b81356141578482602086016140f0565b91505092915050565b60006020828403121561417657614175613bdd565b5b600082013567ffffffffffffffff81111561419457614193613be2565b5b6141a084828501614132565b91505092915050565b600067ffffffffffffffff8211156141c4576141c3614035565b5b6141cd82613cf1565b9050602081019050919050565b60006141ed6141e8846141a9565b614095565b90508281526020810184848401111561420957614208614030565b5b6142148482856140e1565b509392505050565b600082601f8301126142315761423061402b565b5b81356142418482602086016141da565b91505092915050565b6000806000806080858703121561426457614263613bdd565b5b600061427287828801613e33565b945050602061428387828801613e33565b935050604061429487828801613d7e565b925050606085013567ffffffffffffffff8111156142b5576142b4613be2565b5b6142c18782880161421c565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126142ed576142ec61402b565b5b8235905067ffffffffffffffff81111561430a576143096142cd565b5b602083019150836020820283011115614326576143256142d2565b5b9250929050565b60008060006040848603121561434657614345613bdd565b5b600061435486828701613d7e565b935050602084013567ffffffffffffffff81111561437557614374613be2565b5b614381868287016142d7565b92509250509250925092565b6000602082840312156143a3576143a2613bdd565b5b60006143b184828501613fd6565b91505092915050565b600080604083850312156143d1576143d0613bdd565b5b60006143df85828601613e33565b92505060206143f085828601613e33565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061444157607f821691505b602082108103614454576144536143fa565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614490602083613cad565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061450082613d5d565b915061450b83613d5d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614544576145436144c6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061458982613d5d565b915061459483613d5d565b9250826145a4576145a361454f565b5b828204905092915050565b7f636f6e7472616374735f6e6f745f616c6c6f7765645f746f5f6d696e74000000600082015250565b60006145e5601d83613cad565b91506145f0826145af565b602082019050919050565b60006020820190508181036000830152614614816145d8565b9050919050565b7f6e6f5f6d696e745f6f6e5f7468655f73616d655f626c6f636b00000000000000600082015250565b6000614651601983613cad565b915061465c8261461b565b602082019050919050565b6000602082019050818103600083015261468081614644565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146bd601f83613cad565b91506146c882614687565b602082019050919050565b600060208201905081810360008301526146ec816146b0565b9050919050565b7f6d696e745f69735f6e6f745f7374617274656400000000000000000000000000600082015250565b6000614729601383613cad565b9150614734826146f3565b602082019050919050565b600060208201905081810360008301526147588161471c565b9050919050565b7f696e73756666696369656e745f66756e64730000000000000000000000000000600082015250565b6000614795601283613cad565b91506147a08261475f565b602082019050919050565b600060208201905081810360008301526147c481614788565b9050919050565b60008160601b9050919050565b60006147e3826147cb565b9050919050565b60006147f5826147d8565b9050919050565b61480d61480882613de0565b6147ea565b82525050565b600061481f82846147fc565b60148201915081905092915050565b7f696e76616c69645f667265655f77686974656c6973745f6d65726b6c655f707260008201527f6f6f660000000000000000000000000000000000000000000000000000000000602082015250565b600061488a602383613cad565b91506148958261482e565b604082019050919050565b600060208201905081810360008301526148b98161487d565b9050919050565b7f7175616e746974795f69735f7265717569726564000000000000000000000000600082015250565b60006148f6601483613cad565b9150614901826148c0565b602082019050919050565b60006020820190508181036000830152614925816148e9565b9050919050565b600061493782613d5d565b915061494283613d5d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614977576149766144c6565b5b828201905092915050565b7f6d61785f737570706c795f657863656564656564000000000000000000000000600082015250565b60006149b8601483613cad565b91506149c382614982565b602082019050919050565b600060208201905081810360008301526149e7816149ab565b9050919050565b7f6d61785f73746167655f315f667265655f6d696e745f65786365656465640000600082015250565b6000614a24601e83613cad565b9150614a2f826149ee565b602082019050919050565b60006020820190508181036000830152614a5381614a17565b9050919050565b7f6d61785f73746167655f325f667265655f6d696e745f65786365656465640000600082015250565b6000614a90601e83613cad565b9150614a9b82614a5a565b602082019050919050565b60006020820190508181036000830152614abf81614a83565b9050919050565b7f6e6f6e5f6578697374616e745f746f6b656e0000000000000000000000000000600082015250565b6000614afc601283613cad565b9150614b0782614ac6565b602082019050919050565b60006020820190508181036000830152614b2b81614aef565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614b5f81614429565b614b698186614b32565b94506001821660008114614b845760018114614b9557614bc8565b60ff19831686528186019350614bc8565b614b9e85614b3d565b60005b83811015614bc057815481890152600182019150602081019050614ba1565b838801955050505b50505092915050565b6000614bdc82613ca2565b614be68185614b32565b9350614bf6818560208601613cbe565b80840191505092915050565b6000614c0e8285614b52565b9150614c1a8284614bd1565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c82602683613cad565b9150614c8d82614c26565b604082019050919050565b60006020820190508181036000830152614cb181614c75565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614cdf82614cb8565b614ce98185614cc3565b9350614cf9818560208601613cbe565b614d0281613cf1565b840191505092915050565b6000608082019050614d226000830187613df2565b614d2f6020830186613df2565b614d3c6040830185613e88565b8181036060830152614d4e8184614cd4565b905095945050505050565b600081519050614d6881613c13565b92915050565b600060208284031215614d8457614d83613bdd565b5b6000614d9284828501614d59565b91505092915050565b7f6e6f5f73746167655f6e756d6265725f646566696e6564000000000000000000600082015250565b6000614dd1601783614b32565b9150614ddc82614d9b565b601782019050919050565b6000614df282614dc4565b9150819050919050565b6000614e0782613d5d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e3957614e386144c6565b5b600182019050919050565b6000614e4f82613d5d565b9150614e5a83613d5d565b925082821015614e6d57614e6c6144c6565b5b828203905092915050565b6000614e8382613d5d565b9150614e8e83613d5d565b925082614e9e57614e9d61454f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220c2d9ca7fd92df3e676183bbd98ad35773d5f449854c7273e4c21872a44a0e91b64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102885760003560e01c80638da5cb5b1161015a578063cbc92499116100c1578063ecab70791161007a578063ecab707914610988578063eebb17f8146109b3578063effc9067146109dc578063f0b1292a14610a07578063f2fde38b14610a44578063fc27fc3914610a6d57610288565b8063cbc924991461087e578063cbd751f7146108a7578063d1f0ccd5146108d0578063e1bcb32e146108f9578063e706e5e814610922578063e985e9c51461094b57610288565b8063af1c521111610113578063af1c52111461077f578063b58bab36146107a8578063b88d4fde146107d3578063bd742dd8146107fc578063be1fd87314610825578063c87b56dd1461084157610288565b80638da5cb5b1461067f57806394767c99146106aa57806395d89b41146106d5578063a22cb46514610700578063a83cfbf514610729578063a976620f1461075457610288565b8063420ab222116101fe5780636c0360eb116101b75780636c0360eb1461058157806370a08231146105ac578063715018a6146105e95780637bed1ccf146106005780638a333b501461062b5780638a938f2f1461065657610288565b8063420ab2221461047357806342842e0e1461049c57806342966c68146104c557806357187412146104ee57806360fb5be2146105195780636352211e1461054457610288565b8063160fba5611610250578063160fba561461038457806318160ddd146103af5780631d4b37d0146103da5780631fa7b75d1461041757806323b872dd146104405780633ccfd60b1461046957610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b3146103325780630e467d6f1461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613c3f565b610a96565b6040516102c19190613c87565b60405180910390f35b3480156102d657600080fd5b506102df610b78565b6040516102ec9190613d3b565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613d93565b610c0a565b6040516103299190613e01565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613e48565b610c86565b005b34801561036757600080fd5b50610382600480360381019061037d9190613d93565b610d90565b005b34801561039057600080fd5b50610399610e16565b6040516103a69190613d3b565b60405180910390f35b3480156103bb57600080fd5b506103c4610ea4565b6040516103d19190613e97565b60405180910390f35b3480156103e657600080fd5b5061040160048036038101906103fc9190613eb2565b610ebb565b60405161040e9190613c87565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190613eb2565b610edb565b005b34801561044c57600080fd5b5061046760048036038101906104629190613edf565b610fb2565b005b610471610fc2565b005b34801561047f57600080fd5b5061049a60048036038101906104959190613f68565b6111b1565b005b3480156104a857600080fd5b506104c360048036038101906104be9190613edf565b611237565b005b3480156104d157600080fd5b506104ec60048036038101906104e79190613d93565b611257565b005b3480156104fa57600080fd5b506105036112df565b6040516105109190613c87565b60405180910390f35b34801561052557600080fd5b5061052e6112f2565b60405161053b9190613fa4565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190613d93565b6112f8565b6040516105789190613e01565b60405180910390f35b34801561058d57600080fd5b5061059661130e565b6040516105a39190613d3b565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613eb2565b61139c565b6040516105e09190613e97565b60405180910390f35b3480156105f557600080fd5b506105fe61146b565b005b34801561060c57600080fd5b506106156114f3565b6040516106229190613c87565b60405180910390f35b34801561063757600080fd5b50610640611506565b60405161064d9190613e97565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190613d93565b61150c565b005b34801561068b57600080fd5b50610694611592565b6040516106a19190613e01565b60405180910390f35b3480156106b657600080fd5b506106bf6115bc565b6040516106cc9190613fa4565b60405180910390f35b3480156106e157600080fd5b506106ea6115c2565b6040516106f79190613d3b565b60405180910390f35b34801561070c57600080fd5b5061072760048036038101906107229190613feb565b611654565b005b34801561073557600080fd5b5061073e6117cb565b60405161074b9190613fa4565b60405180910390f35b34801561076057600080fd5b506107696117d1565b6040516107769190613e97565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a19190614160565b6117d7565b005b3480156107b457600080fd5b506107bd61186d565b6040516107ca9190613e97565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f5919061424a565b611873565b005b34801561080857600080fd5b50610823600480360381019061081e9190614160565b6118ef565b005b61083f600480360381019061083a919061432d565b611985565b005b34801561084d57600080fd5b5061086860048036038101906108639190613d93565b611ecc565b6040516108759190613d3b565b60405180910390f35b34801561088a57600080fd5b506108a560048036038101906108a09190613f68565b611ff0565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190613f68565b612076565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613d93565b6120fc565b005b34801561090557600080fd5b50610920600480360381019061091b9190613f68565b612182565b005b34801561092e57600080fd5b506109496004803603810190610944919061438d565b612208565b005b34801561095757600080fd5b50610972600480360381019061096d91906143ba565b6122a1565b60405161097f9190613c87565b60405180910390f35b34801561099457600080fd5b5061099d612335565b6040516109aa9190613fa4565b60405180910390f35b3480156109bf57600080fd5b506109da60048036038101906109d59190613f68565b61233b565b005b3480156109e857600080fd5b506109f16123c1565b6040516109fe9190613fa4565b60405180910390f35b348015610a1357600080fd5b50610a2e6004803603810190610a299190613eb2565b6123c7565b604051610a3b9190613e97565b60405180910390f35b348015610a5057600080fd5b50610a6b6004803603810190610a669190613eb2565b6123df565b005b348015610a7957600080fd5b50610a946004803603810190610a8f919061438d565b6124d6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b715750610b708261256f565b5b9050919050565b606060028054610b8790614429565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb390614429565b8015610c005780601f10610bd557610100808354040283529160200191610c00565b820191906000526020600020905b815481529060010190602001808311610be357829003601f168201915b5050505050905090565b6000610c15826125d9565b610c4b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c91826112f8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d17612627565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d495750610d4781610d42612627565b6122a1565b155b15610d80576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d8b83838361262f565b505050565b610d98612627565b73ffffffffffffffffffffffffffffffffffffffff16610db6611592565b73ffffffffffffffffffffffffffffffffffffffff1614610e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e03906144a6565b60405180910390fd5b80600d8190555050565b60148054610e2390614429565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f90614429565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b505050505081565b6000610eae6126e1565b6001546000540303905090565b60176020528060005260406000206000915054906101000a900460ff1681565b610ee3612627565b73ffffffffffffffffffffffffffffffffffffffff16610f01611592565b73ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906144a6565b60405180910390fd5b6001601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610fbd8383836126e6565b505050565b610fca612627565b73ffffffffffffffffffffffffffffffffffffffff16610fe8611592565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611035906144a6565b60405180910390fd5b600047905060006064600a8361105491906144f5565b61105e919061457e565b90506000606460288461107191906144f5565b61107b919061457e565b90506000606460328561108e91906144f5565b611098919061457e565b90507361c9651b626b0aed8476243d2d27f4cdd0d2d88173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156110f4573d6000803e3d6000fd5b507326e37142dbef20f1683a5b8d8bacfaa8c752563173ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561114f573d6000803e3d6000fd5b5073bd9e9915fc583be672bb882b79a7576c97a1cc6f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156111aa573d6000803e3d6000fd5b5050505050565b6111b9612627565b73ffffffffffffffffffffffffffffffffffffffff166111d7611592565b73ffffffffffffffffffffffffffffffffffffffff161461122d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611224906144a6565b60405180910390fd5b8060118190555050565b61125283838360405180602001604052806000815250611873565b505050565b61125f612627565b73ffffffffffffffffffffffffffffffffffffffff1661127d611592565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca906144a6565b60405180910390fd5b6112dc81612b9a565b50565b600a60009054906101000a900460ff1681565b600f5481565b600061130382612ba8565b600001519050919050565b6013805461131b90614429565b80601f016020809104026020016040519081016040528092919081815260200182805461134790614429565b80156113945780601f1061136957610100808354040283529160200191611394565b820191906000526020600020905b81548152906001019060200180831161137757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611403576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611473612627565b73ffffffffffffffffffffffffffffffffffffffff16611491611592565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de906144a6565b60405180910390fd5b6114f16000612e37565b565b600a60019054906101000a900460ff1681565b600b5481565b611514612627565b73ffffffffffffffffffffffffffffffffffffffff16611532611592565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f906144a6565b60405180910390fd5b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6060600380546115d190614429565b80601f01602080910402602001604051908101604052809291908181526020018280546115fd90614429565b801561164a5780601f1061161f5761010080835404028352916020019161164a565b820191906000526020600020905b81548152906001019060200180831161162d57829003601f168201915b5050505050905090565b61165c612627565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116cd612627565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661177a612627565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117bf9190613c87565b60405180910390a35050565b60105481565b600c5481565b6117df612627565b73ffffffffffffffffffffffffffffffffffffffff166117fd611592565b73ffffffffffffffffffffffffffffffffffffffff1614611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a906144a6565b60405180910390fd5b8060139080519060200190611869929190613aed565b5050565b600d5481565b61187e8484846126e6565b61189d8373ffffffffffffffffffffffffffffffffffffffff16612efd565b80156118b257506118b084848484612f10565b155b156118e9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6118f7612627565b73ffffffffffffffffffffffffffffffffffffffff16611915611592565b73ffffffffffffffffffffffffffffffffffffffff161461196b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611962906144a6565b60405180910390fd5b8060149080519060200190611981929190613aed565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146119f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ea906145fb565b60405180910390fd5b42601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90614667565b60405180910390fd5b600260095403611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab0906146d3565b60405180910390fd5b60026009819055506000600d5411611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd9061473f565b60405180910390fd5b6002600d541115611b625782600c54611b1f91906144f5565b341015611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906147ab565b60405180910390fd5b5b6000611b6c610ea4565b90506000611b78613060565b9050600a60019054906101000a900460ff16611c9857600033604051602001611ba19190614813565b604051602081830303815290604052805190602001209050601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c9657611c56858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505083836130f5565b611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c906148a0565b60405180910390fd5b5b505b60008511611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd29061490c565b60405180910390fd5b600b548286611cea919061492c565b1115611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d22906149ce565b60405180910390fd5b6001600d5403611dc457600285601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d82919061492c565b1115611dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dba90614a3a565b60405180910390fd5b5b6002600d5403611e5d57600185601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e1b919061492c565b1115611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390614aa6565b60405180910390fd5b5b84601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eac919061492c565b92505081905550611ebd338661310c565b50506001600981905550505050565b6060611ed7826125d9565b611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d90614b12565b60405180910390fd5b600a60009054906101000a900460ff1615611f5d576013611f368361312a565b604051602001611f47929190614c02565b6040516020818303038152906040529050611feb565b60148054611f6a90614429565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9690614429565b8015611fe35780601f10611fb857610100808354040283529160200191611fe3565b820191906000526020600020905b815481529060010190602001808311611fc657829003601f168201915b505050505090505b919050565b611ff8612627565b73ffffffffffffffffffffffffffffffffffffffff16612016611592565b73ffffffffffffffffffffffffffffffffffffffff161461206c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612063906144a6565b60405180910390fd5b80600f8190555050565b61207e612627565b73ffffffffffffffffffffffffffffffffffffffff1661209c611592565b73ffffffffffffffffffffffffffffffffffffffff16146120f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e9906144a6565b60405180910390fd5b8060108190555050565b612104612627565b73ffffffffffffffffffffffffffffffffffffffff16612122611592565b73ffffffffffffffffffffffffffffffffffffffff1614612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216f906144a6565b60405180910390fd5b80600c8190555050565b61218a612627565b73ffffffffffffffffffffffffffffffffffffffff166121a8611592565b73ffffffffffffffffffffffffffffffffffffffff16146121fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f5906144a6565b60405180910390fd5b80600e8190555050565b612210612627565b73ffffffffffffffffffffffffffffffffffffffff1661222e611592565b73ffffffffffffffffffffffffffffffffffffffff1614612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b906144a6565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b612343612627565b73ffffffffffffffffffffffffffffffffffffffff16612361611592565b73ffffffffffffffffffffffffffffffffffffffff16146123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae906144a6565b60405180910390fd5b8060128190555050565b60115481565b60166020528060005260406000206000915090505481565b6123e7612627565b73ffffffffffffffffffffffffffffffffffffffff16612405611592565b73ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612452906144a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c190614c98565b60405180910390fd5b6124d381612e37565b50565b6124de612627565b73ffffffffffffffffffffffffffffffffffffffff166124fc611592565b73ffffffffffffffffffffffffffffffffffffffff1614612552576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612549906144a6565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816125e46126e1565b111580156125f3575060005482105b8015612620575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006126f182612ba8565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461275c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661277d612627565b73ffffffffffffffffffffffffffffffffffffffff1614806127ac57506127ab856127a6612627565b6122a1565b5b806127f157506127ba612627565b73ffffffffffffffffffffffffffffffffffffffff166127d984610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061282a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612890576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61289d858585600161328a565b6128a96000848761262f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b28576000548214612b2757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b938585856001613290565b5050505050565b612ba5816000613296565b50565b612bb0613b73565b600082905080612bbe6126e1565b11158015612bcd575060005481105b15612e00576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612dfe57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ce2578092505050612e32565b5b600115612dfd57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612df8578092505050612e32565b612ce3565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f36612627565b8786866040518563ffffffff1660e01b8152600401612f589493929190614d0d565b6020604051808303816000875af1925050508015612f9457506040513d601f19601f82011682018060405250810190612f919190614d6e565b60015b61300d573d8060008114612fc4576040519150601f19603f3d011682016040523d82523d6000602084013e612fc9565b606091505b506000815103613005576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008060405160200161307290614de7565b6040516020818303038152906040528051906020012090506001600d540361309e57600e5490506130ee565b6002600d54036130b257600f5490506130ed565b6003600d54036130c65760105490506130ec565b6004600d54036130da5760115490506130eb565b6005600d54036130ea5760125490505b5b5b5b5b8091505090565b6000826131028584613685565b1490509392505050565b6131268282604051806020016040528060008152506136fa565b5050565b606060008203613171576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613285565b600082905060005b600082146131a357808061318c90614dfc565b915050600a8261319c919061457e565b9150613179565b60008167ffffffffffffffff8111156131bf576131be614035565b5b6040519080825280601f01601f1916602001820160405280156131f15781602001600182028036833780820191505090505b5090505b6000851461327e5760018261320a9190614e44565b9150600a856132199190614e78565b6030613225919061492c565b60f81b81838151811061323b5761323a614ea9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613277919061457e565b94506131f5565b8093505050505b919050565b50505050565b50505050565b60006132a183612ba8565b905060008160000151905082156133825760008173ffffffffffffffffffffffffffffffffffffffff166132d3612627565b73ffffffffffffffffffffffffffffffffffffffff1614806133025750613301826132fc612627565b6122a1565b5b806133475750613310612627565b73ffffffffffffffffffffffffffffffffffffffff1661332f86610c0a565b73ffffffffffffffffffffffffffffffffffffffff16145b905080613380576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61339081600086600161328a565b61339c6000858361262f565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036135ff5760005482146135fe57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461366d816000866001613290565b60016000815480929190600101919050555050505050565b60008082905060005b84518110156136ef5760008582815181106136ac576136ab614ea9565b5b602002602001015190508083116136ce576136c7838261370c565b92506136db565b6136d8818461370c565b92505b5080806136e790614dfc565b91505061368e565b508091505092915050565b6137078383836001613723565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361378f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036137c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6137d6600086838761328a565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139a0575061399f8773ffffffffffffffffffffffffffffffffffffffff16612efd565b5b15613a65575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a156000888480600101955088612f10565b613a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036139a6578260005414613a6057600080fd5b613ad0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613a66575b816000819055505050613ae66000868387613290565b5050505050565b828054613af990614429565b90600052602060002090601f016020900481019282613b1b5760008555613b62565b82601f10613b3457805160ff1916838001178555613b62565b82800160010185558215613b62579182015b82811115613b61578251825591602001919060010190613b46565b5b509050613b6f9190613bb6565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613bcf576000816000905550600101613bb7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c1c81613be7565b8114613c2757600080fd5b50565b600081359050613c3981613c13565b92915050565b600060208284031215613c5557613c54613bdd565b5b6000613c6384828501613c2a565b91505092915050565b60008115159050919050565b613c8181613c6c565b82525050565b6000602082019050613c9c6000830184613c78565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cdc578082015181840152602081019050613cc1565b83811115613ceb576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d0d82613ca2565b613d178185613cad565b9350613d27818560208601613cbe565b613d3081613cf1565b840191505092915050565b60006020820190508181036000830152613d558184613d02565b905092915050565b6000819050919050565b613d7081613d5d565b8114613d7b57600080fd5b50565b600081359050613d8d81613d67565b92915050565b600060208284031215613da957613da8613bdd565b5b6000613db784828501613d7e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613deb82613dc0565b9050919050565b613dfb81613de0565b82525050565b6000602082019050613e166000830184613df2565b92915050565b613e2581613de0565b8114613e3057600080fd5b50565b600081359050613e4281613e1c565b92915050565b60008060408385031215613e5f57613e5e613bdd565b5b6000613e6d85828601613e33565b9250506020613e7e85828601613d7e565b9150509250929050565b613e9181613d5d565b82525050565b6000602082019050613eac6000830184613e88565b92915050565b600060208284031215613ec857613ec7613bdd565b5b6000613ed684828501613e33565b91505092915050565b600080600060608486031215613ef857613ef7613bdd565b5b6000613f0686828701613e33565b9350506020613f1786828701613e33565b9250506040613f2886828701613d7e565b9150509250925092565b6000819050919050565b613f4581613f32565b8114613f5057600080fd5b50565b600081359050613f6281613f3c565b92915050565b600060208284031215613f7e57613f7d613bdd565b5b6000613f8c84828501613f53565b91505092915050565b613f9e81613f32565b82525050565b6000602082019050613fb96000830184613f95565b92915050565b613fc881613c6c565b8114613fd357600080fd5b50565b600081359050613fe581613fbf565b92915050565b6000806040838503121561400257614001613bdd565b5b600061401085828601613e33565b925050602061402185828601613fd6565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61406d82613cf1565b810181811067ffffffffffffffff8211171561408c5761408b614035565b5b80604052505050565b600061409f613bd3565b90506140ab8282614064565b919050565b600067ffffffffffffffff8211156140cb576140ca614035565b5b6140d482613cf1565b9050602081019050919050565b82818337600083830152505050565b60006141036140fe846140b0565b614095565b90508281526020810184848401111561411f5761411e614030565b5b61412a8482856140e1565b509392505050565b600082601f8301126141475761414661402b565b5b81356141578482602086016140f0565b91505092915050565b60006020828403121561417657614175613bdd565b5b600082013567ffffffffffffffff81111561419457614193613be2565b5b6141a084828501614132565b91505092915050565b600067ffffffffffffffff8211156141c4576141c3614035565b5b6141cd82613cf1565b9050602081019050919050565b60006141ed6141e8846141a9565b614095565b90508281526020810184848401111561420957614208614030565b5b6142148482856140e1565b509392505050565b600082601f8301126142315761423061402b565b5b81356142418482602086016141da565b91505092915050565b6000806000806080858703121561426457614263613bdd565b5b600061427287828801613e33565b945050602061428387828801613e33565b935050604061429487828801613d7e565b925050606085013567ffffffffffffffff8111156142b5576142b4613be2565b5b6142c18782880161421c565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126142ed576142ec61402b565b5b8235905067ffffffffffffffff81111561430a576143096142cd565b5b602083019150836020820283011115614326576143256142d2565b5b9250929050565b60008060006040848603121561434657614345613bdd565b5b600061435486828701613d7e565b935050602084013567ffffffffffffffff81111561437557614374613be2565b5b614381868287016142d7565b92509250509250925092565b6000602082840312156143a3576143a2613bdd565b5b60006143b184828501613fd6565b91505092915050565b600080604083850312156143d1576143d0613bdd565b5b60006143df85828601613e33565b92505060206143f085828601613e33565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061444157607f821691505b602082108103614454576144536143fa565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614490602083613cad565b915061449b8261445a565b602082019050919050565b600060208201905081810360008301526144bf81614483565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061450082613d5d565b915061450b83613d5d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614544576145436144c6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061458982613d5d565b915061459483613d5d565b9250826145a4576145a361454f565b5b828204905092915050565b7f636f6e7472616374735f6e6f745f616c6c6f7765645f746f5f6d696e74000000600082015250565b60006145e5601d83613cad565b91506145f0826145af565b602082019050919050565b60006020820190508181036000830152614614816145d8565b9050919050565b7f6e6f5f6d696e745f6f6e5f7468655f73616d655f626c6f636b00000000000000600082015250565b6000614651601983613cad565b915061465c8261461b565b602082019050919050565b6000602082019050818103600083015261468081614644565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146bd601f83613cad565b91506146c882614687565b602082019050919050565b600060208201905081810360008301526146ec816146b0565b9050919050565b7f6d696e745f69735f6e6f745f7374617274656400000000000000000000000000600082015250565b6000614729601383613cad565b9150614734826146f3565b602082019050919050565b600060208201905081810360008301526147588161471c565b9050919050565b7f696e73756666696369656e745f66756e64730000000000000000000000000000600082015250565b6000614795601283613cad565b91506147a08261475f565b602082019050919050565b600060208201905081810360008301526147c481614788565b9050919050565b60008160601b9050919050565b60006147e3826147cb565b9050919050565b60006147f5826147d8565b9050919050565b61480d61480882613de0565b6147ea565b82525050565b600061481f82846147fc565b60148201915081905092915050565b7f696e76616c69645f667265655f77686974656c6973745f6d65726b6c655f707260008201527f6f6f660000000000000000000000000000000000000000000000000000000000602082015250565b600061488a602383613cad565b91506148958261482e565b604082019050919050565b600060208201905081810360008301526148b98161487d565b9050919050565b7f7175616e746974795f69735f7265717569726564000000000000000000000000600082015250565b60006148f6601483613cad565b9150614901826148c0565b602082019050919050565b60006020820190508181036000830152614925816148e9565b9050919050565b600061493782613d5d565b915061494283613d5d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614977576149766144c6565b5b828201905092915050565b7f6d61785f737570706c795f657863656564656564000000000000000000000000600082015250565b60006149b8601483613cad565b91506149c382614982565b602082019050919050565b600060208201905081810360008301526149e7816149ab565b9050919050565b7f6d61785f73746167655f315f667265655f6d696e745f65786365656465640000600082015250565b6000614a24601e83613cad565b9150614a2f826149ee565b602082019050919050565b60006020820190508181036000830152614a5381614a17565b9050919050565b7f6d61785f73746167655f325f667265655f6d696e745f65786365656465640000600082015250565b6000614a90601e83613cad565b9150614a9b82614a5a565b602082019050919050565b60006020820190508181036000830152614abf81614a83565b9050919050565b7f6e6f6e5f6578697374616e745f746f6b656e0000000000000000000000000000600082015250565b6000614afc601283613cad565b9150614b0782614ac6565b602082019050919050565b60006020820190508181036000830152614b2b81614aef565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614b5f81614429565b614b698186614b32565b94506001821660008114614b845760018114614b9557614bc8565b60ff19831686528186019350614bc8565b614b9e85614b3d565b60005b83811015614bc057815481890152600182019150602081019050614ba1565b838801955050505b50505092915050565b6000614bdc82613ca2565b614be68185614b32565b9350614bf6818560208601613cbe565b80840191505092915050565b6000614c0e8285614b52565b9150614c1a8284614bd1565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c82602683613cad565b9150614c8d82614c26565b604082019050919050565b60006020820190508181036000830152614cb181614c75565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614cdf82614cb8565b614ce98185614cc3565b9350614cf9818560208601613cbe565b614d0281613cf1565b840191505092915050565b6000608082019050614d226000830187613df2565b614d2f6020830186613df2565b614d3c6040830185613e88565b8181036060830152614d4e8184614cd4565b905095945050505050565b600081519050614d6881613c13565b92915050565b600060208284031215614d8457614d83613bdd565b5b6000614d9284828501614d59565b91505092915050565b7f6e6f5f73746167655f6e756d6265725f646566696e6564000000000000000000600082015250565b6000614dd1601783614b32565b9150614ddc82614d9b565b601782019050919050565b6000614df282614dc4565b9150819050919050565b6000614e0782613d5d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e3957614e386144c6565b5b600182019050919050565b6000614e4f82613d5d565b9150614e5a83613d5d565b925082821015614e6d57614e6c6144c6565b5b828203905092915050565b6000614e8382613d5d565b9150614e8e83613d5d565b925082614e9e57614e9d61454f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220c2d9ca7fd92df3e676183bbd98ad35773d5f449854c7273e4c21872a44a0e91b64736f6c634300080d0033

Deployed Bytecode Sourcemap

50336:5776:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31768:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34881:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36384:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35947:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54547:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51185:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31017:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51315:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55345:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37249:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55563:546;;;:::i;:::-;;55087:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37490:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55480:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50428:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50747:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34689:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51159:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32137:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9878:103;;;;;;;;;;;;;:::i;:::-;;50470:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50517:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54313:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9227:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51056:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35050:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36660:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50850:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50554:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53789:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50600:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37746:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53899:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51639:1205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53487:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54829:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54958;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54426:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54700:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54017:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37018:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50644:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55216:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50953:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51261:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10136:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54155:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31768:305;31870:4;31922:25;31907:40;;;:11;:40;;;;:105;;;;31979:33;31964:48;;;:11;:48;;;;31907:105;:158;;;;32029:36;32053:11;32029:23;:36::i;:::-;31907:158;31887:178;;31768:305;;;:::o;34881:100::-;34935:13;34968:5;34961:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34881:100;:::o;36384:204::-;36452:7;36477:16;36485:7;36477;:16::i;:::-;36472:64;;36502:34;;;;;;;;;;;;;;36472:64;36556:15;:24;36572:7;36556:24;;;;;;;;;;;;;;;;;;;;;36549:31;;36384:204;;;:::o;35947:371::-;36020:13;36036:24;36052:7;36036:15;:24::i;:::-;36020:40;;36081:5;36075:11;;:2;:11;;;36071:48;;36095:24;;;;;;;;;;;;;;36071:48;36152:5;36136:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36162:37;36179:5;36186:12;:10;:12::i;:::-;36162:16;:37::i;:::-;36161:38;36136:63;36132:138;;;36223:35;;;;;;;;;;;;;;36132:138;36282:28;36291:2;36295:7;36304:5;36282:8;:28::i;:::-;36009:309;35947:371;;:::o;54547:147::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54663:25:::1;54640:20;:48;;;;54547:147:::0;:::o;51185:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31017:303::-;31061:7;31286:15;:13;:15::i;:::-;31271:12;;31255:13;;:28;:46;31248:53;;31017:303;:::o;51315:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;55345:129::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55464:4:::1;55424:15;:37;55440:20;55424:37;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;55345:129:::0;:::o;37249:170::-;37383:28;37393:4;37399:2;37403:7;37383:9;:28::i;:::-;37249:170;;;:::o;55563:546::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55615:24:::1;55642:21;55615:48;;55670:24;55721:3;55716:2;55697:16;:21;;;;:::i;:::-;:27;;;;:::i;:::-;55670:54;;55731:25;55783:3;55778:2;55759:16;:21;;;;:::i;:::-;:27;;;;:::i;:::-;55731:55;;55793:24;55844:3;55839:2;55820:16;:21;;;;:::i;:::-;:27;;;;:::i;:::-;55793:54;;55862:42;55854:60;;:78;55915:16;55854:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55947:42;55939:60;;:79;56000:17;55939:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56033:42;56025:60;;:78;56086:16;56025:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55608:501;;;;55563:546::o:0;55087:123::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55185:19:::1;55168:14;:36;;;;55087:123:::0;:::o;37490:185::-;37628:39;37645:4;37651:2;37655:7;37628:39;;;;;;;;;;;;:16;:39::i;:::-;37490:185;;;:::o;55480:77::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55536:15:::1;55542:8;55536:5;:15::i;:::-;55480:77:::0;:::o;50428:37::-;;;;;;;;;;;;;:::o;50747:98::-;;;;:::o;34689:125::-;34753:7;34780:21;34793:7;34780:12;:21::i;:::-;:26;;;34773:33;;34689:125;;;:::o;51159:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32137:206::-;32201:7;32242:1;32225:19;;:5;:19;;;32221:60;;32253:28;;;;;;;;;;;;;;32221:60;32307:12;:19;32320:5;32307:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;32299:36;;32292:43;;32137:206;;;:::o;9878:103::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9943:30:::1;9970:1;9943:18;:30::i;:::-;9878:103::o:0;50470:42::-;;;;;;;;;;;;;:::o;50517:32::-;;;;:::o;54313:107::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54399:15:::1;54386:10;:28;;;;54313:107:::0;:::o;9227:87::-;9273:7;9300:6;;;;;;;;;;;9293:13;;9227:87;:::o;51056:98::-;;;;:::o;35050:104::-;35106:13;35139:7;35132:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35050:104;:::o;36660:287::-;36771:12;:10;:12::i;:::-;36759:24;;:8;:24;;;36755:54;;36792:17;;;;;;;;;;;;;;36755:54;36867:8;36822:18;:32;36841:12;:10;:12::i;:::-;36822:32;;;;;;;;;;;;;;;:42;36855:8;36822:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36920:8;36891:48;;36906:12;:10;:12::i;:::-;36891:48;;;36930:8;36891:48;;;;;;:::i;:::-;;;;;;;;36660:287;;:::o;50850:98::-;;;;:::o;50554:41::-;;;;:::o;53789:104::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53874:13:::1;53864:7;:23;;;;;;;;;;;;:::i;:::-;;53789:104:::0;:::o;50600:39::-;;;;:::o;37746:369::-;37913:28;37923:4;37929:2;37933:7;37913:9;:28::i;:::-;37956:15;:2;:13;;;:15::i;:::-;:76;;;;;37976:56;38007:4;38013:2;38017:7;38026:5;37976:30;:56::i;:::-;37975:57;37956:76;37952:156;;;38056:40;;;;;;;;;;;;;;37952:156;37746:369;;;;:::o;53899:112::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53990:15:::1;53978:9;:27;;;;;;;;;;;;:::i;:::-;;53899:112:::0;:::o;51639:1205::-;51487:10;51474:23;;:9;:23;;;51466:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51574:15;51546:13;:25;51560:10;51546:25;;;;;;;;;;;;;;;;:43;51538:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;51800:1:::2;51777:20;;:24;51769:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;51858:1;51835:20;;:24;51832:117;;;51906:12;51891;;:27;;;;:::i;:::-;51878:9;:40;;51870:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51832:117;51957:14;51974:13;:11;:13::i;:::-;51957:30;;51994:22;52019:15;:13;:15::i;:::-;51994:40;;52047:22;;;;;;;;;;;52043:283;;52080:24;52134:10;52117:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52107:39;;;;;;52080:66;;52159:15;:27;52175:10;52159:27;;;;;;;;;;;;;;;;;;;;;;;;;52155:164;;52207:62;52226:8;;52207:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52236:14;52252:16;52207:18;:62::i;:::-;52199:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52155:164;52071:255;52043:283;52357:1;52342:12;:16;52334:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;52423:10;;52413:6;52398:12;:21;;;;:::i;:::-;:35;;52390:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52495:1;52471:20;;:25:::0;52468:136:::2;;52560:1;52544:12;52515:14;:26;52530:10;52515:26;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:46;;52507:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;52468:136;52637:1;52613:20;;:25:::0;52610:136:::2;;52702:1;52686:12;52657:14;:26;52672:10;52657:26;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:46;;52649:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;52610:136;52784:12;52754:14;:26;52769:10;52754:26;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;52803:35;52813:10;52825:12;52803:9;:35::i;:::-;51762:1082;;1768:1:::1;2722:7;:22;;;;51639:1205:::0;;;:::o;53487:296::-;53561:13;53591:17;53599:8;53591:7;:17::i;:::-;53583:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53642:17;;;;;;;;;;;53638:140;;;53701:7;53710:19;:8;:17;:19::i;:::-;53684:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53670:61;;;;53638:140;53761:9;53754:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53487:296;;;;:::o;54829:123::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54927:19:::1;54910:14;:36;;;;54829:123:::0;:::o;54958:::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55056:19:::1;55039:14;:36;;;;54958:123:::0;:::o;54426:115::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54518:17:::1;54503:12;:32;;;;54426:115:::0;:::o;54700:123::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54798:19:::1;54781:14;:36;;;;54700:123:::0;:::o;54017:132::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54121:22:::1;54101:17;;:42;;;;;;;;;;;;;;;;;;54017:132:::0;:::o;37018:164::-;37115:4;37139:18;:25;37158:5;37139:25;;;;;;;;;;;;;;;:35;37165:8;37139:35;;;;;;;;;;;;;;;;;;;;;;;;;37132:42;;37018:164;;;;:::o;50644:98::-;;;;:::o;55216:123::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55314:19:::1;55297:14;:36;;;;55216:123:::0;:::o;50953:98::-;;;;:::o;51261:49::-;;;;;;;;;;;;;;;;;:::o;10136:201::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10245:1:::1;10225:22;;:8;:22;;::::0;10217:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10301:28;10320:8;10301:18;:28::i;:::-;10136:201:::0;:::o;54155:152::-;9458:12;:10;:12::i;:::-;9447:23;;:7;:5;:7::i;:::-;:23;;;9439:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54274:27:::1;54249:22;;:52;;;;;;;;;;;;;;;;;;54155:152:::0;:::o;21659:157::-;21744:4;21783:25;21768:40;;;:11;:40;;;;21761:47;;21659:157;;;:::o;38370:187::-;38427:4;38470:7;38451:15;:13;:15::i;:::-;:26;;:53;;;;;38491:13;;38481:7;:23;38451:53;:98;;;;;38522:11;:20;38534:7;38522:20;;;;;;;;;;;:27;;;;;;;;;;;;38521:28;38451:98;38444:105;;38370:187;;;:::o;7951:98::-;8004:7;8031:10;8024:17;;7951:98;:::o;46540:196::-;46682:2;46655:15;:24;46671:7;46655:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46720:7;46716:2;46700:28;;46709:5;46700:28;;;;;;;;;;;;46540:196;;;:::o;30791:92::-;30847:7;30791:92;:::o;41483:2130::-;41598:35;41636:21;41649:7;41636:12;:21::i;:::-;41598:59;;41696:4;41674:26;;:13;:18;;;:26;;;41670:67;;41709:28;;;;;;;;;;;;;;41670:67;41750:22;41792:4;41776:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;41813:36;41830:4;41836:12;:10;:12::i;:::-;41813:16;:36::i;:::-;41776:73;:126;;;;41890:12;:10;:12::i;:::-;41866:36;;:20;41878:7;41866:11;:20::i;:::-;:36;;;41776:126;41750:153;;41921:17;41916:66;;41947:35;;;;;;;;;;;;;;41916:66;42011:1;41997:16;;:2;:16;;;41993:52;;42022:23;;;;;;;;;;;;;;41993:52;42058:43;42080:4;42086:2;42090:7;42099:1;42058:21;:43::i;:::-;42166:35;42183:1;42187:7;42196:4;42166:8;:35::i;:::-;42527:1;42497:12;:18;42510:4;42497:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42571:1;42543:12;:16;42556:2;42543:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42589:31;42623:11;:20;42635:7;42623:20;;;;;;;;;;;42589:54;;42674:2;42658:8;:13;;;:18;;;;;;;;;;;;;;;;;;42724:15;42691:8;:23;;;:49;;;;;;;;;;;;;;;;;;42992:19;43024:1;43014:7;:11;42992:33;;43040:31;43074:11;:24;43086:11;43074:24;;;;;;;;;;;43040:58;;43142:1;43117:27;;:8;:13;;;;;;;;;;;;:27;;;43113:384;;43327:13;;43312:11;:28;43308:174;;43381:4;43365:8;:13;;;:20;;;;;;;;;;;;;;;;;;43434:13;:28;;;43408:8;:23;;;:54;;;;;;;;;;;;;;;;;;43308:174;43113:384;42472:1036;;;43544:7;43540:2;43525:27;;43534:4;43525:27;;;;;;;;;;;;43563:42;43584:4;43590:2;43594:7;43603:1;43563:20;:42::i;:::-;41587:2026;;41483:2130;;;:::o;43696:89::-;43756:21;43762:7;43771:5;43756;:21::i;:::-;43696:89;:::o;33518:1109::-;33580:21;;:::i;:::-;33614:12;33629:7;33614:22;;33697:4;33678:15;:13;:15::i;:::-;:23;;:47;;;;;33712:13;;33705:4;:20;33678:47;33674:886;;;33746:31;33780:11;:17;33792:4;33780:17;;;;;;;;;;;33746:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33821:9;:16;;;33816:729;;33892:1;33866:28;;:9;:14;;;:28;;;33862:101;;33930:9;33923:16;;;;;;33862:101;34265:261;34272:4;34265:261;;;34305:6;;;;;;;;34350:11;:17;34362:4;34350:17;;;;;;;;;;;34338:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34424:1;34398:28;;:9;:14;;;:28;;;34394:109;;34466:9;34459:16;;;;;;34394:109;34265:261;;;33816:729;33727:833;33674:886;34588:31;;;;;;;;;;;;;;33518:1109;;;;:::o;10497:191::-;10571:16;10590:6;;;;;;;;;;;10571:25;;10616:8;10607:6;;:17;;;;;;;;;;;;;;;;;;10671:8;10640:40;;10661:8;10640:40;;;;;;;;;;;;10560:128;10497:191;:::o;11515:387::-;11575:4;11783:12;11850:7;11838:20;11830:28;;11893:1;11886:4;:8;11879:15;;;11515:387;;;:::o;47228:667::-;47391:4;47428:2;47412:36;;;47449:12;:10;:12::i;:::-;47463:4;47469:7;47478:5;47412:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47408:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47663:1;47646:6;:13;:18;47642:235;;47692:40;;;;;;;;;;;;;;47642:235;47835:6;47829:13;47820:6;47816:2;47812:15;47805:38;47408:480;47541:45;;;47531:55;;;:6;:55;;;;47524:62;;;47228:667;;;;;;:::o;52850:631::-;52901:18;52928:22;52963:43;;;;;;;:::i;:::-;;;;;;;;;;;;;52953:54;;;;;;52928:79;;53041:1;53017:20;;:25;53014:434;;53070:14;;53053:31;;53014:434;;;53130:1;53106:20;;:25;53103:345;;53159:14;;53142:31;;53103:345;;;53219:1;53195:20;;:25;53192:256;;53248:14;;53231:31;;53192:256;;;53308:1;53284:20;;:25;53281:167;;53337:14;;53320:31;;53281:167;;;53397:1;53373:20;;:25;53370:78;;53426:14;;53409:31;;53370:78;53281:167;53192:256;53103:345;53014:434;53461:14;53454:21;;;52850:631;:::o;3682:190::-;3807:4;3860;3831:25;3844:5;3851:4;3831:12;:25::i;:::-;:33;3824:40;;3682:190;;;;;:::o;38565:104::-;38634:27;38644:2;38648:8;38634:27;;;;;;;;;;;;:9;:27::i;:::-;38565:104;;:::o;5513:723::-;5569:13;5799:1;5790:5;:10;5786:53;;5817:10;;;;;;;;;;;;;;;;;;;;;5786:53;5849:12;5864:5;5849:20;;5880:14;5905:78;5920:1;5912:4;:9;5905:78;;5938:8;;;;;:::i;:::-;;;;5969:2;5961:10;;;;;:::i;:::-;;;5905:78;;;5993:19;6025:6;6015:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5993:39;;6043:154;6059:1;6050:5;:10;6043:154;;6087:1;6077:11;;;;;:::i;:::-;;;6154:2;6146:5;:10;;;;:::i;:::-;6133:2;:24;;;;:::i;:::-;6120:39;;6103:6;6110;6103:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6183:2;6174:11;;;;;:::i;:::-;;;6043:154;;;6221:6;6207:21;;;;;5513:723;;;;:::o;48543:159::-;;;;;:::o;49361:158::-;;;;;:::o;44014:2408::-;44094:35;44132:21;44145:7;44132:12;:21::i;:::-;44094:59;;44166:12;44181:13;:18;;;44166:33;;44216:13;44212:290;;;44246:22;44288:4;44272:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;44313:36;44330:4;44336:12;:10;:12::i;:::-;44313:16;:36::i;:::-;44272:77;:134;;;;44394:12;:10;:12::i;:::-;44370:36;;:20;44382:7;44370:11;:20::i;:::-;:36;;;44272:134;44246:161;;44429:17;44424:66;;44455:35;;;;;;;;;;;;;;44424:66;44231:271;44212:290;44514:51;44536:4;44550:1;44554:7;44563:1;44514:21;:51::i;:::-;44630:35;44647:1;44651:7;44660:4;44630:8;:35::i;:::-;44961:31;44995:12;:18;45008:4;44995:18;;;;;;;;;;;;;;;44961:52;;45051:1;45028:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45095:1;45067:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45195:31;45229:11;:20;45241:7;45229:20;;;;;;;;;;;45195:54;;45280:4;45264:8;:13;;;:20;;;;;;;;;;;;;;;;;;45332:15;45299:8;:23;;;:49;;;;;;;;;;;;;;;;;;45381:4;45363:8;:15;;;:22;;;;;;;;;;;;;;;;;;45633:19;45665:1;45655:7;:11;45633:33;;45681:31;45715:11;:24;45727:11;45715:24;;;;;;;;;;;45681:58;;45783:1;45758:27;;:8;:13;;;;;;;;;;;;:27;;;45754:384;;45968:13;;45953:11;:28;45949:174;;46022:4;46006:8;:13;;;:20;;;;;;;;;;;;;;;;;;46075:13;:28;;;46049:8;:23;;;:54;;;;;;;;;;;;;;;;;;45949:174;45754:384;44936:1213;;;;46193:7;46189:1;46166:35;;46175:4;46166:35;;;;;;;;;;;;46212:50;46233:4;46247:1;46251:7;46260:1;46212:20;:50::i;:::-;46389:12;;:14;;;;;;;;;;;;;44083:2339;;44014:2408;;:::o;4234:675::-;4317:7;4337:20;4360:4;4337:27;;4380:9;4375:497;4399:5;:12;4395:1;:16;4375:497;;;4433:20;4456:5;4462:1;4456:8;;;;;;;;:::i;:::-;;;;;;;;4433:31;;4499:12;4483;:28;4479:382;;4626:42;4641:12;4655;4626:14;:42::i;:::-;4611:57;;4479:382;;;4803:42;4818:12;4832;4803:14;:42::i;:::-;4788:57;;4479:382;4418:454;4413:3;;;;;:::i;:::-;;;;4375:497;;;;4889:12;4882:19;;;4234:675;;;;:::o;39032:163::-;39155:32;39161:2;39165:8;39175:5;39182:4;39155:5;:32::i;:::-;39032:163;;;:::o;4917:224::-;4985:13;5048:1;5042:4;5035:15;5077:1;5071:4;5064:15;5118:4;5112;5102:21;5093:30;;4917:224;;;;:::o;39454:1775::-;39593:20;39616:13;;39593:36;;39658:1;39644:16;;:2;:16;;;39640:48;;39669:19;;;;;;;;;;;;;;39640:48;39715:1;39703:8;:13;39699:44;;39725:18;;;;;;;;;;;;;;39699:44;39756:61;39786:1;39790:2;39794:12;39808:8;39756:21;:61::i;:::-;40129:8;40094:12;:16;40107:2;40094:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40193:8;40153:12;:16;40166:2;40153:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40252:2;40219:11;:25;40231:12;40219:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40319:15;40269:11;:25;40281:12;40269:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40352:20;40375:12;40352:35;;40402:11;40431:8;40416:12;:23;40402:37;;40460:4;:23;;;;;40468:15;:2;:13;;;:15::i;:::-;40460:23;40456:641;;;40504:314;40560:12;40556:2;40535:38;;40552:1;40535:38;;;;;;;;;;;;40601:69;40640:1;40644:2;40648:14;;;;;;40664:5;40601:30;:69::i;:::-;40596:174;;40706:40;;;;;;;;;;;;;;40596:174;40813:3;40797:12;:19;40504:314;;40899:12;40882:13;;:29;40878:43;;40913:8;;;40878:43;40456:641;;;40962:120;41018:14;;;;;;41014:2;40993:40;;41010:1;40993:40;;;;;;;;;;;;41077:3;41061:12;:19;40962:120;;40456:641;41127:12;41111:13;:28;;;;40069:1082;;41161:60;41190:1;41194:2;41198:12;41212:8;41161:20;:60::i;:::-;39582:1647;39454:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334: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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:77::-;6287:7;6316:5;6305:16;;6250:77;;;:::o;6333:122::-;6406:24;6424:5;6406:24;:::i;:::-;6399:5;6396:35;6386:63;;6445:1;6442;6435:12;6386:63;6333:122;:::o;6461:139::-;6507:5;6545:6;6532:20;6523:29;;6561:33;6588:5;6561:33;:::i;:::-;6461:139;;;;:::o;6606:329::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:53;6910:7;6901:6;6890:9;6886:22;6865:53;:::i;:::-;6855:63;;6811:117;6606:329;;;;:::o;6941:118::-;7028:24;7046:5;7028:24;:::i;:::-;7023:3;7016:37;6941:118;;:::o;7065:222::-;7158:4;7196:2;7185:9;7181:18;7173:26;;7209:71;7277:1;7266:9;7262:17;7253:6;7209:71;:::i;:::-;7065:222;;;;:::o;7293:116::-;7363:21;7378:5;7363:21;:::i;:::-;7356:5;7353:32;7343:60;;7399:1;7396;7389:12;7343:60;7293:116;:::o;7415:133::-;7458:5;7496:6;7483:20;7474:29;;7512:30;7536:5;7512:30;:::i;:::-;7415:133;;;;:::o;7554:468::-;7619:6;7627;7676:2;7664:9;7655:7;7651:23;7647:32;7644:119;;;7682:79;;:::i;:::-;7644:119;7802:1;7827:53;7872:7;7863:6;7852:9;7848:22;7827:53;:::i;:::-;7817:63;;7773:117;7929:2;7955:50;7997:7;7988:6;7977:9;7973:22;7955:50;:::i;:::-;7945:60;;7900:115;7554:468;;;;;:::o;8028:117::-;8137:1;8134;8127:12;8151:117;8260:1;8257;8250:12;8274:180;8322:77;8319:1;8312:88;8419:4;8416:1;8409:15;8443:4;8440:1;8433:15;8460:281;8543:27;8565:4;8543:27;:::i;:::-;8535:6;8531:40;8673:6;8661:10;8658:22;8637:18;8625:10;8622:34;8619:62;8616:88;;;8684:18;;:::i;:::-;8616:88;8724:10;8720:2;8713:22;8503:238;8460:281;;:::o;8747:129::-;8781:6;8808:20;;:::i;:::-;8798:30;;8837:33;8865:4;8857:6;8837:33;:::i;:::-;8747:129;;;:::o;8882:308::-;8944:4;9034:18;9026:6;9023:30;9020:56;;;9056:18;;:::i;:::-;9020:56;9094:29;9116:6;9094:29;:::i;:::-;9086:37;;9178:4;9172;9168:15;9160:23;;8882:308;;;:::o;9196:154::-;9280:6;9275:3;9270;9257:30;9342:1;9333:6;9328:3;9324:16;9317:27;9196:154;;;:::o;9356:412::-;9434:5;9459:66;9475:49;9517:6;9475:49;:::i;:::-;9459:66;:::i;:::-;9450:75;;9548:6;9541:5;9534:21;9586:4;9579:5;9575:16;9624:3;9615:6;9610:3;9606:16;9603:25;9600:112;;;9631:79;;:::i;:::-;9600:112;9721:41;9755:6;9750:3;9745;9721:41;:::i;:::-;9440:328;9356:412;;;;;:::o;9788:340::-;9844:5;9893:3;9886:4;9878:6;9874:17;9870:27;9860:122;;9901:79;;:::i;:::-;9860:122;10018:6;10005:20;10043:79;10118:3;10110:6;10103:4;10095:6;10091:17;10043:79;:::i;:::-;10034:88;;9850:278;9788:340;;;;:::o;10134:509::-;10203:6;10252:2;10240:9;10231:7;10227:23;10223:32;10220:119;;;10258:79;;:::i;:::-;10220:119;10406:1;10395:9;10391:17;10378:31;10436:18;10428:6;10425:30;10422:117;;;10458:79;;:::i;:::-;10422:117;10563:63;10618:7;10609:6;10598:9;10594:22;10563:63;:::i;:::-;10553:73;;10349:287;10134:509;;;;:::o;10649:307::-;10710:4;10800:18;10792:6;10789:30;10786:56;;;10822:18;;:::i;:::-;10786:56;10860:29;10882:6;10860:29;:::i;:::-;10852:37;;10944:4;10938;10934:15;10926:23;;10649:307;;;:::o;10962:410::-;11039:5;11064:65;11080:48;11121:6;11080:48;:::i;:::-;11064:65;:::i;:::-;11055:74;;11152:6;11145:5;11138:21;11190:4;11183:5;11179:16;11228:3;11219:6;11214:3;11210:16;11207:25;11204:112;;;11235:79;;:::i;:::-;11204:112;11325:41;11359:6;11354:3;11349;11325:41;:::i;:::-;11045:327;10962:410;;;;;:::o;11391:338::-;11446:5;11495:3;11488:4;11480:6;11476:17;11472:27;11462:122;;11503:79;;:::i;:::-;11462:122;11620:6;11607:20;11645:78;11719:3;11711:6;11704:4;11696:6;11692:17;11645:78;:::i;:::-;11636:87;;11452:277;11391:338;;;;:::o;11735:943::-;11830:6;11838;11846;11854;11903:3;11891:9;11882:7;11878:23;11874:33;11871:120;;;11910:79;;:::i;:::-;11871:120;12030:1;12055:53;12100:7;12091:6;12080:9;12076:22;12055:53;:::i;:::-;12045:63;;12001:117;12157:2;12183:53;12228:7;12219:6;12208:9;12204:22;12183:53;:::i;:::-;12173:63;;12128:118;12285:2;12311:53;12356:7;12347:6;12336:9;12332:22;12311:53;:::i;:::-;12301:63;;12256:118;12441:2;12430:9;12426:18;12413:32;12472:18;12464:6;12461:30;12458:117;;;12494:79;;:::i;:::-;12458:117;12599:62;12653:7;12644:6;12633:9;12629:22;12599:62;:::i;:::-;12589:72;;12384:287;11735:943;;;;;;;:::o;12684:117::-;12793:1;12790;12783:12;12807:117;12916:1;12913;12906:12;12947:568;13020:8;13030:6;13080:3;13073:4;13065:6;13061:17;13057:27;13047:122;;13088:79;;:::i;:::-;13047:122;13201:6;13188:20;13178:30;;13231:18;13223:6;13220:30;13217:117;;;13253:79;;:::i;:::-;13217:117;13367:4;13359:6;13355:17;13343:29;;13421:3;13413:4;13405:6;13401:17;13391:8;13387:32;13384:41;13381:128;;;13428:79;;:::i;:::-;13381:128;12947:568;;;;;:::o;13521:704::-;13616:6;13624;13632;13681:2;13669:9;13660:7;13656:23;13652:32;13649:119;;;13687:79;;:::i;:::-;13649:119;13807:1;13832:53;13877:7;13868:6;13857:9;13853:22;13832:53;:::i;:::-;13822:63;;13778:117;13962:2;13951:9;13947:18;13934:32;13993:18;13985:6;13982:30;13979:117;;;14015:79;;:::i;:::-;13979:117;14128:80;14200:7;14191:6;14180:9;14176:22;14128:80;:::i;:::-;14110:98;;;;13905:313;13521:704;;;;;:::o;14231:323::-;14287:6;14336:2;14324:9;14315:7;14311:23;14307:32;14304:119;;;14342:79;;:::i;:::-;14304:119;14462:1;14487:50;14529:7;14520:6;14509:9;14505:22;14487:50;:::i;:::-;14477:60;;14433:114;14231:323;;;;:::o;14560:474::-;14628:6;14636;14685:2;14673:9;14664:7;14660:23;14656:32;14653:119;;;14691:79;;:::i;:::-;14653:119;14811:1;14836:53;14881:7;14872:6;14861:9;14857:22;14836:53;:::i;:::-;14826:63;;14782:117;14938:2;14964:53;15009:7;15000:6;14989:9;14985:22;14964:53;:::i;:::-;14954:63;;14909:118;14560:474;;;;;:::o;15040:180::-;15088:77;15085:1;15078:88;15185:4;15182:1;15175:15;15209:4;15206:1;15199:15;15226:320;15270:6;15307:1;15301:4;15297:12;15287:22;;15354:1;15348:4;15344:12;15375:18;15365:81;;15431:4;15423:6;15419:17;15409:27;;15365:81;15493:2;15485:6;15482:14;15462:18;15459:38;15456:84;;15512:18;;:::i;:::-;15456:84;15277:269;15226:320;;;:::o;15552:182::-;15692:34;15688:1;15680:6;15676:14;15669:58;15552:182;:::o;15740:366::-;15882:3;15903:67;15967:2;15962:3;15903:67;:::i;:::-;15896:74;;15979:93;16068:3;15979:93;:::i;:::-;16097:2;16092:3;16088:12;16081:19;;15740:366;;;:::o;16112:419::-;16278:4;16316:2;16305:9;16301:18;16293:26;;16365:9;16359:4;16355:20;16351:1;16340:9;16336:17;16329:47;16393:131;16519:4;16393:131;:::i;:::-;16385:139;;16112:419;;;:::o;16537:180::-;16585:77;16582:1;16575:88;16682:4;16679:1;16672:15;16706:4;16703:1;16696:15;16723:348;16763:7;16786:20;16804:1;16786:20;:::i;:::-;16781:25;;16820:20;16838:1;16820:20;:::i;:::-;16815:25;;17008:1;16940:66;16936:74;16933:1;16930:81;16925:1;16918:9;16911:17;16907:105;16904:131;;;17015:18;;:::i;:::-;16904:131;17063:1;17060;17056:9;17045:20;;16723:348;;;;:::o;17077:180::-;17125:77;17122:1;17115:88;17222:4;17219:1;17212:15;17246:4;17243:1;17236:15;17263:185;17303:1;17320:20;17338:1;17320:20;:::i;:::-;17315:25;;17354:20;17372:1;17354:20;:::i;:::-;17349:25;;17393:1;17383:35;;17398:18;;:::i;:::-;17383:35;17440:1;17437;17433:9;17428:14;;17263:185;;;;:::o;17454:179::-;17594:31;17590:1;17582:6;17578:14;17571:55;17454:179;:::o;17639:366::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:419::-;18177:4;18215:2;18204:9;18200:18;18192:26;;18264:9;18258:4;18254:20;18250:1;18239:9;18235:17;18228:47;18292:131;18418:4;18292:131;:::i;:::-;18284:139;;18011:419;;;:::o;18436:175::-;18576:27;18572:1;18564:6;18560:14;18553:51;18436:175;:::o;18617:366::-;18759:3;18780:67;18844:2;18839:3;18780:67;:::i;:::-;18773:74;;18856:93;18945:3;18856:93;:::i;:::-;18974:2;18969:3;18965:12;18958:19;;18617:366;;;:::o;18989:419::-;19155:4;19193:2;19182:9;19178:18;19170:26;;19242:9;19236:4;19232:20;19228:1;19217:9;19213:17;19206:47;19270:131;19396:4;19270:131;:::i;:::-;19262:139;;18989:419;;;:::o;19414:181::-;19554:33;19550:1;19542:6;19538:14;19531:57;19414:181;:::o;19601:366::-;19743:3;19764:67;19828:2;19823:3;19764:67;:::i;:::-;19757:74;;19840:93;19929:3;19840:93;:::i;:::-;19958:2;19953:3;19949:12;19942:19;;19601:366;;;:::o;19973:419::-;20139:4;20177:2;20166:9;20162:18;20154:26;;20226:9;20220:4;20216:20;20212:1;20201:9;20197:17;20190:47;20254:131;20380:4;20254:131;:::i;:::-;20246:139;;19973:419;;;:::o;20398:169::-;20538:21;20534:1;20526:6;20522:14;20515:45;20398:169;:::o;20573:366::-;20715:3;20736:67;20800:2;20795:3;20736:67;:::i;:::-;20729:74;;20812:93;20901:3;20812:93;:::i;:::-;20930:2;20925:3;20921:12;20914:19;;20573:366;;;:::o;20945:419::-;21111:4;21149:2;21138:9;21134:18;21126:26;;21198:9;21192:4;21188:20;21184:1;21173:9;21169:17;21162:47;21226:131;21352:4;21226:131;:::i;:::-;21218:139;;20945:419;;;:::o;21370:168::-;21510:20;21506:1;21498:6;21494:14;21487:44;21370:168;:::o;21544:366::-;21686:3;21707:67;21771:2;21766:3;21707:67;:::i;:::-;21700:74;;21783:93;21872:3;21783:93;:::i;:::-;21901:2;21896:3;21892:12;21885:19;;21544:366;;;:::o;21916:419::-;22082:4;22120:2;22109:9;22105:18;22097:26;;22169:9;22163:4;22159:20;22155:1;22144:9;22140:17;22133:47;22197:131;22323:4;22197:131;:::i;:::-;22189:139;;21916:419;;;:::o;22341:94::-;22374:8;22422:5;22418:2;22414:14;22393:35;;22341:94;;;:::o;22441:::-;22480:7;22509:20;22523:5;22509:20;:::i;:::-;22498:31;;22441:94;;;:::o;22541:100::-;22580:7;22609:26;22629:5;22609:26;:::i;:::-;22598:37;;22541:100;;;:::o;22647:157::-;22752:45;22772:24;22790:5;22772:24;:::i;:::-;22752:45;:::i;:::-;22747:3;22740:58;22647:157;;:::o;22810:256::-;22922:3;22937:75;23008:3;22999:6;22937:75;:::i;:::-;23037:2;23032:3;23028:12;23021:19;;23057:3;23050:10;;22810:256;;;;:::o;23072:222::-;23212:34;23208:1;23200:6;23196:14;23189:58;23281:5;23276:2;23268:6;23264:15;23257:30;23072:222;:::o;23300:366::-;23442:3;23463:67;23527:2;23522:3;23463:67;:::i;:::-;23456:74;;23539:93;23628:3;23539:93;:::i;:::-;23657:2;23652:3;23648:12;23641:19;;23300:366;;;:::o;23672:419::-;23838:4;23876:2;23865:9;23861:18;23853:26;;23925:9;23919:4;23915:20;23911:1;23900:9;23896:17;23889:47;23953:131;24079:4;23953:131;:::i;:::-;23945:139;;23672:419;;;:::o;24097:170::-;24237:22;24233:1;24225:6;24221:14;24214:46;24097:170;:::o;24273:366::-;24415:3;24436:67;24500:2;24495:3;24436:67;:::i;:::-;24429:74;;24512:93;24601:3;24512:93;:::i;:::-;24630:2;24625:3;24621:12;24614:19;;24273:366;;;:::o;24645:419::-;24811:4;24849:2;24838:9;24834:18;24826:26;;24898:9;24892:4;24888:20;24884:1;24873:9;24869:17;24862:47;24926:131;25052:4;24926:131;:::i;:::-;24918:139;;24645:419;;;:::o;25070:305::-;25110:3;25129:20;25147:1;25129:20;:::i;:::-;25124:25;;25163:20;25181:1;25163:20;:::i;:::-;25158:25;;25317:1;25249:66;25245:74;25242:1;25239:81;25236:107;;;25323:18;;:::i;:::-;25236:107;25367:1;25364;25360:9;25353:16;;25070:305;;;;:::o;25381:170::-;25521:22;25517:1;25509:6;25505:14;25498:46;25381:170;:::o;25557:366::-;25699:3;25720:67;25784:2;25779:3;25720:67;:::i;:::-;25713:74;;25796:93;25885:3;25796:93;:::i;:::-;25914:2;25909:3;25905:12;25898:19;;25557:366;;;:::o;25929:419::-;26095:4;26133:2;26122:9;26118:18;26110:26;;26182:9;26176:4;26172:20;26168:1;26157:9;26153:17;26146:47;26210:131;26336:4;26210:131;:::i;:::-;26202:139;;25929:419;;;:::o;26354:180::-;26494:32;26490:1;26482:6;26478:14;26471:56;26354:180;:::o;26540:366::-;26682:3;26703:67;26767:2;26762:3;26703:67;:::i;:::-;26696:74;;26779:93;26868:3;26779:93;:::i;:::-;26897:2;26892:3;26888:12;26881:19;;26540:366;;;:::o;26912:419::-;27078:4;27116:2;27105:9;27101:18;27093:26;;27165:9;27159:4;27155:20;27151:1;27140:9;27136:17;27129:47;27193:131;27319:4;27193:131;:::i;:::-;27185:139;;26912:419;;;:::o;27337:180::-;27477:32;27473:1;27465:6;27461:14;27454:56;27337:180;:::o;27523:366::-;27665:3;27686:67;27750:2;27745:3;27686:67;:::i;:::-;27679:74;;27762:93;27851:3;27762:93;:::i;:::-;27880:2;27875:3;27871:12;27864:19;;27523:366;;;:::o;27895:419::-;28061:4;28099:2;28088:9;28084:18;28076:26;;28148:9;28142:4;28138:20;28134:1;28123:9;28119:17;28112:47;28176:131;28302:4;28176:131;:::i;:::-;28168:139;;27895:419;;;:::o;28320:168::-;28460:20;28456:1;28448:6;28444:14;28437:44;28320:168;:::o;28494:366::-;28636:3;28657:67;28721:2;28716:3;28657:67;:::i;:::-;28650:74;;28733:93;28822:3;28733:93;:::i;:::-;28851:2;28846:3;28842:12;28835:19;;28494:366;;;:::o;28866:419::-;29032:4;29070:2;29059:9;29055:18;29047:26;;29119:9;29113:4;29109:20;29105:1;29094:9;29090:17;29083:47;29147:131;29273:4;29147:131;:::i;:::-;29139:139;;28866:419;;;:::o;29291:148::-;29393:11;29430:3;29415:18;;29291:148;;;;:::o;29445:141::-;29494:4;29517:3;29509:11;;29540:3;29537:1;29530:14;29574:4;29571:1;29561:18;29553:26;;29445:141;;;:::o;29616:845::-;29719:3;29756:5;29750:12;29785:36;29811:9;29785:36;:::i;:::-;29837:89;29919:6;29914:3;29837:89;:::i;:::-;29830:96;;29957:1;29946:9;29942:17;29973:1;29968:137;;;;30119:1;30114:341;;;;29935:520;;29968:137;30052:4;30048:9;30037;30033:25;30028:3;30021:38;30088:6;30083:3;30079:16;30072:23;;29968:137;;30114:341;30181:38;30213:5;30181:38;:::i;:::-;30241:1;30255:154;30269:6;30266:1;30263:13;30255:154;;;30343:7;30337:14;30333:1;30328:3;30324:11;30317:35;30393:1;30384:7;30380:15;30369:26;;30291:4;30288:1;30284:12;30279:17;;30255:154;;;30438:6;30433:3;30429:16;30422:23;;30121:334;;29935:520;;29723:738;;29616:845;;;;:::o;30467:377::-;30573:3;30601:39;30634:5;30601:39;:::i;:::-;30656:89;30738:6;30733:3;30656:89;:::i;:::-;30649:96;;30754:52;30799:6;30794:3;30787:4;30780:5;30776:16;30754:52;:::i;:::-;30831:6;30826:3;30822:16;30815:23;;30577:267;30467:377;;;;:::o;30850:429::-;31027:3;31049:92;31137:3;31128:6;31049:92;:::i;:::-;31042:99;;31158:95;31249:3;31240:6;31158:95;:::i;:::-;31151:102;;31270:3;31263:10;;30850:429;;;;;:::o;31285:225::-;31425:34;31421:1;31413:6;31409:14;31402:58;31494:8;31489:2;31481:6;31477:15;31470:33;31285:225;:::o;31516:366::-;31658:3;31679:67;31743:2;31738:3;31679:67;:::i;:::-;31672:74;;31755:93;31844:3;31755:93;:::i;:::-;31873:2;31868:3;31864:12;31857:19;;31516:366;;;:::o;31888:419::-;32054:4;32092:2;32081:9;32077:18;32069:26;;32141:9;32135:4;32131:20;32127:1;32116:9;32112:17;32105:47;32169:131;32295:4;32169:131;:::i;:::-;32161:139;;31888:419;;;:::o;32313:98::-;32364:6;32398:5;32392:12;32382:22;;32313:98;;;:::o;32417:168::-;32500:11;32534:6;32529:3;32522:19;32574:4;32569:3;32565:14;32550:29;;32417:168;;;;:::o;32591:360::-;32677:3;32705:38;32737:5;32705:38;:::i;:::-;32759:70;32822:6;32817:3;32759:70;:::i;:::-;32752:77;;32838:52;32883:6;32878:3;32871:4;32864:5;32860:16;32838:52;:::i;:::-;32915:29;32937:6;32915:29;:::i;:::-;32910:3;32906:39;32899:46;;32681:270;32591:360;;;;:::o;32957:640::-;33152:4;33190:3;33179:9;33175:19;33167:27;;33204:71;33272:1;33261:9;33257:17;33248:6;33204:71;:::i;:::-;33285:72;33353:2;33342:9;33338:18;33329:6;33285:72;:::i;:::-;33367;33435:2;33424:9;33420:18;33411:6;33367:72;:::i;:::-;33486:9;33480:4;33476:20;33471:2;33460:9;33456:18;33449:48;33514:76;33585:4;33576:6;33514:76;:::i;:::-;33506:84;;32957:640;;;;;;;:::o;33603:141::-;33659:5;33690:6;33684:13;33675:22;;33706:32;33732:5;33706:32;:::i;:::-;33603:141;;;;:::o;33750:349::-;33819:6;33868:2;33856:9;33847:7;33843:23;33839:32;33836:119;;;33874:79;;:::i;:::-;33836:119;33994:1;34019:63;34074:7;34065:6;34054:9;34050:22;34019:63;:::i;:::-;34009:73;;33965:127;33750:349;;;;:::o;34105:173::-;34245:25;34241:1;34233:6;34229:14;34222:49;34105:173;:::o;34284:402::-;34444:3;34465:85;34547:2;34542:3;34465:85;:::i;:::-;34458:92;;34559:93;34648:3;34559:93;:::i;:::-;34677:2;34672:3;34668:12;34661:19;;34284:402;;;:::o;34692:381::-;34877:3;34899:148;35043:3;34899:148;:::i;:::-;34892:155;;35064:3;35057:10;;34692:381;;;:::o;35079:233::-;35118:3;35141:24;35159:5;35141:24;:::i;:::-;35132:33;;35187:66;35180:5;35177:77;35174:103;;35257:18;;:::i;:::-;35174:103;35304:1;35297:5;35293:13;35286:20;;35079:233;;;:::o;35318:191::-;35358:4;35378:20;35396:1;35378:20;:::i;:::-;35373:25;;35412:20;35430:1;35412:20;:::i;:::-;35407:25;;35451:1;35448;35445:8;35442:34;;;35456:18;;:::i;:::-;35442:34;35501:1;35498;35494:9;35486:17;;35318:191;;;;:::o;35515:176::-;35547:1;35564:20;35582:1;35564:20;:::i;:::-;35559:25;;35598:20;35616:1;35598:20;:::i;:::-;35593:25;;35637:1;35627:35;;35642:18;;:::i;:::-;35627:35;35683:1;35680;35676:9;35671:14;;35515:176;;;;:::o;35697:180::-;35745:77;35742:1;35735:88;35842:4;35839:1;35832:15;35866:4;35863:1;35856:15

Swarm Source

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