ETH Price: $3,357.79 (-2.26%)

Token

CoolmansUniverse (COOLMAN)
 

Overview

Max Total Supply

10,000 COOLMAN

Holders

4,893

Market

Volume (24H)

0.1382 ETH

Min Price (24H)

$36.60 @ 0.010900 ETH

Max Price (24H)

$93.34 @ 0.027799 ETH
Balance
4 COOLMAN
0x70F2e552027BBB5eac42646b0D052eac0B51aCAf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A project by Coolman Coffeedan. 10,000 Speshies vibin’ as NFTs surfing through the Universe.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CoolmansUniverse

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-21
*/

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //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 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 {}
}

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

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

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
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();
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
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;
        }
    }
}

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

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

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

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

contract CoolmansUniverse is ERC721, ERC721Enumerable, Ownable {
    using SafeMath for uint256;

    uint256 public constant MAX_ALLOW_LIST_MINT = 2;
    uint256 public constant MAX_PUBLIC_MINT = 10;
    uint256 public constant TOKEN_LIMIT = 10000;
    uint256 public constant TOKEN_PRICE = 0.095 ether;

    string public PROVENANCE;

    bool public saleActive = false;
    bool public allowListSaleActive = false;

    string private _baseURIextended;
    bytes32 private _allowListRoot;

    mapping(address => uint256) private _allowListClaimed;

    constructor() ERC721("CoolmansUniverse", "COOLMAN") {}

    function mint(uint256 numTokens) external payable {
        require(Address.isContract(msg.sender) == false, "Cannot mint from a contract");

        uint256 ts = totalSupply();
        require(saleActive, "The sale is not active");
        require(numTokens <= MAX_PUBLIC_MINT, "Invalid number of tokens");
        require(ts.add(numTokens) <= TOKEN_LIMIT, "Purchase would exceed max tokens");
        require(msg.value >= TOKEN_PRICE.mul(numTokens), "Ether value sent is below the required price");

        for (uint256 i = 0; i < numTokens; i++) {
            _safeMint(msg.sender, ts.add(i));
        }
    }

    function mintAllowList(uint256 numTokens, bytes32[] calldata proof) external payable {
        require(Address.isContract(msg.sender) == false, "Cannot mint from a contract");

        uint256 ts = totalSupply();
        require(_verify(_leaf(msg.sender), proof), "Address is not on allowlist");
        require(allowListSaleActive, "The pre-sale is not active");
        require(_allowListClaimed[msg.sender].add(numTokens) <= MAX_ALLOW_LIST_MINT, "Purchase would exceed max pre-sale tokens");
        require(ts.add(numTokens) <= TOKEN_LIMIT, "Purchase would exceed max tokens");
        require(msg.value >= TOKEN_PRICE.mul(numTokens), "Ether value sent is below the required price");

        _allowListClaimed[msg.sender] = _allowListClaimed[msg.sender].add(numTokens);
        for (uint256 i = 0; i < numTokens; i++) {
            _safeMint(msg.sender, ts.add(i));
        }
    }

    function numAvailableToMintDuringPreSale(bytes32[] calldata proof) external view returns (uint256) {
        if (_verify(_leaf(msg.sender), proof)) {
            return MAX_ALLOW_LIST_MINT - _allowListClaimed[msg.sender];
        }
        return 0;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    // OWNER ONLY

    function reserve(uint256 numTokens, address addr) public onlyOwner {
        uint256 ts = totalSupply();
        for (uint256 i = 0; i < numTokens; i++) {
            _safeMint(addr, ts.add(i));
        }
    }

    function setBaseURI(string memory baseURI_) public onlyOwner {
        _baseURIextended = baseURI_;
    }

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

    function setSaleActive(bool _saleActive) public onlyOwner {
        saleActive = _saleActive;
    }

    function setAllowListSaleActive(bool _allowListSaleActive) public onlyOwner {
        allowListSaleActive = _allowListSaleActive;
    }

    function setAllowListRoot(bytes32 _root) public onlyOwner {
        _allowListRoot = _root;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(msg.sender), balance);
    }

    // INTERNAL

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

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"MAX_ALLOW_LIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"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":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"numAvailableToMintDuringPreSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setAllowListRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allowListSaleActive","type":"bool"}],"name":"setAllowListSaleActive","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleActive","type":"bool"}],"name":"setSaleActive","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":[],"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":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280601081526020017f436f6f6c6d616e73556e697665727365000000000000000000000000000000008152506040518060400160405280600781526020017f434f4f4c4d414e000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620001dc565b508060019080519060200190620000e5929190620001dc565b50505062000108620000fc6200010e60201b60201c565b6200011660201b60201c565b620002f1565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001ea90620002bb565b90600052602060002090601f0160209004810192826200020e57600085556200025a565b82601f106200022957805160ff19168380011785556200025a565b828001600101855582156200025a579182015b82811115620002595782518255916020019190600101906200023c565b5b5090506200026991906200026d565b5090565b5b80821115620002885760008160009055506001016200026e565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002d457607f821691505b60208210811415620002eb57620002ea6200028c565b5b50919050565b614e1880620003016000396000f3fe60806040526004361061020f5760003560e01c8063693d77d211610118578063b88d4fde116100a0578063d86a5a1a1161006f578063d86a5a1a1461077c578063e985e9c5146107b9578063f2fde38b146107f6578063fa05a6571461081f578063ffe630b51461083b5761020f565b8063b88d4fde146106c2578063bdeb7a85146106eb578063c87b56dd14610714578063d2d8cb67146107515761020f565b8063841718a6116100e7578063841718a6146105fe5780638da5cb5b1461062757806395d89b4114610652578063a0712d681461067d578063a22cb465146106995761020f565b8063693d77d21461055657806370a082311461057f578063715018a6146105bc57806381c13a18146105d35761020f565b80632f745c591161019b57806355f804b31161016a57806355f804b31461046f5780636352211e146104985780636373a6b1146104d557806365f130971461050057806368428a1b1461052b5761020f565b80632f745c59146103b55780633ccfd60b146103f257806342842e0e146104095780634f6ccce7146104325761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d57806318160ddd1461033657806323b872dd146103615780632e8ba1f21461038a5761020f565b806301ffc9a714610214578063031bd4c41461025157806303339bcb1461027c57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613289565b610864565b60405161024891906132d1565b60405180910390f35b34801561025d57600080fd5b50610266610876565b6040516102739190613305565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906133aa565b61087c565b005b3480156102b157600080fd5b506102ba610944565b6040516102c79190613483565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906134a5565b6109d6565b60405161030491906134e1565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f91906134fc565b610a5b565b005b34801561034257600080fd5b5061034b610b73565b6040516103589190613305565b60405180910390f35b34801561036d57600080fd5b506103886004803603810190610383919061353c565b610b80565b005b34801561039657600080fd5b5061039f610be0565b6040516103ac9190613305565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906134fc565b610be5565b6040516103e99190613305565b60405180910390f35b3480156103fe57600080fd5b50610407610c8a565b005b34801561041557600080fd5b50610430600480360381019061042b919061353c565b610d18565b005b34801561043e57600080fd5b50610459600480360381019061045491906134a5565b610d38565b6040516104669190613305565b60405180910390f35b34801561047b57600080fd5b50610496600480360381019061049191906136c4565b610da9565b005b3480156104a457600080fd5b506104bf60048036038101906104ba91906134a5565b610e3f565b6040516104cc91906134e1565b60405180910390f35b3480156104e157600080fd5b506104ea610ef1565b6040516104f79190613483565b60405180910390f35b34801561050c57600080fd5b50610515610f7f565b6040516105229190613305565b60405180910390f35b34801561053757600080fd5b50610540610f84565b60405161054d91906132d1565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613739565b610f97565b005b34801561058b57600080fd5b506105a660048036038101906105a19190613766565b611030565b6040516105b39190613305565b60405180910390f35b3480156105c857600080fd5b506105d16110e8565b005b3480156105df57600080fd5b506105e8611170565b6040516105f591906132d1565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613739565b611183565b005b34801561063357600080fd5b5061063c61121c565b60405161064991906134e1565b60405180910390f35b34801561065e57600080fd5b50610667611246565b6040516106749190613483565b60405180910390f35b610697600480360381019061069291906134a5565b6112d8565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613793565b6114b9565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613874565b61163a565b005b3480156106f757600080fd5b50610712600480360381019061070d919061392d565b61169c565b005b34801561072057600080fd5b5061073b600480360381019061073691906134a5565b611722565b6040516107489190613483565b60405180910390f35b34801561075d57600080fd5b506107666117c9565b6040516107739190613305565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e91906139ba565b6117d5565b6040516107b09190613305565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190613a07565b61188d565b6040516107ed91906132d1565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613766565b611921565b005b61083960048036038101906108349190613a47565b611a19565b005b34801561084757600080fd5b50610862600480360381019061085d91906136c4565b611d74565b005b600061086f82611e0a565b9050919050565b61271081565b610884611e84565b73ffffffffffffffffffffffffffffffffffffffff166108a261121c565b73ffffffffffffffffffffffffffffffffffffffff16146108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef90613af3565b60405180910390fd5b6000610902610b73565b905060005b8381101561093e5761092b836109268385611e8c90919063ffffffff16565b611ea2565b808061093690613b42565b915050610907565b50505050565b60606000805461095390613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461097f90613bba565b80156109cc5780601f106109a1576101008083540402835291602001916109cc565b820191906000526020600020905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b60006109e182611ec0565b610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790613c5e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6682610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace90613cf0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af6611e84565b73ffffffffffffffffffffffffffffffffffffffff161480610b255750610b2481610b1f611e84565b61188d565b5b610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90613d82565b60405180910390fd5b610b6e8383611f2c565b505050565b6000600880549050905090565b610b91610b8b611e84565b82611fe5565b610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790613e14565b60405180910390fd5b610bdb8383836120c3565b505050565b600281565b6000610bf083611030565b8210610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2890613ea6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c92611e84565b73ffffffffffffffffffffffffffffffffffffffff16610cb061121c565b73ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90613af3565b60405180910390fd5b6000479050610d15338261231f565b50565b610d338383836040518060200160405280600081525061163a565b505050565b6000610d42610b73565b8210610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90613f38565b60405180910390fd5b60088281548110610d9757610d96613f58565b5b90600052602060002001549050919050565b610db1611e84565b73ffffffffffffffffffffffffffffffffffffffff16610dcf61121c565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90613af3565b60405180910390fd5b80600d9080519060200190610e3b92919061317a565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613ff9565b60405180910390fd5b80915050919050565b600b8054610efe90613bba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2a90613bba565b8015610f775780601f10610f4c57610100808354040283529160200191610f77565b820191906000526020600020905b815481529060010190602001808311610f5a57829003601f168201915b505050505081565b600a81565b600c60009054906101000a900460ff1681565b610f9f611e84565b73ffffffffffffffffffffffffffffffffffffffff16610fbd61121c565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613af3565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110989061408b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110f0611e84565b73ffffffffffffffffffffffffffffffffffffffff1661110e61121c565b73ffffffffffffffffffffffffffffffffffffffff1614611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613af3565b60405180910390fd5b61116e6000612413565b565b600c60019054906101000a900460ff1681565b61118b611e84565b73ffffffffffffffffffffffffffffffffffffffff166111a961121c565b73ffffffffffffffffffffffffffffffffffffffff16146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613af3565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461125590613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461128190613bba565b80156112ce5780601f106112a3576101008083540402835291602001916112ce565b820191906000526020600020905b8154815290600101906020018083116112b157829003601f168201915b5050505050905090565b600015156112e5336124d9565b151514611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906140f7565b60405180910390fd5b6000611331610b73565b9050600c60009054906101000a900460ff16611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990614163565b60405180910390fd5b600a8211156113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd906141cf565b60405180910390fd5b6127106113dc8383611e8c90919063ffffffff16565b111561141d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114149061423b565b60405180910390fd5b6114388267015181ff25a980006124ec90919063ffffffff16565b34101561147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906142cd565b60405180910390fd5b60005b828110156114b4576114a13361149c8385611e8c90919063ffffffff16565b611ea2565b80806114ac90613b42565b91505061147d565b505050565b6114c1611e84565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561152f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152690614339565b60405180910390fd5b806005600061153c611e84565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115e9611e84565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161162e91906132d1565b60405180910390a35050565b61164b611645611e84565b83611fe5565b61168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190613e14565b60405180910390fd5b61169684848484612502565b50505050565b6116a4611e84565b73ffffffffffffffffffffffffffffffffffffffff166116c261121c565b73ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90613af3565b60405180910390fd5b80600e8190555050565b606061172d82611ec0565b61176c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611763906143cb565b60405180910390fd5b600061177661255e565b9050600081511161179657604051806020016040528060008152506117c1565b806117a0846125f0565b6040516020016117b1929190614427565b6040516020818303038152906040525b915050919050565b67015181ff25a9800081565b600061182a6117e333612751565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612781565b1561188257600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600261187b919061444b565b9050611887565b600090505b92915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611929611e84565b73ffffffffffffffffffffffffffffffffffffffff1661194761121c565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613af3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a04906144f1565b60405180910390fd5b611a1681612413565b50565b60001515611a26336124d9565b151514611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f906140f7565b60405180910390fd5b6000611a72610b73565b9050611ac7611a8033612751565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612781565b611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd9061455d565b60405180910390fd5b600c60019054906101000a900460ff16611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c906145c9565b60405180910390fd5b6002611ba985600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8c90919063ffffffff16565b1115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be19061465b565b60405180910390fd5b612710611c008583611e8c90919063ffffffff16565b1115611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c389061423b565b60405180910390fd5b611c5c8467015181ff25a980006124ec90919063ffffffff16565b341015611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c95906142cd565b60405180910390fd5b611cf084600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8c90919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b84811015611d6d57611d5a33611d558385611e8c90919063ffffffff16565b611ea2565b8080611d6590613b42565b915050611d36565b5050505050565b611d7c611e84565b73ffffffffffffffffffffffffffffffffffffffff16611d9a61121c565b73ffffffffffffffffffffffffffffffffffffffff1614611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de790613af3565b60405180910390fd5b80600b9080519060200190611e0692919061317a565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e7d5750611e7c82612798565b5b9050919050565b600033905090565b60008183611e9a919061467b565b905092915050565b611ebc82826040518060200160405280600081525061287a565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f9f83610e3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ff082611ec0565b61202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690614743565b60405180910390fd5b600061203a83610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120a957508373ffffffffffffffffffffffffffffffffffffffff16612091846109d6565b73ffffffffffffffffffffffffffffffffffffffff16145b806120ba57506120b9818561188d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120e382610e3f565b73ffffffffffffffffffffffffffffffffffffffff1614612139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612130906147d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614867565b60405180910390fd5b6121b48383836128d5565b6121bf600082611f2c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220f919061444b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612266919061467b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612359906148d3565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161238890614924565b60006040518083038185875af1925050503d80600081146123c5576040519150601f19603f3d011682016040523d82523d6000602084013e6123ca565b606091505b505090508061240e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612405906149ab565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b600081836124fa91906149cb565b905092915050565b61250d8484846120c3565b612519848484846128e5565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90614a97565b60405180910390fd5b50505050565b6060600d805461256d90613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461259990613bba565b80156125e65780601f106125bb576101008083540402835291602001916125e6565b820191906000526020600020905b8154815290600101906020018083116125c957829003601f168201915b5050505050905090565b60606000821415612638576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061274c565b600082905060005b6000821461266a57808061265390613b42565b915050600a826126639190614ae6565b9150612640565b60008167ffffffffffffffff81111561268657612685613599565b5b6040519080825280601f01601f1916602001820160405280156126b85781602001600182028036833780820191505090505b5090505b60008514612745576001826126d1919061444b565b9150600a856126e09190614b17565b60306126ec919061467b565b60f81b81838151811061270257612701613f58565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561273e9190614ae6565b94506126bc565b8093505050505b919050565b6000816040516020016127649190614b90565b604051602081830303815290604052805190602001209050919050565b600061279082600e5485612a6d565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061286357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612873575061287282612b23565b5b9050919050565b6128848383612b8d565b61289160008484846128e5565b6128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c790614a97565b60405180910390fd5b505050565b6128e0838383612d5b565b505050565b60006129068473ffffffffffffffffffffffffffffffffffffffff166124d9565b15612a60578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292f611e84565b8786866040518563ffffffff1660e01b81526004016129519493929190614c00565b6020604051808303816000875af192505050801561298d57506040513d601f19601f8201168201806040525081019061298a9190614c61565b60015b612a10573d80600081146129bd576040519150601f19603f3d011682016040523d82523d6000602084013e6129c2565b606091505b50600081511415612a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ff90614a97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a65565b600190505b949350505050565b60008082905060005b8551811015612b15576000868281518110612a9457612a93613f58565b5b60200260200101519050808311612ad5578281604051602001612ab8929190614caf565b604051602081830303815290604052805190602001209250612b01565b8083604051602001612ae8929190614caf565b6040516020818303038152906040528051906020012092505b508080612b0d90613b42565b915050612a76565b508381149150509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf490614d27565b60405180910390fd5b612c0681611ec0565b15612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d90614d93565b60405180910390fd5b612c52600083836128d5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca2919061467b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612d66838383612e6f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da957612da481612e74565b612de8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de757612de68382612ebd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2b57612e268161302a565b612e6a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6957612e6882826130fb565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612eca84611030565b612ed4919061444b565b9050600060076000848152602001908152602001600020549050818114612fb9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061303e919061444b565b905060006009600084815260200190815260200160002054905060006008838154811061306e5761306d613f58565b5b9060005260206000200154905080600883815481106130905761308f613f58565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130df576130de614db3565b5b6001900381819060005260206000200160009055905550505050565b600061310683611030565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461318690613bba565b90600052602060002090601f0160209004810192826131a857600085556131ef565b82601f106131c157805160ff19168380011785556131ef565b828001600101855582156131ef579182015b828111156131ee5782518255916020019190600101906131d3565b5b5090506131fc9190613200565b5090565b5b80821115613219576000816000905550600101613201565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61326681613231565b811461327157600080fd5b50565b6000813590506132838161325d565b92915050565b60006020828403121561329f5761329e613227565b5b60006132ad84828501613274565b91505092915050565b60008115159050919050565b6132cb816132b6565b82525050565b60006020820190506132e660008301846132c2565b92915050565b6000819050919050565b6132ff816132ec565b82525050565b600060208201905061331a60008301846132f6565b92915050565b613329816132ec565b811461333457600080fd5b50565b60008135905061334681613320565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133778261334c565b9050919050565b6133878161336c565b811461339257600080fd5b50565b6000813590506133a48161337e565b92915050565b600080604083850312156133c1576133c0613227565b5b60006133cf85828601613337565b92505060206133e085828601613395565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613424578082015181840152602081019050613409565b83811115613433576000848401525b50505050565b6000601f19601f8301169050919050565b6000613455826133ea565b61345f81856133f5565b935061346f818560208601613406565b61347881613439565b840191505092915050565b6000602082019050818103600083015261349d818461344a565b905092915050565b6000602082840312156134bb576134ba613227565b5b60006134c984828501613337565b91505092915050565b6134db8161336c565b82525050565b60006020820190506134f660008301846134d2565b92915050565b6000806040838503121561351357613512613227565b5b600061352185828601613395565b925050602061353285828601613337565b9150509250929050565b60008060006060848603121561355557613554613227565b5b600061356386828701613395565b935050602061357486828701613395565b925050604061358586828701613337565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135d182613439565b810181811067ffffffffffffffff821117156135f0576135ef613599565b5b80604052505050565b600061360361321d565b905061360f82826135c8565b919050565b600067ffffffffffffffff82111561362f5761362e613599565b5b61363882613439565b9050602081019050919050565b82818337600083830152505050565b600061366761366284613614565b6135f9565b90508281526020810184848401111561368357613682613594565b5b61368e848285613645565b509392505050565b600082601f8301126136ab576136aa61358f565b5b81356136bb848260208601613654565b91505092915050565b6000602082840312156136da576136d9613227565b5b600082013567ffffffffffffffff8111156136f8576136f761322c565b5b61370484828501613696565b91505092915050565b613716816132b6565b811461372157600080fd5b50565b6000813590506137338161370d565b92915050565b60006020828403121561374f5761374e613227565b5b600061375d84828501613724565b91505092915050565b60006020828403121561377c5761377b613227565b5b600061378a84828501613395565b91505092915050565b600080604083850312156137aa576137a9613227565b5b60006137b885828601613395565b92505060206137c985828601613724565b9150509250929050565b600067ffffffffffffffff8211156137ee576137ed613599565b5b6137f782613439565b9050602081019050919050565b6000613817613812846137d3565b6135f9565b90508281526020810184848401111561383357613832613594565b5b61383e848285613645565b509392505050565b600082601f83011261385b5761385a61358f565b5b813561386b848260208601613804565b91505092915050565b6000806000806080858703121561388e5761388d613227565b5b600061389c87828801613395565b94505060206138ad87828801613395565b93505060406138be87828801613337565b925050606085013567ffffffffffffffff8111156138df576138de61322c565b5b6138eb87828801613846565b91505092959194509250565b6000819050919050565b61390a816138f7565b811461391557600080fd5b50565b60008135905061392781613901565b92915050565b60006020828403121561394357613942613227565b5b600061395184828501613918565b91505092915050565b600080fd5b600080fd5b60008083601f84011261397a5761397961358f565b5b8235905067ffffffffffffffff8111156139975761399661395a565b5b6020830191508360208202830111156139b3576139b261395f565b5b9250929050565b600080602083850312156139d1576139d0613227565b5b600083013567ffffffffffffffff8111156139ef576139ee61322c565b5b6139fb85828601613964565b92509250509250929050565b60008060408385031215613a1e57613a1d613227565b5b6000613a2c85828601613395565b9250506020613a3d85828601613395565b9150509250929050565b600080600060408486031215613a6057613a5f613227565b5b6000613a6e86828701613337565b935050602084013567ffffffffffffffff811115613a8f57613a8e61322c565b5b613a9b86828701613964565b92509250509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613add6020836133f5565b9150613ae882613aa7565b602082019050919050565b60006020820190508181036000830152613b0c81613ad0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b4d826132ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8057613b7f613b13565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bd257607f821691505b60208210811415613be657613be5613b8b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c48602c836133f5565b9150613c5382613bec565b604082019050919050565b60006020820190508181036000830152613c7781613c3b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cda6021836133f5565b9150613ce582613c7e565b604082019050919050565b60006020820190508181036000830152613d0981613ccd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d6c6038836133f5565b9150613d7782613d10565b604082019050919050565b60006020820190508181036000830152613d9b81613d5f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613dfe6031836133f5565b9150613e0982613da2565b604082019050919050565b60006020820190508181036000830152613e2d81613df1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e90602b836133f5565b9150613e9b82613e34565b604082019050919050565b60006020820190508181036000830152613ebf81613e83565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f22602c836133f5565b9150613f2d82613ec6565b604082019050919050565b60006020820190508181036000830152613f5181613f15565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fe36029836133f5565b9150613fee82613f87565b604082019050919050565b6000602082019050818103600083015261401281613fd6565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614075602a836133f5565b915061408082614019565b604082019050919050565b600060208201905081810360008301526140a481614068565b9050919050565b7f43616e6e6f74206d696e742066726f6d206120636f6e74726163740000000000600082015250565b60006140e1601b836133f5565b91506140ec826140ab565b602082019050919050565b60006020820190508181036000830152614110816140d4565b9050919050565b7f5468652073616c65206973206e6f742061637469766500000000000000000000600082015250565b600061414d6016836133f5565b915061415882614117565b602082019050919050565b6000602082019050818103600083015261417c81614140565b9050919050565b7f496e76616c6964206e756d626572206f6620746f6b656e730000000000000000600082015250565b60006141b96018836133f5565b91506141c482614183565b602082019050919050565b600060208201905081810360008301526141e8816141ac565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006142256020836133f5565b9150614230826141ef565b602082019050919050565b6000602082019050818103600083015261425481614218565b9050919050565b7f45746865722076616c75652073656e742069732062656c6f772074686520726560008201527f7175697265642070726963650000000000000000000000000000000000000000602082015250565b60006142b7602c836133f5565b91506142c28261425b565b604082019050919050565b600060208201905081810360008301526142e6816142aa565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143236019836133f5565b915061432e826142ed565b602082019050919050565b6000602082019050818103600083015261435281614316565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143b5602f836133f5565b91506143c082614359565b604082019050919050565b600060208201905081810360008301526143e4816143a8565b9050919050565b600081905092915050565b6000614401826133ea565b61440b81856143eb565b935061441b818560208601613406565b80840191505092915050565b600061443382856143f6565b915061443f82846143f6565b91508190509392505050565b6000614456826132ec565b9150614461836132ec565b92508282101561447457614473613b13565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144db6026836133f5565b91506144e68261447f565b604082019050919050565b6000602082019050818103600083015261450a816144ce565b9050919050565b7f41646472657373206973206e6f74206f6e20616c6c6f776c6973740000000000600082015250565b6000614547601b836133f5565b915061455282614511565b602082019050919050565b600060208201905081810360008301526145768161453a565b9050919050565b7f546865207072652d73616c65206973206e6f7420616374697665000000000000600082015250565b60006145b3601a836133f5565b91506145be8261457d565b602082019050919050565b600060208201905081810360008301526145e2816145a6565b9050919050565b7f507572636861736520776f756c6420657863656564206d6178207072652d736160008201527f6c6520746f6b656e730000000000000000000000000000000000000000000000602082015250565b60006146456029836133f5565b9150614650826145e9565b604082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b6000614686826132ec565b9150614691836132ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146c6576146c5613b13565b5b828201905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061472d602c836133f5565b9150614738826146d1565b604082019050919050565b6000602082019050818103600083015261475c81614720565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006147bf6029836133f5565b91506147ca82614763565b604082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148516024836133f5565b915061485c826147f5565b604082019050919050565b6000602082019050818103600083015261488081614844565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006148bd601d836133f5565b91506148c882614887565b602082019050919050565b600060208201905081810360008301526148ec816148b0565b9050919050565b600081905092915050565b50565b600061490e6000836148f3565b9150614919826148fe565b600082019050919050565b600061492f82614901565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614995603a836133f5565b91506149a082614939565b604082019050919050565b600060208201905081810360008301526149c481614988565b9050919050565b60006149d6826132ec565b91506149e1836132ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a1a57614a19613b13565b5b828202905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a816032836133f5565b9150614a8c82614a25565b604082019050919050565b60006020820190508181036000830152614ab081614a74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614af1826132ec565b9150614afc836132ec565b925082614b0c57614b0b614ab7565b5b828204905092915050565b6000614b22826132ec565b9150614b2d836132ec565b925082614b3d57614b3c614ab7565b5b828206905092915050565b60008160601b9050919050565b6000614b6082614b48565b9050919050565b6000614b7282614b55565b9050919050565b614b8a614b858261336c565b614b67565b82525050565b6000614b9c8284614b79565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000614bd282614bab565b614bdc8185614bb6565b9350614bec818560208601613406565b614bf581613439565b840191505092915050565b6000608082019050614c1560008301876134d2565b614c2260208301866134d2565b614c2f60408301856132f6565b8181036060830152614c418184614bc7565b905095945050505050565b600081519050614c5b8161325d565b92915050565b600060208284031215614c7757614c76613227565b5b6000614c8584828501614c4c565b91505092915050565b6000819050919050565b614ca9614ca4826138f7565b614c8e565b82525050565b6000614cbb8285614c98565b602082019150614ccb8284614c98565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d116020836133f5565b9150614d1c82614cdb565b602082019050919050565b60006020820190508181036000830152614d4081614d04565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d7d601c836133f5565b9150614d8882614d47565b602082019050919050565b60006020820190508181036000830152614dac81614d70565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207c154ed28edae4172a5492ceba88f8bf1db75121f7b2ac8c926caee28df1fb7e64736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063693d77d211610118578063b88d4fde116100a0578063d86a5a1a1161006f578063d86a5a1a1461077c578063e985e9c5146107b9578063f2fde38b146107f6578063fa05a6571461081f578063ffe630b51461083b5761020f565b8063b88d4fde146106c2578063bdeb7a85146106eb578063c87b56dd14610714578063d2d8cb67146107515761020f565b8063841718a6116100e7578063841718a6146105fe5780638da5cb5b1461062757806395d89b4114610652578063a0712d681461067d578063a22cb465146106995761020f565b8063693d77d21461055657806370a082311461057f578063715018a6146105bc57806381c13a18146105d35761020f565b80632f745c591161019b57806355f804b31161016a57806355f804b31461046f5780636352211e146104985780636373a6b1146104d557806365f130971461050057806368428a1b1461052b5761020f565b80632f745c59146103b55780633ccfd60b146103f257806342842e0e146104095780634f6ccce7146104325761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d57806318160ddd1461033657806323b872dd146103615780632e8ba1f21461038a5761020f565b806301ffc9a714610214578063031bd4c41461025157806303339bcb1461027c57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613289565b610864565b60405161024891906132d1565b60405180910390f35b34801561025d57600080fd5b50610266610876565b6040516102739190613305565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906133aa565b61087c565b005b3480156102b157600080fd5b506102ba610944565b6040516102c79190613483565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906134a5565b6109d6565b60405161030491906134e1565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f91906134fc565b610a5b565b005b34801561034257600080fd5b5061034b610b73565b6040516103589190613305565b60405180910390f35b34801561036d57600080fd5b506103886004803603810190610383919061353c565b610b80565b005b34801561039657600080fd5b5061039f610be0565b6040516103ac9190613305565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906134fc565b610be5565b6040516103e99190613305565b60405180910390f35b3480156103fe57600080fd5b50610407610c8a565b005b34801561041557600080fd5b50610430600480360381019061042b919061353c565b610d18565b005b34801561043e57600080fd5b50610459600480360381019061045491906134a5565b610d38565b6040516104669190613305565b60405180910390f35b34801561047b57600080fd5b50610496600480360381019061049191906136c4565b610da9565b005b3480156104a457600080fd5b506104bf60048036038101906104ba91906134a5565b610e3f565b6040516104cc91906134e1565b60405180910390f35b3480156104e157600080fd5b506104ea610ef1565b6040516104f79190613483565b60405180910390f35b34801561050c57600080fd5b50610515610f7f565b6040516105229190613305565b60405180910390f35b34801561053757600080fd5b50610540610f84565b60405161054d91906132d1565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613739565b610f97565b005b34801561058b57600080fd5b506105a660048036038101906105a19190613766565b611030565b6040516105b39190613305565b60405180910390f35b3480156105c857600080fd5b506105d16110e8565b005b3480156105df57600080fd5b506105e8611170565b6040516105f591906132d1565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613739565b611183565b005b34801561063357600080fd5b5061063c61121c565b60405161064991906134e1565b60405180910390f35b34801561065e57600080fd5b50610667611246565b6040516106749190613483565b60405180910390f35b610697600480360381019061069291906134a5565b6112d8565b005b3480156106a557600080fd5b506106c060048036038101906106bb9190613793565b6114b9565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613874565b61163a565b005b3480156106f757600080fd5b50610712600480360381019061070d919061392d565b61169c565b005b34801561072057600080fd5b5061073b600480360381019061073691906134a5565b611722565b6040516107489190613483565b60405180910390f35b34801561075d57600080fd5b506107666117c9565b6040516107739190613305565b60405180910390f35b34801561078857600080fd5b506107a3600480360381019061079e91906139ba565b6117d5565b6040516107b09190613305565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db9190613a07565b61188d565b6040516107ed91906132d1565b60405180910390f35b34801561080257600080fd5b5061081d60048036038101906108189190613766565b611921565b005b61083960048036038101906108349190613a47565b611a19565b005b34801561084757600080fd5b50610862600480360381019061085d91906136c4565b611d74565b005b600061086f82611e0a565b9050919050565b61271081565b610884611e84565b73ffffffffffffffffffffffffffffffffffffffff166108a261121c565b73ffffffffffffffffffffffffffffffffffffffff16146108f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ef90613af3565b60405180910390fd5b6000610902610b73565b905060005b8381101561093e5761092b836109268385611e8c90919063ffffffff16565b611ea2565b808061093690613b42565b915050610907565b50505050565b60606000805461095390613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461097f90613bba565b80156109cc5780601f106109a1576101008083540402835291602001916109cc565b820191906000526020600020905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b60006109e182611ec0565b610a20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1790613c5e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a6682610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ace90613cf0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af6611e84565b73ffffffffffffffffffffffffffffffffffffffff161480610b255750610b2481610b1f611e84565b61188d565b5b610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90613d82565b60405180910390fd5b610b6e8383611f2c565b505050565b6000600880549050905090565b610b91610b8b611e84565b82611fe5565b610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790613e14565b60405180910390fd5b610bdb8383836120c3565b505050565b600281565b6000610bf083611030565b8210610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2890613ea6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c92611e84565b73ffffffffffffffffffffffffffffffffffffffff16610cb061121c565b73ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90613af3565b60405180910390fd5b6000479050610d15338261231f565b50565b610d338383836040518060200160405280600081525061163a565b505050565b6000610d42610b73565b8210610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90613f38565b60405180910390fd5b60088281548110610d9757610d96613f58565b5b90600052602060002001549050919050565b610db1611e84565b73ffffffffffffffffffffffffffffffffffffffff16610dcf61121c565b73ffffffffffffffffffffffffffffffffffffffff1614610e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1c90613af3565b60405180910390fd5b80600d9080519060200190610e3b92919061317a565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613ff9565b60405180910390fd5b80915050919050565b600b8054610efe90613bba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2a90613bba565b8015610f775780601f10610f4c57610100808354040283529160200191610f77565b820191906000526020600020905b815481529060010190602001808311610f5a57829003601f168201915b505050505081565b600a81565b600c60009054906101000a900460ff1681565b610f9f611e84565b73ffffffffffffffffffffffffffffffffffffffff16610fbd61121c565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613af3565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110989061408b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110f0611e84565b73ffffffffffffffffffffffffffffffffffffffff1661110e61121c565b73ffffffffffffffffffffffffffffffffffffffff1614611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90613af3565b60405180910390fd5b61116e6000612413565b565b600c60019054906101000a900460ff1681565b61118b611e84565b73ffffffffffffffffffffffffffffffffffffffff166111a961121c565b73ffffffffffffffffffffffffffffffffffffffff16146111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613af3565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461125590613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461128190613bba565b80156112ce5780601f106112a3576101008083540402835291602001916112ce565b820191906000526020600020905b8154815290600101906020018083116112b157829003601f168201915b5050505050905090565b600015156112e5336124d9565b151514611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e906140f7565b60405180910390fd5b6000611331610b73565b9050600c60009054906101000a900460ff16611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990614163565b60405180910390fd5b600a8211156113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd906141cf565b60405180910390fd5b6127106113dc8383611e8c90919063ffffffff16565b111561141d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114149061423b565b60405180910390fd5b6114388267015181ff25a980006124ec90919063ffffffff16565b34101561147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906142cd565b60405180910390fd5b60005b828110156114b4576114a13361149c8385611e8c90919063ffffffff16565b611ea2565b80806114ac90613b42565b91505061147d565b505050565b6114c1611e84565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561152f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152690614339565b60405180910390fd5b806005600061153c611e84565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115e9611e84565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161162e91906132d1565b60405180910390a35050565b61164b611645611e84565b83611fe5565b61168a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168190613e14565b60405180910390fd5b61169684848484612502565b50505050565b6116a4611e84565b73ffffffffffffffffffffffffffffffffffffffff166116c261121c565b73ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f90613af3565b60405180910390fd5b80600e8190555050565b606061172d82611ec0565b61176c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611763906143cb565b60405180910390fd5b600061177661255e565b9050600081511161179657604051806020016040528060008152506117c1565b806117a0846125f0565b6040516020016117b1929190614427565b6040516020818303038152906040525b915050919050565b67015181ff25a9800081565b600061182a6117e333612751565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612781565b1561188257600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600261187b919061444b565b9050611887565b600090505b92915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611929611e84565b73ffffffffffffffffffffffffffffffffffffffff1661194761121c565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613af3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a04906144f1565b60405180910390fd5b611a1681612413565b50565b60001515611a26336124d9565b151514611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f906140f7565b60405180910390fd5b6000611a72610b73565b9050611ac7611a8033612751565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612781565b611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd9061455d565b60405180910390fd5b600c60019054906101000a900460ff16611b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4c906145c9565b60405180910390fd5b6002611ba985600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8c90919063ffffffff16565b1115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be19061465b565b60405180910390fd5b612710611c008583611e8c90919063ffffffff16565b1115611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c389061423b565b60405180910390fd5b611c5c8467015181ff25a980006124ec90919063ffffffff16565b341015611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c95906142cd565b60405180910390fd5b611cf084600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8c90919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b84811015611d6d57611d5a33611d558385611e8c90919063ffffffff16565b611ea2565b8080611d6590613b42565b915050611d36565b5050505050565b611d7c611e84565b73ffffffffffffffffffffffffffffffffffffffff16611d9a61121c565b73ffffffffffffffffffffffffffffffffffffffff1614611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de790613af3565b60405180910390fd5b80600b9080519060200190611e0692919061317a565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e7d5750611e7c82612798565b5b9050919050565b600033905090565b60008183611e9a919061467b565b905092915050565b611ebc82826040518060200160405280600081525061287a565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f9f83610e3f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ff082611ec0565b61202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690614743565b60405180910390fd5b600061203a83610e3f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120a957508373ffffffffffffffffffffffffffffffffffffffff16612091846109d6565b73ffffffffffffffffffffffffffffffffffffffff16145b806120ba57506120b9818561188d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120e382610e3f565b73ffffffffffffffffffffffffffffffffffffffff1614612139576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612130906147d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614867565b60405180910390fd5b6121b48383836128d5565b6121bf600082611f2c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220f919061444b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612266919061467b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b80471015612362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612359906148d3565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161238890614924565b60006040518083038185875af1925050503d80600081146123c5576040519150601f19603f3d011682016040523d82523d6000602084013e6123ca565b606091505b505090508061240e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612405906149ab565b60405180910390fd5b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b600081836124fa91906149cb565b905092915050565b61250d8484846120c3565b612519848484846128e5565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90614a97565b60405180910390fd5b50505050565b6060600d805461256d90613bba565b80601f016020809104026020016040519081016040528092919081815260200182805461259990613bba565b80156125e65780601f106125bb576101008083540402835291602001916125e6565b820191906000526020600020905b8154815290600101906020018083116125c957829003601f168201915b5050505050905090565b60606000821415612638576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061274c565b600082905060005b6000821461266a57808061265390613b42565b915050600a826126639190614ae6565b9150612640565b60008167ffffffffffffffff81111561268657612685613599565b5b6040519080825280601f01601f1916602001820160405280156126b85781602001600182028036833780820191505090505b5090505b60008514612745576001826126d1919061444b565b9150600a856126e09190614b17565b60306126ec919061467b565b60f81b81838151811061270257612701613f58565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561273e9190614ae6565b94506126bc565b8093505050505b919050565b6000816040516020016127649190614b90565b604051602081830303815290604052805190602001209050919050565b600061279082600e5485612a6d565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061286357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612873575061287282612b23565b5b9050919050565b6128848383612b8d565b61289160008484846128e5565b6128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c790614a97565b60405180910390fd5b505050565b6128e0838383612d5b565b505050565b60006129068473ffffffffffffffffffffffffffffffffffffffff166124d9565b15612a60578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292f611e84565b8786866040518563ffffffff1660e01b81526004016129519493929190614c00565b6020604051808303816000875af192505050801561298d57506040513d601f19601f8201168201806040525081019061298a9190614c61565b60015b612a10573d80600081146129bd576040519150601f19603f3d011682016040523d82523d6000602084013e6129c2565b606091505b50600081511415612a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ff90614a97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a65565b600190505b949350505050565b60008082905060005b8551811015612b15576000868281518110612a9457612a93613f58565b5b60200260200101519050808311612ad5578281604051602001612ab8929190614caf565b604051602081830303815290604052805190602001209250612b01565b8083604051602001612ae8929190614caf565b6040516020818303038152906040528051906020012092505b508080612b0d90613b42565b915050612a76565b508381149150509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf490614d27565b60405180910390fd5b612c0681611ec0565b15612c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3d90614d93565b60405180910390fd5b612c52600083836128d5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca2919061467b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612d66838383612e6f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612da957612da481612e74565b612de8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612de757612de68382612ebd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e2b57612e268161302a565b612e6a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e6957612e6882826130fb565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612eca84611030565b612ed4919061444b565b9050600060076000848152602001908152602001600020549050818114612fb9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061303e919061444b565b905060006009600084815260200190815260200160002054905060006008838154811061306e5761306d613f58565b5b9060005260206000200154905080600883815481106130905761308f613f58565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806130df576130de614db3565b5b6001900381819060005260206000200160009055905550505050565b600061310683611030565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461318690613bba565b90600052602060002090601f0160209004810192826131a857600085556131ef565b82601f106131c157805160ff19168380011785556131ef565b828001600101855582156131ef579182015b828111156131ee5782518255916020019190600101906131d3565b5b5090506131fc9190613200565b5090565b5b80821115613219576000816000905550600101613201565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61326681613231565b811461327157600080fd5b50565b6000813590506132838161325d565b92915050565b60006020828403121561329f5761329e613227565b5b60006132ad84828501613274565b91505092915050565b60008115159050919050565b6132cb816132b6565b82525050565b60006020820190506132e660008301846132c2565b92915050565b6000819050919050565b6132ff816132ec565b82525050565b600060208201905061331a60008301846132f6565b92915050565b613329816132ec565b811461333457600080fd5b50565b60008135905061334681613320565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133778261334c565b9050919050565b6133878161336c565b811461339257600080fd5b50565b6000813590506133a48161337e565b92915050565b600080604083850312156133c1576133c0613227565b5b60006133cf85828601613337565b92505060206133e085828601613395565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613424578082015181840152602081019050613409565b83811115613433576000848401525b50505050565b6000601f19601f8301169050919050565b6000613455826133ea565b61345f81856133f5565b935061346f818560208601613406565b61347881613439565b840191505092915050565b6000602082019050818103600083015261349d818461344a565b905092915050565b6000602082840312156134bb576134ba613227565b5b60006134c984828501613337565b91505092915050565b6134db8161336c565b82525050565b60006020820190506134f660008301846134d2565b92915050565b6000806040838503121561351357613512613227565b5b600061352185828601613395565b925050602061353285828601613337565b9150509250929050565b60008060006060848603121561355557613554613227565b5b600061356386828701613395565b935050602061357486828701613395565b925050604061358586828701613337565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135d182613439565b810181811067ffffffffffffffff821117156135f0576135ef613599565b5b80604052505050565b600061360361321d565b905061360f82826135c8565b919050565b600067ffffffffffffffff82111561362f5761362e613599565b5b61363882613439565b9050602081019050919050565b82818337600083830152505050565b600061366761366284613614565b6135f9565b90508281526020810184848401111561368357613682613594565b5b61368e848285613645565b509392505050565b600082601f8301126136ab576136aa61358f565b5b81356136bb848260208601613654565b91505092915050565b6000602082840312156136da576136d9613227565b5b600082013567ffffffffffffffff8111156136f8576136f761322c565b5b61370484828501613696565b91505092915050565b613716816132b6565b811461372157600080fd5b50565b6000813590506137338161370d565b92915050565b60006020828403121561374f5761374e613227565b5b600061375d84828501613724565b91505092915050565b60006020828403121561377c5761377b613227565b5b600061378a84828501613395565b91505092915050565b600080604083850312156137aa576137a9613227565b5b60006137b885828601613395565b92505060206137c985828601613724565b9150509250929050565b600067ffffffffffffffff8211156137ee576137ed613599565b5b6137f782613439565b9050602081019050919050565b6000613817613812846137d3565b6135f9565b90508281526020810184848401111561383357613832613594565b5b61383e848285613645565b509392505050565b600082601f83011261385b5761385a61358f565b5b813561386b848260208601613804565b91505092915050565b6000806000806080858703121561388e5761388d613227565b5b600061389c87828801613395565b94505060206138ad87828801613395565b93505060406138be87828801613337565b925050606085013567ffffffffffffffff8111156138df576138de61322c565b5b6138eb87828801613846565b91505092959194509250565b6000819050919050565b61390a816138f7565b811461391557600080fd5b50565b60008135905061392781613901565b92915050565b60006020828403121561394357613942613227565b5b600061395184828501613918565b91505092915050565b600080fd5b600080fd5b60008083601f84011261397a5761397961358f565b5b8235905067ffffffffffffffff8111156139975761399661395a565b5b6020830191508360208202830111156139b3576139b261395f565b5b9250929050565b600080602083850312156139d1576139d0613227565b5b600083013567ffffffffffffffff8111156139ef576139ee61322c565b5b6139fb85828601613964565b92509250509250929050565b60008060408385031215613a1e57613a1d613227565b5b6000613a2c85828601613395565b9250506020613a3d85828601613395565b9150509250929050565b600080600060408486031215613a6057613a5f613227565b5b6000613a6e86828701613337565b935050602084013567ffffffffffffffff811115613a8f57613a8e61322c565b5b613a9b86828701613964565b92509250509250925092565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613add6020836133f5565b9150613ae882613aa7565b602082019050919050565b60006020820190508181036000830152613b0c81613ad0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b4d826132ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8057613b7f613b13565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bd257607f821691505b60208210811415613be657613be5613b8b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c48602c836133f5565b9150613c5382613bec565b604082019050919050565b60006020820190508181036000830152613c7781613c3b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cda6021836133f5565b9150613ce582613c7e565b604082019050919050565b60006020820190508181036000830152613d0981613ccd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613d6c6038836133f5565b9150613d7782613d10565b604082019050919050565b60006020820190508181036000830152613d9b81613d5f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613dfe6031836133f5565b9150613e0982613da2565b604082019050919050565b60006020820190508181036000830152613e2d81613df1565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613e90602b836133f5565b9150613e9b82613e34565b604082019050919050565b60006020820190508181036000830152613ebf81613e83565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f22602c836133f5565b9150613f2d82613ec6565b604082019050919050565b60006020820190508181036000830152613f5181613f15565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613fe36029836133f5565b9150613fee82613f87565b604082019050919050565b6000602082019050818103600083015261401281613fd6565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614075602a836133f5565b915061408082614019565b604082019050919050565b600060208201905081810360008301526140a481614068565b9050919050565b7f43616e6e6f74206d696e742066726f6d206120636f6e74726163740000000000600082015250565b60006140e1601b836133f5565b91506140ec826140ab565b602082019050919050565b60006020820190508181036000830152614110816140d4565b9050919050565b7f5468652073616c65206973206e6f742061637469766500000000000000000000600082015250565b600061414d6016836133f5565b915061415882614117565b602082019050919050565b6000602082019050818103600083015261417c81614140565b9050919050565b7f496e76616c6964206e756d626572206f6620746f6b656e730000000000000000600082015250565b60006141b96018836133f5565b91506141c482614183565b602082019050919050565b600060208201905081810360008301526141e8816141ac565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006142256020836133f5565b9150614230826141ef565b602082019050919050565b6000602082019050818103600083015261425481614218565b9050919050565b7f45746865722076616c75652073656e742069732062656c6f772074686520726560008201527f7175697265642070726963650000000000000000000000000000000000000000602082015250565b60006142b7602c836133f5565b91506142c28261425b565b604082019050919050565b600060208201905081810360008301526142e6816142aa565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006143236019836133f5565b915061432e826142ed565b602082019050919050565b6000602082019050818103600083015261435281614316565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143b5602f836133f5565b91506143c082614359565b604082019050919050565b600060208201905081810360008301526143e4816143a8565b9050919050565b600081905092915050565b6000614401826133ea565b61440b81856143eb565b935061441b818560208601613406565b80840191505092915050565b600061443382856143f6565b915061443f82846143f6565b91508190509392505050565b6000614456826132ec565b9150614461836132ec565b92508282101561447457614473613b13565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006144db6026836133f5565b91506144e68261447f565b604082019050919050565b6000602082019050818103600083015261450a816144ce565b9050919050565b7f41646472657373206973206e6f74206f6e20616c6c6f776c6973740000000000600082015250565b6000614547601b836133f5565b915061455282614511565b602082019050919050565b600060208201905081810360008301526145768161453a565b9050919050565b7f546865207072652d73616c65206973206e6f7420616374697665000000000000600082015250565b60006145b3601a836133f5565b91506145be8261457d565b602082019050919050565b600060208201905081810360008301526145e2816145a6565b9050919050565b7f507572636861736520776f756c6420657863656564206d6178207072652d736160008201527f6c6520746f6b656e730000000000000000000000000000000000000000000000602082015250565b60006146456029836133f5565b9150614650826145e9565b604082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b6000614686826132ec565b9150614691836132ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146c6576146c5613b13565b5b828201905092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061472d602c836133f5565b9150614738826146d1565b604082019050919050565b6000602082019050818103600083015261475c81614720565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006147bf6029836133f5565b91506147ca82614763565b604082019050919050565b600060208201905081810360008301526147ee816147b2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006148516024836133f5565b915061485c826147f5565b604082019050919050565b6000602082019050818103600083015261488081614844565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006148bd601d836133f5565b91506148c882614887565b602082019050919050565b600060208201905081810360008301526148ec816148b0565b9050919050565b600081905092915050565b50565b600061490e6000836148f3565b9150614919826148fe565b600082019050919050565b600061492f82614901565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614995603a836133f5565b91506149a082614939565b604082019050919050565b600060208201905081810360008301526149c481614988565b9050919050565b60006149d6826132ec565b91506149e1836132ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a1a57614a19613b13565b5b828202905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614a816032836133f5565b9150614a8c82614a25565b604082019050919050565b60006020820190508181036000830152614ab081614a74565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614af1826132ec565b9150614afc836132ec565b925082614b0c57614b0b614ab7565b5b828204905092915050565b6000614b22826132ec565b9150614b2d836132ec565b925082614b3d57614b3c614ab7565b5b828206905092915050565b60008160601b9050919050565b6000614b6082614b48565b9050919050565b6000614b7282614b55565b9050919050565b614b8a614b858261336c565b614b67565b82525050565b6000614b9c8284614b79565b60148201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000614bd282614bab565b614bdc8185614bb6565b9350614bec818560208601613406565b614bf581613439565b840191505092915050565b6000608082019050614c1560008301876134d2565b614c2260208301866134d2565b614c2f60408301856132f6565b8181036060830152614c418184614bc7565b905095945050505050565b600081519050614c5b8161325d565b92915050565b600060208284031215614c7757614c76613227565b5b6000614c8584828501614c4c565b91505092915050565b6000819050919050565b614ca9614ca4826138f7565b614c8e565b82525050565b6000614cbb8285614c98565b602082019150614ccb8284614c98565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d116020836133f5565b9150614d1c82614cdb565b602082019050919050565b60006020820190508181036000830152614d4081614d04565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d7d601c836133f5565b9150614d8882614d47565b602082019050919050565b60006020820190508181036000830152614dac81614d70565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207c154ed28edae4172a5492ceba88f8bf1db75121f7b2ac8c926caee28df1fb7e64736f6c634300080a0033

Deployed Bytecode Sourcemap

50428:4267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52874:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50638:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53082:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20786:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22345:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21868:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34294:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23235:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50533:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33962:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53897:153;;;;;;;;;;;;;:::i;:::-;;23645:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34484:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53305:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20480:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50746:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50587:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50779:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53645:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20210:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41363:94;;;;;;;;;;;;;:::i;:::-;;50816:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53536:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40712:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20955:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51065:625;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22638:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23901:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53790:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21130:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50688:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52606:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23004:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41612:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51698:900;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53420:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52874:179;52985:4;53009:36;53033:11;53009:23;:36::i;:::-;53002:43;;52874:179;;;:::o;50638:43::-;50676:5;50638:43;:::o;53082:215::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53160:10:::1;53173:13;:11;:13::i;:::-;53160:26;;53202:9;53197:93;53221:9;53217:1;:13;53197:93;;;53252:26;53262:4;53268:9;53275:1;53268:2;:6;;:9;;;;:::i;:::-;53252;:26::i;:::-;53232:3;;;;;:::i;:::-;;;;53197:93;;;;53149:148;53082:215:::0;;:::o;20786:100::-;20840:13;20873:5;20866:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20786:100;:::o;22345:221::-;22421:7;22449:16;22457:7;22449;:16::i;:::-;22441:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22534:15;:24;22550:7;22534:24;;;;;;;;;;;;;;;;;;;;;22527:31;;22345:221;;;:::o;21868:411::-;21949:13;21965:23;21980:7;21965:14;:23::i;:::-;21949:39;;22013:5;22007:11;;:2;:11;;;;21999:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22107:5;22091:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22116:37;22133:5;22140:12;:10;:12::i;:::-;22116:16;:37::i;:::-;22091:62;22069:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22250:21;22259:2;22263:7;22250:8;:21::i;:::-;21938:341;21868:411;;:::o;34294:113::-;34355:7;34382:10;:17;;;;34375:24;;34294:113;:::o;23235:339::-;23430:41;23449:12;:10;:12::i;:::-;23463:7;23430:18;:41::i;:::-;23422:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23538:28;23548:4;23554:2;23558:7;23538:9;:28::i;:::-;23235:339;;;:::o;50533:47::-;50579:1;50533:47;:::o;33962:256::-;34059:7;34095:23;34112:5;34095:16;:23::i;:::-;34087:5;:31;34079:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34184:12;:19;34197:5;34184:19;;;;;;;;;;;;;;;:26;34204:5;34184:26;;;;;;;;;;;;34177:33;;33962:256;;;;:::o;53897:153::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53945:15:::1;53963:21;53945:39;;53995:47;54021:10;54034:7;53995:17;:47::i;:::-;53934:116;53897:153::o:0;23645:185::-;23783:39;23800:4;23806:2;23810:7;23783:39;;;;;;;;;;;;:16;:39::i;:::-;23645:185;;;:::o;34484:233::-;34559:7;34595:30;:28;:30::i;:::-;34587:5;:38;34579:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34692:10;34703:5;34692:17;;;;;;;;:::i;:::-;;;;;;;;;;34685:24;;34484:233;;;:::o;53305:107::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53396:8:::1;53377:16;:27;;;;;;;;;;;;:::i;:::-;;53305:107:::0;:::o;20480:239::-;20552:7;20572:13;20588:7;:16;20596:7;20588:16;;;;;;;;;;;;;;;;;;;;;20572:32;;20640:1;20623:19;;:5;:19;;;;20615:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20706:5;20699:12;;;20480:239;;;:::o;50746:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50587:44::-;50629:2;50587:44;:::o;50779:30::-;;;;;;;;;;;;;:::o;53645:137::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53754:20:::1;53732:19;;:42;;;;;;;;;;;;;;;;;;53645:137:::0;:::o;20210:208::-;20282:7;20327:1;20310:19;;:5;:19;;;;20302:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20394:9;:16;20404:5;20394:16;;;;;;;;;;;;;;;;20387:23;;20210:208;;;:::o;41363:94::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41428:21:::1;41446:1;41428:9;:21::i;:::-;41363:94::o:0;50816:39::-;;;;;;;;;;;;;:::o;53536:101::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53618:11:::1;53605:10;;:24;;;;;;;;;;;;;;;;;;53536:101:::0;:::o;40712:87::-;40758:7;40785:6;;;;;;;;;;;40778:13;;40712:87;:::o;20955:104::-;21011:13;21044:7;21037:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20955:104;:::o;51065:625::-;51168:5;51134:39;;:30;51153:10;51134:18;:30::i;:::-;:39;;;51126:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;51218:10;51231:13;:11;:13::i;:::-;51218:26;;51263:10;;;;;;;;;;;51255:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;50629:2;51319:9;:28;;51311:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50676:5;51395:17;51402:9;51395:2;:6;;:17;;;;:::i;:::-;:32;;51387:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;51496:26;51512:9;50726:11;51496:15;;:26;;;;:::i;:::-;51483:9;:39;;51475:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;51589:9;51584:99;51608:9;51604:1;:13;51584:99;;;51639:32;51649:10;51661:9;51668:1;51661:2;:6;;:9;;;;:::i;:::-;51639;:32::i;:::-;51619:3;;;;;:::i;:::-;;;;51584:99;;;;51115:575;51065:625;:::o;22638:295::-;22753:12;:10;:12::i;:::-;22741:24;;:8;:24;;;;22733:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22853:8;22808:18;:32;22827:12;:10;:12::i;:::-;22808:32;;;;;;;;;;;;;;;:42;22841:8;22808:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22906:8;22877:48;;22892:12;:10;:12::i;:::-;22877:48;;;22916:8;22877:48;;;;;;:::i;:::-;;;;;;;;22638:295;;:::o;23901:328::-;24076:41;24095:12;:10;:12::i;:::-;24109:7;24076:18;:41::i;:::-;24068:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24182:39;24196:4;24202:2;24206:7;24215:5;24182:13;:39::i;:::-;23901:328;;;;:::o;53790:99::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53876:5:::1;53859:14;:22;;;;53790:99:::0;:::o;21130:334::-;21203:13;21237:16;21245:7;21237;:16::i;:::-;21229:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21318:21;21342:10;:8;:10::i;:::-;21318:34;;21394:1;21376:7;21370:21;:25;:86;;;;;;;;;;;;;;;;;21422:7;21431:18;:7;:16;:18::i;:::-;21405:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21370:86;21363:93;;;21130:334;;;:::o;50688:49::-;50726:11;50688:49;:::o;52606:260::-;52696:7;52720:33;52728:17;52734:10;52728:5;:17::i;:::-;52747:5;;52720:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;52716:124;;;52799:17;:29;52817:10;52799:29;;;;;;;;;;;;;;;;50579:1;52777:51;;;;:::i;:::-;52770:58;;;;52716:124;52857:1;52850:8;;52606:260;;;;;:::o;23004:164::-;23101:4;23125:18;:25;23144:5;23125:25;;;;;;;;;;;;;;;:35;23151:8;23125:35;;;;;;;;;;;;;;;;;;;;;;;;;23118:42;;23004:164;;;;:::o;41612:192::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41721:1:::1;41701:22;;:8;:22;;;;41693:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41777:19;41787:8;41777:9;:19::i;:::-;41612:192:::0;:::o;51698:900::-;51836:5;51802:39;;:30;51821:10;51802:18;:30::i;:::-;:39;;;51794:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;51886:10;51899:13;:11;:13::i;:::-;51886:26;;51931:33;51939:17;51945:10;51939:5;:17::i;:::-;51958:5;;51931:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;51923:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52015:19;;;;;;;;;;;52007:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50579:1;52084:44;52118:9;52084:17;:29;52102:10;52084:29;;;;;;;;;;;;;;;;:33;;:44;;;;:::i;:::-;:67;;52076:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;50676:5;52216:17;52223:9;52216:2;:6;;:17;;;;:::i;:::-;:32;;52208:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;52317:26;52333:9;50726:11;52317:15;;:26;;;;:::i;:::-;52304:9;:39;;52296:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;52437:44;52471:9;52437:17;:29;52455:10;52437:29;;;;;;;;;;;;;;;;:33;;:44;;;;:::i;:::-;52405:17;:29;52423:10;52405:29;;;;;;;;;;;;;;;:76;;;;52497:9;52492:99;52516:9;52512:1;:13;52492:99;;;52547:32;52557:10;52569:9;52576:1;52569:2;:6;;:9;;;;:::i;:::-;52547;:32::i;:::-;52527:3;;;;;:::i;:::-;;;;52492:99;;;;51783:815;51698:900;;;:::o;53420:108::-;40943:12;:10;:12::i;:::-;40932:23;;:7;:5;:7::i;:::-;:23;;;40924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53510:10:::1;53497;:23;;;;;;;;;;;;:::i;:::-;;53420:108:::0;:::o;33654:224::-;33756:4;33795:35;33780:50;;;:11;:50;;;;:90;;;;33834:36;33858:11;33834:23;:36::i;:::-;33780:90;33773:97;;33654:224;;;:::o;15553:98::-;15606:7;15633:10;15626:17;;15553:98;:::o;44691:::-;44749:7;44780:1;44776;:5;;;;:::i;:::-;44769:12;;44691:98;;;;:::o;26723:110::-;26799:26;26809:2;26813:7;26799:26;;;;;;;;;;;;:9;:26::i;:::-;26723:110;;:::o;25739:127::-;25804:4;25856:1;25828:30;;:7;:16;25836:7;25828:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25821:37;;25739:127;;;:::o;29721:174::-;29823:2;29796:15;:24;29812:7;29796:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29879:7;29875:2;29841:46;;29850:23;29865:7;29850:14;:23::i;:::-;29841:46;;;;;;;;;;;;29721:174;;:::o;26033:348::-;26126:4;26151:16;26159:7;26151;:16::i;:::-;26143:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26227:13;26243:23;26258:7;26243:14;:23::i;:::-;26227:39;;26296:5;26285:16;;:7;:16;;;:51;;;;26329:7;26305:31;;:20;26317:7;26305:11;:20::i;:::-;:31;;;26285:51;:87;;;;26340:32;26357:5;26364:7;26340:16;:32::i;:::-;26285:87;26277:96;;;26033:348;;;;:::o;29025:578::-;29184:4;29157:31;;:23;29172:7;29157:14;:23::i;:::-;:31;;;29149:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29267:1;29253:16;;:2;:16;;;;29245:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29323:39;29344:4;29350:2;29354:7;29323:20;:39::i;:::-;29427:29;29444:1;29448:7;29427:8;:29::i;:::-;29488:1;29469:9;:15;29479:4;29469:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29517:1;29500:9;:13;29510:2;29500:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29548:2;29529:7;:16;29537:7;29529:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29587:7;29583:2;29568:27;;29577:4;29568:27;;;;;;;;;;;;29025:578;;;:::o;9004:317::-;9119:6;9094:21;:31;;9086:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9173:12;9191:9;:14;;9213:6;9191:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9172:52;;;9243:7;9235:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9075:246;9004:317;;:::o;41812:173::-;41868:16;41887:6;;;;;;;;;;;41868:25;;41913:8;41904:6;;:17;;;;;;;;;;;;;;;;;;41968:8;41937:40;;41958:8;41937:40;;;;;;;;;;;;41857:128;41812:173;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;45429:98::-;45487:7;45518:1;45514;:5;;;;:::i;:::-;45507:12;;45429:98;;;;:::o;25111:315::-;25268:28;25278:4;25284:2;25288:7;25268:9;:28::i;:::-;25315:48;25338:4;25344:2;25348:7;25357:5;25315:22;:48::i;:::-;25307:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25111:315;;;;:::o;54077:117::-;54137:13;54170:16;54163:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54077:117;:::o;15993:723::-;16049:13;16279:1;16270:5;:10;16266:53;;;16297:10;;;;;;;;;;;;;;;;;;;;;16266:53;16329:12;16344:5;16329:20;;16360:14;16385:78;16400:1;16392:4;:9;16385:78;;16418:8;;;;;:::i;:::-;;;;16449:2;16441:10;;;;;:::i;:::-;;;16385:78;;;16473:19;16505:6;16495:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16473:39;;16523:154;16539:1;16530:5;:10;16523:154;;16567:1;16557:11;;;;;:::i;:::-;;;16634:2;16626:5;:10;;;;:::i;:::-;16613:2;:24;;;;:::i;:::-;16600:39;;16583:6;16590;16583:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16663:2;16654:11;;;;;:::i;:::-;;;16523:154;;;16701:6;16687:21;;;;;15993:723;;;;:::o;54391:126::-;54446:7;54500;54483:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;54473:36;;;;;;54466:43;;54391:126;;;:::o;54525:167::-;54608:4;54632:52;54651:5;54658:14;;54674:9;54632:18;:52::i;:::-;54625:59;;54525:167;;;;:::o;19841:305::-;19943:4;19995:25;19980:40;;;:11;:40;;;;:105;;;;20052:33;20037:48;;;:11;:48;;;;19980:105;:158;;;;20102:36;20126:11;20102:23;:36::i;:::-;19980:158;19960:178;;19841:305;;;:::o;27060:321::-;27190:18;27196:2;27200:7;27190:5;:18::i;:::-;27241:54;27272:1;27276:2;27280:7;27289:5;27241:22;:54::i;:::-;27219:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27060:321;;;:::o;54202:181::-;54330:45;54357:4;54363:2;54367:7;54330:26;:45::i;:::-;54202:181;;;:::o;30460:799::-;30615:4;30636:15;:2;:13;;;:15::i;:::-;30632:620;;;30688:2;30672:36;;;30709:12;:10;:12::i;:::-;30723:4;30729:7;30738:5;30672:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30668:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30931:1;30914:6;:13;:18;30910:272;;;30957:60;;;;;;;;;;:::i;:::-;;;;;;;;30910:272;31132:6;31126:13;31117:6;31113:2;31109:15;31102:38;30668:529;30805:41;;;30795:51;;;:6;:51;;;;30788:58;;;;;30632:620;31236:4;31229:11;;30460:799;;;;;;;:::o;49591:830::-;49716:4;49733:20;49756:4;49733:27;;49778:9;49773:525;49797:5;:12;49793:1;:16;49773:525;;;49831:20;49854:5;49860:1;49854:8;;;;;;;;:::i;:::-;;;;;;;;49831:31;;49899:12;49883;:28;49879:408;;50053:12;50067;50036:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50026:55;;;;;;50011:70;;49879:408;;;50243:12;50257;50226:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50216:55;;;;;;50201:70;;49879:408;49816:482;49811:3;;;;;:::i;:::-;;;;49773:525;;;;50409:4;50393:12;:20;50386:27;;;49591:830;;;;;:::o;18450:157::-;18535:4;18574:25;18559:40;;;:11;:40;;;;18552:47;;18450:157;;;:::o;27717:382::-;27811:1;27797:16;;:2;:16;;;;27789:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27870:16;27878:7;27870;:16::i;:::-;27869:17;27861:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27932:45;27961:1;27965:2;27969:7;27932:20;:45::i;:::-;28007:1;27990:9;:13;28000:2;27990:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28038:2;28019:7;:16;28027:7;28019:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28083:7;28079:2;28058:33;;28075:1;28058:33;;;;;;;;;;;;27717:382;;:::o;35330:589::-;35474:45;35501:4;35507:2;35511:7;35474:26;:45::i;:::-;35552:1;35536:18;;:4;:18;;;35532:187;;;35571:40;35603:7;35571:31;:40::i;:::-;35532:187;;;35641:2;35633:10;;:4;:10;;;35629:90;;35660:47;35693:4;35699:7;35660:32;:47::i;:::-;35629:90;35532:187;35747:1;35733:16;;:2;:16;;;35729:183;;;35766:45;35803:7;35766:36;:45::i;:::-;35729:183;;;35839:4;35833:10;;:2;:10;;;35829:83;;35860:40;35888:2;35892:7;35860:27;:40::i;:::-;35829:83;35729:183;35330:589;;;:::o;31831:126::-;;;;:::o;36642:164::-;36746:10;:17;;;;36719:15;:24;36735:7;36719:24;;;;;;;;;;;:44;;;;36774:10;36790:7;36774:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36642:164;:::o;37433:988::-;37699:22;37749:1;37724:22;37741:4;37724:16;:22::i;:::-;:26;;;;:::i;:::-;37699:51;;37761:18;37782:17;:26;37800:7;37782:26;;;;;;;;;;;;37761:47;;37929:14;37915:10;:28;37911:328;;37960:19;37982:12;:18;37995:4;37982:18;;;;;;;;;;;;;;;:34;38001:14;37982:34;;;;;;;;;;;;37960:56;;38066:11;38033:12;:18;38046:4;38033:18;;;;;;;;;;;;;;;:30;38052:10;38033:30;;;;;;;;;;;:44;;;;38183:10;38150:17;:30;38168:11;38150:30;;;;;;;;;;;:43;;;;37945:294;37911:328;38335:17;:26;38353:7;38335:26;;;;;;;;;;;38328:33;;;38379:12;:18;38392:4;38379:18;;;;;;;;;;;;;;;:34;38398:14;38379:34;;;;;;;;;;;38372:41;;;37514:907;;37433:988;;:::o;38716:1079::-;38969:22;39014:1;38994:10;:17;;;;:21;;;;:::i;:::-;38969:46;;39026:18;39047:15;:24;39063:7;39047:24;;;;;;;;;;;;39026:45;;39398:19;39420:10;39431:14;39420:26;;;;;;;;:::i;:::-;;;;;;;;;;39398:48;;39484:11;39459:10;39470;39459:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39595:10;39564:15;:28;39580:11;39564:28;;;;;;;;;;;:41;;;;39736:15;:24;39752:7;39736:24;;;;;;;;;;;39729:31;;;39771:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38787:1008;;;38716:1079;:::o;36220:221::-;36305:14;36322:20;36339:2;36322:16;:20::i;:::-;36305:37;;36380:7;36353:12;:16;36366:2;36353:16;;;;;;;;;;;;;;;:24;36370:6;36353:24;;;;;;;;;;;:34;;;;36427:6;36398:17;:26;36416:7;36398:26;;;;;;;;;;;:35;;;;36294:147;36220:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:122::-;2026:24;2044:5;2026:24;:::i;:::-;2019:5;2016:35;2006:63;;2065:1;2062;2055:12;2006:63;1953:122;:::o;2081:139::-;2127:5;2165:6;2152:20;2143:29;;2181:33;2208:5;2181:33;:::i;:::-;2081:139;;;;:::o;2226:126::-;2263:7;2303:42;2296:5;2292:54;2281:65;;2226:126;;;:::o;2358:96::-;2395:7;2424:24;2442:5;2424:24;:::i;:::-;2413:35;;2358:96;;;:::o;2460:122::-;2533:24;2551:5;2533:24;:::i;:::-;2526:5;2523:35;2513:63;;2572:1;2569;2562:12;2513:63;2460:122;:::o;2588:139::-;2634:5;2672:6;2659:20;2650:29;;2688:33;2715:5;2688:33;:::i;:::-;2588:139;;;;:::o;2733:474::-;2801:6;2809;2858:2;2846:9;2837:7;2833:23;2829:32;2826:119;;;2864:79;;:::i;:::-;2826:119;2984:1;3009:53;3054:7;3045:6;3034:9;3030:22;3009:53;:::i;:::-;2999:63;;2955:117;3111:2;3137:53;3182:7;3173:6;3162:9;3158:22;3137:53;:::i;:::-;3127:63;;3082:118;2733:474;;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:307::-;3561:1;3571:113;3585:6;3582:1;3579:13;3571:113;;;3670:1;3665:3;3661:11;3655:18;3651:1;3646:3;3642:11;3635:39;3607:2;3604:1;3600:10;3595:15;;3571:113;;;3702:6;3699:1;3696:13;3693:101;;;3782:1;3773:6;3768:3;3764:16;3757:27;3693:101;3542:258;3493:307;;;:::o;3806:102::-;3847:6;3898:2;3894:7;3889:2;3882:5;3878:14;3874:28;3864:38;;3806:102;;;:::o;3914:364::-;4002:3;4030:39;4063:5;4030:39;:::i;:::-;4085:71;4149:6;4144:3;4085:71;:::i;:::-;4078:78;;4165:52;4210:6;4205:3;4198:4;4191:5;4187:16;4165:52;:::i;:::-;4242:29;4264:6;4242:29;:::i;:::-;4237:3;4233:39;4226:46;;4006:272;3914:364;;;;:::o;4284:313::-;4397:4;4435:2;4424:9;4420:18;4412:26;;4484:9;4478:4;4474:20;4470:1;4459:9;4455:17;4448:47;4512:78;4585:4;4576:6;4512:78;:::i;:::-;4504:86;;4284:313;;;;:::o;4603:329::-;4662:6;4711:2;4699:9;4690:7;4686:23;4682:32;4679:119;;;4717:79;;:::i;:::-;4679:119;4837:1;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4808:117;4603:329;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:474::-;5358:6;5366;5415:2;5403:9;5394:7;5390:23;5386:32;5383:119;;;5421:79;;:::i;:::-;5383:119;5541:1;5566:53;5611:7;5602:6;5591:9;5587:22;5566:53;:::i;:::-;5556:63;;5512:117;5668:2;5694:53;5739:7;5730:6;5719:9;5715:22;5694:53;:::i;:::-;5684:63;;5639:118;5290:474;;;;;:::o;5770:619::-;5847:6;5855;5863;5912:2;5900:9;5891:7;5887:23;5883:32;5880:119;;;5918:79;;:::i;:::-;5880:119;6038:1;6063:53;6108:7;6099:6;6088:9;6084:22;6063:53;:::i;:::-;6053:63;;6009:117;6165:2;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6136:118;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5770:619;;;;;:::o;6395:117::-;6504:1;6501;6494:12;6518:117;6627:1;6624;6617:12;6641:180;6689:77;6686:1;6679:88;6786:4;6783:1;6776:15;6810:4;6807:1;6800:15;6827:281;6910:27;6932:4;6910:27;:::i;:::-;6902:6;6898:40;7040:6;7028:10;7025:22;7004:18;6992:10;6989:34;6986:62;6983:88;;;7051:18;;:::i;:::-;6983:88;7091:10;7087:2;7080:22;6870:238;6827:281;;:::o;7114:129::-;7148:6;7175:20;;:::i;:::-;7165:30;;7204:33;7232:4;7224:6;7204:33;:::i;:::-;7114:129;;;:::o;7249:308::-;7311:4;7401:18;7393:6;7390:30;7387:56;;;7423:18;;:::i;:::-;7387:56;7461:29;7483:6;7461:29;:::i;:::-;7453:37;;7545:4;7539;7535:15;7527:23;;7249:308;;;:::o;7563:154::-;7647:6;7642:3;7637;7624:30;7709:1;7700:6;7695:3;7691:16;7684:27;7563:154;;;:::o;7723:412::-;7801:5;7826:66;7842:49;7884:6;7842:49;:::i;:::-;7826:66;:::i;:::-;7817:75;;7915:6;7908:5;7901:21;7953:4;7946:5;7942:16;7991:3;7982:6;7977:3;7973:16;7970:25;7967:112;;;7998:79;;:::i;:::-;7967:112;8088:41;8122:6;8117:3;8112;8088:41;:::i;:::-;7807:328;7723:412;;;;;:::o;8155:340::-;8211:5;8260:3;8253:4;8245:6;8241:17;8237:27;8227:122;;8268:79;;:::i;:::-;8227:122;8385:6;8372:20;8410:79;8485:3;8477:6;8470:4;8462:6;8458:17;8410:79;:::i;:::-;8401:88;;8217:278;8155:340;;;;:::o;8501:509::-;8570:6;8619:2;8607:9;8598:7;8594:23;8590:32;8587:119;;;8625:79;;:::i;:::-;8587:119;8773:1;8762:9;8758:17;8745:31;8803:18;8795:6;8792:30;8789:117;;;8825:79;;:::i;:::-;8789:117;8930:63;8985:7;8976:6;8965:9;8961:22;8930:63;:::i;:::-;8920:73;;8716:287;8501:509;;;;:::o;9016:116::-;9086:21;9101:5;9086:21;:::i;:::-;9079:5;9076:32;9066:60;;9122:1;9119;9112:12;9066:60;9016:116;:::o;9138:133::-;9181:5;9219:6;9206:20;9197:29;;9235:30;9259:5;9235:30;:::i;:::-;9138:133;;;;:::o;9277:323::-;9333:6;9382:2;9370:9;9361:7;9357:23;9353:32;9350:119;;;9388:79;;:::i;:::-;9350:119;9508:1;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9479:114;9277:323;;;;:::o;9606:329::-;9665:6;9714:2;9702:9;9693:7;9689:23;9685:32;9682:119;;;9720:79;;:::i;:::-;9682:119;9840:1;9865:53;9910:7;9901:6;9890:9;9886:22;9865:53;:::i;:::-;9855:63;;9811:117;9606:329;;;;:::o;9941:468::-;10006:6;10014;10063:2;10051:9;10042:7;10038:23;10034:32;10031:119;;;10069:79;;:::i;:::-;10031:119;10189:1;10214:53;10259:7;10250:6;10239:9;10235:22;10214:53;:::i;:::-;10204:63;;10160:117;10316:2;10342:50;10384:7;10375:6;10364:9;10360:22;10342:50;:::i;:::-;10332:60;;10287:115;9941:468;;;;;:::o;10415:307::-;10476:4;10566:18;10558:6;10555:30;10552:56;;;10588:18;;:::i;:::-;10552:56;10626:29;10648:6;10626:29;:::i;:::-;10618:37;;10710:4;10704;10700:15;10692:23;;10415:307;;;:::o;10728:410::-;10805:5;10830:65;10846:48;10887:6;10846:48;:::i;:::-;10830:65;:::i;:::-;10821:74;;10918:6;10911:5;10904:21;10956:4;10949:5;10945:16;10994:3;10985:6;10980:3;10976:16;10973:25;10970:112;;;11001:79;;:::i;:::-;10970:112;11091:41;11125:6;11120:3;11115;11091:41;:::i;:::-;10811:327;10728:410;;;;;:::o;11157:338::-;11212:5;11261:3;11254:4;11246:6;11242:17;11238:27;11228:122;;11269:79;;:::i;:::-;11228:122;11386:6;11373:20;11411:78;11485:3;11477:6;11470:4;11462:6;11458:17;11411:78;:::i;:::-;11402:87;;11218:277;11157:338;;;;:::o;11501:943::-;11596:6;11604;11612;11620;11669:3;11657:9;11648:7;11644:23;11640:33;11637:120;;;11676:79;;:::i;:::-;11637:120;11796:1;11821:53;11866:7;11857:6;11846:9;11842:22;11821:53;:::i;:::-;11811:63;;11767:117;11923:2;11949:53;11994:7;11985:6;11974:9;11970:22;11949:53;:::i;:::-;11939:63;;11894:118;12051:2;12077:53;12122:7;12113:6;12102:9;12098:22;12077:53;:::i;:::-;12067:63;;12022:118;12207:2;12196:9;12192:18;12179:32;12238:18;12230:6;12227:30;12224:117;;;12260:79;;:::i;:::-;12224:117;12365:62;12419:7;12410:6;12399:9;12395:22;12365:62;:::i;:::-;12355:72;;12150:287;11501:943;;;;;;;:::o;12450:77::-;12487:7;12516:5;12505:16;;12450:77;;;:::o;12533:122::-;12606:24;12624:5;12606:24;:::i;:::-;12599:5;12596:35;12586:63;;12645:1;12642;12635:12;12586:63;12533:122;:::o;12661:139::-;12707:5;12745:6;12732:20;12723:29;;12761:33;12788:5;12761:33;:::i;:::-;12661:139;;;;:::o;12806:329::-;12865:6;12914:2;12902:9;12893:7;12889:23;12885:32;12882:119;;;12920:79;;:::i;:::-;12882:119;13040:1;13065:53;13110:7;13101:6;13090:9;13086:22;13065:53;:::i;:::-;13055:63;;13011:117;12806:329;;;;:::o;13141:117::-;13250:1;13247;13240:12;13264:117;13373:1;13370;13363:12;13404:568;13477:8;13487:6;13537:3;13530:4;13522:6;13518:17;13514:27;13504:122;;13545:79;;:::i;:::-;13504:122;13658:6;13645:20;13635:30;;13688:18;13680:6;13677:30;13674:117;;;13710:79;;:::i;:::-;13674:117;13824:4;13816:6;13812:17;13800:29;;13878:3;13870:4;13862:6;13858:17;13848:8;13844:32;13841:41;13838:128;;;13885:79;;:::i;:::-;13838:128;13404:568;;;;;:::o;13978:559::-;14064:6;14072;14121:2;14109:9;14100:7;14096:23;14092:32;14089:119;;;14127:79;;:::i;:::-;14089:119;14275:1;14264:9;14260:17;14247:31;14305:18;14297:6;14294:30;14291:117;;;14327:79;;:::i;:::-;14291:117;14440:80;14512:7;14503:6;14492:9;14488:22;14440:80;:::i;:::-;14422:98;;;;14218:312;13978:559;;;;;:::o;14543:474::-;14611:6;14619;14668:2;14656:9;14647:7;14643:23;14639:32;14636:119;;;14674:79;;:::i;:::-;14636:119;14794:1;14819:53;14864:7;14855:6;14844:9;14840:22;14819:53;:::i;:::-;14809:63;;14765:117;14921:2;14947:53;14992:7;14983:6;14972:9;14968:22;14947:53;:::i;:::-;14937:63;;14892:118;14543:474;;;;;:::o;15023:704::-;15118:6;15126;15134;15183:2;15171:9;15162:7;15158:23;15154:32;15151:119;;;15189:79;;:::i;:::-;15151:119;15309:1;15334:53;15379:7;15370:6;15359:9;15355:22;15334:53;:::i;:::-;15324:63;;15280:117;15464:2;15453:9;15449:18;15436:32;15495:18;15487:6;15484:30;15481:117;;;15517:79;;:::i;:::-;15481:117;15630:80;15702:7;15693:6;15682:9;15678:22;15630:80;:::i;:::-;15612:98;;;;15407:313;15023:704;;;;;:::o;15733:182::-;15873:34;15869:1;15861:6;15857:14;15850:58;15733:182;:::o;15921:366::-;16063:3;16084:67;16148:2;16143:3;16084:67;:::i;:::-;16077:74;;16160:93;16249:3;16160:93;:::i;:::-;16278:2;16273:3;16269:12;16262:19;;15921:366;;;:::o;16293:419::-;16459:4;16497:2;16486:9;16482:18;16474:26;;16546:9;16540:4;16536:20;16532:1;16521:9;16517:17;16510:47;16574:131;16700:4;16574:131;:::i;:::-;16566:139;;16293:419;;;:::o;16718:180::-;16766:77;16763:1;16756:88;16863:4;16860:1;16853:15;16887:4;16884:1;16877:15;16904:233;16943:3;16966:24;16984:5;16966:24;:::i;:::-;16957:33;;17012:66;17005:5;17002:77;16999:103;;;17082:18;;:::i;:::-;16999:103;17129:1;17122:5;17118:13;17111:20;;16904:233;;;:::o;17143:180::-;17191:77;17188:1;17181:88;17288:4;17285:1;17278:15;17312:4;17309:1;17302:15;17329:320;17373:6;17410:1;17404:4;17400:12;17390:22;;17457:1;17451:4;17447:12;17478:18;17468:81;;17534:4;17526:6;17522:17;17512:27;;17468:81;17596:2;17588:6;17585:14;17565:18;17562:38;17559:84;;;17615:18;;:::i;:::-;17559:84;17380:269;17329:320;;;:::o;17655:231::-;17795:34;17791:1;17783:6;17779:14;17772:58;17864:14;17859:2;17851:6;17847:15;17840:39;17655:231;:::o;17892:366::-;18034:3;18055:67;18119:2;18114:3;18055:67;:::i;:::-;18048:74;;18131:93;18220:3;18131:93;:::i;:::-;18249:2;18244:3;18240:12;18233:19;;17892:366;;;:::o;18264:419::-;18430:4;18468:2;18457:9;18453:18;18445:26;;18517:9;18511:4;18507:20;18503:1;18492:9;18488:17;18481:47;18545:131;18671:4;18545:131;:::i;:::-;18537:139;;18264:419;;;:::o;18689:220::-;18829:34;18825:1;18817:6;18813:14;18806:58;18898:3;18893:2;18885:6;18881:15;18874:28;18689:220;:::o;18915:366::-;19057:3;19078:67;19142:2;19137:3;19078:67;:::i;:::-;19071:74;;19154:93;19243:3;19154:93;:::i;:::-;19272:2;19267:3;19263:12;19256:19;;18915:366;;;:::o;19287:419::-;19453:4;19491:2;19480:9;19476:18;19468:26;;19540:9;19534:4;19530:20;19526:1;19515:9;19511:17;19504:47;19568:131;19694:4;19568:131;:::i;:::-;19560:139;;19287:419;;;:::o;19712:243::-;19852:34;19848:1;19840:6;19836:14;19829:58;19921:26;19916:2;19908:6;19904:15;19897:51;19712:243;:::o;19961:366::-;20103:3;20124:67;20188:2;20183:3;20124:67;:::i;:::-;20117:74;;20200:93;20289:3;20200:93;:::i;:::-;20318:2;20313:3;20309:12;20302:19;;19961:366;;;:::o;20333:419::-;20499:4;20537:2;20526:9;20522:18;20514:26;;20586:9;20580:4;20576:20;20572:1;20561:9;20557:17;20550:47;20614:131;20740:4;20614:131;:::i;:::-;20606:139;;20333:419;;;:::o;20758:236::-;20898:34;20894:1;20886:6;20882:14;20875:58;20967:19;20962:2;20954:6;20950:15;20943:44;20758:236;:::o;21000:366::-;21142:3;21163:67;21227:2;21222:3;21163:67;:::i;:::-;21156:74;;21239:93;21328:3;21239:93;:::i;:::-;21357:2;21352:3;21348:12;21341:19;;21000:366;;;:::o;21372:419::-;21538:4;21576:2;21565:9;21561:18;21553:26;;21625:9;21619:4;21615:20;21611:1;21600:9;21596:17;21589:47;21653:131;21779:4;21653:131;:::i;:::-;21645:139;;21372:419;;;:::o;21797:230::-;21937:34;21933:1;21925:6;21921:14;21914:58;22006:13;22001:2;21993:6;21989:15;21982:38;21797:230;:::o;22033:366::-;22175:3;22196:67;22260:2;22255:3;22196:67;:::i;:::-;22189:74;;22272:93;22361:3;22272:93;:::i;:::-;22390:2;22385:3;22381:12;22374:19;;22033:366;;;:::o;22405:419::-;22571:4;22609:2;22598:9;22594:18;22586:26;;22658:9;22652:4;22648:20;22644:1;22633:9;22629:17;22622:47;22686:131;22812:4;22686:131;:::i;:::-;22678:139;;22405:419;;;:::o;22830:231::-;22970:34;22966:1;22958:6;22954:14;22947:58;23039:14;23034:2;23026:6;23022:15;23015:39;22830:231;:::o;23067:366::-;23209:3;23230:67;23294:2;23289:3;23230:67;:::i;:::-;23223:74;;23306:93;23395:3;23306:93;:::i;:::-;23424:2;23419:3;23415:12;23408:19;;23067:366;;;:::o;23439:419::-;23605:4;23643:2;23632:9;23628:18;23620:26;;23692:9;23686:4;23682:20;23678:1;23667:9;23663:17;23656:47;23720:131;23846:4;23720:131;:::i;:::-;23712:139;;23439:419;;;:::o;23864:180::-;23912:77;23909:1;23902:88;24009:4;24006:1;23999:15;24033:4;24030:1;24023:15;24050:228;24190:34;24186:1;24178:6;24174:14;24167:58;24259:11;24254:2;24246:6;24242:15;24235:36;24050:228;:::o;24284:366::-;24426:3;24447:67;24511:2;24506:3;24447:67;:::i;:::-;24440:74;;24523:93;24612:3;24523:93;:::i;:::-;24641:2;24636:3;24632:12;24625:19;;24284:366;;;:::o;24656:419::-;24822:4;24860:2;24849:9;24845:18;24837:26;;24909:9;24903:4;24899:20;24895:1;24884:9;24880:17;24873:47;24937:131;25063:4;24937:131;:::i;:::-;24929:139;;24656:419;;;:::o;25081:229::-;25221:34;25217:1;25209:6;25205:14;25198:58;25290:12;25285:2;25277:6;25273:15;25266:37;25081:229;:::o;25316:366::-;25458:3;25479:67;25543:2;25538:3;25479:67;:::i;:::-;25472:74;;25555:93;25644:3;25555:93;:::i;:::-;25673:2;25668:3;25664:12;25657:19;;25316:366;;;:::o;25688:419::-;25854:4;25892:2;25881:9;25877:18;25869:26;;25941:9;25935:4;25931:20;25927:1;25916:9;25912:17;25905:47;25969:131;26095:4;25969:131;:::i;:::-;25961:139;;25688:419;;;:::o;26113:177::-;26253:29;26249:1;26241:6;26237:14;26230:53;26113:177;:::o;26296:366::-;26438:3;26459:67;26523:2;26518:3;26459:67;:::i;:::-;26452:74;;26535:93;26624:3;26535:93;:::i;:::-;26653:2;26648:3;26644:12;26637:19;;26296:366;;;:::o;26668:419::-;26834:4;26872:2;26861:9;26857:18;26849:26;;26921:9;26915:4;26911:20;26907:1;26896:9;26892:17;26885:47;26949:131;27075:4;26949:131;:::i;:::-;26941:139;;26668:419;;;:::o;27093:172::-;27233:24;27229:1;27221:6;27217:14;27210:48;27093:172;:::o;27271:366::-;27413:3;27434:67;27498:2;27493:3;27434:67;:::i;:::-;27427:74;;27510:93;27599:3;27510:93;:::i;:::-;27628:2;27623:3;27619:12;27612:19;;27271:366;;;:::o;27643:419::-;27809:4;27847:2;27836:9;27832:18;27824:26;;27896:9;27890:4;27886:20;27882:1;27871:9;27867:17;27860:47;27924:131;28050:4;27924:131;:::i;:::-;27916:139;;27643:419;;;:::o;28068:174::-;28208:26;28204:1;28196:6;28192:14;28185:50;28068:174;:::o;28248:366::-;28390:3;28411:67;28475:2;28470:3;28411:67;:::i;:::-;28404:74;;28487:93;28576:3;28487:93;:::i;:::-;28605:2;28600:3;28596:12;28589:19;;28248:366;;;:::o;28620:419::-;28786:4;28824:2;28813:9;28809:18;28801:26;;28873:9;28867:4;28863:20;28859:1;28848:9;28844:17;28837:47;28901:131;29027:4;28901:131;:::i;:::-;28893:139;;28620:419;;;:::o;29045:182::-;29185:34;29181:1;29173:6;29169:14;29162:58;29045:182;:::o;29233:366::-;29375:3;29396:67;29460:2;29455:3;29396:67;:::i;:::-;29389:74;;29472:93;29561:3;29472:93;:::i;:::-;29590:2;29585:3;29581:12;29574:19;;29233:366;;;:::o;29605:419::-;29771:4;29809:2;29798:9;29794:18;29786:26;;29858:9;29852:4;29848:20;29844:1;29833:9;29829:17;29822:47;29886:131;30012:4;29886:131;:::i;:::-;29878:139;;29605:419;;;:::o;30030:231::-;30170:34;30166:1;30158:6;30154:14;30147:58;30239:14;30234:2;30226:6;30222:15;30215:39;30030:231;:::o;30267:366::-;30409:3;30430:67;30494:2;30489:3;30430:67;:::i;:::-;30423:74;;30506:93;30595:3;30506:93;:::i;:::-;30624:2;30619:3;30615:12;30608:19;;30267:366;;;:::o;30639:419::-;30805:4;30843:2;30832:9;30828:18;30820:26;;30892:9;30886:4;30882:20;30878:1;30867:9;30863:17;30856:47;30920:131;31046:4;30920:131;:::i;:::-;30912:139;;30639:419;;;:::o;31064:175::-;31204:27;31200:1;31192:6;31188:14;31181:51;31064:175;:::o;31245:366::-;31387:3;31408:67;31472:2;31467:3;31408:67;:::i;:::-;31401:74;;31484:93;31573:3;31484:93;:::i;:::-;31602:2;31597:3;31593:12;31586:19;;31245:366;;;:::o;31617:419::-;31783:4;31821:2;31810:9;31806:18;31798:26;;31870:9;31864:4;31860:20;31856:1;31845:9;31841:17;31834:47;31898:131;32024:4;31898:131;:::i;:::-;31890:139;;31617:419;;;:::o;32042:234::-;32182:34;32178:1;32170:6;32166:14;32159:58;32251:17;32246:2;32238:6;32234:15;32227:42;32042:234;:::o;32282:366::-;32424:3;32445:67;32509:2;32504:3;32445:67;:::i;:::-;32438:74;;32521:93;32610:3;32521:93;:::i;:::-;32639:2;32634:3;32630:12;32623:19;;32282:366;;;:::o;32654:419::-;32820:4;32858:2;32847:9;32843:18;32835:26;;32907:9;32901:4;32897:20;32893:1;32882:9;32878:17;32871:47;32935:131;33061:4;32935:131;:::i;:::-;32927:139;;32654:419;;;:::o;33079:148::-;33181:11;33218:3;33203:18;;33079:148;;;;:::o;33233:377::-;33339:3;33367:39;33400:5;33367:39;:::i;:::-;33422:89;33504:6;33499:3;33422:89;:::i;:::-;33415:96;;33520:52;33565:6;33560:3;33553:4;33546:5;33542:16;33520:52;:::i;:::-;33597:6;33592:3;33588:16;33581:23;;33343:267;33233:377;;;;:::o;33616:435::-;33796:3;33818:95;33909:3;33900:6;33818:95;:::i;:::-;33811:102;;33930:95;34021:3;34012:6;33930:95;:::i;:::-;33923:102;;34042:3;34035:10;;33616:435;;;;;:::o;34057:191::-;34097:4;34117:20;34135:1;34117:20;:::i;:::-;34112:25;;34151:20;34169:1;34151:20;:::i;:::-;34146:25;;34190:1;34187;34184:8;34181:34;;;34195:18;;:::i;:::-;34181:34;34240:1;34237;34233:9;34225:17;;34057:191;;;;:::o;34254:225::-;34394:34;34390:1;34382:6;34378:14;34371:58;34463:8;34458:2;34450:6;34446:15;34439:33;34254:225;:::o;34485:366::-;34627:3;34648:67;34712:2;34707:3;34648:67;:::i;:::-;34641:74;;34724:93;34813:3;34724:93;:::i;:::-;34842:2;34837:3;34833:12;34826:19;;34485:366;;;:::o;34857:419::-;35023:4;35061:2;35050:9;35046:18;35038:26;;35110:9;35104:4;35100:20;35096:1;35085:9;35081:17;35074:47;35138:131;35264:4;35138:131;:::i;:::-;35130:139;;34857:419;;;:::o;35282:177::-;35422:29;35418:1;35410:6;35406:14;35399:53;35282:177;:::o;35465:366::-;35607:3;35628:67;35692:2;35687:3;35628:67;:::i;:::-;35621:74;;35704:93;35793:3;35704:93;:::i;:::-;35822:2;35817:3;35813:12;35806:19;;35465:366;;;:::o;35837:419::-;36003:4;36041:2;36030:9;36026:18;36018:26;;36090:9;36084:4;36080:20;36076:1;36065:9;36061:17;36054:47;36118:131;36244:4;36118:131;:::i;:::-;36110:139;;35837:419;;;:::o;36262:176::-;36402:28;36398:1;36390:6;36386:14;36379:52;36262:176;:::o;36444:366::-;36586:3;36607:67;36671:2;36666:3;36607:67;:::i;:::-;36600:74;;36683:93;36772:3;36683:93;:::i;:::-;36801:2;36796:3;36792:12;36785:19;;36444:366;;;:::o;36816:419::-;36982:4;37020:2;37009:9;37005:18;36997:26;;37069:9;37063:4;37059:20;37055:1;37044:9;37040:17;37033:47;37097:131;37223:4;37097:131;:::i;:::-;37089:139;;36816:419;;;:::o;37241:228::-;37381:34;37377:1;37369:6;37365:14;37358:58;37450:11;37445:2;37437:6;37433:15;37426:36;37241:228;:::o;37475:366::-;37617:3;37638:67;37702:2;37697:3;37638:67;:::i;:::-;37631:74;;37714:93;37803:3;37714:93;:::i;:::-;37832:2;37827:3;37823:12;37816:19;;37475:366;;;:::o;37847:419::-;38013:4;38051:2;38040:9;38036:18;38028:26;;38100:9;38094:4;38090:20;38086:1;38075:9;38071:17;38064:47;38128:131;38254:4;38128:131;:::i;:::-;38120:139;;37847:419;;;:::o;38272:305::-;38312:3;38331:20;38349:1;38331:20;:::i;:::-;38326:25;;38365:20;38383:1;38365:20;:::i;:::-;38360:25;;38519:1;38451:66;38447:74;38444:1;38441:81;38438:107;;;38525:18;;:::i;:::-;38438:107;38569:1;38566;38562:9;38555:16;;38272:305;;;;:::o;38583:231::-;38723:34;38719:1;38711:6;38707:14;38700:58;38792:14;38787:2;38779:6;38775:15;38768:39;38583:231;:::o;38820:366::-;38962:3;38983:67;39047:2;39042:3;38983:67;:::i;:::-;38976:74;;39059:93;39148:3;39059:93;:::i;:::-;39177:2;39172:3;39168:12;39161:19;;38820:366;;;:::o;39192:419::-;39358:4;39396:2;39385:9;39381:18;39373:26;;39445:9;39439:4;39435:20;39431:1;39420:9;39416:17;39409:47;39473:131;39599:4;39473:131;:::i;:::-;39465:139;;39192:419;;;:::o;39617:228::-;39757:34;39753:1;39745:6;39741:14;39734:58;39826:11;39821:2;39813:6;39809:15;39802:36;39617:228;:::o;39851:366::-;39993:3;40014:67;40078:2;40073:3;40014:67;:::i;:::-;40007:74;;40090:93;40179:3;40090:93;:::i;:::-;40208:2;40203:3;40199:12;40192:19;;39851:366;;;:::o;40223:419::-;40389:4;40427:2;40416:9;40412:18;40404:26;;40476:9;40470:4;40466:20;40462:1;40451:9;40447:17;40440:47;40504:131;40630:4;40504:131;:::i;:::-;40496:139;;40223:419;;;:::o;40648:223::-;40788:34;40784:1;40776:6;40772:14;40765:58;40857:6;40852:2;40844:6;40840:15;40833:31;40648:223;:::o;40877:366::-;41019:3;41040:67;41104:2;41099:3;41040:67;:::i;:::-;41033:74;;41116:93;41205:3;41116:93;:::i;:::-;41234:2;41229:3;41225:12;41218:19;;40877:366;;;:::o;41249:419::-;41415:4;41453:2;41442:9;41438:18;41430:26;;41502:9;41496:4;41492:20;41488:1;41477:9;41473:17;41466:47;41530:131;41656:4;41530:131;:::i;:::-;41522:139;;41249:419;;;:::o;41674:179::-;41814:31;41810:1;41802:6;41798:14;41791:55;41674:179;:::o;41859:366::-;42001:3;42022:67;42086:2;42081:3;42022:67;:::i;:::-;42015:74;;42098:93;42187:3;42098:93;:::i;:::-;42216:2;42211:3;42207:12;42200:19;;41859:366;;;:::o;42231:419::-;42397:4;42435:2;42424:9;42420:18;42412:26;;42484:9;42478:4;42474:20;42470:1;42459:9;42455:17;42448:47;42512:131;42638:4;42512:131;:::i;:::-;42504:139;;42231:419;;;:::o;42656:147::-;42757:11;42794:3;42779:18;;42656:147;;;;:::o;42809:114::-;;:::o;42929:398::-;43088:3;43109:83;43190:1;43185:3;43109:83;:::i;:::-;43102:90;;43201:93;43290:3;43201:93;:::i;:::-;43319:1;43314:3;43310:11;43303:18;;42929:398;;;:::o;43333:379::-;43517:3;43539:147;43682:3;43539:147;:::i;:::-;43532:154;;43703:3;43696:10;;43333:379;;;:::o;43718:245::-;43858:34;43854:1;43846:6;43842:14;43835:58;43927:28;43922:2;43914:6;43910:15;43903:53;43718:245;:::o;43969:366::-;44111:3;44132:67;44196:2;44191:3;44132:67;:::i;:::-;44125:74;;44208:93;44297:3;44208:93;:::i;:::-;44326:2;44321:3;44317:12;44310:19;;43969:366;;;:::o;44341:419::-;44507:4;44545:2;44534:9;44530:18;44522:26;;44594:9;44588:4;44584:20;44580:1;44569:9;44565:17;44558:47;44622:131;44748:4;44622:131;:::i;:::-;44614:139;;44341:419;;;:::o;44766:348::-;44806:7;44829:20;44847:1;44829:20;:::i;:::-;44824:25;;44863:20;44881:1;44863:20;:::i;:::-;44858:25;;45051:1;44983:66;44979:74;44976:1;44973:81;44968:1;44961:9;44954:17;44950:105;44947:131;;;45058:18;;:::i;:::-;44947:131;45106:1;45103;45099:9;45088:20;;44766:348;;;;:::o;45120:237::-;45260:34;45256:1;45248:6;45244:14;45237:58;45329:20;45324:2;45316:6;45312:15;45305:45;45120:237;:::o;45363:366::-;45505:3;45526:67;45590:2;45585:3;45526:67;:::i;:::-;45519:74;;45602:93;45691:3;45602:93;:::i;:::-;45720:2;45715:3;45711:12;45704:19;;45363:366;;;:::o;45735:419::-;45901:4;45939:2;45928:9;45924:18;45916:26;;45988:9;45982:4;45978:20;45974:1;45963:9;45959:17;45952:47;46016:131;46142:4;46016:131;:::i;:::-;46008:139;;45735:419;;;:::o;46160:180::-;46208:77;46205:1;46198:88;46305:4;46302:1;46295:15;46329:4;46326:1;46319:15;46346:185;46386:1;46403:20;46421:1;46403:20;:::i;:::-;46398:25;;46437:20;46455:1;46437:20;:::i;:::-;46432:25;;46476:1;46466:35;;46481:18;;:::i;:::-;46466:35;46523:1;46520;46516:9;46511:14;;46346:185;;;;:::o;46537:176::-;46569:1;46586:20;46604:1;46586:20;:::i;:::-;46581:25;;46620:20;46638:1;46620:20;:::i;:::-;46615:25;;46659:1;46649:35;;46664:18;;:::i;:::-;46649:35;46705:1;46702;46698:9;46693:14;;46537:176;;;;:::o;46719:94::-;46752:8;46800:5;46796:2;46792:14;46771:35;;46719:94;;;:::o;46819:::-;46858:7;46887:20;46901:5;46887:20;:::i;:::-;46876:31;;46819:94;;;:::o;46919:100::-;46958:7;46987:26;47007:5;46987:26;:::i;:::-;46976:37;;46919:100;;;:::o;47025:157::-;47130:45;47150:24;47168:5;47150:24;:::i;:::-;47130:45;:::i;:::-;47125:3;47118:58;47025:157;;:::o;47188:256::-;47300:3;47315:75;47386:3;47377:6;47315:75;:::i;:::-;47415:2;47410:3;47406:12;47399:19;;47435:3;47428:10;;47188:256;;;;:::o;47450:98::-;47501:6;47535:5;47529:12;47519:22;;47450:98;;;:::o;47554:168::-;47637:11;47671:6;47666:3;47659:19;47711:4;47706:3;47702:14;47687:29;;47554:168;;;;:::o;47728:360::-;47814:3;47842:38;47874:5;47842:38;:::i;:::-;47896:70;47959:6;47954:3;47896:70;:::i;:::-;47889:77;;47975:52;48020:6;48015:3;48008:4;48001:5;47997:16;47975:52;:::i;:::-;48052:29;48074:6;48052:29;:::i;:::-;48047:3;48043:39;48036:46;;47818:270;47728:360;;;;:::o;48094:640::-;48289:4;48327:3;48316:9;48312:19;48304:27;;48341:71;48409:1;48398:9;48394:17;48385:6;48341:71;:::i;:::-;48422:72;48490:2;48479:9;48475:18;48466:6;48422:72;:::i;:::-;48504;48572:2;48561:9;48557:18;48548:6;48504:72;:::i;:::-;48623:9;48617:4;48613:20;48608:2;48597:9;48593:18;48586:48;48651:76;48722:4;48713:6;48651:76;:::i;:::-;48643:84;;48094:640;;;;;;;:::o;48740:141::-;48796:5;48827:6;48821:13;48812:22;;48843:32;48869:5;48843:32;:::i;:::-;48740:141;;;;:::o;48887:349::-;48956:6;49005:2;48993:9;48984:7;48980:23;48976:32;48973:119;;;49011:79;;:::i;:::-;48973:119;49131:1;49156:63;49211:7;49202:6;49191:9;49187:22;49156:63;:::i;:::-;49146:73;;49102:127;48887:349;;;;:::o;49242:79::-;49281:7;49310:5;49299:16;;49242:79;;;:::o;49327:157::-;49432:45;49452:24;49470:5;49452:24;:::i;:::-;49432:45;:::i;:::-;49427:3;49420:58;49327:157;;:::o;49490:397::-;49630:3;49645:75;49716:3;49707:6;49645:75;:::i;:::-;49745:2;49740:3;49736:12;49729:19;;49758:75;49829:3;49820:6;49758:75;:::i;:::-;49858:2;49853:3;49849:12;49842:19;;49878:3;49871:10;;49490:397;;;;;:::o;49893:182::-;50033:34;50029:1;50021:6;50017:14;50010:58;49893:182;:::o;50081:366::-;50223:3;50244:67;50308:2;50303:3;50244:67;:::i;:::-;50237:74;;50320:93;50409:3;50320:93;:::i;:::-;50438:2;50433:3;50429:12;50422:19;;50081:366;;;:::o;50453:419::-;50619:4;50657:2;50646:9;50642:18;50634:26;;50706:9;50700:4;50696:20;50692:1;50681:9;50677:17;50670:47;50734:131;50860:4;50734:131;:::i;:::-;50726:139;;50453:419;;;:::o;50878:178::-;51018:30;51014:1;51006:6;51002:14;50995:54;50878:178;:::o;51062:366::-;51204:3;51225:67;51289:2;51284:3;51225:67;:::i;:::-;51218:74;;51301:93;51390:3;51301:93;:::i;:::-;51419:2;51414:3;51410:12;51403:19;;51062:366;;;:::o;51434:419::-;51600:4;51638:2;51627:9;51623:18;51615:26;;51687:9;51681:4;51677:20;51673:1;51662:9;51658:17;51651:47;51715:131;51841:4;51715:131;:::i;:::-;51707:139;;51434:419;;;:::o;51859:180::-;51907:77;51904:1;51897:88;52004:4;52001:1;51994:15;52028:4;52025:1;52018:15

Swarm Source

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