ETH Price: $2,987.39 (+3.63%)
Gas: 3 Gwei

Token

BOUNTYCREATURES (BTY)
 

Overview

Max Total Supply

147 BTY

Holders

95

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BTY
0xaa884bfc4b6decd8002e20e21acb126e4c985a4b
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:
BOUNTYNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// ██████╗░░█████╗░██╗░░░██╗███╗░░██╗████████╗██╗░░░██╗
// ██╔══██╗██╔══██╗██║░░░██║████╗░██║╚══██╔══╝╚██╗░██╔╝
// ██████╦╝██║░░██║██║░░░██║██╔██╗██║░░░██║░░░░╚████╔╝░
// ██╔══██╗██║░░██║██║░░░██║██║╚████║░░░██║░░░░░╚██╔╝░░
// ██████╦╝╚█████╔╝╚██████╔╝██║░╚███║░░░██║░░░░░░██║░░░
// ╚═════╝░░╚════╝░░╚═════╝░╚═╝░░╚══╝░░░╚═╝░░░░░░╚═╝░░░

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

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

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

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

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

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

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @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)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _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 {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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 = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }
        return computedHash;
    }
}

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

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

contract BOUNTYNFT is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    bytes32 public root;
    string public baseTokenURI;
    string public notRevealedUri =
        "https://bounty.mypinata.cloud/ipfs/QmNnoTijuCp6E8N9a7Ea4snkCEAaWfio3hvxD3MTijvRt7/hidden.json";
    string public baseExtension = ".json";
    bool public isPreSale = true;
    bool public paused = true;
    bool public revealed = false;
    uint256 public PRICE = 0.03 ether;
    uint256 public constant maxSupply = 5555;
    uint256 public constant preSaleSupply = 1000;

    mapping(uint256 => uint256) private claimedBitMap;

    constructor(
        string memory name,
        string memory symbol,
        bytes32 merkleroot,
        string memory baseURI
    ) ERC721(name, symbol) {
        root = merkleroot;
        setBaseURI(baseURI);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }

    function isClaimed(uint256 tokenId) public view returns (bool) {
        uint256 claimedWordIndex = tokenId / 256;
        uint256 claimedBitIndex = tokenId % 256;
        uint256 claimedWord = claimedBitMap[claimedWordIndex];
        uint256 mask = (1 << claimedBitIndex);
        return claimedWord & mask == mask;
    }

    function _setClaimed(uint256 tokenId) private {
        uint256 claimedWordIndex = tokenId / 256;
        uint256 claimedBitIndex = tokenId % 256;
        claimedBitMap[claimedWordIndex] =
            claimedBitMap[claimedWordIndex] |
            (1 << claimedBitIndex);
    }

    function claim() external payable {
        uint256 supply = totalSupply();
        uint256 tokenId = supply + 1;

        require(!paused, "Mint is disabled!");

        require(!isPreSale, "Presale enabled!");

        require(msg.value >= PRICE, "Not enough ether!");

        require(tokenId <= maxSupply, "0 NFT LEFT!");

        require(balanceOf(msg.sender) < 10, "Max 10 NFT per wallet!");

        require(!isClaimed(tokenId), "TokenId already claimed.");

        _setClaimed(tokenId);
        _safeMint(msg.sender, tokenId);
    }

    function preSaleClaim(bytes32[] calldata proof) external payable {
        uint256 supply = totalSupply();
        uint256 tokenId = supply + 1;

        require(!paused, "Mint is disabled!");

        require(tokenId <= preSaleSupply, "0 PRE-SALE NFTs LEFT!");

        require(isPreSale, "Presale must be enabled!");

        require(_verify(_leaf(msg.sender), proof), "Invalid merkle proof.");

        require(msg.value >= PRICE, "Not enough ether!");

        require(!isClaimed(tokenId), "TokenId already claimed.");

        require(
            balanceOf(msg.sender) < 2,
            "Max 2 NFT per wallet during presale!"
        );

        _setClaimed(tokenId);
        _safeMint(msg.sender, tokenId);
    }

    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof)
        internal
        view
        returns (bool)
    {
        return MerkleProof.verify(proof, root, leaf);
    }

    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);

        for (uint256 i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function setBaseURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function reveal() public onlyOwner {
        revealed = true;
    }

    function setCost(uint256 _newPrice) public onlyOwner {
        PRICE = _newPrice;
    }

    function setPreSale(bool _isPreSale) public onlyOwner {
        isPreSale = _isPreSale;
    }

    function pause(bool _isPaused) public onlyOwner {
        paused = _isPaused;
    }

    function setRoot(bytes32 _root) public onlyOwner {
        root = _root;
    }

    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "No ether left to withdraw");
        (bool success, ) = (msg.sender).call{value: balance}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bytes32","name":"merkleroot","type":"bytes32"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"preSaleClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPreSale","type":"bool"}],"name":"setPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060800160405280605d8152602001620058d3605d9139600d9080519060200190620000359291906200032e565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000839291906200032e565b506001600f60006101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff021916908315150217905550666a94d74f430000601055348015620000ed57600080fd5b506040516200593038038062005930833981810160405281019062000113919062000473565b838381600090805190602001906200012d9291906200032e565b508060019080519060200190620001469291906200032e565b505050620001696200015d6200018b60201b60201c565b6200019360201b60201c565b81600b8190555062000181816200025960201b60201c565b505050506200076d565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002696200018b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200028f6200030460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002df9062000569565b60405180910390fd5b80600c9080519060200190620003009291906200032e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200033c906200063b565b90600052602060002090601f016020900481019282620003605760008555620003ac565b82601f106200037b57805160ff1916838001178555620003ac565b82800160010185558215620003ac579182015b82811115620003ab5782518255916020019190600101906200038e565b5b509050620003bb9190620003bf565b5090565b5b80821115620003da576000816000905550600101620003c0565b5090565b6000620003f5620003ef84620005b4565b6200058b565b9050828152602081018484840111156200041457620004136200070a565b5b6200042184828562000605565b509392505050565b6000815190506200043a8162000753565b92915050565b600082601f83011262000458576200045762000705565b5b81516200046a848260208601620003de565b91505092915050565b6000806000806080858703121562000490576200048f62000714565b5b600085015167ffffffffffffffff811115620004b157620004b06200070f565b5b620004bf8782880162000440565b945050602085015167ffffffffffffffff811115620004e357620004e26200070f565b5b620004f18782880162000440565b9350506040620005048782880162000429565b925050606085015167ffffffffffffffff8111156200052857620005276200070f565b5b620005368782880162000440565b91505092959194509250565b600062000551602083620005ea565b91506200055e826200072a565b602082019050919050565b60006020820190508181036000830152620005848162000542565b9050919050565b600062000597620005aa565b9050620005a5828262000671565b919050565b6000604051905090565b600067ffffffffffffffff821115620005d257620005d1620006d6565b5b620005dd8262000719565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200062557808201518184015260208101905062000608565b8381111562000635576000848401525b50505050565b600060028204905060018216806200065457607f821691505b602082108114156200066b576200066a620006a7565b5b50919050565b6200067c8262000719565b810181811067ffffffffffffffff821117156200069e576200069d620006d6565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200075e81620005fb565b81146200076a57600080fd5b50565b615156806200077d6000396000f3fe60806040526004361061023b5760003560e01c80636352211e1161012e578063b88d4fde116100ab578063d68c60da1161006f578063d68c60da14610847578063dab5f34014610863578063e985e9c51461088c578063ebf0c717146108c9578063f2fde38b146108f45761023b565b8063b88d4fde14610760578063c668286214610789578063c87b56dd146107b4578063d547cfb7146107f1578063d5abeb011461081c5761023b565b80638da5cb5b116100f25780638da5cb5b1461068d57806395d89b41146106b85780639e34070f146106e3578063a22cb46514610720578063a475b5dd146107495761023b565b80636352211e1461059457806370a08231146105d1578063715018a61461060e5780638462151c146106255780638d859f3e146106625761023b565b80632f745c59116101bc5780634e71d92d116101805780634e71d92d146104ce5780634f6ccce7146104d8578063518302271461051557806355f804b3146105405780635c975abb146105695761023b565b80632f745c591461040a5780633ccfd60b1461044757806342842e0e1461045157806344a0d68a1461047a5780634ced4734146104a35761023b565b8063095ea7b311610203578063095ea7b3146103395780630d95ccc91461036257806318160ddd1461038b57806323b872dd146103b65780632e055bcc146103df5761023b565b806301ffc9a71461024057806302329a291461027d57806306fdde03146102a6578063081812fc146102d1578063081c8c441461030e575b600080fd5b34801561024c57600080fd5b506102676004803603810190610262919061383c565b61091d565b6040516102749190614070565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f91906137e2565b610997565b005b3480156102b257600080fd5b506102bb610a30565b6040516102c891906140a6565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f391906138df565b610ac2565b6040516103059190613fe7565b60405180910390f35b34801561031a57600080fd5b50610323610b47565b60405161033091906140a6565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613755565b610bd5565b005b34801561036e57600080fd5b50610389600480360381019061038491906137e2565b610ced565b005b34801561039757600080fd5b506103a0610d86565b6040516103ad9190614488565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d8919061363f565b610d93565b005b3480156103eb57600080fd5b506103f4610df3565b6040516104019190614488565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c9190613755565b610df9565b60405161043e9190614488565b60405180910390f35b61044f610e9e565b005b34801561045d57600080fd5b506104786004803603810190610473919061363f565b611012565b005b34801561048657600080fd5b506104a1600480360381019061049c91906138df565b611032565b005b3480156104af57600080fd5b506104b86110b8565b6040516104c59190614070565b60405180910390f35b6104d66110cb565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906138df565b6112bd565b60405161050c9190614488565b60405180910390f35b34801561052157600080fd5b5061052a61132e565b6040516105379190614070565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613896565b611341565b005b34801561057557600080fd5b5061057e6113d7565b60405161058b9190614070565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b691906138df565b6113ea565b6040516105c89190613fe7565b60405180910390f35b3480156105dd57600080fd5b506105f860048036038101906105f391906135d2565b61149c565b6040516106059190614488565b60405180910390f35b34801561061a57600080fd5b50610623611554565b005b34801561063157600080fd5b5061064c600480360381019061064791906135d2565b6115dc565b604051610659919061404e565b60405180910390f35b34801561066e57600080fd5b5061067761168a565b6040516106849190614488565b60405180910390f35b34801561069957600080fd5b506106a2611690565b6040516106af9190613fe7565b60405180910390f35b3480156106c457600080fd5b506106cd6116ba565b6040516106da91906140a6565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906138df565b61174c565b6040516107179190614070565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190613715565b6117a2565b005b34801561075557600080fd5b5061075e6117b8565b005b34801561076c57600080fd5b5061078760048036038101906107829190613692565b611851565b005b34801561079557600080fd5b5061079e6118b3565b6040516107ab91906140a6565b60405180910390f35b3480156107c057600080fd5b506107db60048036038101906107d691906138df565b611941565b6040516107e891906140a6565b60405180910390f35b3480156107fd57600080fd5b50610806611a9a565b60405161081391906140a6565b60405180910390f35b34801561082857600080fd5b50610831611b28565b60405161083e9190614488565b60405180910390f35b610861600480360381019061085c9190613795565b611b2e565b005b34801561086f57600080fd5b5061088a6004803603810190610885919061380f565b611db3565b005b34801561089857600080fd5b506108b360048036038101906108ae91906135ff565b611e39565b6040516108c09190614070565b60405180910390f35b3480156108d557600080fd5b506108de611ecd565b6040516108eb919061408b565b60405180910390f35b34801561090057600080fd5b5061091b600480360381019061091691906135d2565b611ed3565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610990575061098f82611fcb565b5b9050919050565b61099f6120ad565b73ffffffffffffffffffffffffffffffffffffffff166109bd611690565b73ffffffffffffffffffffffffffffffffffffffff1614610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a906142e8565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b606060008054610a3f90614741565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6b90614741565b8015610ab85780601f10610a8d57610100808354040283529160200191610ab8565b820191906000526020600020905b815481529060010190602001808311610a9b57829003601f168201915b5050505050905090565b6000610acd826120b5565b610b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b03906142c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610b5490614741565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8090614741565b8015610bcd5780601f10610ba257610100808354040283529160200191610bcd565b820191906000526020600020905b815481529060010190602001808311610bb057829003601f168201915b505050505081565b6000610be0826113ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4890614368565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c706120ad565b73ffffffffffffffffffffffffffffffffffffffff161480610c9f5750610c9e81610c996120ad565b611e39565b5b610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590614208565b60405180910390fd5b610ce88383612121565b505050565b610cf56120ad565b73ffffffffffffffffffffffffffffffffffffffff16610d13611690565b73ffffffffffffffffffffffffffffffffffffffff1614610d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d60906142e8565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b610da4610d9e6120ad565b826121da565b610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda906143a8565b60405180910390fd5b610dee8383836122b8565b505050565b6103e881565b6000610e048361149c565b8210610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c906140e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ea66120ad565b73ffffffffffffffffffffffffffffffffffffffff16610ec4611690565b73ffffffffffffffffffffffffffffffffffffffff1614610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f11906142e8565b60405180910390fd5b600047905060008111610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f59906142a8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610f8890613fd2565b60006040518083038185875af1925050503d8060008114610fc5576040519150601f19603f3d011682016040523d82523d6000602084013e610fca565b606091505b505090508061100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590614388565b60405180910390fd5b5050565b61102d83838360405180602001604052806000815250611851565b505050565b61103a6120ad565b73ffffffffffffffffffffffffffffffffffffffff16611058611690565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a5906142e8565b60405180910390fd5b8060108190555050565b600f60009054906101000a900460ff1681565b60006110d5610d86565b905060006001826110e691906145c6565b9050600f60019054906101000a900460ff1615611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f906143e8565b60405180910390fd5b600f60009054906101000a900460ff1615611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90614448565b60405180910390fd5b6010543410156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906140c8565b60405180910390fd5b6115b3811115611212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611209906141c8565b60405180910390fd5b600a61121d3361149c565b1061125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490614348565b60405180910390fd5b6112668161174c565b156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614168565b60405180910390fd5b6112af81612514565b6112b9338261256e565b5050565b60006112c7610d86565b8210611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff906143c8565b60405180910390fd5b6008828154811061131c5761131b614908565b5b90600052602060002001549050919050565b600f60029054906101000a900460ff1681565b6113496120ad565b73ffffffffffffffffffffffffffffffffffffffff16611367611690565b73ffffffffffffffffffffffffffffffffffffffff16146113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b4906142e8565b60405180910390fd5b80600c90805190602001906113d392919061337b565b5050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a90614248565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490614228565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61155c6120ad565b73ffffffffffffffffffffffffffffffffffffffff1661157a611690565b73ffffffffffffffffffffffffffffffffffffffff16146115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c7906142e8565b60405180910390fd5b6115da600061258c565b565b606060006115e98361149c565b905060008167ffffffffffffffff81111561160757611606614937565b5b6040519080825280602002602001820160405280156116355781602001602082028036833780820191505090505b50905060005b8281101561167f5761164d8582610df9565b8282815181106116605761165f614908565b5b6020026020010181815250508080611677906147a4565b91505061163b565b508092505050919050565b60105481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116c990614741565b80601f01602080910402602001604051908101604052809291908181526020018280546116f590614741565b80156117425780601f1061171757610100808354040283529160200191611742565b820191906000526020600020905b81548152906001019060200180831161172557829003601f168201915b5050505050905090565b6000806101008361175d919061461c565b905060006101008461176f919061481b565b90506000601160008481526020019081526020016000205490506000826001901b90508081831614945050505050919050565b6117b46117ad6120ad565b8383612652565b5050565b6117c06120ad565b73ffffffffffffffffffffffffffffffffffffffff166117de611690565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b906142e8565b60405180910390fd5b6001600f60026101000a81548160ff021916908315150217905550565b61186261185c6120ad565b836121da565b6118a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611898906143a8565b60405180910390fd5b6118ad848484846127bf565b50505050565b600e80546118c090614741565b80601f01602080910402602001604051908101604052809291908181526020018280546118ec90614741565b80156119395780601f1061190e57610100808354040283529160200191611939565b820191906000526020600020905b81548152906001019060200180831161191c57829003601f168201915b505050505081565b606061194c826120b5565b61198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290614328565b60405180910390fd5b60001515600f60029054906101000a900460ff1615151415611a3957600d80546119b490614741565b80601f01602080910402602001604051908101604052809291908181526020018280546119e090614741565b8015611a2d5780601f10611a0257610100808354040283529160200191611a2d565b820191906000526020600020905b815481529060010190602001808311611a1057829003601f168201915b50505050509050611a95565b6000611a4361281b565b90506000815111611a635760405180602001604052806000815250611a91565b80611a6d846128ad565b600e604051602001611a8193929190613fa1565b6040516020818303038152906040525b9150505b919050565b600c8054611aa790614741565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad390614741565b8015611b205780601f10611af557610100808354040283529160200191611b20565b820191906000526020600020905b815481529060010190602001808311611b0357829003601f168201915b505050505081565b6115b381565b6000611b38610d86565b90506000600182611b4991906145c6565b9050600f60019054906101000a900460ff1615611b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b92906143e8565b60405180910390fd5b6103e8811115611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd790614408565b60405180910390fd5b600f60009054906101000a900460ff16611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690614468565b60405180910390fd5b611c82611c3b33612a0e565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a3e565b611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb890614428565b60405180910390fd5b601054341015611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906140c8565b60405180910390fd5b611d0f8161174c565b15611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4690614168565b60405180910390fd5b6002611d5a3361149c565b10611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190614268565b60405180910390fd5b611da381612514565b611dad338261256e565b50505050565b611dbb6120ad565b73ffffffffffffffffffffffffffffffffffffffff16611dd9611690565b73ffffffffffffffffffffffffffffffffffffffff1614611e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e26906142e8565b60405180910390fd5b80600b8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b611edb6120ad565b73ffffffffffffffffffffffffffffffffffffffff16611ef9611690565b73ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906142e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690614128565b60405180910390fd5b611fc88161258c565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a657506120a582612a55565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612194836113ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121e5826120b5565b612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906141e8565b60405180910390fd5b600061222f836113ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061229e57508373ffffffffffffffffffffffffffffffffffffffff1661228684610ac2565b73ffffffffffffffffffffffffffffffffffffffff16145b806122af57506122ae8185611e39565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122d8826113ea565b73ffffffffffffffffffffffffffffffffffffffff161461232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590614308565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561239e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239590614188565b60405180910390fd5b6123a9838383612abf565b6123b4600082612121565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612404919061464d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245b91906145c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061010082612524919061461c565b9050600061010083612536919061481b565b9050806001901b6011600084815260200190815260200160002054176011600084815260200190815260200160002081905550505050565b612588828260405180602001604052806000815250612bd3565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b8906141a8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127b29190614070565b60405180910390a3505050565b6127ca8484846122b8565b6127d684848484612c2e565b612815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280c90614108565b60405180910390fd5b50505050565b6060600c805461282a90614741565b80601f016020809104026020016040519081016040528092919081815260200182805461285690614741565b80156128a35780601f10612878576101008083540402835291602001916128a3565b820191906000526020600020905b81548152906001019060200180831161288657829003601f168201915b5050505050905090565b606060008214156128f5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a09565b600082905060005b60008214612927578080612910906147a4565b915050600a82612920919061461c565b91506128fd565b60008167ffffffffffffffff81111561294357612942614937565b5b6040519080825280601f01601f1916602001820160405280156129755781602001600182028036833780820191505090505b5090505b60008514612a025760018261298e919061464d565b9150600a8561299d919061481b565b60306129a991906145c6565b60f81b8183815181106129bf576129be614908565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129fb919061461c565b9450612979565b8093505050505b919050565b600081604051602001612a219190613f5a565b604051602081830303815290604052805190602001209050919050565b6000612a4d82600b5485612dc5565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612aca838383612ddc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b0d57612b0881612de1565b612b4c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b4b57612b4a8382612e2a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b8f57612b8a81612f97565b612bce565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612bcd57612bcc8282613068565b5b5b505050565b612bdd83836130e7565b612bea6000848484612c2e565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2090614108565b60405180910390fd5b505050565b6000612c4f8473ffffffffffffffffffffffffffffffffffffffff166132b5565b15612db8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c786120ad565b8786866040518563ffffffff1660e01b8152600401612c9a9493929190614002565b602060405180830381600087803b158015612cb457600080fd5b505af1925050508015612ce557506040513d601f19601f82011682018060405250810190612ce29190613869565b60015b612d68573d8060008114612d15576040519150601f19603f3d011682016040523d82523d6000602084013e612d1a565b606091505b50600081511415612d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5790614108565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612dbd565b600190505b949350505050565b600082612dd285846132c8565b1490509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e378461149c565b612e41919061464d565b9050600060076000848152602001908152602001600020549050818114612f26576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612fab919061464d565b9050600060096000848152602001908152602001600020549050600060088381548110612fdb57612fda614908565b5b906000526020600020015490508060088381548110612ffd57612ffc614908565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061304c5761304b6148d9565b5b6001900381819060005260206000200160009055905550505050565b60006130738361149c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314e90614288565b60405180910390fd5b613160816120b5565b156131a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319790614148565b60405180910390fd5b6131ac60008383612abf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131fc91906145c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60008082905060005b84518110156133705760008582815181106132ef576132ee614908565b5b60200260200101519050808311613330578281604051602001613313929190613f75565b60405160208183030381529060405280519060200120925061335c565b8083604051602001613343929190613f75565b6040516020818303038152906040528051906020012092505b508080613368906147a4565b9150506132d1565b508091505092915050565b82805461338790614741565b90600052602060002090601f0160209004810192826133a957600085556133f0565b82601f106133c257805160ff19168380011785556133f0565b828001600101855582156133f0579182015b828111156133ef5782518255916020019190600101906133d4565b5b5090506133fd9190613401565b5090565b5b8082111561341a576000816000905550600101613402565b5090565b600061343161342c846144c8565b6144a3565b90508281526020810184848401111561344d5761344c614975565b5b6134588482856146ff565b509392505050565b600061347361346e846144f9565b6144a3565b90508281526020810184848401111561348f5761348e614975565b5b61349a8482856146ff565b509392505050565b6000813590506134b1816150ad565b92915050565b60008083601f8401126134cd576134cc61496b565b5b8235905067ffffffffffffffff8111156134ea576134e9614966565b5b60208301915083602082028301111561350657613505614970565b5b9250929050565b60008135905061351c816150c4565b92915050565b600081359050613531816150db565b92915050565b600081359050613546816150f2565b92915050565b60008151905061355b816150f2565b92915050565b600082601f8301126135765761357561496b565b5b813561358684826020860161341e565b91505092915050565b600082601f8301126135a4576135a361496b565b5b81356135b4848260208601613460565b91505092915050565b6000813590506135cc81615109565b92915050565b6000602082840312156135e8576135e761497f565b5b60006135f6848285016134a2565b91505092915050565b600080604083850312156136165761361561497f565b5b6000613624858286016134a2565b9250506020613635858286016134a2565b9150509250929050565b6000806000606084860312156136585761365761497f565b5b6000613666868287016134a2565b9350506020613677868287016134a2565b9250506040613688868287016135bd565b9150509250925092565b600080600080608085870312156136ac576136ab61497f565b5b60006136ba878288016134a2565b94505060206136cb878288016134a2565b93505060406136dc878288016135bd565b925050606085013567ffffffffffffffff8111156136fd576136fc61497a565b5b61370987828801613561565b91505092959194509250565b6000806040838503121561372c5761372b61497f565b5b600061373a858286016134a2565b925050602061374b8582860161350d565b9150509250929050565b6000806040838503121561376c5761376b61497f565b5b600061377a858286016134a2565b925050602061378b858286016135bd565b9150509250929050565b600080602083850312156137ac576137ab61497f565b5b600083013567ffffffffffffffff8111156137ca576137c961497a565b5b6137d6858286016134b7565b92509250509250929050565b6000602082840312156137f8576137f761497f565b5b60006138068482850161350d565b91505092915050565b6000602082840312156138255761382461497f565b5b600061383384828501613522565b91505092915050565b6000602082840312156138525761385161497f565b5b600061386084828501613537565b91505092915050565b60006020828403121561387f5761387e61497f565b5b600061388d8482850161354c565b91505092915050565b6000602082840312156138ac576138ab61497f565b5b600082013567ffffffffffffffff8111156138ca576138c961497a565b5b6138d68482850161358f565b91505092915050565b6000602082840312156138f5576138f461497f565b5b6000613903848285016135bd565b91505092915050565b60006139188383613f3c565b60208301905092915050565b61392d81614681565b82525050565b61394461393f82614681565b6147ed565b82525050565b60006139558261454f565b61395f818561457d565b935061396a8361452a565b8060005b8381101561399b578151613982888261390c565b975061398d83614570565b92505060018101905061396e565b5085935050505092915050565b6139b181614693565b82525050565b6139c08161469f565b82525050565b6139d76139d28261469f565b6147ff565b82525050565b60006139e88261455a565b6139f2818561458e565b9350613a0281856020860161470e565b613a0b81614984565b840191505092915050565b6000613a2182614565565b613a2b81856145aa565b9350613a3b81856020860161470e565b613a4481614984565b840191505092915050565b6000613a5a82614565565b613a6481856145bb565b9350613a7481856020860161470e565b80840191505092915050565b60008154613a8d81614741565b613a9781866145bb565b94506001821660008114613ab25760018114613ac357613af6565b60ff19831686528186019350613af6565b613acc8561453a565b60005b83811015613aee57815481890152600182019150602081019050613acf565b838801955050505b50505092915050565b6000613b0c6011836145aa565b9150613b17826149a2565b602082019050919050565b6000613b2f602b836145aa565b9150613b3a826149cb565b604082019050919050565b6000613b526032836145aa565b9150613b5d82614a1a565b604082019050919050565b6000613b756026836145aa565b9150613b8082614a69565b604082019050919050565b6000613b98601c836145aa565b9150613ba382614ab8565b602082019050919050565b6000613bbb6018836145aa565b9150613bc682614ae1565b602082019050919050565b6000613bde6024836145aa565b9150613be982614b0a565b604082019050919050565b6000613c016019836145aa565b9150613c0c82614b59565b602082019050919050565b6000613c24600b836145aa565b9150613c2f82614b82565b602082019050919050565b6000613c47602c836145aa565b9150613c5282614bab565b604082019050919050565b6000613c6a6038836145aa565b9150613c7582614bfa565b604082019050919050565b6000613c8d602a836145aa565b9150613c9882614c49565b604082019050919050565b6000613cb06029836145aa565b9150613cbb82614c98565b604082019050919050565b6000613cd36024836145aa565b9150613cde82614ce7565b604082019050919050565b6000613cf66020836145aa565b9150613d0182614d36565b602082019050919050565b6000613d196019836145aa565b9150613d2482614d5f565b602082019050919050565b6000613d3c602c836145aa565b9150613d4782614d88565b604082019050919050565b6000613d5f6020836145aa565b9150613d6a82614dd7565b602082019050919050565b6000613d826029836145aa565b9150613d8d82614e00565b604082019050919050565b6000613da5602f836145aa565b9150613db082614e4f565b604082019050919050565b6000613dc86016836145aa565b9150613dd382614e9e565b602082019050919050565b6000613deb6021836145aa565b9150613df682614ec7565b604082019050919050565b6000613e0e60008361459f565b9150613e1982614f16565b600082019050919050565b6000613e316010836145aa565b9150613e3c82614f19565b602082019050919050565b6000613e546031836145aa565b9150613e5f82614f42565b604082019050919050565b6000613e77602c836145aa565b9150613e8282614f91565b604082019050919050565b6000613e9a6011836145aa565b9150613ea582614fe0565b602082019050919050565b6000613ebd6015836145aa565b9150613ec882615009565b602082019050919050565b6000613ee06015836145aa565b9150613eeb82615032565b602082019050919050565b6000613f036010836145aa565b9150613f0e8261505b565b602082019050919050565b6000613f266018836145aa565b9150613f3182615084565b602082019050919050565b613f45816146f5565b82525050565b613f54816146f5565b82525050565b6000613f668284613933565b60148201915081905092915050565b6000613f8182856139c6565b602082019150613f9182846139c6565b6020820191508190509392505050565b6000613fad8286613a4f565b9150613fb98285613a4f565b9150613fc58284613a80565b9150819050949350505050565b6000613fdd82613e01565b9150819050919050565b6000602082019050613ffc6000830184613924565b92915050565b60006080820190506140176000830187613924565b6140246020830186613924565b6140316040830185613f4b565b818103606083015261404381846139dd565b905095945050505050565b60006020820190508181036000830152614068818461394a565b905092915050565b600060208201905061408560008301846139a8565b92915050565b60006020820190506140a060008301846139b7565b92915050565b600060208201905081810360008301526140c08184613a16565b905092915050565b600060208201905081810360008301526140e181613aff565b9050919050565b6000602082019050818103600083015261410181613b22565b9050919050565b6000602082019050818103600083015261412181613b45565b9050919050565b6000602082019050818103600083015261414181613b68565b9050919050565b6000602082019050818103600083015261416181613b8b565b9050919050565b6000602082019050818103600083015261418181613bae565b9050919050565b600060208201905081810360008301526141a181613bd1565b9050919050565b600060208201905081810360008301526141c181613bf4565b9050919050565b600060208201905081810360008301526141e181613c17565b9050919050565b6000602082019050818103600083015261420181613c3a565b9050919050565b6000602082019050818103600083015261422181613c5d565b9050919050565b6000602082019050818103600083015261424181613c80565b9050919050565b6000602082019050818103600083015261426181613ca3565b9050919050565b6000602082019050818103600083015261428181613cc6565b9050919050565b600060208201905081810360008301526142a181613ce9565b9050919050565b600060208201905081810360008301526142c181613d0c565b9050919050565b600060208201905081810360008301526142e181613d2f565b9050919050565b6000602082019050818103600083015261430181613d52565b9050919050565b6000602082019050818103600083015261432181613d75565b9050919050565b6000602082019050818103600083015261434181613d98565b9050919050565b6000602082019050818103600083015261436181613dbb565b9050919050565b6000602082019050818103600083015261438181613dde565b9050919050565b600060208201905081810360008301526143a181613e24565b9050919050565b600060208201905081810360008301526143c181613e47565b9050919050565b600060208201905081810360008301526143e181613e6a565b9050919050565b6000602082019050818103600083015261440181613e8d565b9050919050565b6000602082019050818103600083015261442181613eb0565b9050919050565b6000602082019050818103600083015261444181613ed3565b9050919050565b6000602082019050818103600083015261446181613ef6565b9050919050565b6000602082019050818103600083015261448181613f19565b9050919050565b600060208201905061449d6000830184613f4b565b92915050565b60006144ad6144be565b90506144b98282614773565b919050565b6000604051905090565b600067ffffffffffffffff8211156144e3576144e2614937565b5b6144ec82614984565b9050602081019050919050565b600067ffffffffffffffff82111561451457614513614937565b5b61451d82614984565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006145d1826146f5565b91506145dc836146f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146115761461061484c565b5b828201905092915050565b6000614627826146f5565b9150614632836146f5565b9250826146425761464161487b565b5b828204905092915050565b6000614658826146f5565b9150614663836146f5565b9250828210156146765761467561484c565b5b828203905092915050565b600061468c826146d5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561472c578082015181840152602081019050614711565b8381111561473b576000848401525b50505050565b6000600282049050600182168061475957607f821691505b6020821081141561476d5761476c6148aa565b5b50919050565b61477c82614984565b810181811067ffffffffffffffff8211171561479b5761479a614937565b5b80604052505050565b60006147af826146f5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147e2576147e161484c565b5b600182019050919050565b60006147f882614809565b9050919050565b6000819050919050565b600061481482614995565b9050919050565b6000614826826146f5565b9150614831836146f5565b9250826148415761484061487b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f7420656e6f75676820657468657221000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6b656e496420616c726561647920636c61696d65642e0000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f30204e4654204c45465421000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d61782032204e4654207065722077616c6c657420647572696e67207072657360008201527f616c652100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178203130204e4654207065722077616c6c65742100000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e742069732064697361626c656421000000000000000000000000000000600082015250565b7f30205052452d53414c45204e465473204c454654210000000000000000000000600082015250565b7f496e76616c6964206d65726b6c652070726f6f662e0000000000000000000000600082015250565b7f50726573616c6520656e61626c65642100000000000000000000000000000000600082015250565b7f50726573616c65206d75737420626520656e61626c6564210000000000000000600082015250565b6150b681614681565b81146150c157600080fd5b50565b6150cd81614693565b81146150d857600080fd5b50565b6150e48161469f565b81146150ef57600080fd5b50565b6150fb816146a9565b811461510657600080fd5b50565b615112816146f5565b811461511d57600080fd5b5056fea2646970667358221220637a27dce7798e337a8c0ff4ae6aea1cea71777dfdbe5f45bff2d77f13832c9864736f6c6343000807003368747470733a2f2f626f756e74792e6d7970696e6174612e636c6f75642f697066732f516d4e6e6f54696a7543703645384e396137456134736e6b434541615766696f3368767844334d54696a765274372f68696464656e2e6a736f6e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c04bab1f93f48a885ebecb8553497f0d783840f4a408a7dcbf1c414ee389580ea20000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000f424f554e545943524541545552455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003425459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076261736575726900000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636352211e1161012e578063b88d4fde116100ab578063d68c60da1161006f578063d68c60da14610847578063dab5f34014610863578063e985e9c51461088c578063ebf0c717146108c9578063f2fde38b146108f45761023b565b8063b88d4fde14610760578063c668286214610789578063c87b56dd146107b4578063d547cfb7146107f1578063d5abeb011461081c5761023b565b80638da5cb5b116100f25780638da5cb5b1461068d57806395d89b41146106b85780639e34070f146106e3578063a22cb46514610720578063a475b5dd146107495761023b565b80636352211e1461059457806370a08231146105d1578063715018a61461060e5780638462151c146106255780638d859f3e146106625761023b565b80632f745c59116101bc5780634e71d92d116101805780634e71d92d146104ce5780634f6ccce7146104d8578063518302271461051557806355f804b3146105405780635c975abb146105695761023b565b80632f745c591461040a5780633ccfd60b1461044757806342842e0e1461045157806344a0d68a1461047a5780634ced4734146104a35761023b565b8063095ea7b311610203578063095ea7b3146103395780630d95ccc91461036257806318160ddd1461038b57806323b872dd146103b65780632e055bcc146103df5761023b565b806301ffc9a71461024057806302329a291461027d57806306fdde03146102a6578063081812fc146102d1578063081c8c441461030e575b600080fd5b34801561024c57600080fd5b506102676004803603810190610262919061383c565b61091d565b6040516102749190614070565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f91906137e2565b610997565b005b3480156102b257600080fd5b506102bb610a30565b6040516102c891906140a6565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f391906138df565b610ac2565b6040516103059190613fe7565b60405180910390f35b34801561031a57600080fd5b50610323610b47565b60405161033091906140a6565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b9190613755565b610bd5565b005b34801561036e57600080fd5b50610389600480360381019061038491906137e2565b610ced565b005b34801561039757600080fd5b506103a0610d86565b6040516103ad9190614488565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d8919061363f565b610d93565b005b3480156103eb57600080fd5b506103f4610df3565b6040516104019190614488565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c9190613755565b610df9565b60405161043e9190614488565b60405180910390f35b61044f610e9e565b005b34801561045d57600080fd5b506104786004803603810190610473919061363f565b611012565b005b34801561048657600080fd5b506104a1600480360381019061049c91906138df565b611032565b005b3480156104af57600080fd5b506104b86110b8565b6040516104c59190614070565b60405180910390f35b6104d66110cb565b005b3480156104e457600080fd5b506104ff60048036038101906104fa91906138df565b6112bd565b60405161050c9190614488565b60405180910390f35b34801561052157600080fd5b5061052a61132e565b6040516105379190614070565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613896565b611341565b005b34801561057557600080fd5b5061057e6113d7565b60405161058b9190614070565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b691906138df565b6113ea565b6040516105c89190613fe7565b60405180910390f35b3480156105dd57600080fd5b506105f860048036038101906105f391906135d2565b61149c565b6040516106059190614488565b60405180910390f35b34801561061a57600080fd5b50610623611554565b005b34801561063157600080fd5b5061064c600480360381019061064791906135d2565b6115dc565b604051610659919061404e565b60405180910390f35b34801561066e57600080fd5b5061067761168a565b6040516106849190614488565b60405180910390f35b34801561069957600080fd5b506106a2611690565b6040516106af9190613fe7565b60405180910390f35b3480156106c457600080fd5b506106cd6116ba565b6040516106da91906140a6565b60405180910390f35b3480156106ef57600080fd5b5061070a600480360381019061070591906138df565b61174c565b6040516107179190614070565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190613715565b6117a2565b005b34801561075557600080fd5b5061075e6117b8565b005b34801561076c57600080fd5b5061078760048036038101906107829190613692565b611851565b005b34801561079557600080fd5b5061079e6118b3565b6040516107ab91906140a6565b60405180910390f35b3480156107c057600080fd5b506107db60048036038101906107d691906138df565b611941565b6040516107e891906140a6565b60405180910390f35b3480156107fd57600080fd5b50610806611a9a565b60405161081391906140a6565b60405180910390f35b34801561082857600080fd5b50610831611b28565b60405161083e9190614488565b60405180910390f35b610861600480360381019061085c9190613795565b611b2e565b005b34801561086f57600080fd5b5061088a6004803603810190610885919061380f565b611db3565b005b34801561089857600080fd5b506108b360048036038101906108ae91906135ff565b611e39565b6040516108c09190614070565b60405180910390f35b3480156108d557600080fd5b506108de611ecd565b6040516108eb919061408b565b60405180910390f35b34801561090057600080fd5b5061091b600480360381019061091691906135d2565b611ed3565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610990575061098f82611fcb565b5b9050919050565b61099f6120ad565b73ffffffffffffffffffffffffffffffffffffffff166109bd611690565b73ffffffffffffffffffffffffffffffffffffffff1614610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a906142e8565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b606060008054610a3f90614741565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6b90614741565b8015610ab85780601f10610a8d57610100808354040283529160200191610ab8565b820191906000526020600020905b815481529060010190602001808311610a9b57829003601f168201915b5050505050905090565b6000610acd826120b5565b610b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b03906142c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610b5490614741565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8090614741565b8015610bcd5780601f10610ba257610100808354040283529160200191610bcd565b820191906000526020600020905b815481529060010190602001808311610bb057829003601f168201915b505050505081565b6000610be0826113ea565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4890614368565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c706120ad565b73ffffffffffffffffffffffffffffffffffffffff161480610c9f5750610c9e81610c996120ad565b611e39565b5b610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590614208565b60405180910390fd5b610ce88383612121565b505050565b610cf56120ad565b73ffffffffffffffffffffffffffffffffffffffff16610d13611690565b73ffffffffffffffffffffffffffffffffffffffff1614610d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d60906142e8565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b610da4610d9e6120ad565b826121da565b610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda906143a8565b60405180910390fd5b610dee8383836122b8565b505050565b6103e881565b6000610e048361149c565b8210610e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3c906140e8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ea66120ad565b73ffffffffffffffffffffffffffffffffffffffff16610ec4611690565b73ffffffffffffffffffffffffffffffffffffffff1614610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f11906142e8565b60405180910390fd5b600047905060008111610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f59906142a8565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610f8890613fd2565b60006040518083038185875af1925050503d8060008114610fc5576040519150601f19603f3d011682016040523d82523d6000602084013e610fca565b606091505b505090508061100e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100590614388565b60405180910390fd5b5050565b61102d83838360405180602001604052806000815250611851565b505050565b61103a6120ad565b73ffffffffffffffffffffffffffffffffffffffff16611058611690565b73ffffffffffffffffffffffffffffffffffffffff16146110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a5906142e8565b60405180910390fd5b8060108190555050565b600f60009054906101000a900460ff1681565b60006110d5610d86565b905060006001826110e691906145c6565b9050600f60019054906101000a900460ff1615611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f906143e8565b60405180910390fd5b600f60009054906101000a900460ff1615611188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117f90614448565b60405180910390fd5b6010543410156111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c4906140c8565b60405180910390fd5b6115b3811115611212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611209906141c8565b60405180910390fd5b600a61121d3361149c565b1061125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490614348565b60405180910390fd5b6112668161174c565b156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614168565b60405180910390fd5b6112af81612514565b6112b9338261256e565b5050565b60006112c7610d86565b8210611308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ff906143c8565b60405180910390fd5b6008828154811061131c5761131b614908565b5b90600052602060002001549050919050565b600f60029054906101000a900460ff1681565b6113496120ad565b73ffffffffffffffffffffffffffffffffffffffff16611367611690565b73ffffffffffffffffffffffffffffffffffffffff16146113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b4906142e8565b60405180910390fd5b80600c90805190602001906113d392919061337b565b5050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a90614248565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150490614228565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61155c6120ad565b73ffffffffffffffffffffffffffffffffffffffff1661157a611690565b73ffffffffffffffffffffffffffffffffffffffff16146115d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c7906142e8565b60405180910390fd5b6115da600061258c565b565b606060006115e98361149c565b905060008167ffffffffffffffff81111561160757611606614937565b5b6040519080825280602002602001820160405280156116355781602001602082028036833780820191505090505b50905060005b8281101561167f5761164d8582610df9565b8282815181106116605761165f614908565b5b6020026020010181815250508080611677906147a4565b91505061163b565b508092505050919050565b60105481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116c990614741565b80601f01602080910402602001604051908101604052809291908181526020018280546116f590614741565b80156117425780601f1061171757610100808354040283529160200191611742565b820191906000526020600020905b81548152906001019060200180831161172557829003601f168201915b5050505050905090565b6000806101008361175d919061461c565b905060006101008461176f919061481b565b90506000601160008481526020019081526020016000205490506000826001901b90508081831614945050505050919050565b6117b46117ad6120ad565b8383612652565b5050565b6117c06120ad565b73ffffffffffffffffffffffffffffffffffffffff166117de611690565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b906142e8565b60405180910390fd5b6001600f60026101000a81548160ff021916908315150217905550565b61186261185c6120ad565b836121da565b6118a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611898906143a8565b60405180910390fd5b6118ad848484846127bf565b50505050565b600e80546118c090614741565b80601f01602080910402602001604051908101604052809291908181526020018280546118ec90614741565b80156119395780601f1061190e57610100808354040283529160200191611939565b820191906000526020600020905b81548152906001019060200180831161191c57829003601f168201915b505050505081565b606061194c826120b5565b61198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290614328565b60405180910390fd5b60001515600f60029054906101000a900460ff1615151415611a3957600d80546119b490614741565b80601f01602080910402602001604051908101604052809291908181526020018280546119e090614741565b8015611a2d5780601f10611a0257610100808354040283529160200191611a2d565b820191906000526020600020905b815481529060010190602001808311611a1057829003601f168201915b50505050509050611a95565b6000611a4361281b565b90506000815111611a635760405180602001604052806000815250611a91565b80611a6d846128ad565b600e604051602001611a8193929190613fa1565b6040516020818303038152906040525b9150505b919050565b600c8054611aa790614741565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad390614741565b8015611b205780601f10611af557610100808354040283529160200191611b20565b820191906000526020600020905b815481529060010190602001808311611b0357829003601f168201915b505050505081565b6115b381565b6000611b38610d86565b90506000600182611b4991906145c6565b9050600f60019054906101000a900460ff1615611b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b92906143e8565b60405180910390fd5b6103e8811115611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd790614408565b60405180910390fd5b600f60009054906101000a900460ff16611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690614468565b60405180910390fd5b611c82611c3b33612a0e565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612a3e565b611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb890614428565b60405180910390fd5b601054341015611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd906140c8565b60405180910390fd5b611d0f8161174c565b15611d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4690614168565b60405180910390fd5b6002611d5a3361149c565b10611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9190614268565b60405180910390fd5b611da381612514565b611dad338261256e565b50505050565b611dbb6120ad565b73ffffffffffffffffffffffffffffffffffffffff16611dd9611690565b73ffffffffffffffffffffffffffffffffffffffff1614611e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e26906142e8565b60405180910390fd5b80600b8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b611edb6120ad565b73ffffffffffffffffffffffffffffffffffffffff16611ef9611690565b73ffffffffffffffffffffffffffffffffffffffff1614611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f46906142e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb690614128565b60405180910390fd5b611fc88161258c565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a657506120a582612a55565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612194836113ea565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121e5826120b5565b612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b906141e8565b60405180910390fd5b600061222f836113ea565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061229e57508373ffffffffffffffffffffffffffffffffffffffff1661228684610ac2565b73ffffffffffffffffffffffffffffffffffffffff16145b806122af57506122ae8185611e39565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166122d8826113ea565b73ffffffffffffffffffffffffffffffffffffffff161461232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590614308565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561239e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239590614188565b60405180910390fd5b6123a9838383612abf565b6123b4600082612121565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612404919061464d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245b91906145c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061010082612524919061461c565b9050600061010083612536919061481b565b9050806001901b6011600084815260200190815260200160002054176011600084815260200190815260200160002081905550505050565b612588828260405180602001604052806000815250612bd3565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b8906141a8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127b29190614070565b60405180910390a3505050565b6127ca8484846122b8565b6127d684848484612c2e565b612815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280c90614108565b60405180910390fd5b50505050565b6060600c805461282a90614741565b80601f016020809104026020016040519081016040528092919081815260200182805461285690614741565b80156128a35780601f10612878576101008083540402835291602001916128a3565b820191906000526020600020905b81548152906001019060200180831161288657829003601f168201915b5050505050905090565b606060008214156128f5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a09565b600082905060005b60008214612927578080612910906147a4565b915050600a82612920919061461c565b91506128fd565b60008167ffffffffffffffff81111561294357612942614937565b5b6040519080825280601f01601f1916602001820160405280156129755781602001600182028036833780820191505090505b5090505b60008514612a025760018261298e919061464d565b9150600a8561299d919061481b565b60306129a991906145c6565b60f81b8183815181106129bf576129be614908565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129fb919061461c565b9450612979565b8093505050505b919050565b600081604051602001612a219190613f5a565b604051602081830303815290604052805190602001209050919050565b6000612a4d82600b5485612dc5565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612aca838383612ddc565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b0d57612b0881612de1565b612b4c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b4b57612b4a8382612e2a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b8f57612b8a81612f97565b612bce565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612bcd57612bcc8282613068565b5b5b505050565b612bdd83836130e7565b612bea6000848484612c2e565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2090614108565b60405180910390fd5b505050565b6000612c4f8473ffffffffffffffffffffffffffffffffffffffff166132b5565b15612db8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c786120ad565b8786866040518563ffffffff1660e01b8152600401612c9a9493929190614002565b602060405180830381600087803b158015612cb457600080fd5b505af1925050508015612ce557506040513d601f19601f82011682018060405250810190612ce29190613869565b60015b612d68573d8060008114612d15576040519150601f19603f3d011682016040523d82523d6000602084013e612d1a565b606091505b50600081511415612d60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5790614108565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612dbd565b600190505b949350505050565b600082612dd285846132c8565b1490509392505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e378461149c565b612e41919061464d565b9050600060076000848152602001908152602001600020549050818114612f26576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612fab919061464d565b9050600060096000848152602001908152602001600020549050600060088381548110612fdb57612fda614908565b5b906000526020600020015490508060088381548110612ffd57612ffc614908565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061304c5761304b6148d9565b5b6001900381819060005260206000200160009055905550505050565b60006130738361149c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314e90614288565b60405180910390fd5b613160816120b5565b156131a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319790614148565b60405180910390fd5b6131ac60008383612abf565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131fc91906145c6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60008082905060005b84518110156133705760008582815181106132ef576132ee614908565b5b60200260200101519050808311613330578281604051602001613313929190613f75565b60405160208183030381529060405280519060200120925061335c565b8083604051602001613343929190613f75565b6040516020818303038152906040528051906020012092505b508080613368906147a4565b9150506132d1565b508091505092915050565b82805461338790614741565b90600052602060002090601f0160209004810192826133a957600085556133f0565b82601f106133c257805160ff19168380011785556133f0565b828001600101855582156133f0579182015b828111156133ef5782518255916020019190600101906133d4565b5b5090506133fd9190613401565b5090565b5b8082111561341a576000816000905550600101613402565b5090565b600061343161342c846144c8565b6144a3565b90508281526020810184848401111561344d5761344c614975565b5b6134588482856146ff565b509392505050565b600061347361346e846144f9565b6144a3565b90508281526020810184848401111561348f5761348e614975565b5b61349a8482856146ff565b509392505050565b6000813590506134b1816150ad565b92915050565b60008083601f8401126134cd576134cc61496b565b5b8235905067ffffffffffffffff8111156134ea576134e9614966565b5b60208301915083602082028301111561350657613505614970565b5b9250929050565b60008135905061351c816150c4565b92915050565b600081359050613531816150db565b92915050565b600081359050613546816150f2565b92915050565b60008151905061355b816150f2565b92915050565b600082601f8301126135765761357561496b565b5b813561358684826020860161341e565b91505092915050565b600082601f8301126135a4576135a361496b565b5b81356135b4848260208601613460565b91505092915050565b6000813590506135cc81615109565b92915050565b6000602082840312156135e8576135e761497f565b5b60006135f6848285016134a2565b91505092915050565b600080604083850312156136165761361561497f565b5b6000613624858286016134a2565b9250506020613635858286016134a2565b9150509250929050565b6000806000606084860312156136585761365761497f565b5b6000613666868287016134a2565b9350506020613677868287016134a2565b9250506040613688868287016135bd565b9150509250925092565b600080600080608085870312156136ac576136ab61497f565b5b60006136ba878288016134a2565b94505060206136cb878288016134a2565b93505060406136dc878288016135bd565b925050606085013567ffffffffffffffff8111156136fd576136fc61497a565b5b61370987828801613561565b91505092959194509250565b6000806040838503121561372c5761372b61497f565b5b600061373a858286016134a2565b925050602061374b8582860161350d565b9150509250929050565b6000806040838503121561376c5761376b61497f565b5b600061377a858286016134a2565b925050602061378b858286016135bd565b9150509250929050565b600080602083850312156137ac576137ab61497f565b5b600083013567ffffffffffffffff8111156137ca576137c961497a565b5b6137d6858286016134b7565b92509250509250929050565b6000602082840312156137f8576137f761497f565b5b60006138068482850161350d565b91505092915050565b6000602082840312156138255761382461497f565b5b600061383384828501613522565b91505092915050565b6000602082840312156138525761385161497f565b5b600061386084828501613537565b91505092915050565b60006020828403121561387f5761387e61497f565b5b600061388d8482850161354c565b91505092915050565b6000602082840312156138ac576138ab61497f565b5b600082013567ffffffffffffffff8111156138ca576138c961497a565b5b6138d68482850161358f565b91505092915050565b6000602082840312156138f5576138f461497f565b5b6000613903848285016135bd565b91505092915050565b60006139188383613f3c565b60208301905092915050565b61392d81614681565b82525050565b61394461393f82614681565b6147ed565b82525050565b60006139558261454f565b61395f818561457d565b935061396a8361452a565b8060005b8381101561399b578151613982888261390c565b975061398d83614570565b92505060018101905061396e565b5085935050505092915050565b6139b181614693565b82525050565b6139c08161469f565b82525050565b6139d76139d28261469f565b6147ff565b82525050565b60006139e88261455a565b6139f2818561458e565b9350613a0281856020860161470e565b613a0b81614984565b840191505092915050565b6000613a2182614565565b613a2b81856145aa565b9350613a3b81856020860161470e565b613a4481614984565b840191505092915050565b6000613a5a82614565565b613a6481856145bb565b9350613a7481856020860161470e565b80840191505092915050565b60008154613a8d81614741565b613a9781866145bb565b94506001821660008114613ab25760018114613ac357613af6565b60ff19831686528186019350613af6565b613acc8561453a565b60005b83811015613aee57815481890152600182019150602081019050613acf565b838801955050505b50505092915050565b6000613b0c6011836145aa565b9150613b17826149a2565b602082019050919050565b6000613b2f602b836145aa565b9150613b3a826149cb565b604082019050919050565b6000613b526032836145aa565b9150613b5d82614a1a565b604082019050919050565b6000613b756026836145aa565b9150613b8082614a69565b604082019050919050565b6000613b98601c836145aa565b9150613ba382614ab8565b602082019050919050565b6000613bbb6018836145aa565b9150613bc682614ae1565b602082019050919050565b6000613bde6024836145aa565b9150613be982614b0a565b604082019050919050565b6000613c016019836145aa565b9150613c0c82614b59565b602082019050919050565b6000613c24600b836145aa565b9150613c2f82614b82565b602082019050919050565b6000613c47602c836145aa565b9150613c5282614bab565b604082019050919050565b6000613c6a6038836145aa565b9150613c7582614bfa565b604082019050919050565b6000613c8d602a836145aa565b9150613c9882614c49565b604082019050919050565b6000613cb06029836145aa565b9150613cbb82614c98565b604082019050919050565b6000613cd36024836145aa565b9150613cde82614ce7565b604082019050919050565b6000613cf66020836145aa565b9150613d0182614d36565b602082019050919050565b6000613d196019836145aa565b9150613d2482614d5f565b602082019050919050565b6000613d3c602c836145aa565b9150613d4782614d88565b604082019050919050565b6000613d5f6020836145aa565b9150613d6a82614dd7565b602082019050919050565b6000613d826029836145aa565b9150613d8d82614e00565b604082019050919050565b6000613da5602f836145aa565b9150613db082614e4f565b604082019050919050565b6000613dc86016836145aa565b9150613dd382614e9e565b602082019050919050565b6000613deb6021836145aa565b9150613df682614ec7565b604082019050919050565b6000613e0e60008361459f565b9150613e1982614f16565b600082019050919050565b6000613e316010836145aa565b9150613e3c82614f19565b602082019050919050565b6000613e546031836145aa565b9150613e5f82614f42565b604082019050919050565b6000613e77602c836145aa565b9150613e8282614f91565b604082019050919050565b6000613e9a6011836145aa565b9150613ea582614fe0565b602082019050919050565b6000613ebd6015836145aa565b9150613ec882615009565b602082019050919050565b6000613ee06015836145aa565b9150613eeb82615032565b602082019050919050565b6000613f036010836145aa565b9150613f0e8261505b565b602082019050919050565b6000613f266018836145aa565b9150613f3182615084565b602082019050919050565b613f45816146f5565b82525050565b613f54816146f5565b82525050565b6000613f668284613933565b60148201915081905092915050565b6000613f8182856139c6565b602082019150613f9182846139c6565b6020820191508190509392505050565b6000613fad8286613a4f565b9150613fb98285613a4f565b9150613fc58284613a80565b9150819050949350505050565b6000613fdd82613e01565b9150819050919050565b6000602082019050613ffc6000830184613924565b92915050565b60006080820190506140176000830187613924565b6140246020830186613924565b6140316040830185613f4b565b818103606083015261404381846139dd565b905095945050505050565b60006020820190508181036000830152614068818461394a565b905092915050565b600060208201905061408560008301846139a8565b92915050565b60006020820190506140a060008301846139b7565b92915050565b600060208201905081810360008301526140c08184613a16565b905092915050565b600060208201905081810360008301526140e181613aff565b9050919050565b6000602082019050818103600083015261410181613b22565b9050919050565b6000602082019050818103600083015261412181613b45565b9050919050565b6000602082019050818103600083015261414181613b68565b9050919050565b6000602082019050818103600083015261416181613b8b565b9050919050565b6000602082019050818103600083015261418181613bae565b9050919050565b600060208201905081810360008301526141a181613bd1565b9050919050565b600060208201905081810360008301526141c181613bf4565b9050919050565b600060208201905081810360008301526141e181613c17565b9050919050565b6000602082019050818103600083015261420181613c3a565b9050919050565b6000602082019050818103600083015261422181613c5d565b9050919050565b6000602082019050818103600083015261424181613c80565b9050919050565b6000602082019050818103600083015261426181613ca3565b9050919050565b6000602082019050818103600083015261428181613cc6565b9050919050565b600060208201905081810360008301526142a181613ce9565b9050919050565b600060208201905081810360008301526142c181613d0c565b9050919050565b600060208201905081810360008301526142e181613d2f565b9050919050565b6000602082019050818103600083015261430181613d52565b9050919050565b6000602082019050818103600083015261432181613d75565b9050919050565b6000602082019050818103600083015261434181613d98565b9050919050565b6000602082019050818103600083015261436181613dbb565b9050919050565b6000602082019050818103600083015261438181613dde565b9050919050565b600060208201905081810360008301526143a181613e24565b9050919050565b600060208201905081810360008301526143c181613e47565b9050919050565b600060208201905081810360008301526143e181613e6a565b9050919050565b6000602082019050818103600083015261440181613e8d565b9050919050565b6000602082019050818103600083015261442181613eb0565b9050919050565b6000602082019050818103600083015261444181613ed3565b9050919050565b6000602082019050818103600083015261446181613ef6565b9050919050565b6000602082019050818103600083015261448181613f19565b9050919050565b600060208201905061449d6000830184613f4b565b92915050565b60006144ad6144be565b90506144b98282614773565b919050565b6000604051905090565b600067ffffffffffffffff8211156144e3576144e2614937565b5b6144ec82614984565b9050602081019050919050565b600067ffffffffffffffff82111561451457614513614937565b5b61451d82614984565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006145d1826146f5565b91506145dc836146f5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146115761461061484c565b5b828201905092915050565b6000614627826146f5565b9150614632836146f5565b9250826146425761464161487b565b5b828204905092915050565b6000614658826146f5565b9150614663836146f5565b9250828210156146765761467561484c565b5b828203905092915050565b600061468c826146d5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561472c578082015181840152602081019050614711565b8381111561473b576000848401525b50505050565b6000600282049050600182168061475957607f821691505b6020821081141561476d5761476c6148aa565b5b50919050565b61477c82614984565b810181811067ffffffffffffffff8211171561479b5761479a614937565b5b80604052505050565b60006147af826146f5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147e2576147e161484c565b5b600182019050919050565b60006147f882614809565b9050919050565b6000819050919050565b600061481482614995565b9050919050565b6000614826826146f5565b9150614831836146f5565b9250826148415761484061487b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f7420656e6f75676820657468657221000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6b656e496420616c726561647920636c61696d65642e0000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f30204e4654204c45465421000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d61782032204e4654207065722077616c6c657420647572696e67207072657360008201527f616c652100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178203130204e4654207065722077616c6c65742100000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e742069732064697361626c656421000000000000000000000000000000600082015250565b7f30205052452d53414c45204e465473204c454654210000000000000000000000600082015250565b7f496e76616c6964206d65726b6c652070726f6f662e0000000000000000000000600082015250565b7f50726573616c6520656e61626c65642100000000000000000000000000000000600082015250565b7f50726573616c65206d75737420626520656e61626c6564210000000000000000600082015250565b6150b681614681565b81146150c157600080fd5b50565b6150cd81614693565b81146150d857600080fd5b50565b6150e48161469f565b81146150ef57600080fd5b50565b6150fb816146a9565b811461510657600080fd5b50565b615112816146f5565b811461511d57600080fd5b5056fea2646970667358221220637a27dce7798e337a8c0ff4ae6aea1cea71777dfdbe5f45bff2d77f13832c9864736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c04bab1f93f48a885ebecb8553497f0d783840f4a408a7dcbf1c414ee389580ea20000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000f424f554e545943524541545552455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003425459000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076261736575726900000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): BOUNTYCREATURES
Arg [1] : symbol (string): BTY
Arg [2] : merkleroot (bytes32): 0x4bab1f93f48a885ebecb8553497f0d783840f4a408a7dcbf1c414ee389580ea2
Arg [3] : baseURI (string): baseuri

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 4bab1f93f48a885ebecb8553497f0d783840f4a408a7dcbf1c414ee389580ea2
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [5] : 424f554e54594352454154555245530000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4254590000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 6261736575726900000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53749:5269:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36986:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58557:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23384:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25077:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53930:135;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24600:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58454:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37789:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25996:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54305:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37370:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58738:277;;;:::i;:::-;;26443:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58357:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54116:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56131:559;;;:::i;:::-;;37979:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54183:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58159:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54151:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22991:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22634:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46219:103;;;;;;;;;;;;;:::i;:::-;;57768:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54218:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45568:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23553:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55505:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25457:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58280:69;;;;;;;;;;;;;:::i;:::-;;26699:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54072:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54772:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53897:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54258:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56698:741;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58650:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25715:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53871:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46477:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36986:300;37133:4;37190:35;37175:50;;;:11;:50;;;;:103;;;;37242:36;37266:11;37242:23;:36::i;:::-;37175:103;37155:123;;36986:300;;;:::o;58557:85::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58625:9:::1;58616:6;;:18;;;;;;;;;;;;;;;;;;58557:85:::0;:::o;23384:100::-;23438:13;23471:5;23464:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23384:100;:::o;25077:308::-;25198:7;25245:16;25253:7;25245;:16::i;:::-;25223:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25353:15;:24;25369:7;25353:24;;;;;;;;;;;;;;;;;;;;;25346:31;;25077:308;;;:::o;53930:135::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24600:411::-;24681:13;24697:23;24712:7;24697:14;:23::i;:::-;24681:39;;24745:5;24739:11;;:2;:11;;;;24731:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24839:5;24823:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24848:37;24865:5;24872:12;:10;:12::i;:::-;24848:16;:37::i;:::-;24823:62;24801:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24982:21;24991:2;24995:7;24982:8;:21::i;:::-;24670:341;24600:411;;:::o;58454:95::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58531:10:::1;58519:9;;:22;;;;;;;;;;;;;;;;;;58454:95:::0;:::o;37789:113::-;37850:7;37877:10;:17;;;;37870:24;;37789:113;:::o;25996:376::-;26205:41;26224:12;:10;:12::i;:::-;26238:7;26205:18;:41::i;:::-;26183:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26336:28;26346:4;26352:2;26356:7;26336:9;:28::i;:::-;25996:376;;;:::o;54305:44::-;54345:4;54305:44;:::o;37370:343::-;37512:7;37567:23;37584:5;37567:16;:23::i;:::-;37559:5;:31;37537:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37679:12;:19;37692:5;37679:19;;;;;;;;;;;;;;;:26;37699:5;37679:26;;;;;;;;;;;;37672:33;;37370:343;;;;:::o;58738:277::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58794:15:::1;58812:21;58794:39;;58862:1;58852:7;:11;58844:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;58905:12;58924:10;58923:17;;58948:7;58923:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58904:56;;;58979:7;58971:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58783:232;;58738:277::o:0;26443:185::-;26581:39;26598:4;26604:2;26608:7;26581:39;;;;;;;;;;;;:16;:39::i;:::-;26443:185;;;:::o;58357:89::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58429:9:::1;58421:5;:17;;;;58357:89:::0;:::o;54116:28::-;;;;;;;;;;;;;:::o;56131:559::-;56176:14;56193:13;:11;:13::i;:::-;56176:30;;56217:15;56244:1;56235:6;:10;;;;:::i;:::-;56217:28;;56267:6;;;;;;;;;;;56266:7;56258:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;56317:9;;;;;;;;;;;56316:10;56308:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;56381:5;;56368:9;:18;;56360:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;54294:4;56429:7;:20;;56421:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;56510:2;56486:21;56496:10;56486:9;:21::i;:::-;:26;56478:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56561:18;56571:7;56561:9;:18::i;:::-;56560:19;56552:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56621:20;56633:7;56621:11;:20::i;:::-;56652:30;56662:10;56674:7;56652:9;:30::i;:::-;56165:525;;56131:559::o;37979:320::-;38099:7;38154:30;:28;:30::i;:::-;38146:5;:38;38124:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;38274:10;38285:5;38274:17;;;;;;;;:::i;:::-;;;;;;;;;;38267:24;;37979:320;;;:::o;54183:28::-;;;;;;;;;;;;;:::o;58159:113::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58251:13:::1;58236:12;:28;;;;;;;;;;;;:::i;:::-;;58159:113:::0;:::o;54151:25::-;;;;;;;;;;;;;:::o;22991:326::-;23108:7;23133:13;23149:7;:16;23157:7;23149:16;;;;;;;;;;;;;;;;;;;;;23133:32;;23215:1;23198:19;;:5;:19;;;;23176:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;23304:5;23297:12;;;22991:326;;;:::o;22634:295::-;22751:7;22815:1;22798:19;;:5;:19;;;;22776:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22905:9;:16;22915:5;22905:16;;;;;;;;;;;;;;;;22898:23;;22634:295;;;:::o;46219:103::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46284:30:::1;46311:1;46284:18;:30::i;:::-;46219:103::o:0;57768:383::-;57857:16;57891:18;57912:17;57922:6;57912:9;:17::i;:::-;57891:38;;57940:25;57982:10;57968:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57940:53;;58011:9;58006:112;58030:10;58026:1;:14;58006:112;;;58076:30;58096:6;58104:1;58076:19;:30::i;:::-;58062:8;58071:1;58062:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;58042:3;;;;;:::i;:::-;;;;58006:112;;;;58135:8;58128:15;;;;57768:383;;;:::o;54218:33::-;;;;:::o;45568:87::-;45614:7;45641:6;;;;;;;;;;;45634:13;;45568:87;:::o;23553:104::-;23609:13;23642:7;23635:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23553:104;:::o;55505:328::-;55562:4;55579:24;55616:3;55606:7;:13;;;;:::i;:::-;55579:40;;55630:23;55666:3;55656:7;:13;;;;:::i;:::-;55630:39;;55680:19;55702:13;:31;55716:16;55702:31;;;;;;;;;;;;55680:53;;55744:12;55765:15;55760:1;:20;;55744:37;;55821:4;55813;55799:11;:18;:26;55792:33;;;;;;55505:328;;;:::o;25457:187::-;25584:52;25603:12;:10;:12::i;:::-;25617:8;25627;25584:18;:52::i;:::-;25457:187;;:::o;58280:69::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58337:4:::1;58326:8;;:15;;;;;;;;;;;;;;;;;;58280:69::o:0;26699:365::-;26888:41;26907:12;:10;:12::i;:::-;26921:7;26888:18;:41::i;:::-;26866:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;27017:39;27031:4;27037:2;27041:7;27050:5;27017:13;:39::i;:::-;26699:365;;;;:::o;54072:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54772:725::-;54890:13;54943:16;54951:7;54943;:16::i;:::-;54921:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;55063:5;55051:17;;:8;;;;;;;;;;;:17;;;55047:71;;;55092:14;55085:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55047:71;55130:28;55161:10;:8;:10::i;:::-;55130:41;;55233:1;55208:14;55202:28;:32;:287;;;;;;;;;;;;;;;;;55326:14;55367:18;:7;:16;:18::i;:::-;55412:13;55283:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55202:287;55182:307;;;54772:725;;;;:::o;53897:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54258:40::-;54294:4;54258:40;:::o;56698:741::-;56774:14;56791:13;:11;:13::i;:::-;56774:30;;56815:15;56842:1;56833:6;:10;;;;:::i;:::-;56815:28;;56865:6;;;;;;;;;;;56864:7;56856:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;54345:4;56914:7;:24;;56906:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56985:9;;;;;;;;;;;56977:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;57044:33;57052:17;57058:10;57052:5;:17::i;:::-;57071:5;;57044:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;57036:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57137:5;;57124:9;:18;;57116:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57186:18;57196:7;57186:9;:18::i;:::-;57185:19;57177:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57292:1;57268:21;57278:10;57268:9;:21::i;:::-;:25;57246:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;57370:20;57382:7;57370:11;:20::i;:::-;57401:30;57411:10;57423:7;57401:9;:30::i;:::-;56763:676;;56698:741;;:::o;58650:80::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58717:5:::1;58710:4;:12;;;;58650:80:::0;:::o;25715:214::-;25857:4;25886:18;:25;25905:5;25886:25;;;;;;;;;;;;;;;:35;25912:8;25886:35;;;;;;;;;;;;;;;;;;;;;;;;;25879:42;;25715:214;;;;:::o;53871:19::-;;;;:::o;46477:238::-;45799:12;:10;:12::i;:::-;45788:23;;:7;:5;:7::i;:::-;:23;;;45780:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46600:1:::1;46580:22;;:8;:22;;;;46558:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46679:28;46698:8;46679:18;:28::i;:::-;46477:238:::0;:::o;22215:355::-;22362:4;22419:25;22404:40;;;:11;:40;;;;:105;;;;22476:33;22461:48;;;:11;:48;;;;22404:105;:158;;;;22526:36;22550:11;22526:23;:36::i;:::-;22404:158;22384:178;;22215:355;;;:::o;9935:98::-;9988:7;10015:10;10008:17;;9935:98;:::o;28611:127::-;28676:4;28728:1;28700:30;;:7;:16;28708:7;28700:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28693:37;;28611:127;;;:::o;32734:174::-;32836:2;32809:15;:24;32825:7;32809:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32892:7;32888:2;32854:46;;32863:23;32878:7;32863:14;:23::i;:::-;32854:46;;;;;;;;;;;;32734:174;;:::o;28905:452::-;29034:4;29078:16;29086:7;29078;:16::i;:::-;29056:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29177:13;29193:23;29208:7;29193:14;:23::i;:::-;29177:39;;29246:5;29235:16;;:7;:16;;;:64;;;;29292:7;29268:31;;:20;29280:7;29268:11;:20::i;:::-;:31;;;29235:64;:113;;;;29316:32;29333:5;29340:7;29316:16;:32::i;:::-;29235:113;29227:122;;;28905:452;;;;:::o;32001:615::-;32174:4;32147:31;;:23;32162:7;32147:14;:23::i;:::-;:31;;;32125:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;32280:1;32266:16;;:2;:16;;;;32258:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32336:39;32357:4;32363:2;32367:7;32336:20;:39::i;:::-;32440:29;32457:1;32461:7;32440:8;:29::i;:::-;32501:1;32482:9;:15;32492:4;32482:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32530:1;32513:9;:13;32523:2;32513:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32561:2;32542:7;:16;32550:7;32542:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32600:7;32596:2;32581:27;;32590:4;32581:27;;;;;;;;;;;;32001:615;;;:::o;55841:282::-;55898:24;55935:3;55925:7;:13;;;;:::i;:::-;55898:40;;55949:23;55985:3;55975:7;:13;;;;:::i;:::-;55949:39;;56099:15;56094:1;:20;;56046:13;:31;56060:16;56046:31;;;;;;;;;;;;:69;55999:13;:31;56013:16;55999:31;;;;;;;;;;;:116;;;;55887:236;;55841:282;:::o;29699:110::-;29775:26;29785:2;29789:7;29775:26;;;;;;;;;;;;:9;:26::i;:::-;29699:110;;:::o;46875:191::-;46949:16;46968:6;;;;;;;;;;;46949:25;;46994:8;46985:6;;:17;;;;;;;;;;;;;;;;;;47049:8;47018:40;;47039:8;47018:40;;;;;;;;;;;;46938:128;46875:191;:::o;33050:315::-;33205:8;33196:17;;:5;:17;;;;33188:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33292:8;33254:18;:25;33273:5;33254:25;;;;;;;;;;;;;;;:35;33280:8;33254:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33338:8;33316:41;;33331:5;33316:41;;;33348:8;33316:41;;;;;;:::i;:::-;;;;;;;;33050:315;;;:::o;27946:352::-;28103:28;28113:4;28119:2;28123:7;28103:9;:28::i;:::-;28164:48;28187:4;28193:2;28197:7;28206:5;28164:22;:48::i;:::-;28142:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27946:352;;;;:::o;54651:113::-;54711:13;54744:12;54737:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54651:113;:::o;18745:723::-;18801:13;19031:1;19022:5;:10;19018:53;;;19049:10;;;;;;;;;;;;;;;;;;;;;19018:53;19081:12;19096:5;19081:20;;19112:14;19137:78;19152:1;19144:4;:9;19137:78;;19170:8;;;;;:::i;:::-;;;;19201:2;19193:10;;;;;:::i;:::-;;;19137:78;;;19225:19;19257:6;19247:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19225:39;;19275:154;19291:1;19282:5;:10;19275:154;;19319:1;19309:11;;;;;:::i;:::-;;;19386:2;19378:5;:10;;;;:::i;:::-;19365:2;:24;;;;:::i;:::-;19352:39;;19335:6;19342;19335:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19415:2;19406:11;;;;;:::i;:::-;;;19275:154;;;19453:6;19439:21;;;;;18745:723;;;;:::o;57447:126::-;57502:7;57556;57539:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57529:36;;;;;;57522:43;;57447:126;;;:::o;57581:179::-;57686:4;57715:37;57734:5;57741:4;;57747;57715:18;:37::i;:::-;57708:44;;57581:179;;;;:::o;9688:207::-;9818:4;9862:25;9847:40;;;:11;:40;;;;9840:47;;9688:207;;;:::o;38912:589::-;39056:45;39083:4;39089:2;39093:7;39056:26;:45::i;:::-;39134:1;39118:18;;:4;:18;;;39114:187;;;39153:40;39185:7;39153:31;:40::i;:::-;39114:187;;;39223:2;39215:10;;:4;:10;;;39211:90;;39242:47;39275:4;39281:7;39242:32;:47::i;:::-;39211:90;39114:187;39329:1;39315:16;;:2;:16;;;39311:183;;;39348:45;39385:7;39348:36;:45::i;:::-;39311:183;;;39421:4;39415:10;;:2;:10;;;39411:83;;39442:40;39470:2;39474:7;39442:27;:40::i;:::-;39411:83;39311:183;38912:589;;;:::o;30036:321::-;30166:18;30172:2;30176:7;30166:5;:18::i;:::-;30217:54;30248:1;30252:2;30256:7;30265:5;30217:22;:54::i;:::-;30195:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;30036:321;;;:::o;33930:980::-;34085:4;34106:15;:2;:13;;;:15::i;:::-;34102:801;;;34175:2;34159:36;;;34218:12;:10;:12::i;:::-;34253:4;34280:7;34310:5;34159:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34138:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34534:1;34517:6;:13;:18;34513:320;;;34560:108;;;;;;;;;;:::i;:::-;;;;;;;;34513:320;34783:6;34777:13;34768:6;34764:2;34760:15;34753:38;34138:710;34408:41;;;34398:51;;;:6;:51;;;;34391:58;;;;;34102:801;34887:4;34880:11;;33930:980;;;;;;;:::o;43759:190::-;43884:4;43937;43908:25;43921:5;43928:4;43908:12;:25::i;:::-;:33;43901:40;;43759:190;;;;;:::o;35482:126::-;;;;:::o;40224:164::-;40328:10;:17;;;;40301:15;:24;40317:7;40301:24;;;;;;;;;;;:44;;;;40356:10;40372:7;40356:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40224:164;:::o;41015:1002::-;41295:22;41345:1;41320:22;41337:4;41320:16;:22::i;:::-;:26;;;;:::i;:::-;41295:51;;41357:18;41378:17;:26;41396:7;41378:26;;;;;;;;;;;;41357:47;;41525:14;41511:10;:28;41507:328;;41556:19;41578:12;:18;41591:4;41578:18;;;;;;;;;;;;;;;:34;41597:14;41578:34;;;;;;;;;;;;41556:56;;41662:11;41629:12;:18;41642:4;41629:18;;;;;;;;;;;;;;;:30;41648:10;41629:30;;;;;;;;;;;:44;;;;41779:10;41746:17;:30;41764:11;41746:30;;;;;;;;;;;:43;;;;41541:294;41507:328;41931:17;:26;41949:7;41931:26;;;;;;;;;;;41924:33;;;41975:12;:18;41988:4;41975:18;;;;;;;;;;;;;;;:34;41994:14;41975:34;;;;;;;;;;;41968:41;;;41110:907;;41015:1002;;:::o;42312:1079::-;42565:22;42610:1;42590:10;:17;;;;:21;;;;:::i;:::-;42565:46;;42622:18;42643:15;:24;42659:7;42643:24;;;;;;;;;;;;42622:45;;42994:19;43016:10;43027:14;43016:26;;;;;;;;:::i;:::-;;;;;;;;;;42994:48;;43080:11;43055:10;43066;43055:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43191:10;43160:15;:28;43176:11;43160:28;;;;;;;;;;;:41;;;;43332:15;:24;43348:7;43332:24;;;;;;;;;;;43325:31;;;43367:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42383:1008;;;42312:1079;:::o;39802:221::-;39887:14;39904:20;39921:2;39904:16;:20::i;:::-;39887:37;;39962:7;39935:12;:16;39948:2;39935:16;;;;;;;;;;;;;;;:24;39952:6;39935:24;;;;;;;;;;;:34;;;;40009:6;39980:17;:26;39998:7;39980:26;;;;;;;;;;;:35;;;;39876:147;39802:221;;:::o;30693:382::-;30787:1;30773:16;;:2;:16;;;;30765:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30846:16;30854:7;30846;:16::i;:::-;30845:17;30837:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30908:45;30937:1;30941:2;30945:7;30908:20;:45::i;:::-;30983:1;30966:9;:13;30976:2;30966:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31014:2;30995:7;:16;31003:7;30995:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31059:7;31055:2;31034:33;;31051:1;31034:33;;;;;;;;;;;;30693:382;;:::o;10759:387::-;10819:4;11027:12;11094:7;11082:20;11074:28;;11137:1;11130:4;:8;11123:15;;;10759:387;;;:::o;44311:813::-;44421:7;44446:20;44469:4;44446:27;;44489:9;44484:603;44508:5;:12;44504:1;:16;44484:603;;;44542:20;44565:5;44571:1;44565:8;;;;;;;;:::i;:::-;;;;;;;;44542:31;;44608:12;44592;:28;44588:488;;44784:12;44798;44767:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44735:95;;;;;;44720:110;;44588:488;;;45014:12;45028;44997:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44965:95;;;;;;44950:110;;44588:488;44527:560;44522:3;;;;;:::i;:::-;;;;44484:603;;;;45104:12;45097:19;;;44311:813;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:559::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6653:1;6642:9;6638:17;6625:31;6683:18;6675:6;6672:30;6669:117;;;6705:79;;:::i;:::-;6669:117;6818:80;6890:7;6881:6;6870:9;6866:22;6818:80;:::i;:::-;6800:98;;;;6596:312;6356:559;;;;;:::o;6921:323::-;6977:6;7026:2;7014:9;7005:7;7001:23;6997:32;6994:119;;;7032:79;;:::i;:::-;6994:119;7152:1;7177:50;7219:7;7210:6;7199:9;7195:22;7177:50;:::i;:::-;7167:60;;7123:114;6921:323;;;;:::o;7250:329::-;7309:6;7358:2;7346:9;7337:7;7333:23;7329:32;7326:119;;;7364:79;;:::i;:::-;7326:119;7484:1;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7455:117;7250:329;;;;:::o;7585:327::-;7643:6;7692:2;7680:9;7671:7;7667:23;7663:32;7660:119;;;7698:79;;:::i;:::-;7660:119;7818:1;7843:52;7887:7;7878:6;7867:9;7863:22;7843:52;:::i;:::-;7833:62;;7789:116;7585:327;;;;:::o;7918:349::-;7987:6;8036:2;8024:9;8015:7;8011:23;8007:32;8004:119;;;8042:79;;:::i;:::-;8004:119;8162:1;8187:63;8242:7;8233:6;8222:9;8218:22;8187:63;:::i;:::-;8177:73;;8133:127;7918:349;;;;:::o;8273:509::-;8342:6;8391:2;8379:9;8370:7;8366:23;8362:32;8359:119;;;8397:79;;:::i;:::-;8359:119;8545:1;8534:9;8530:17;8517:31;8575:18;8567:6;8564:30;8561:117;;;8597:79;;:::i;:::-;8561:117;8702:63;8757:7;8748:6;8737:9;8733:22;8702:63;:::i;:::-;8692:73;;8488:287;8273:509;;;;:::o;8788:329::-;8847:6;8896:2;8884:9;8875:7;8871:23;8867:32;8864:119;;;8902:79;;:::i;:::-;8864:119;9022:1;9047:53;9092:7;9083:6;9072:9;9068:22;9047:53;:::i;:::-;9037:63;;8993:117;8788:329;;;;:::o;9123:179::-;9192:10;9213:46;9255:3;9247:6;9213:46;:::i;:::-;9291:4;9286:3;9282:14;9268:28;;9123:179;;;;:::o;9308:118::-;9395:24;9413:5;9395:24;:::i;:::-;9390:3;9383:37;9308:118;;:::o;9432:157::-;9537:45;9557:24;9575:5;9557:24;:::i;:::-;9537:45;:::i;:::-;9532:3;9525:58;9432:157;;:::o;9625:732::-;9744:3;9773:54;9821:5;9773:54;:::i;:::-;9843:86;9922:6;9917:3;9843:86;:::i;:::-;9836:93;;9953:56;10003:5;9953:56;:::i;:::-;10032:7;10063:1;10048:284;10073:6;10070:1;10067:13;10048:284;;;10149:6;10143:13;10176:63;10235:3;10220:13;10176:63;:::i;:::-;10169:70;;10262:60;10315:6;10262:60;:::i;:::-;10252:70;;10108:224;10095:1;10092;10088:9;10083:14;;10048:284;;;10052:14;10348:3;10341:10;;9749:608;;;9625:732;;;;:::o;10363:109::-;10444:21;10459:5;10444:21;:::i;:::-;10439:3;10432:34;10363:109;;:::o;10478:118::-;10565:24;10583:5;10565:24;:::i;:::-;10560:3;10553:37;10478:118;;:::o;10602:157::-;10707:45;10727:24;10745:5;10727:24;:::i;:::-;10707:45;:::i;:::-;10702:3;10695:58;10602:157;;:::o;10765:360::-;10851:3;10879:38;10911:5;10879:38;:::i;:::-;10933:70;10996:6;10991:3;10933:70;:::i;:::-;10926:77;;11012:52;11057:6;11052:3;11045:4;11038:5;11034:16;11012:52;:::i;:::-;11089:29;11111:6;11089:29;:::i;:::-;11084:3;11080:39;11073:46;;10855:270;10765:360;;;;:::o;11131:364::-;11219:3;11247:39;11280:5;11247:39;:::i;:::-;11302:71;11366:6;11361:3;11302:71;:::i;:::-;11295:78;;11382:52;11427:6;11422:3;11415:4;11408:5;11404:16;11382:52;:::i;:::-;11459:29;11481:6;11459:29;:::i;:::-;11454:3;11450:39;11443:46;;11223:272;11131:364;;;;:::o;11501:377::-;11607:3;11635:39;11668:5;11635:39;:::i;:::-;11690:89;11772:6;11767:3;11690:89;:::i;:::-;11683:96;;11788:52;11833:6;11828:3;11821:4;11814:5;11810:16;11788:52;:::i;:::-;11865:6;11860:3;11856:16;11849:23;;11611:267;11501:377;;;;:::o;11908:845::-;12011:3;12048:5;12042:12;12077:36;12103:9;12077:36;:::i;:::-;12129:89;12211:6;12206:3;12129:89;:::i;:::-;12122:96;;12249:1;12238:9;12234:17;12265:1;12260:137;;;;12411:1;12406:341;;;;12227:520;;12260:137;12344:4;12340:9;12329;12325:25;12320:3;12313:38;12380:6;12375:3;12371:16;12364:23;;12260:137;;12406:341;12473:38;12505:5;12473:38;:::i;:::-;12533:1;12547:154;12561:6;12558:1;12555:13;12547:154;;;12635:7;12629:14;12625:1;12620:3;12616:11;12609:35;12685:1;12676:7;12672:15;12661:26;;12583:4;12580:1;12576:12;12571:17;;12547:154;;;12730:6;12725:3;12721:16;12714:23;;12413:334;;12227:520;;12015:738;;11908:845;;;;:::o;12759:366::-;12901:3;12922:67;12986:2;12981:3;12922:67;:::i;:::-;12915:74;;12998:93;13087:3;12998:93;:::i;:::-;13116:2;13111:3;13107:12;13100:19;;12759:366;;;:::o;13131:::-;13273:3;13294:67;13358:2;13353:3;13294:67;:::i;:::-;13287:74;;13370:93;13459:3;13370:93;:::i;:::-;13488:2;13483:3;13479:12;13472:19;;13131:366;;;:::o;13503:::-;13645:3;13666:67;13730:2;13725:3;13666:67;:::i;:::-;13659:74;;13742:93;13831:3;13742:93;:::i;:::-;13860:2;13855:3;13851:12;13844:19;;13503:366;;;:::o;13875:::-;14017:3;14038:67;14102:2;14097:3;14038:67;:::i;:::-;14031:74;;14114:93;14203:3;14114:93;:::i;:::-;14232:2;14227:3;14223:12;14216:19;;13875:366;;;:::o;14247:::-;14389:3;14410:67;14474:2;14469:3;14410:67;:::i;:::-;14403:74;;14486:93;14575:3;14486:93;:::i;:::-;14604:2;14599:3;14595:12;14588:19;;14247:366;;;:::o;14619:::-;14761:3;14782:67;14846:2;14841:3;14782:67;:::i;:::-;14775:74;;14858:93;14947:3;14858:93;:::i;:::-;14976:2;14971:3;14967:12;14960:19;;14619:366;;;:::o;14991:::-;15133:3;15154:67;15218:2;15213:3;15154:67;:::i;:::-;15147:74;;15230:93;15319:3;15230:93;:::i;:::-;15348:2;15343:3;15339:12;15332:19;;14991:366;;;:::o;15363:::-;15505:3;15526:67;15590:2;15585:3;15526:67;:::i;:::-;15519:74;;15602:93;15691:3;15602:93;:::i;:::-;15720:2;15715:3;15711:12;15704:19;;15363:366;;;:::o;15735:::-;15877:3;15898:67;15962:2;15957:3;15898:67;:::i;:::-;15891:74;;15974:93;16063:3;15974:93;:::i;:::-;16092:2;16087:3;16083:12;16076:19;;15735:366;;;:::o;16107:::-;16249:3;16270:67;16334:2;16329:3;16270:67;:::i;:::-;16263:74;;16346:93;16435:3;16346:93;:::i;:::-;16464:2;16459:3;16455:12;16448:19;;16107:366;;;:::o;16479:::-;16621:3;16642:67;16706:2;16701:3;16642:67;:::i;:::-;16635:74;;16718:93;16807:3;16718:93;:::i;:::-;16836:2;16831:3;16827:12;16820:19;;16479:366;;;:::o;16851:::-;16993:3;17014:67;17078:2;17073:3;17014:67;:::i;:::-;17007:74;;17090:93;17179:3;17090:93;:::i;:::-;17208:2;17203:3;17199:12;17192:19;;16851:366;;;:::o;17223:::-;17365:3;17386:67;17450:2;17445:3;17386:67;:::i;:::-;17379:74;;17462:93;17551:3;17462:93;:::i;:::-;17580:2;17575:3;17571:12;17564:19;;17223:366;;;:::o;17595:::-;17737:3;17758:67;17822:2;17817:3;17758:67;:::i;:::-;17751:74;;17834:93;17923:3;17834:93;:::i;:::-;17952:2;17947:3;17943:12;17936:19;;17595:366;;;:::o;17967:::-;18109:3;18130:67;18194:2;18189:3;18130:67;:::i;:::-;18123:74;;18206:93;18295:3;18206:93;:::i;:::-;18324:2;18319:3;18315:12;18308:19;;17967:366;;;:::o;18339:::-;18481:3;18502:67;18566:2;18561:3;18502:67;:::i;:::-;18495:74;;18578:93;18667:3;18578:93;:::i;:::-;18696:2;18691:3;18687:12;18680:19;;18339:366;;;:::o;18711:::-;18853:3;18874:67;18938:2;18933:3;18874:67;:::i;:::-;18867:74;;18950:93;19039:3;18950:93;:::i;:::-;19068:2;19063:3;19059:12;19052:19;;18711:366;;;:::o;19083:::-;19225:3;19246:67;19310:2;19305:3;19246:67;:::i;:::-;19239:74;;19322:93;19411:3;19322:93;:::i;:::-;19440:2;19435:3;19431:12;19424:19;;19083:366;;;:::o;19455:::-;19597:3;19618:67;19682:2;19677:3;19618:67;:::i;:::-;19611:74;;19694:93;19783:3;19694:93;:::i;:::-;19812:2;19807:3;19803:12;19796:19;;19455:366;;;:::o;19827:::-;19969:3;19990:67;20054:2;20049:3;19990:67;:::i;:::-;19983:74;;20066:93;20155:3;20066:93;:::i;:::-;20184:2;20179:3;20175:12;20168:19;;19827:366;;;:::o;20199:::-;20341:3;20362:67;20426:2;20421:3;20362:67;:::i;:::-;20355:74;;20438:93;20527:3;20438:93;:::i;:::-;20556:2;20551:3;20547:12;20540:19;;20199:366;;;:::o;20571:::-;20713:3;20734:67;20798:2;20793:3;20734:67;:::i;:::-;20727:74;;20810:93;20899:3;20810:93;:::i;:::-;20928:2;20923:3;20919:12;20912:19;;20571:366;;;:::o;20943:398::-;21102:3;21123:83;21204:1;21199:3;21123:83;:::i;:::-;21116:90;;21215:93;21304:3;21215:93;:::i;:::-;21333:1;21328:3;21324:11;21317:18;;20943:398;;;:::o;21347:366::-;21489:3;21510:67;21574:2;21569:3;21510:67;:::i;:::-;21503:74;;21586:93;21675:3;21586:93;:::i;:::-;21704:2;21699:3;21695:12;21688:19;;21347:366;;;:::o;21719:::-;21861:3;21882:67;21946:2;21941:3;21882:67;:::i;:::-;21875:74;;21958:93;22047:3;21958:93;:::i;:::-;22076:2;22071:3;22067:12;22060:19;;21719:366;;;:::o;22091:::-;22233:3;22254:67;22318:2;22313:3;22254:67;:::i;:::-;22247:74;;22330:93;22419:3;22330:93;:::i;:::-;22448:2;22443:3;22439:12;22432:19;;22091:366;;;:::o;22463:::-;22605:3;22626:67;22690:2;22685:3;22626:67;:::i;:::-;22619:74;;22702:93;22791:3;22702:93;:::i;:::-;22820:2;22815:3;22811:12;22804:19;;22463:366;;;:::o;22835:::-;22977:3;22998:67;23062:2;23057:3;22998:67;:::i;:::-;22991:74;;23074:93;23163:3;23074:93;:::i;:::-;23192:2;23187:3;23183:12;23176:19;;22835:366;;;:::o;23207:::-;23349:3;23370:67;23434:2;23429:3;23370:67;:::i;:::-;23363:74;;23446:93;23535:3;23446:93;:::i;:::-;23564:2;23559:3;23555:12;23548:19;;23207:366;;;:::o;23579:::-;23721:3;23742:67;23806:2;23801:3;23742:67;:::i;:::-;23735:74;;23818:93;23907:3;23818:93;:::i;:::-;23936:2;23931:3;23927:12;23920:19;;23579:366;;;:::o;23951:::-;24093:3;24114:67;24178:2;24173:3;24114:67;:::i;:::-;24107:74;;24190:93;24279:3;24190:93;:::i;:::-;24308:2;24303:3;24299:12;24292:19;;23951:366;;;:::o;24323:108::-;24400:24;24418:5;24400:24;:::i;:::-;24395:3;24388:37;24323:108;;:::o;24437:118::-;24524:24;24542:5;24524:24;:::i;:::-;24519:3;24512:37;24437:118;;:::o;24561:256::-;24673:3;24688:75;24759:3;24750:6;24688:75;:::i;:::-;24788:2;24783:3;24779:12;24772:19;;24808:3;24801:10;;24561:256;;;;:::o;24823:397::-;24963:3;24978:75;25049:3;25040:6;24978:75;:::i;:::-;25078:2;25073:3;25069:12;25062:19;;25091:75;25162:3;25153:6;25091:75;:::i;:::-;25191:2;25186:3;25182:12;25175:19;;25211:3;25204:10;;24823:397;;;;;:::o;25226:589::-;25451:3;25473:95;25564:3;25555:6;25473:95;:::i;:::-;25466:102;;25585:95;25676:3;25667:6;25585:95;:::i;:::-;25578:102;;25697:92;25785:3;25776:6;25697:92;:::i;:::-;25690:99;;25806:3;25799:10;;25226:589;;;;;;:::o;25821:379::-;26005:3;26027:147;26170:3;26027:147;:::i;:::-;26020:154;;26191:3;26184:10;;25821:379;;;:::o;26206:222::-;26299:4;26337:2;26326:9;26322:18;26314:26;;26350:71;26418:1;26407:9;26403:17;26394:6;26350:71;:::i;:::-;26206:222;;;;:::o;26434:640::-;26629:4;26667:3;26656:9;26652:19;26644:27;;26681:71;26749:1;26738:9;26734:17;26725:6;26681:71;:::i;:::-;26762:72;26830:2;26819:9;26815:18;26806:6;26762:72;:::i;:::-;26844;26912:2;26901:9;26897:18;26888:6;26844:72;:::i;:::-;26963:9;26957:4;26953:20;26948:2;26937:9;26933:18;26926:48;26991:76;27062:4;27053:6;26991:76;:::i;:::-;26983:84;;26434:640;;;;;;;:::o;27080:373::-;27223:4;27261:2;27250:9;27246:18;27238:26;;27310:9;27304:4;27300:20;27296:1;27285:9;27281:17;27274:47;27338:108;27441:4;27432:6;27338:108;:::i;:::-;27330:116;;27080:373;;;;:::o;27459:210::-;27546:4;27584:2;27573:9;27569:18;27561:26;;27597:65;27659:1;27648:9;27644:17;27635:6;27597:65;:::i;:::-;27459:210;;;;:::o;27675:222::-;27768:4;27806:2;27795:9;27791:18;27783:26;;27819:71;27887:1;27876:9;27872:17;27863:6;27819:71;:::i;:::-;27675:222;;;;:::o;27903:313::-;28016:4;28054:2;28043:9;28039:18;28031:26;;28103:9;28097:4;28093:20;28089:1;28078:9;28074:17;28067:47;28131:78;28204:4;28195:6;28131:78;:::i;:::-;28123:86;;27903:313;;;;:::o;28222:419::-;28388:4;28426:2;28415:9;28411:18;28403:26;;28475:9;28469:4;28465:20;28461:1;28450:9;28446:17;28439:47;28503:131;28629:4;28503:131;:::i;:::-;28495:139;;28222:419;;;:::o;28647:::-;28813:4;28851:2;28840:9;28836:18;28828:26;;28900:9;28894:4;28890:20;28886:1;28875:9;28871:17;28864:47;28928:131;29054:4;28928:131;:::i;:::-;28920:139;;28647:419;;;:::o;29072:::-;29238:4;29276:2;29265:9;29261:18;29253:26;;29325:9;29319:4;29315:20;29311:1;29300:9;29296:17;29289:47;29353:131;29479:4;29353:131;:::i;:::-;29345:139;;29072:419;;;:::o;29497:::-;29663:4;29701:2;29690:9;29686:18;29678:26;;29750:9;29744:4;29740:20;29736:1;29725:9;29721:17;29714:47;29778:131;29904:4;29778:131;:::i;:::-;29770:139;;29497:419;;;:::o;29922:::-;30088:4;30126:2;30115:9;30111:18;30103:26;;30175:9;30169:4;30165:20;30161:1;30150:9;30146:17;30139:47;30203:131;30329:4;30203:131;:::i;:::-;30195:139;;29922:419;;;:::o;30347:::-;30513:4;30551:2;30540:9;30536:18;30528:26;;30600:9;30594:4;30590:20;30586:1;30575:9;30571:17;30564:47;30628:131;30754:4;30628:131;:::i;:::-;30620:139;;30347:419;;;:::o;30772:::-;30938:4;30976:2;30965:9;30961:18;30953:26;;31025:9;31019:4;31015:20;31011:1;31000:9;30996:17;30989:47;31053:131;31179:4;31053:131;:::i;:::-;31045:139;;30772:419;;;:::o;31197:::-;31363:4;31401:2;31390:9;31386:18;31378:26;;31450:9;31444:4;31440:20;31436:1;31425:9;31421:17;31414:47;31478:131;31604:4;31478:131;:::i;:::-;31470:139;;31197:419;;;:::o;31622:::-;31788:4;31826:2;31815:9;31811:18;31803:26;;31875:9;31869:4;31865:20;31861:1;31850:9;31846:17;31839:47;31903:131;32029:4;31903:131;:::i;:::-;31895:139;;31622:419;;;:::o;32047:::-;32213:4;32251:2;32240:9;32236:18;32228:26;;32300:9;32294:4;32290:20;32286:1;32275:9;32271:17;32264:47;32328:131;32454:4;32328:131;:::i;:::-;32320:139;;32047:419;;;:::o;32472:::-;32638:4;32676:2;32665:9;32661:18;32653:26;;32725:9;32719:4;32715:20;32711:1;32700:9;32696:17;32689:47;32753:131;32879:4;32753:131;:::i;:::-;32745:139;;32472:419;;;:::o;32897:::-;33063:4;33101:2;33090:9;33086:18;33078:26;;33150:9;33144:4;33140:20;33136:1;33125:9;33121:17;33114:47;33178:131;33304:4;33178:131;:::i;:::-;33170:139;;32897:419;;;:::o;33322:::-;33488:4;33526:2;33515:9;33511:18;33503:26;;33575:9;33569:4;33565:20;33561:1;33550:9;33546:17;33539:47;33603:131;33729:4;33603:131;:::i;:::-;33595:139;;33322:419;;;:::o;33747:::-;33913:4;33951:2;33940:9;33936:18;33928:26;;34000:9;33994:4;33990:20;33986:1;33975:9;33971:17;33964:47;34028:131;34154:4;34028:131;:::i;:::-;34020:139;;33747:419;;;:::o;34172:::-;34338:4;34376:2;34365:9;34361:18;34353:26;;34425:9;34419:4;34415:20;34411:1;34400:9;34396:17;34389:47;34453:131;34579:4;34453:131;:::i;:::-;34445:139;;34172:419;;;:::o;34597:::-;34763:4;34801:2;34790:9;34786:18;34778:26;;34850:9;34844:4;34840:20;34836:1;34825:9;34821:17;34814:47;34878:131;35004:4;34878:131;:::i;:::-;34870:139;;34597:419;;;:::o;35022:::-;35188:4;35226:2;35215:9;35211:18;35203:26;;35275:9;35269:4;35265:20;35261:1;35250:9;35246:17;35239:47;35303:131;35429:4;35303:131;:::i;:::-;35295:139;;35022:419;;;:::o;35447:::-;35613:4;35651:2;35640:9;35636:18;35628:26;;35700:9;35694:4;35690:20;35686:1;35675:9;35671:17;35664:47;35728:131;35854:4;35728:131;:::i;:::-;35720:139;;35447:419;;;:::o;35872:::-;36038:4;36076:2;36065:9;36061:18;36053:26;;36125:9;36119:4;36115:20;36111:1;36100:9;36096:17;36089:47;36153:131;36279:4;36153:131;:::i;:::-;36145:139;;35872:419;;;:::o;36297:::-;36463:4;36501:2;36490:9;36486:18;36478:26;;36550:9;36544:4;36540:20;36536:1;36525:9;36521:17;36514:47;36578:131;36704:4;36578:131;:::i;:::-;36570:139;;36297:419;;;:::o;36722:::-;36888:4;36926:2;36915:9;36911:18;36903:26;;36975:9;36969:4;36965:20;36961:1;36950:9;36946:17;36939:47;37003:131;37129:4;37003:131;:::i;:::-;36995:139;;36722:419;;;:::o;37147:::-;37313:4;37351:2;37340:9;37336:18;37328:26;;37400:9;37394:4;37390:20;37386:1;37375:9;37371:17;37364:47;37428:131;37554:4;37428:131;:::i;:::-;37420:139;;37147:419;;;:::o;37572:::-;37738:4;37776:2;37765:9;37761:18;37753:26;;37825:9;37819:4;37815:20;37811:1;37800:9;37796:17;37789:47;37853:131;37979:4;37853:131;:::i;:::-;37845:139;;37572:419;;;:::o;37997:::-;38163:4;38201:2;38190:9;38186:18;38178:26;;38250:9;38244:4;38240:20;38236:1;38225:9;38221:17;38214:47;38278:131;38404:4;38278:131;:::i;:::-;38270:139;;37997:419;;;:::o;38422:::-;38588:4;38626:2;38615:9;38611:18;38603:26;;38675:9;38669:4;38665:20;38661:1;38650:9;38646:17;38639:47;38703:131;38829:4;38703:131;:::i;:::-;38695:139;;38422:419;;;:::o;38847:::-;39013:4;39051:2;39040:9;39036:18;39028:26;;39100:9;39094:4;39090:20;39086:1;39075:9;39071:17;39064:47;39128:131;39254:4;39128:131;:::i;:::-;39120:139;;38847:419;;;:::o;39272:::-;39438:4;39476:2;39465:9;39461:18;39453:26;;39525:9;39519:4;39515:20;39511:1;39500:9;39496:17;39489:47;39553:131;39679:4;39553:131;:::i;:::-;39545:139;;39272:419;;;:::o;39697:::-;39863:4;39901:2;39890:9;39886:18;39878:26;;39950:9;39944:4;39940:20;39936:1;39925:9;39921:17;39914:47;39978:131;40104:4;39978:131;:::i;:::-;39970:139;;39697:419;;;:::o;40122:::-;40288:4;40326:2;40315:9;40311:18;40303:26;;40375:9;40369:4;40365:20;40361:1;40350:9;40346:17;40339:47;40403:131;40529:4;40403:131;:::i;:::-;40395:139;;40122:419;;;:::o;40547:::-;40713:4;40751:2;40740:9;40736:18;40728:26;;40800:9;40794:4;40790:20;40786:1;40775:9;40771:17;40764:47;40828:131;40954:4;40828:131;:::i;:::-;40820:139;;40547:419;;;:::o;40972:222::-;41065:4;41103:2;41092:9;41088:18;41080:26;;41116:71;41184:1;41173:9;41169:17;41160:6;41116:71;:::i;:::-;40972:222;;;;:::o;41200:129::-;41234:6;41261:20;;:::i;:::-;41251:30;;41290:33;41318:4;41310:6;41290:33;:::i;:::-;41200:129;;;:::o;41335:75::-;41368:6;41401:2;41395:9;41385:19;;41335:75;:::o;41416:307::-;41477:4;41567:18;41559:6;41556:30;41553:56;;;41589:18;;:::i;:::-;41553:56;41627:29;41649:6;41627:29;:::i;:::-;41619:37;;41711:4;41705;41701:15;41693:23;;41416:307;;;:::o;41729:308::-;41791:4;41881:18;41873:6;41870:30;41867:56;;;41903:18;;:::i;:::-;41867:56;41941:29;41963:6;41941:29;:::i;:::-;41933:37;;42025:4;42019;42015:15;42007:23;;41729:308;;;:::o;42043:132::-;42110:4;42133:3;42125:11;;42163:4;42158:3;42154:14;42146:22;;42043:132;;;:::o;42181:141::-;42230:4;42253:3;42245:11;;42276:3;42273:1;42266:14;42310:4;42307:1;42297:18;42289:26;;42181:141;;;:::o;42328:114::-;42395:6;42429:5;42423:12;42413:22;;42328:114;;;:::o;42448:98::-;42499:6;42533:5;42527:12;42517:22;;42448:98;;;:::o;42552:99::-;42604:6;42638:5;42632:12;42622:22;;42552:99;;;:::o;42657:113::-;42727:4;42759;42754:3;42750:14;42742:22;;42657:113;;;:::o;42776:184::-;42875:11;42909:6;42904:3;42897:19;42949:4;42944:3;42940:14;42925:29;;42776:184;;;;:::o;42966:168::-;43049:11;43083:6;43078:3;43071:19;43123:4;43118:3;43114:14;43099:29;;42966:168;;;;:::o;43140:147::-;43241:11;43278:3;43263:18;;43140:147;;;;:::o;43293:169::-;43377:11;43411:6;43406:3;43399:19;43451:4;43446:3;43442:14;43427:29;;43293:169;;;;:::o;43468:148::-;43570:11;43607:3;43592:18;;43468:148;;;;:::o;43622:305::-;43662:3;43681:20;43699:1;43681:20;:::i;:::-;43676:25;;43715:20;43733:1;43715:20;:::i;:::-;43710:25;;43869:1;43801:66;43797:74;43794:1;43791:81;43788:107;;;43875:18;;:::i;:::-;43788:107;43919:1;43916;43912:9;43905:16;;43622:305;;;;:::o;43933:185::-;43973:1;43990:20;44008:1;43990:20;:::i;:::-;43985:25;;44024:20;44042:1;44024:20;:::i;:::-;44019:25;;44063:1;44053:35;;44068:18;;:::i;:::-;44053:35;44110:1;44107;44103:9;44098:14;;43933:185;;;;:::o;44124:191::-;44164:4;44184:20;44202:1;44184:20;:::i;:::-;44179:25;;44218:20;44236:1;44218:20;:::i;:::-;44213:25;;44257:1;44254;44251:8;44248:34;;;44262:18;;:::i;:::-;44248:34;44307:1;44304;44300:9;44292:17;;44124:191;;;;:::o;44321:96::-;44358:7;44387:24;44405:5;44387:24;:::i;:::-;44376:35;;44321:96;;;:::o;44423:90::-;44457:7;44500:5;44493:13;44486:21;44475:32;;44423:90;;;:::o;44519:77::-;44556:7;44585:5;44574:16;;44519:77;;;:::o;44602:149::-;44638:7;44678:66;44671:5;44667:78;44656:89;;44602:149;;;:::o;44757:126::-;44794:7;44834:42;44827:5;44823:54;44812:65;;44757:126;;;:::o;44889:77::-;44926:7;44955:5;44944:16;;44889:77;;;:::o;44972:154::-;45056:6;45051:3;45046;45033:30;45118:1;45109:6;45104:3;45100:16;45093:27;44972:154;;;:::o;45132:307::-;45200:1;45210:113;45224:6;45221:1;45218:13;45210:113;;;45309:1;45304:3;45300:11;45294:18;45290:1;45285:3;45281:11;45274:39;45246:2;45243:1;45239:10;45234:15;;45210:113;;;45341:6;45338:1;45335:13;45332:101;;;45421:1;45412:6;45407:3;45403:16;45396:27;45332:101;45181:258;45132:307;;;:::o;45445:320::-;45489:6;45526:1;45520:4;45516:12;45506:22;;45573:1;45567:4;45563:12;45594:18;45584:81;;45650:4;45642:6;45638:17;45628:27;;45584:81;45712:2;45704:6;45701:14;45681:18;45678:38;45675:84;;;45731:18;;:::i;:::-;45675:84;45496:269;45445:320;;;:::o;45771:281::-;45854:27;45876:4;45854:27;:::i;:::-;45846:6;45842:40;45984:6;45972:10;45969:22;45948:18;45936:10;45933:34;45930:62;45927:88;;;45995:18;;:::i;:::-;45927:88;46035:10;46031:2;46024:22;45814:238;45771:281;;:::o;46058:233::-;46097:3;46120:24;46138:5;46120:24;:::i;:::-;46111:33;;46166:66;46159:5;46156:77;46153:103;;;46236:18;;:::i;:::-;46153:103;46283:1;46276:5;46272:13;46265:20;;46058:233;;;:::o;46297:100::-;46336:7;46365:26;46385:5;46365:26;:::i;:::-;46354:37;;46297:100;;;:::o;46403:79::-;46442:7;46471:5;46460:16;;46403:79;;;:::o;46488:94::-;46527:7;46556:20;46570:5;46556:20;:::i;:::-;46545:31;;46488:94;;;:::o;46588:176::-;46620:1;46637:20;46655:1;46637:20;:::i;:::-;46632:25;;46671:20;46689:1;46671:20;:::i;:::-;46666:25;;46710:1;46700:35;;46715:18;;:::i;:::-;46700:35;46756:1;46753;46749:9;46744:14;;46588:176;;;;:::o;46770:180::-;46818:77;46815:1;46808:88;46915:4;46912:1;46905:15;46939:4;46936:1;46929:15;46956:180;47004:77;47001:1;46994:88;47101:4;47098:1;47091:15;47125:4;47122:1;47115:15;47142:180;47190:77;47187:1;47180:88;47287:4;47284:1;47277:15;47311:4;47308:1;47301:15;47328:180;47376:77;47373:1;47366:88;47473:4;47470:1;47463:15;47497:4;47494:1;47487:15;47514:180;47562:77;47559:1;47552:88;47659:4;47656:1;47649:15;47683:4;47680:1;47673:15;47700:180;47748:77;47745:1;47738:88;47845:4;47842:1;47835:15;47869:4;47866:1;47859:15;47886:117;47995:1;47992;47985:12;48009:117;48118:1;48115;48108:12;48132:117;48241:1;48238;48231:12;48255:117;48364:1;48361;48354:12;48378:117;48487:1;48484;48477:12;48501:117;48610:1;48607;48600:12;48624:102;48665:6;48716:2;48712:7;48707:2;48700:5;48696:14;48692:28;48682:38;;48624:102;;;:::o;48732:94::-;48765:8;48813:5;48809:2;48805:14;48784:35;;48732:94;;;:::o;48832:167::-;48972:19;48968:1;48960:6;48956:14;48949:43;48832:167;:::o;49005:230::-;49145:34;49141:1;49133:6;49129:14;49122:58;49214:13;49209:2;49201:6;49197:15;49190:38;49005:230;:::o;49241:237::-;49381:34;49377:1;49369:6;49365:14;49358:58;49450:20;49445:2;49437:6;49433:15;49426:45;49241:237;:::o;49484:225::-;49624:34;49620:1;49612:6;49608:14;49601:58;49693:8;49688:2;49680:6;49676:15;49669:33;49484:225;:::o;49715:178::-;49855:30;49851:1;49843:6;49839:14;49832:54;49715:178;:::o;49899:174::-;50039:26;50035:1;50027:6;50023:14;50016:50;49899:174;:::o;50079:223::-;50219:34;50215:1;50207:6;50203:14;50196:58;50288:6;50283:2;50275:6;50271:15;50264:31;50079:223;:::o;50308:175::-;50448:27;50444:1;50436:6;50432:14;50425:51;50308:175;:::o;50489:161::-;50629:13;50625:1;50617:6;50613:14;50606:37;50489:161;:::o;50656:231::-;50796:34;50792:1;50784:6;50780:14;50773:58;50865:14;50860:2;50852:6;50848:15;50841:39;50656:231;:::o;50893:243::-;51033:34;51029:1;51021:6;51017:14;51010:58;51102:26;51097:2;51089:6;51085:15;51078:51;50893:243;:::o;51142:229::-;51282:34;51278:1;51270:6;51266:14;51259:58;51351:12;51346:2;51338:6;51334:15;51327:37;51142:229;:::o;51377:228::-;51517:34;51513:1;51505:6;51501:14;51494:58;51586:11;51581:2;51573:6;51569:15;51562:36;51377:228;:::o;51611:223::-;51751:34;51747:1;51739:6;51735:14;51728:58;51820:6;51815:2;51807:6;51803:15;51796:31;51611:223;:::o;51840:182::-;51980:34;51976:1;51968:6;51964:14;51957:58;51840:182;:::o;52028:175::-;52168:27;52164:1;52156:6;52152:14;52145:51;52028:175;:::o;52209:231::-;52349:34;52345:1;52337:6;52333:14;52326:58;52418:14;52413:2;52405:6;52401:15;52394:39;52209:231;:::o;52446:182::-;52586:34;52582:1;52574:6;52570:14;52563:58;52446:182;:::o;52634:228::-;52774:34;52770:1;52762:6;52758:14;52751:58;52843:11;52838:2;52830:6;52826:15;52819:36;52634:228;:::o;52868:234::-;53008:34;53004:1;52996:6;52992:14;52985:58;53077:17;53072:2;53064:6;53060:15;53053:42;52868:234;:::o;53108:172::-;53248:24;53244:1;53236:6;53232:14;53225:48;53108:172;:::o;53286:220::-;53426:34;53422:1;53414:6;53410:14;53403:58;53495:3;53490:2;53482:6;53478:15;53471:28;53286:220;:::o;53512:114::-;;:::o;53632:166::-;53772:18;53768:1;53760:6;53756:14;53749:42;53632:166;:::o;53804:236::-;53944:34;53940:1;53932:6;53928:14;53921:58;54013:19;54008:2;54000:6;53996:15;53989:44;53804:236;:::o;54046:231::-;54186:34;54182:1;54174:6;54170:14;54163:58;54255:14;54250:2;54242:6;54238:15;54231:39;54046:231;:::o;54283:167::-;54423:19;54419:1;54411:6;54407:14;54400:43;54283:167;:::o;54456:171::-;54596:23;54592:1;54584:6;54580:14;54573:47;54456:171;:::o;54633:::-;54773:23;54769:1;54761:6;54757:14;54750:47;54633:171;:::o;54810:166::-;54950:18;54946:1;54938:6;54934:14;54927:42;54810:166;:::o;54982:174::-;55122:26;55118:1;55110:6;55106:14;55099:50;54982:174;:::o;55162:122::-;55235:24;55253:5;55235:24;:::i;:::-;55228:5;55225:35;55215:63;;55274:1;55271;55264:12;55215:63;55162:122;:::o;55290:116::-;55360:21;55375:5;55360:21;:::i;:::-;55353:5;55350:32;55340:60;;55396:1;55393;55386:12;55340:60;55290:116;:::o;55412:122::-;55485:24;55503:5;55485:24;:::i;:::-;55478:5;55475:35;55465:63;;55524:1;55521;55514:12;55465:63;55412:122;:::o;55540:120::-;55612:23;55629:5;55612:23;:::i;:::-;55605:5;55602:34;55592:62;;55650:1;55647;55640:12;55592:62;55540:120;:::o;55666:122::-;55739:24;55757:5;55739:24;:::i;:::-;55732:5;55729:35;55719:63;;55778:1;55775;55768:12;55719:63;55666:122;:::o

Swarm Source

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