ETH Price: $3,260.82 (+4.68%)
Gas: 2 Gwei

Token

MetaSyndicate (MSYN)
 

Overview

Max Total Supply

328 MSYN

Holders

159

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 MSYN
0x464132D57420c1b1fCc36F7979B1c5126a13A9C5
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MetasyndicateNft

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @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();
    }
}

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

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

// File: contracts/Metasyndicate.sol


pragma solidity ^0.8.0;





contract MetasyndicateNft is ERC721Enumerable, Ownable {

    uint public MAX_TOKENS = 7777;
    uint public MAX_PRIVATE_TOKENS = 777;
    uint public MAX_PRESALE_TOKENS = 1777;
    uint public MAX_RESERVED_TOKENS = 446;

    uint public privateSupply;
    uint public presaleSupply;
    uint public reservedSupply;

    string private _baseURIextended;
    bool public publicIsActive = false;
    bool public presaleIsActive = false;
    bool public privateIsActive = true;
    bool public merkleWhitelist = true;

    uint public publicMaxTokenPurchase = 20;
    
    uint256 public publicPrice = 200000000000000000; //0.2
    uint256 public presalePrice = 150000000000000000; //0.15
    uint256 public privatePrice = 100000000000000000; //0.1

    bytes32 public PRESALE_MERKLE_ROOT = "";
    
    constructor() ERC721("MetaSyndicate", "MSYN") {

    }

    function publicMint(uint numberOfTokens) public payable {
        require(publicIsActive, "Public sale must be active to mint NFTs");
        require(numberOfTokens <= publicMaxTokenPurchase, "Exceeded the max token purchase");
        require(publicPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS - MAX_RESERVED_TOKENS, "Purchase would exceed max supply of tokens");
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + 1;
            _safeMint(msg.sender, mintIndex);
        }
    }

    function presaleMint(bytes32[] calldata _merkleProof, uint numberOfTokens) public payable {
        require(presaleIsActive, "Presale sale must be active to mint NFTs");
        require(numberOfTokens <= publicMaxTokenPurchase, "Exceeded max token purchase");
        require(presalePrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS - MAX_RESERVED_TOKENS, "Purchase would exceed max supply of total tokens");
        require(presaleSupply + numberOfTokens <= MAX_PRESALE_TOKENS, "Purchase would exceed max supply of presale tokens");

        if (merkleWhitelist) {
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, PRESALE_MERKLE_ROOT, leaf), "Invalid Proof");
        }

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + 1;
            presaleSupply = presaleSupply + 1;
            _safeMint(msg.sender, mintIndex);
        }
    }

    function privateMint(uint numberOfTokens) public payable {
        require(privateIsActive, "Private sale must be active to mint NFTs");
        require(privatePrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        require(privateSupply + numberOfTokens <= MAX_PRIVATE_TOKENS, "Purchase would exceed max supply of tokens");
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + 1;
            privateSupply = privateSupply + 1;
            _safeMint(msg.sender, mintIndex);
        }
    }

    function airdropNft(address userAddress, uint numberOfTokens) public onlyOwner {
        require(reservedSupply + numberOfTokens <= MAX_RESERVED_TOKENS, "Purchase would exceed max supply of total tokens");
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + 1;
            reservedSupply = reservedSupply + 1;
            _safeMint(userAddress, mintIndex);
        }
    }

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

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

    function flipPublicMintState() public onlyOwner {
        publicIsActive = !publicIsActive;
    }

    function flipPresaleMintState() public onlyOwner {
        presaleIsActive = !presaleIsActive;
    }

    function flipPrivateMintState() public onlyOwner {
        privateIsActive = !privateIsActive;
    }

    function flipMerkleState() public onlyOwner {
        merkleWhitelist = !merkleWhitelist;
    }

    function changePresaleMerkleRoot(bytes32 presaleMerkleRoot) public onlyOwner {
        PRESALE_MERKLE_ROOT = presaleMerkleRoot;
    }

    function getHolderTokens(address _owner) public view virtual returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }
}

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_PRESALE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRIVATE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdropNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"presaleMerkleRoot","type":"bytes32"}],"name":"changePresaleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMerkleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPrivateMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicMintState","outputs":[],"stateMutability":"nonpayable","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"}],"name":"getHolderTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"privatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedSupply","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","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"}]

6080604052611e61600b55610309600c556106f1600d556101be600e556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506001601360026101000a81548160ff0219169083151502179055506001601360036101000a81548160ff021916908315150217905550601480556702c68af0bb140000601555670214e8348c4f000060165567016345785d8a00006017556000601855348015620000c257600080fd5b506040518060400160405280600d81526020017f4d65746153796e646963617465000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d53594e0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200014792919062000257565b5080600190805190602001906200016092919062000257565b50505062000183620001776200018960201b60201c565b6200019160201b60201c565b6200036c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002659062000307565b90600052602060002090601f016020900481019282620002895760008555620002d5565b82601f10620002a457805160ff1916838001178555620002d5565b82800160010185558215620002d5579182015b82811115620002d4578251825591602001919060010190620002b7565b5b509050620002e49190620002e8565b5090565b5b8082111562000303576000816000905550600101620002e9565b5090565b600060028204905060018216806200032057607f821691505b602082108114156200033757620003366200033d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614fbe806200037c6000396000f3fe6080604052600436106102875760003560e01c8063715018a61161015a578063abfe40a8116100c1578063e985e9c51161007a578063e985e9c51461096d578063f2fde38b146109aa578063f323ad11146109d3578063f47c84c5146109fe578063f931a4c214610a29578063fde5f54814610a4057610287565b8063abfe40a814610858578063b3a196e914610874578063b88d4fde1461089f578063c87b56dd146108c8578063d5133bad14610905578063e547e6931461093057610287565b806399c89e811161011357806399c89e8114610780578063a051ead414610797578063a22cb465146107c2578063a68aa967146107eb578063a8d826c414610802578063a945bf801461082d57610287565b8063715018a614610696578063853d2eea146106ad57806387c0568b146106d65780638da5cb5b1461070157806394813a541461072c57806395d89b411461075557610287565b80632f745c59116101fe5780634f6ccce7116101b75780634f6ccce71461057457806355f804b3146105b157806356bd182d146105da5780636352211e14610605578063702f2a071461064257806370a082311461065957610287565b80632f745c591461047657806330f72cd4146104b357806336095bd1146104de5780633ccfd60b1461050957806342842e0e1461052057806344d19d2b1461054957610287565b8063081812fc11610250578063081812fc14610375578063095ea7b3146103b257806318160ddd146103db57806323b872dd1461040657806329dc72051461042f5780632db115441461045a57610287565b80620e7fa81461028c57806301ffc9a7146102b7578063033a02d6146102f457806306fdde031461031f57806307ce48971461034a575b600080fd5b34801561029857600080fd5b506102a1610a5c565b6040516102ae9190614a64565b60405180910390f35b3480156102c357600080fd5b506102de60048036038101906102d99190613952565b610a62565b6040516102eb919061468c565b60405180910390f35b34801561030057600080fd5b50610309610adc565b604051610316919061468c565b60405180910390f35b34801561032b57600080fd5b50610334610aef565b60405161034191906146c2565b60405180910390f35b34801561035657600080fd5b5061035f610b81565b60405161036c919061468c565b60405180910390f35b34801561038157600080fd5b5061039c600480360381019061039791906139e5565b610b94565b6040516103a99190614603565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190613895565b610c19565b005b3480156103e757600080fd5b506103f0610d31565b6040516103fd9190614a64565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061378f565b610d3e565b005b34801561043b57600080fd5b50610444610d9e565b6040516104519190614a64565b60405180910390f35b610474600480360381019061046f91906139e5565b610da4565b005b34801561048257600080fd5b5061049d60048036038101906104989190613895565b610f31565b6040516104aa9190614a64565b60405180910390f35b3480156104bf57600080fd5b506104c8610fd6565b6040516104d5919061468c565b60405180910390f35b3480156104ea57600080fd5b506104f3610fe9565b604051610500919061468c565b60405180910390f35b34801561051557600080fd5b5061051e610ffc565b005b34801561052c57600080fd5b506105476004803603810190610542919061378f565b6110c1565b005b34801561055557600080fd5b5061055e6110e1565b60405161056b9190614a64565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906139e5565b6110e7565b6040516105a89190614a64565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906139a4565b61117e565b005b3480156105e657600080fd5b506105ef611214565b6040516105fc9190614a64565b60405180910390f35b34801561061157600080fd5b5061062c600480360381019061062791906139e5565b61121a565b6040516106399190614603565b60405180910390f35b34801561064e57600080fd5b506106576112cc565b005b34801561066557600080fd5b50610680600480360381019061067b919061372a565b611374565b60405161068d9190614a64565b60405180910390f35b3480156106a257600080fd5b506106ab61142c565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613929565b6114b4565b005b3480156106e257600080fd5b506106eb61153a565b6040516106f89190614a64565b60405180910390f35b34801561070d57600080fd5b50610716611540565b6040516107239190614603565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613895565b61156a565b005b34801561076157600080fd5b5061076a611693565b60405161077791906146c2565b60405180910390f35b34801561078c57600080fd5b50610795611725565b005b3480156107a357600080fd5b506107ac6117cd565b6040516107b991906146a7565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e49190613859565b6117d3565b005b3480156107f757600080fd5b506108006117e9565b005b34801561080e57600080fd5b50610817611891565b6040516108249190614a64565b60405180910390f35b34801561083957600080fd5b50610842611897565b60405161084f9190614a64565b60405180910390f35b610872600480360381019061086d91906139e5565b61189d565b005b34801561088057600080fd5b506108896119e8565b6040516108969190614a64565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c191906137de565b6119ee565b005b3480156108d457600080fd5b506108ef60048036038101906108ea91906139e5565b611a50565b6040516108fc91906146c2565b60405180910390f35b34801561091157600080fd5b5061091a611af7565b6040516109279190614a64565b60405180910390f35b34801561093c57600080fd5b506109576004803603810190610952919061372a565b611afd565b604051610964919061466a565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f9190613753565b611bf7565b6040516109a1919061468c565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc919061372a565b611c8b565b005b3480156109df57600080fd5b506109e8611d83565b6040516109f59190614a64565b60405180910390f35b348015610a0a57600080fd5b50610a13611d89565b604051610a209190614a64565b60405180910390f35b348015610a3557600080fd5b50610a3e611d8f565b005b610a5a6004803603810190610a5591906138d1565b611e37565b005b60165481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad55750610ad4826120fc565b5b9050919050565b601360009054906101000a900460ff1681565b606060008054610afe90614d61565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2a90614d61565b8015610b775780601f10610b4c57610100808354040283529160200191610b77565b820191906000526020600020905b815481529060010190602001808311610b5a57829003601f168201915b5050505050905090565b601360039054906101000a900460ff1681565b6000610b9f826121de565b610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd590614924565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c248261121a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c906149c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb461224a565b73ffffffffffffffffffffffffffffffffffffffff161480610ce35750610ce281610cdd61224a565b611bf7565b5b610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1990614864565b60405180910390fd5b610d2c8383612252565b505050565b6000600880549050905090565b610d4f610d4961224a565b8261230b565b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590614a04565b60405180910390fd5b610d998383836123e9565b505050565b600d5481565b601360009054906101000a900460ff16610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906146e4565b60405180910390fd5b601454811115610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f906148c4565b60405180910390fd5b3481601554610e479190614c13565b1115610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90614804565b60405180910390fd5b600e54600b54610e989190614c6d565b81610ea1610d31565b610eab9190614b8c565b1115610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906148e4565b60405180910390fd5b60005b81811015610f2d5760006001610f03610d31565b610f0d9190614b8c565b9050610f193382612645565b508080610f2590614d93565b915050610eef565b5050565b6000610f3c83611374565b8210610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614744565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601360019054906101000a900460ff1681565b601360029054906101000a900460ff1681565b61100461224a565b73ffffffffffffffffffffffffffffffffffffffff16611022611540565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90614944565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110be573d6000803e3d6000fd5b50565b6110dc838383604051806020016040528060008152506119ee565b505050565b60115481565b60006110f1610d31565b8210611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614a24565b60405180910390fd5b6008828154811061116c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61118661224a565b73ffffffffffffffffffffffffffffffffffffffff166111a4611540565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614944565b60405180910390fd5b80601290805190602001906112109291906134ef565b5050565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906148a4565b60405180910390fd5b80915050919050565b6112d461224a565b73ffffffffffffffffffffffffffffffffffffffff166112f2611540565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90614944565b60405180910390fd5b601360039054906101000a900460ff1615601360036101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90614884565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61143461224a565b73ffffffffffffffffffffffffffffffffffffffff16611452611540565b73ffffffffffffffffffffffffffffffffffffffff16146114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90614944565b60405180910390fd5b6114b26000612663565b565b6114bc61224a565b73ffffffffffffffffffffffffffffffffffffffff166114da611540565b73ffffffffffffffffffffffffffffffffffffffff1614611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790614944565b60405180910390fd5b8060188190555050565b60175481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61157261224a565b73ffffffffffffffffffffffffffffffffffffffff16611590611540565b73ffffffffffffffffffffffffffffffffffffffff16146115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614944565b60405180910390fd5b600e54816011546115f79190614b8c565b1115611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90614704565b60405180910390fd5b60005b8181101561168e576000600161164f610d31565b6116599190614b8c565b9050600160115461166a9190614b8c565b60118190555061167a8482612645565b50808061168690614d93565b91505061163b565b505050565b6060600180546116a290614d61565b80601f01602080910402602001604051908101604052809291908181526020018280546116ce90614d61565b801561171b5780601f106116f05761010080835404028352916020019161171b565b820191906000526020600020905b8154815290600101906020018083116116fe57829003601f168201915b5050505050905090565b61172d61224a565b73ffffffffffffffffffffffffffffffffffffffff1661174b611540565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890614944565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60185481565b6117e56117de61224a565b8383612729565b5050565b6117f161224a565b73ffffffffffffffffffffffffffffffffffffffff1661180f611540565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90614944565b60405180910390fd5b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b600e5481565b60155481565b601360029054906101000a900460ff166118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390614724565b60405180910390fd5b34816017546118fb9190614c13565b111561193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614804565b60405180910390fd5b600c5481600f5461194d9190614b8c565b111561198e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611985906148e4565b60405180910390fd5b60005b818110156119e457600060016119a5610d31565b6119af9190614b8c565b90506001600f546119c09190614b8c565b600f819055506119d03382612645565b5080806119dc90614d93565b915050611991565b5050565b60105481565b6119ff6119f961224a565b8361230b565b611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614a04565b60405180910390fd5b611a4a84848484612896565b50505050565b6060611a5b826121de565b611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614984565b60405180910390fd5b6000611aa46128f2565b90506000815111611ac45760405180602001604052806000815250611aef565b80611ace84612984565b604051602001611adf9291906145df565b6040516020818303038152906040525b915050919050565b60145481565b60606000611b0a83611374565b905060008167ffffffffffffffff811115611b4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b7c5781602001602082028036833780820191505090505b50905060005b82811015611bec57611b948582610f31565b828281518110611bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611be490614d93565b915050611b82565b508092505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9361224a565b73ffffffffffffffffffffffffffffffffffffffff16611cb1611540565b73ffffffffffffffffffffffffffffffffffffffff1614611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90614944565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e90614784565b60405180910390fd5b611d8081612663565b50565b600c5481565b600b5481565b611d9761224a565b73ffffffffffffffffffffffffffffffffffffffff16611db5611540565b73ffffffffffffffffffffffffffffffffffffffff1614611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290614944565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b601360019054906101000a900460ff16611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d906149a4565b60405180910390fd5b601454811115611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec2906149e4565b60405180910390fd5b3481601654611eda9190614c13565b1115611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1290614804565b60405180910390fd5b600e54600b54611f2b9190614c6d565b81611f34610d31565b611f3e9190614b8c565b1115611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614704565b60405180910390fd5b600d5481601054611f909190614b8c565b1115611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890614844565b60405180910390fd5b601360039054906101000a900460ff16156120a057600033604051602001611ff99190614598565b60405160208183030381529060405280519060200120905061205f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060185483612b31565b61209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209590614a44565b60405180910390fd5b505b60005b818110156120f657600060016120b7610d31565b6120c19190614b8c565b905060016010546120d29190614b8c565b6010819055506120e23382612645565b5080806120ee90614d93565b9150506120a3565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121c757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121d757506121d682612b48565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c58361121a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612316826121de565b612355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234c90614824565b60405180910390fd5b60006123608361121a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123cf57508373ffffffffffffffffffffffffffffffffffffffff166123b784610b94565b73ffffffffffffffffffffffffffffffffffffffff16145b806123e057506123df8185611bf7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124098261121a565b73ffffffffffffffffffffffffffffffffffffffff161461245f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245690614964565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c6906147c4565b60405180910390fd5b6124da838383612bb2565b6124e5600082612252565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125359190614c6d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258c9190614b8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61265f828260405180602001604052806000815250612cc6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278f906147e4565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612889919061468c565b60405180910390a3505050565b6128a18484846123e9565b6128ad84848484612d21565b6128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e390614764565b60405180910390fd5b50505050565b60606012805461290190614d61565b80601f016020809104026020016040519081016040528092919081815260200182805461292d90614d61565b801561297a5780601f1061294f5761010080835404028352916020019161297a565b820191906000526020600020905b81548152906001019060200180831161295d57829003601f168201915b5050505050905090565b606060008214156129cc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b2c565b600082905060005b600082146129fe5780806129e790614d93565b915050600a826129f79190614be2565b91506129d4565b60008167ffffffffffffffff811115612a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a725781602001600182028036833780820191505090505b5090505b60008514612b2557600182612a8b9190614c6d565b9150600a85612a9a9190614e0a565b6030612aa69190614b8c565b60f81b818381518110612ae2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1e9190614be2565b9450612a76565b8093505050505b919050565b600082612b3e8584612eb8565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bbd838383612f91565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c0057612bfb81612f96565b612c3f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c3e57612c3d8382612fdf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c8257612c7d8161314c565b612cc1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cc057612cbf828261328f565b5b5b505050565b612cd0838361330e565b612cdd6000848484612d21565b612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1390614764565b60405180910390fd5b505050565b6000612d428473ffffffffffffffffffffffffffffffffffffffff166134dc565b15612eab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6b61224a565b8786866040518563ffffffff1660e01b8152600401612d8d949392919061461e565b602060405180830381600087803b158015612da757600080fd5b505af1925050508015612dd857506040513d601f19601f82011682018060405250810190612dd5919061397b565b60015b612e5b573d8060008114612e08576040519150601f19603f3d011682016040523d82523d6000602084013e612e0d565b606091505b50600081511415612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90614764565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eb0565b600190505b949350505050565b60008082905060005b8451811015612f86576000858281518110612f05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612f46578281604051602001612f299291906145b3565b604051602081830303815290604052805190602001209250612f72565b8083604051602001612f599291906145b3565b6040516020818303038152906040528051906020012092505b508080612f7e90614d93565b915050612ec1565b508091505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fec84611374565b612ff69190614c6d565b90506000600760008481526020019081526020016000205490508181146130db576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131609190614c6d565b90506000600960008481526020019081526020016000205490506000600883815481106131b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106131fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613273577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061329a83611374565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590614904565b60405180910390fd5b613387816121de565b156133c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133be906147a4565b60405180910390fd5b6133d360008383612bb2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134239190614b8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546134fb90614d61565b90600052602060002090601f01602090048101928261351d5760008555613564565b82601f1061353657805160ff1916838001178555613564565b82800160010185558215613564579182015b82811115613563578251825591602001919060010190613548565b5b5090506135719190613575565b5090565b5b8082111561358e576000816000905550600101613576565b5090565b60006135a56135a084614ab0565b614a7f565b9050828152602081018484840111156135bd57600080fd5b6135c8848285614d1f565b509392505050565b60006135e36135de84614ae0565b614a7f565b9050828152602081018484840111156135fb57600080fd5b613606848285614d1f565b509392505050565b60008135905061361d81614f15565b92915050565b60008083601f84011261363557600080fd5b8235905067ffffffffffffffff81111561364e57600080fd5b60208301915083602082028301111561366657600080fd5b9250929050565b60008135905061367c81614f2c565b92915050565b60008135905061369181614f43565b92915050565b6000813590506136a681614f5a565b92915050565b6000815190506136bb81614f5a565b92915050565b600082601f8301126136d257600080fd5b81356136e2848260208601613592565b91505092915050565b600082601f8301126136fc57600080fd5b813561370c8482602086016135d0565b91505092915050565b60008135905061372481614f71565b92915050565b60006020828403121561373c57600080fd5b600061374a8482850161360e565b91505092915050565b6000806040838503121561376657600080fd5b60006137748582860161360e565b92505060206137858582860161360e565b9150509250929050565b6000806000606084860312156137a457600080fd5b60006137b28682870161360e565b93505060206137c38682870161360e565b92505060406137d486828701613715565b9150509250925092565b600080600080608085870312156137f457600080fd5b60006138028782880161360e565b94505060206138138782880161360e565b935050604061382487828801613715565b925050606085013567ffffffffffffffff81111561384157600080fd5b61384d878288016136c1565b91505092959194509250565b6000806040838503121561386c57600080fd5b600061387a8582860161360e565b925050602061388b8582860161366d565b9150509250929050565b600080604083850312156138a857600080fd5b60006138b68582860161360e565b92505060206138c785828601613715565b9150509250929050565b6000806000604084860312156138e657600080fd5b600084013567ffffffffffffffff81111561390057600080fd5b61390c86828701613623565b9350935050602061391f86828701613715565b9150509250925092565b60006020828403121561393b57600080fd5b600061394984828501613682565b91505092915050565b60006020828403121561396457600080fd5b600061397284828501613697565b91505092915050565b60006020828403121561398d57600080fd5b600061399b848285016136ac565b91505092915050565b6000602082840312156139b657600080fd5b600082013567ffffffffffffffff8111156139d057600080fd5b6139dc848285016136eb565b91505092915050565b6000602082840312156139f757600080fd5b6000613a0584828501613715565b91505092915050565b6000613a1a838361457a565b60208301905092915050565b613a2f81614ca1565b82525050565b613a46613a4182614ca1565b614ddc565b82525050565b6000613a5782614b20565b613a618185614b4e565b9350613a6c83614b10565b8060005b83811015613a9d578151613a848882613a0e565b9750613a8f83614b41565b925050600181019050613a70565b5085935050505092915050565b613ab381614cb3565b82525050565b613ac281614cbf565b82525050565b613ad9613ad482614cbf565b614dee565b82525050565b6000613aea82614b2b565b613af48185614b5f565b9350613b04818560208601614d2e565b613b0d81614ef7565b840191505092915050565b6000613b2382614b36565b613b2d8185614b70565b9350613b3d818560208601614d2e565b613b4681614ef7565b840191505092915050565b6000613b5c82614b36565b613b668185614b81565b9350613b76818560208601614d2e565b80840191505092915050565b6000613b8f602783614b70565b91507f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008301527f6e74204e465473000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bf5603083614b70565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f74616c20746f6b656e73000000000000000000000000000000006020830152604082019050919050565b6000613c5b602883614b70565b91507f507269766174652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cc1602b83614b70565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d27603283614b70565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d8d602683614b70565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613df3601c83614b70565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e33602483614b70565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e99601983614b70565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613ed9601f83614b70565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613f19602c83614b70565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f7f603283614b70565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662070726573616c6520746f6b656e7300000000000000000000000000006020830152604082019050919050565b6000613fe5603883614b70565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061404b602a83614b70565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b1602983614b70565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614117601f83614b70565b91507f457863656564656420746865206d617820746f6b656e207075726368617365006000830152602082019050919050565b6000614157602a83614b70565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006141bd602083614b70565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006141fd602c83614b70565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614263602083614b70565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006142a3602983614b70565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614309602f83614b70565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061436f602883614b70565b91507f50726573616c652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d5602183614b70565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061443b601b83614b70565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b600061447b603183614b70565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144e1602c83614b70565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614547600d83614b70565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b61458381614d15565b82525050565b61459281614d15565b82525050565b60006145a48284613a35565b60148201915081905092915050565b60006145bf8285613ac8565b6020820191506145cf8284613ac8565b6020820191508190509392505050565b60006145eb8285613b51565b91506145f78284613b51565b91508190509392505050565b60006020820190506146186000830184613a26565b92915050565b60006080820190506146336000830187613a26565b6146406020830186613a26565b61464d6040830185614589565b818103606083015261465f8184613adf565b905095945050505050565b600060208201905081810360008301526146848184613a4c565b905092915050565b60006020820190506146a16000830184613aaa565b92915050565b60006020820190506146bc6000830184613ab9565b92915050565b600060208201905081810360008301526146dc8184613b18565b905092915050565b600060208201905081810360008301526146fd81613b82565b9050919050565b6000602082019050818103600083015261471d81613be8565b9050919050565b6000602082019050818103600083015261473d81613c4e565b9050919050565b6000602082019050818103600083015261475d81613cb4565b9050919050565b6000602082019050818103600083015261477d81613d1a565b9050919050565b6000602082019050818103600083015261479d81613d80565b9050919050565b600060208201905081810360008301526147bd81613de6565b9050919050565b600060208201905081810360008301526147dd81613e26565b9050919050565b600060208201905081810360008301526147fd81613e8c565b9050919050565b6000602082019050818103600083015261481d81613ecc565b9050919050565b6000602082019050818103600083015261483d81613f0c565b9050919050565b6000602082019050818103600083015261485d81613f72565b9050919050565b6000602082019050818103600083015261487d81613fd8565b9050919050565b6000602082019050818103600083015261489d8161403e565b9050919050565b600060208201905081810360008301526148bd816140a4565b9050919050565b600060208201905081810360008301526148dd8161410a565b9050919050565b600060208201905081810360008301526148fd8161414a565b9050919050565b6000602082019050818103600083015261491d816141b0565b9050919050565b6000602082019050818103600083015261493d816141f0565b9050919050565b6000602082019050818103600083015261495d81614256565b9050919050565b6000602082019050818103600083015261497d81614296565b9050919050565b6000602082019050818103600083015261499d816142fc565b9050919050565b600060208201905081810360008301526149bd81614362565b9050919050565b600060208201905081810360008301526149dd816143c8565b9050919050565b600060208201905081810360008301526149fd8161442e565b9050919050565b60006020820190508181036000830152614a1d8161446e565b9050919050565b60006020820190508181036000830152614a3d816144d4565b9050919050565b60006020820190508181036000830152614a5d8161453a565b9050919050565b6000602082019050614a796000830184614589565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614aa657614aa5614ec8565b5b8060405250919050565b600067ffffffffffffffff821115614acb57614aca614ec8565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614afb57614afa614ec8565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b9782614d15565b9150614ba283614d15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bd757614bd6614e3b565b5b828201905092915050565b6000614bed82614d15565b9150614bf883614d15565b925082614c0857614c07614e6a565b5b828204905092915050565b6000614c1e82614d15565b9150614c2983614d15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c6257614c61614e3b565b5b828202905092915050565b6000614c7882614d15565b9150614c8383614d15565b925082821015614c9657614c95614e3b565b5b828203905092915050565b6000614cac82614cf5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d4c578082015181840152602081019050614d31565b83811115614d5b576000848401525b50505050565b60006002820490506001821680614d7957607f821691505b60208210811415614d8d57614d8c614e99565b5b50919050565b6000614d9e82614d15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dd157614dd0614e3b565b5b600182019050919050565b6000614de782614df8565b9050919050565b6000819050919050565b6000614e0382614f08565b9050919050565b6000614e1582614d15565b9150614e2083614d15565b925082614e3057614e2f614e6a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614f1e81614ca1565b8114614f2957600080fd5b50565b614f3581614cb3565b8114614f4057600080fd5b50565b614f4c81614cbf565b8114614f5757600080fd5b50565b614f6381614cc9565b8114614f6e57600080fd5b50565b614f7a81614d15565b8114614f8557600080fd5b5056fea26469706673582212201eacb840ae44f1d0c0c291f83e99a0784c42726485f3e9a42b89cfa7131ddc5c64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102875760003560e01c8063715018a61161015a578063abfe40a8116100c1578063e985e9c51161007a578063e985e9c51461096d578063f2fde38b146109aa578063f323ad11146109d3578063f47c84c5146109fe578063f931a4c214610a29578063fde5f54814610a4057610287565b8063abfe40a814610858578063b3a196e914610874578063b88d4fde1461089f578063c87b56dd146108c8578063d5133bad14610905578063e547e6931461093057610287565b806399c89e811161011357806399c89e8114610780578063a051ead414610797578063a22cb465146107c2578063a68aa967146107eb578063a8d826c414610802578063a945bf801461082d57610287565b8063715018a614610696578063853d2eea146106ad57806387c0568b146106d65780638da5cb5b1461070157806394813a541461072c57806395d89b411461075557610287565b80632f745c59116101fe5780634f6ccce7116101b75780634f6ccce71461057457806355f804b3146105b157806356bd182d146105da5780636352211e14610605578063702f2a071461064257806370a082311461065957610287565b80632f745c591461047657806330f72cd4146104b357806336095bd1146104de5780633ccfd60b1461050957806342842e0e1461052057806344d19d2b1461054957610287565b8063081812fc11610250578063081812fc14610375578063095ea7b3146103b257806318160ddd146103db57806323b872dd1461040657806329dc72051461042f5780632db115441461045a57610287565b80620e7fa81461028c57806301ffc9a7146102b7578063033a02d6146102f457806306fdde031461031f57806307ce48971461034a575b600080fd5b34801561029857600080fd5b506102a1610a5c565b6040516102ae9190614a64565b60405180910390f35b3480156102c357600080fd5b506102de60048036038101906102d99190613952565b610a62565b6040516102eb919061468c565b60405180910390f35b34801561030057600080fd5b50610309610adc565b604051610316919061468c565b60405180910390f35b34801561032b57600080fd5b50610334610aef565b60405161034191906146c2565b60405180910390f35b34801561035657600080fd5b5061035f610b81565b60405161036c919061468c565b60405180910390f35b34801561038157600080fd5b5061039c600480360381019061039791906139e5565b610b94565b6040516103a99190614603565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d49190613895565b610c19565b005b3480156103e757600080fd5b506103f0610d31565b6040516103fd9190614a64565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061378f565b610d3e565b005b34801561043b57600080fd5b50610444610d9e565b6040516104519190614a64565b60405180910390f35b610474600480360381019061046f91906139e5565b610da4565b005b34801561048257600080fd5b5061049d60048036038101906104989190613895565b610f31565b6040516104aa9190614a64565b60405180910390f35b3480156104bf57600080fd5b506104c8610fd6565b6040516104d5919061468c565b60405180910390f35b3480156104ea57600080fd5b506104f3610fe9565b604051610500919061468c565b60405180910390f35b34801561051557600080fd5b5061051e610ffc565b005b34801561052c57600080fd5b506105476004803603810190610542919061378f565b6110c1565b005b34801561055557600080fd5b5061055e6110e1565b60405161056b9190614a64565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906139e5565b6110e7565b6040516105a89190614a64565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906139a4565b61117e565b005b3480156105e657600080fd5b506105ef611214565b6040516105fc9190614a64565b60405180910390f35b34801561061157600080fd5b5061062c600480360381019061062791906139e5565b61121a565b6040516106399190614603565b60405180910390f35b34801561064e57600080fd5b506106576112cc565b005b34801561066557600080fd5b50610680600480360381019061067b919061372a565b611374565b60405161068d9190614a64565b60405180910390f35b3480156106a257600080fd5b506106ab61142c565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613929565b6114b4565b005b3480156106e257600080fd5b506106eb61153a565b6040516106f89190614a64565b60405180910390f35b34801561070d57600080fd5b50610716611540565b6040516107239190614603565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613895565b61156a565b005b34801561076157600080fd5b5061076a611693565b60405161077791906146c2565b60405180910390f35b34801561078c57600080fd5b50610795611725565b005b3480156107a357600080fd5b506107ac6117cd565b6040516107b991906146a7565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e49190613859565b6117d3565b005b3480156107f757600080fd5b506108006117e9565b005b34801561080e57600080fd5b50610817611891565b6040516108249190614a64565b60405180910390f35b34801561083957600080fd5b50610842611897565b60405161084f9190614a64565b60405180910390f35b610872600480360381019061086d91906139e5565b61189d565b005b34801561088057600080fd5b506108896119e8565b6040516108969190614a64565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c191906137de565b6119ee565b005b3480156108d457600080fd5b506108ef60048036038101906108ea91906139e5565b611a50565b6040516108fc91906146c2565b60405180910390f35b34801561091157600080fd5b5061091a611af7565b6040516109279190614a64565b60405180910390f35b34801561093c57600080fd5b506109576004803603810190610952919061372a565b611afd565b604051610964919061466a565b60405180910390f35b34801561097957600080fd5b50610994600480360381019061098f9190613753565b611bf7565b6040516109a1919061468c565b60405180910390f35b3480156109b657600080fd5b506109d160048036038101906109cc919061372a565b611c8b565b005b3480156109df57600080fd5b506109e8611d83565b6040516109f59190614a64565b60405180910390f35b348015610a0a57600080fd5b50610a13611d89565b604051610a209190614a64565b60405180910390f35b348015610a3557600080fd5b50610a3e611d8f565b005b610a5a6004803603810190610a5591906138d1565b611e37565b005b60165481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad55750610ad4826120fc565b5b9050919050565b601360009054906101000a900460ff1681565b606060008054610afe90614d61565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2a90614d61565b8015610b775780601f10610b4c57610100808354040283529160200191610b77565b820191906000526020600020905b815481529060010190602001808311610b5a57829003601f168201915b5050505050905090565b601360039054906101000a900460ff1681565b6000610b9f826121de565b610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd590614924565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c248261121a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c906149c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb461224a565b73ffffffffffffffffffffffffffffffffffffffff161480610ce35750610ce281610cdd61224a565b611bf7565b5b610d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1990614864565b60405180910390fd5b610d2c8383612252565b505050565b6000600880549050905090565b610d4f610d4961224a565b8261230b565b610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8590614a04565b60405180910390fd5b610d998383836123e9565b505050565b600d5481565b601360009054906101000a900460ff16610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906146e4565b60405180910390fd5b601454811115610e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2f906148c4565b60405180910390fd5b3481601554610e479190614c13565b1115610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90614804565b60405180910390fd5b600e54600b54610e989190614c6d565b81610ea1610d31565b610eab9190614b8c565b1115610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906148e4565b60405180910390fd5b60005b81811015610f2d5760006001610f03610d31565b610f0d9190614b8c565b9050610f193382612645565b508080610f2590614d93565b915050610eef565b5050565b6000610f3c83611374565b8210610f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7490614744565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601360019054906101000a900460ff1681565b601360029054906101000a900460ff1681565b61100461224a565b73ffffffffffffffffffffffffffffffffffffffff16611022611540565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90614944565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110be573d6000803e3d6000fd5b50565b6110dc838383604051806020016040528060008152506119ee565b505050565b60115481565b60006110f1610d31565b8210611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614a24565b60405180910390fd5b6008828154811061116c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61118661224a565b73ffffffffffffffffffffffffffffffffffffffff166111a4611540565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614944565b60405180910390fd5b80601290805190602001906112109291906134ef565b5050565b600f5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba906148a4565b60405180910390fd5b80915050919050565b6112d461224a565b73ffffffffffffffffffffffffffffffffffffffff166112f2611540565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90614944565b60405180910390fd5b601360039054906101000a900460ff1615601360036101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dc90614884565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61143461224a565b73ffffffffffffffffffffffffffffffffffffffff16611452611540565b73ffffffffffffffffffffffffffffffffffffffff16146114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90614944565b60405180910390fd5b6114b26000612663565b565b6114bc61224a565b73ffffffffffffffffffffffffffffffffffffffff166114da611540565b73ffffffffffffffffffffffffffffffffffffffff1614611530576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152790614944565b60405180910390fd5b8060188190555050565b60175481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61157261224a565b73ffffffffffffffffffffffffffffffffffffffff16611590611540565b73ffffffffffffffffffffffffffffffffffffffff16146115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614944565b60405180910390fd5b600e54816011546115f79190614b8c565b1115611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90614704565b60405180910390fd5b60005b8181101561168e576000600161164f610d31565b6116599190614b8c565b9050600160115461166a9190614b8c565b60118190555061167a8482612645565b50808061168690614d93565b91505061163b565b505050565b6060600180546116a290614d61565b80601f01602080910402602001604051908101604052809291908181526020018280546116ce90614d61565b801561171b5780601f106116f05761010080835404028352916020019161171b565b820191906000526020600020905b8154815290600101906020018083116116fe57829003601f168201915b5050505050905090565b61172d61224a565b73ffffffffffffffffffffffffffffffffffffffff1661174b611540565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890614944565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60185481565b6117e56117de61224a565b8383612729565b5050565b6117f161224a565b73ffffffffffffffffffffffffffffffffffffffff1661180f611540565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90614944565b60405180910390fd5b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b600e5481565b60155481565b601360029054906101000a900460ff166118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390614724565b60405180910390fd5b34816017546118fb9190614c13565b111561193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390614804565b60405180910390fd5b600c5481600f5461194d9190614b8c565b111561198e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611985906148e4565b60405180910390fd5b60005b818110156119e457600060016119a5610d31565b6119af9190614b8c565b90506001600f546119c09190614b8c565b600f819055506119d03382612645565b5080806119dc90614d93565b915050611991565b5050565b60105481565b6119ff6119f961224a565b8361230b565b611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590614a04565b60405180910390fd5b611a4a84848484612896565b50505050565b6060611a5b826121de565b611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614984565b60405180910390fd5b6000611aa46128f2565b90506000815111611ac45760405180602001604052806000815250611aef565b80611ace84612984565b604051602001611adf9291906145df565b6040516020818303038152906040525b915050919050565b60145481565b60606000611b0a83611374565b905060008167ffffffffffffffff811115611b4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611b7c5781602001602082028036833780820191505090505b50905060005b82811015611bec57611b948582610f31565b828281518110611bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611be490614d93565b915050611b82565b508092505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c9361224a565b73ffffffffffffffffffffffffffffffffffffffff16611cb1611540565b73ffffffffffffffffffffffffffffffffffffffff1614611d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfe90614944565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e90614784565b60405180910390fd5b611d8081612663565b50565b600c5481565b600b5481565b611d9761224a565b73ffffffffffffffffffffffffffffffffffffffff16611db5611540565b73ffffffffffffffffffffffffffffffffffffffff1614611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0290614944565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b601360019054906101000a900460ff16611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d906149a4565b60405180910390fd5b601454811115611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec2906149e4565b60405180910390fd5b3481601654611eda9190614c13565b1115611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1290614804565b60405180910390fd5b600e54600b54611f2b9190614c6d565b81611f34610d31565b611f3e9190614b8c565b1115611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7690614704565b60405180910390fd5b600d5481601054611f909190614b8c565b1115611fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc890614844565b60405180910390fd5b601360039054906101000a900460ff16156120a057600033604051602001611ff99190614598565b60405160208183030381529060405280519060200120905061205f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060185483612b31565b61209e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209590614a44565b60405180910390fd5b505b60005b818110156120f657600060016120b7610d31565b6120c19190614b8c565b905060016010546120d29190614b8c565b6010819055506120e23382612645565b5080806120ee90614d93565b9150506120a3565b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806121c757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121d757506121d682612b48565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c58361121a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612316826121de565b612355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234c90614824565b60405180910390fd5b60006123608361121a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123cf57508373ffffffffffffffffffffffffffffffffffffffff166123b784610b94565b73ffffffffffffffffffffffffffffffffffffffff16145b806123e057506123df8185611bf7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124098261121a565b73ffffffffffffffffffffffffffffffffffffffff161461245f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245690614964565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c6906147c4565b60405180910390fd5b6124da838383612bb2565b6124e5600082612252565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125359190614c6d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258c9190614b8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61265f828260405180602001604052806000815250612cc6565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278f906147e4565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612889919061468c565b60405180910390a3505050565b6128a18484846123e9565b6128ad84848484612d21565b6128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e390614764565b60405180910390fd5b50505050565b60606012805461290190614d61565b80601f016020809104026020016040519081016040528092919081815260200182805461292d90614d61565b801561297a5780601f1061294f5761010080835404028352916020019161297a565b820191906000526020600020905b81548152906001019060200180831161295d57829003601f168201915b5050505050905090565b606060008214156129cc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b2c565b600082905060005b600082146129fe5780806129e790614d93565b915050600a826129f79190614be2565b91506129d4565b60008167ffffffffffffffff811115612a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a725781602001600182028036833780820191505090505b5090505b60008514612b2557600182612a8b9190614c6d565b9150600a85612a9a9190614e0a565b6030612aa69190614b8c565b60f81b818381518110612ae2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1e9190614be2565b9450612a76565b8093505050505b919050565b600082612b3e8584612eb8565b1490509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bbd838383612f91565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c0057612bfb81612f96565b612c3f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c3e57612c3d8382612fdf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c8257612c7d8161314c565b612cc1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cc057612cbf828261328f565b5b5b505050565b612cd0838361330e565b612cdd6000848484612d21565b612d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1390614764565b60405180910390fd5b505050565b6000612d428473ffffffffffffffffffffffffffffffffffffffff166134dc565b15612eab578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6b61224a565b8786866040518563ffffffff1660e01b8152600401612d8d949392919061461e565b602060405180830381600087803b158015612da757600080fd5b505af1925050508015612dd857506040513d601f19601f82011682018060405250810190612dd5919061397b565b60015b612e5b573d8060008114612e08576040519150601f19603f3d011682016040523d82523d6000602084013e612e0d565b606091505b50600081511415612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90614764565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612eb0565b600190505b949350505050565b60008082905060005b8451811015612f86576000858281518110612f05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311612f46578281604051602001612f299291906145b3565b604051602081830303815290604052805190602001209250612f72565b8083604051602001612f599291906145b3565b6040516020818303038152906040528051906020012092505b508080612f7e90614d93565b915050612ec1565b508091505092915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fec84611374565b612ff69190614c6d565b90506000600760008481526020019081526020016000205490508181146130db576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131609190614c6d565b90506000600960008481526020019081526020016000205490506000600883815481106131b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106131fe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613273577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061329a83611374565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561337e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337590614904565b60405180910390fd5b613387816121de565b156133c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133be906147a4565b60405180910390fd5b6133d360008383612bb2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134239190614b8c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546134fb90614d61565b90600052602060002090601f01602090048101928261351d5760008555613564565b82601f1061353657805160ff1916838001178555613564565b82800160010185558215613564579182015b82811115613563578251825591602001919060010190613548565b5b5090506135719190613575565b5090565b5b8082111561358e576000816000905550600101613576565b5090565b60006135a56135a084614ab0565b614a7f565b9050828152602081018484840111156135bd57600080fd5b6135c8848285614d1f565b509392505050565b60006135e36135de84614ae0565b614a7f565b9050828152602081018484840111156135fb57600080fd5b613606848285614d1f565b509392505050565b60008135905061361d81614f15565b92915050565b60008083601f84011261363557600080fd5b8235905067ffffffffffffffff81111561364e57600080fd5b60208301915083602082028301111561366657600080fd5b9250929050565b60008135905061367c81614f2c565b92915050565b60008135905061369181614f43565b92915050565b6000813590506136a681614f5a565b92915050565b6000815190506136bb81614f5a565b92915050565b600082601f8301126136d257600080fd5b81356136e2848260208601613592565b91505092915050565b600082601f8301126136fc57600080fd5b813561370c8482602086016135d0565b91505092915050565b60008135905061372481614f71565b92915050565b60006020828403121561373c57600080fd5b600061374a8482850161360e565b91505092915050565b6000806040838503121561376657600080fd5b60006137748582860161360e565b92505060206137858582860161360e565b9150509250929050565b6000806000606084860312156137a457600080fd5b60006137b28682870161360e565b93505060206137c38682870161360e565b92505060406137d486828701613715565b9150509250925092565b600080600080608085870312156137f457600080fd5b60006138028782880161360e565b94505060206138138782880161360e565b935050604061382487828801613715565b925050606085013567ffffffffffffffff81111561384157600080fd5b61384d878288016136c1565b91505092959194509250565b6000806040838503121561386c57600080fd5b600061387a8582860161360e565b925050602061388b8582860161366d565b9150509250929050565b600080604083850312156138a857600080fd5b60006138b68582860161360e565b92505060206138c785828601613715565b9150509250929050565b6000806000604084860312156138e657600080fd5b600084013567ffffffffffffffff81111561390057600080fd5b61390c86828701613623565b9350935050602061391f86828701613715565b9150509250925092565b60006020828403121561393b57600080fd5b600061394984828501613682565b91505092915050565b60006020828403121561396457600080fd5b600061397284828501613697565b91505092915050565b60006020828403121561398d57600080fd5b600061399b848285016136ac565b91505092915050565b6000602082840312156139b657600080fd5b600082013567ffffffffffffffff8111156139d057600080fd5b6139dc848285016136eb565b91505092915050565b6000602082840312156139f757600080fd5b6000613a0584828501613715565b91505092915050565b6000613a1a838361457a565b60208301905092915050565b613a2f81614ca1565b82525050565b613a46613a4182614ca1565b614ddc565b82525050565b6000613a5782614b20565b613a618185614b4e565b9350613a6c83614b10565b8060005b83811015613a9d578151613a848882613a0e565b9750613a8f83614b41565b925050600181019050613a70565b5085935050505092915050565b613ab381614cb3565b82525050565b613ac281614cbf565b82525050565b613ad9613ad482614cbf565b614dee565b82525050565b6000613aea82614b2b565b613af48185614b5f565b9350613b04818560208601614d2e565b613b0d81614ef7565b840191505092915050565b6000613b2382614b36565b613b2d8185614b70565b9350613b3d818560208601614d2e565b613b4681614ef7565b840191505092915050565b6000613b5c82614b36565b613b668185614b81565b9350613b76818560208601614d2e565b80840191505092915050565b6000613b8f602783614b70565b91507f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008301527f6e74204e465473000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bf5603083614b70565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f74616c20746f6b656e73000000000000000000000000000000006020830152604082019050919050565b6000613c5b602883614b70565b91507f507269766174652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cc1602b83614b70565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d27603283614b70565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d8d602683614b70565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613df3601c83614b70565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e33602483614b70565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e99601983614b70565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613ed9601f83614b70565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613f19602c83614b70565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613f7f603283614b70565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f662070726573616c6520746f6b656e7300000000000000000000000000006020830152604082019050919050565b6000613fe5603883614b70565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061404b602a83614b70565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b1602983614b70565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614117601f83614b70565b91507f457863656564656420746865206d617820746f6b656e207075726368617365006000830152602082019050919050565b6000614157602a83614b70565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b60006141bd602083614b70565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006141fd602c83614b70565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614263602083614b70565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006142a3602983614b70565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614309602f83614b70565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061436f602883614b70565b91507f50726573616c652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143d5602183614b70565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061443b601b83614b70565b91507f4578636565646564206d617820746f6b656e20707572636861736500000000006000830152602082019050919050565b600061447b603183614b70565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006144e1602c83614b70565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614547600d83614b70565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b61458381614d15565b82525050565b61459281614d15565b82525050565b60006145a48284613a35565b60148201915081905092915050565b60006145bf8285613ac8565b6020820191506145cf8284613ac8565b6020820191508190509392505050565b60006145eb8285613b51565b91506145f78284613b51565b91508190509392505050565b60006020820190506146186000830184613a26565b92915050565b60006080820190506146336000830187613a26565b6146406020830186613a26565b61464d6040830185614589565b818103606083015261465f8184613adf565b905095945050505050565b600060208201905081810360008301526146848184613a4c565b905092915050565b60006020820190506146a16000830184613aaa565b92915050565b60006020820190506146bc6000830184613ab9565b92915050565b600060208201905081810360008301526146dc8184613b18565b905092915050565b600060208201905081810360008301526146fd81613b82565b9050919050565b6000602082019050818103600083015261471d81613be8565b9050919050565b6000602082019050818103600083015261473d81613c4e565b9050919050565b6000602082019050818103600083015261475d81613cb4565b9050919050565b6000602082019050818103600083015261477d81613d1a565b9050919050565b6000602082019050818103600083015261479d81613d80565b9050919050565b600060208201905081810360008301526147bd81613de6565b9050919050565b600060208201905081810360008301526147dd81613e26565b9050919050565b600060208201905081810360008301526147fd81613e8c565b9050919050565b6000602082019050818103600083015261481d81613ecc565b9050919050565b6000602082019050818103600083015261483d81613f0c565b9050919050565b6000602082019050818103600083015261485d81613f72565b9050919050565b6000602082019050818103600083015261487d81613fd8565b9050919050565b6000602082019050818103600083015261489d8161403e565b9050919050565b600060208201905081810360008301526148bd816140a4565b9050919050565b600060208201905081810360008301526148dd8161410a565b9050919050565b600060208201905081810360008301526148fd8161414a565b9050919050565b6000602082019050818103600083015261491d816141b0565b9050919050565b6000602082019050818103600083015261493d816141f0565b9050919050565b6000602082019050818103600083015261495d81614256565b9050919050565b6000602082019050818103600083015261497d81614296565b9050919050565b6000602082019050818103600083015261499d816142fc565b9050919050565b600060208201905081810360008301526149bd81614362565b9050919050565b600060208201905081810360008301526149dd816143c8565b9050919050565b600060208201905081810360008301526149fd8161442e565b9050919050565b60006020820190508181036000830152614a1d8161446e565b9050919050565b60006020820190508181036000830152614a3d816144d4565b9050919050565b60006020820190508181036000830152614a5d8161453a565b9050919050565b6000602082019050614a796000830184614589565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614aa657614aa5614ec8565b5b8060405250919050565b600067ffffffffffffffff821115614acb57614aca614ec8565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614afb57614afa614ec8565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b9782614d15565b9150614ba283614d15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bd757614bd6614e3b565b5b828201905092915050565b6000614bed82614d15565b9150614bf883614d15565b925082614c0857614c07614e6a565b5b828204905092915050565b6000614c1e82614d15565b9150614c2983614d15565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c6257614c61614e3b565b5b828202905092915050565b6000614c7882614d15565b9150614c8383614d15565b925082821015614c9657614c95614e3b565b5b828203905092915050565b6000614cac82614cf5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d4c578082015181840152602081019050614d31565b83811115614d5b576000848401525b50505050565b60006002820490506001821680614d7957607f821691505b60208210811415614d8d57614d8c614e99565b5b50919050565b6000614d9e82614d15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614dd157614dd0614e3b565b5b600182019050919050565b6000614de782614df8565b9050919050565b6000819050919050565b6000614e0382614f08565b9050919050565b6000614e1582614d15565b9150614e2083614d15565b925082614e3057614e2f614e6a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614f1e81614ca1565b8114614f2957600080fd5b50565b614f3581614cb3565b8114614f4057600080fd5b50565b614f4c81614cbf565b8114614f5757600080fd5b50565b614f6381614cc9565b8114614f6e57600080fd5b50565b614f7a81614d15565b8114614f8557600080fd5b5056fea26469706673582212201eacb840ae44f1d0c0c291f83e99a0784c42726485f3e9a42b89cfa7131ddc5c64736f6c63430008000033

Deployed Bytecode Sourcemap

46690:4872:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47339:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35767:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47060:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22188:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47184:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23747:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23270:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36407:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24497:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46833:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47580:623;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36075:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47101:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47143:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51452:107;;;;;;;;;;;;;:::i;:::-;;24907:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46987:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36597:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50276:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46923:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21882:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50845:97;;;;;;;;;;;;;:::i;:::-;;21612:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43628:103;;;;;;;;;;;;;:::i;:::-;;50950:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47401:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42977:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49845:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22357:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50518:99;;;;;;;;;;;;;:::i;:::-;;47464:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24040:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50735:102;;;;;;;;;;;;;:::i;:::-;;46877:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47279:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49271:566;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46955:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25163:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22532:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47227:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51093:351;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24266:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43886:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46790:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46754:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50625:102;;;;;;;;;;;;;:::i;:::-;;48211:1052;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47339:48;;;;:::o;35767:224::-;35869:4;35908:35;35893:50;;;:11;:50;;;;:90;;;;35947:36;35971:11;35947:23;:36::i;:::-;35893:90;35886:97;;35767:224;;;:::o;47060:34::-;;;;;;;;;;;;;:::o;22188:100::-;22242:13;22275:5;22268:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22188:100;:::o;47184:34::-;;;;;;;;;;;;;:::o;23747:221::-;23823:7;23851:16;23859:7;23851;:16::i;:::-;23843:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23936:15;:24;23952:7;23936:24;;;;;;;;;;;;;;;;;;;;;23929:31;;23747:221;;;:::o;23270:411::-;23351:13;23367:23;23382:7;23367:14;:23::i;:::-;23351:39;;23415:5;23409:11;;:2;:11;;;;23401:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23509:5;23493:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23518:37;23535:5;23542:12;:10;:12::i;:::-;23518:16;:37::i;:::-;23493:62;23471:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23652:21;23661:2;23665:7;23652:8;:21::i;:::-;23270:411;;;:::o;36407:113::-;36468:7;36495:10;:17;;;;36488:24;;36407:113;:::o;24497:339::-;24692:41;24711:12;:10;:12::i;:::-;24725:7;24692:18;:41::i;:::-;24684:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24800:28;24810:4;24816:2;24820:7;24800:9;:28::i;:::-;24497:339;;;:::o;46833:37::-;;;;:::o;47580:623::-;47655:14;;;;;;;;;;;47647:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47750:22;;47732:14;:40;;47724:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;47859:9;47841:14;47827:11;;:28;;;;:::i;:::-;:41;;47819:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;47970:19;;47957:10;;:32;;;;:::i;:::-;47939:14;47923:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:66;;47915:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;48051:6;48047:149;48067:14;48063:1;:18;48047:149;;;48103:14;48136:1;48120:13;:11;:13::i;:::-;:17;;;;:::i;:::-;48103:34;;48152:32;48162:10;48174:9;48152;:32::i;:::-;48047:149;48083:3;;;;;:::i;:::-;;;;48047:149;;;;47580:623;:::o;36075:256::-;36172:7;36208:23;36225:5;36208:16;:23::i;:::-;36200:5;:31;36192:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36297:12;:19;36310:5;36297:19;;;;;;;;;;;;;;;:26;36317:5;36297:26;;;;;;;;;;;;36290:33;;36075:256;;;;:::o;47101:35::-;;;;;;;;;;;;;:::o;47143:34::-;;;;;;;;;;;;;:::o;51452:107::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51508:10:::1;51500:28;;:51;51529:21;51500:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51452:107::o:0;24907:185::-;25045:39;25062:4;25068:2;25072:7;25045:39;;;;;;;;;;;;:16;:39::i;:::-;24907:185;;;:::o;46987:26::-;;;;:::o;36597:233::-;36672:7;36708:30;:28;:30::i;:::-;36700:5;:38;36692:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36805:10;36816:5;36805:17;;;;;;;;;;;;;;;;;;;;;;;;36798:24;;36597:233;;;:::o;50276:109::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50369:8:::1;50350:16;:27;;;;;;;;;;;;:::i;:::-;;50276:109:::0;:::o;46923:25::-;;;;:::o;21882:239::-;21954:7;21974:13;21990:7;:16;21998:7;21990:16;;;;;;;;;;;;;;;;;;;;;21974:32;;22042:1;22025:19;;:5;:19;;;;22017:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22108:5;22101:12;;;21882:239;;;:::o;50845:97::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50919:15:::1;;;;;;;;;;;50918:16;50900:15;;:34;;;;;;;;;;;;;;;;;;50845:97::o:0;21612:208::-;21684:7;21729:1;21712:19;;:5;:19;;;;21704:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21796:9;:16;21806:5;21796:16;;;;;;;;;;;;;;;;21789:23;;21612:208;;;:::o;43628:103::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43693:30:::1;43720:1;43693:18;:30::i;:::-;43628:103::o:0;50950:135::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51060:17:::1;51038:19;:39;;;;50950:135:::0;:::o;47401:48::-;;;;:::o;42977:87::-;43023:7;43050:6;;;;;;;;;;;43043:13;;42977:87;:::o;49845:423::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49978:19:::1;;49960:14;49943;;:31;;;;:::i;:::-;:54;;49935:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;50065:6;50061:200;50081:14;50077:1;:18;50061:200;;;50117:14;50150:1;50134:13;:11;:13::i;:::-;:17;;;;:::i;:::-;50117:34;;50200:1;50183:14;;:18;;;;:::i;:::-;50166:14;:35;;;;50216:33;50226:11;50239:9;50216;:33::i;:::-;50061:200;50097:3;;;;;:::i;:::-;;;;50061:200;;;;49845:423:::0;;:::o;22357:104::-;22413:13;22446:7;22439:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22357:104;:::o;50518:99::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50595:14:::1;;;;;;;;;;;50594:15;50577:14;;:32;;;;;;;;;;;;;;;;;;50518:99::o:0;47464:39::-;;;;:::o;24040:155::-;24135:52;24154:12;:10;:12::i;:::-;24168:8;24178;24135:18;:52::i;:::-;24040:155;;:::o;50735:102::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50814:15:::1;;;;;;;;;;;50813:16;50795:15;;:34;;;;;;;;;;;;;;;;;;50735:102::o:0;46877:37::-;;;;:::o;47279:47::-;;;;:::o;49271:566::-;49347:15;;;;;;;;;;;49339:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49459:9;49441:14;49426:12;;:29;;;;:::i;:::-;:42;;49418:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;49557:18;;49539:14;49523:13;;:30;;;;:::i;:::-;:52;;49515:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;49637:6;49633:197;49653:14;49649:1;:18;49633:197;;;49689:14;49722:1;49706:13;:11;:13::i;:::-;:17;;;;:::i;:::-;49689:34;;49770:1;49754:13;;:17;;;;:::i;:::-;49738:13;:33;;;;49786:32;49796:10;49808:9;49786;:32::i;:::-;49633:197;49669:3;;;;;:::i;:::-;;;;49633:197;;;;49271:566;:::o;46955:25::-;;;;:::o;25163:328::-;25338:41;25357:12;:10;:12::i;:::-;25371:7;25338:18;:41::i;:::-;25330:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25444:39;25458:4;25464:2;25468:7;25477:5;25444:13;:39::i;:::-;25163:328;;;;:::o;22532:334::-;22605:13;22639:16;22647:7;22639;:16::i;:::-;22631:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22720:21;22744:10;:8;:10::i;:::-;22720:34;;22796:1;22778:7;22772:21;:25;:86;;;;;;;;;;;;;;;;;22824:7;22833:18;:7;:16;:18::i;:::-;22807:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22772:86;22765:93;;;22532:334;;;:::o;47227:39::-;;;;:::o;51093:351::-;51163:16;51192:18;51213:17;51223:6;51213:9;:17::i;:::-;51192:38;;51241:25;51283:10;51269:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51241:53;;51309:9;51305:106;51324:10;51320:1;:14;51305:106;;;51369:30;51389:6;51397:1;51369:19;:30::i;:::-;51355:8;51364:1;51355:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;51336:3;;;;;:::i;:::-;;;;51305:106;;;;51428:8;51421:15;;;;51093:351;;;:::o;24266:164::-;24363:4;24387:18;:25;24406:5;24387:25;;;;;;;;;;;;;;;:35;24413:8;24387:35;;;;;;;;;;;;;;;;;;;;;;;;;24380:42;;24266:164;;;;:::o;43886:201::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43995:1:::1;43975:22;;:8;:22;;;;43967:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44051:28;44070:8;44051:18;:28::i;:::-;43886:201:::0;:::o;46790:36::-;;;;:::o;46754:29::-;;;;:::o;50625:102::-;43208:12;:10;:12::i;:::-;43197:23;;:7;:5;:7::i;:::-;:23;;;43189:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50704:15:::1;;;;;;;;;;;50703:16;50685:15;;:34;;;;;;;;;;;;;;;;;;50625:102::o:0;48211:1052::-;48320:15;;;;;;;;;;;48312:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48417:22;;48399:14;:40;;48391:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;48523:9;48505:14;48490:12;;:29;;;;:::i;:::-;:42;;48482:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;48634:19;;48621:10;;:32;;;;:::i;:::-;48603:14;48587:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:66;;48579:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;48759:18;;48741:14;48725:13;;:30;;;;:::i;:::-;:52;;48717:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;48849:15;;;;;;;;;;;48845:202;;;48881:12;48923:10;48906:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;48896:39;;;;;;48881:54;;48958:59;48977:12;;48958:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48991:19;;49012:4;48958:18;:59::i;:::-;48950:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;48845:202;;49063:6;49059:197;49079:14;49075:1;:18;49059:197;;;49115:14;49148:1;49132:13;:11;:13::i;:::-;:17;;;;:::i;:::-;49115:34;;49196:1;49180:13;;:17;;;;:::i;:::-;49164:13;:33;;;;49212:32;49222:10;49234:9;49212;:32::i;:::-;49059:197;49095:3;;;;;:::i;:::-;;;;49059:197;;;;48211:1052;;;:::o;21243:305::-;21345:4;21397:25;21382:40;;;:11;:40;;;;:105;;;;21454:33;21439:48;;;:11;:48;;;;21382:105;:158;;;;21504:36;21528:11;21504:23;:36::i;:::-;21382:158;21362:178;;21243:305;;;:::o;27001:127::-;27066:4;27118:1;27090:30;;:7;:16;27098:7;27090:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27083:37;;27001:127;;;:::o;16484:98::-;16537:7;16564:10;16557:17;;16484:98;:::o;30983:174::-;31085:2;31058:15;:24;31074:7;31058:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31141:7;31137:2;31103:46;;31112:23;31127:7;31112:14;:23::i;:::-;31103:46;;;;;;;;;;;;30983:174;;:::o;27295:348::-;27388:4;27413:16;27421:7;27413;:16::i;:::-;27405:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27489:13;27505:23;27520:7;27505:14;:23::i;:::-;27489:39;;27558:5;27547:16;;:7;:16;;;:51;;;;27591:7;27567:31;;:20;27579:7;27567:11;:20::i;:::-;:31;;;27547:51;:87;;;;27602:32;27619:5;27626:7;27602:16;:32::i;:::-;27547:87;27539:96;;;27295:348;;;;:::o;30287:578::-;30446:4;30419:31;;:23;30434:7;30419:14;:23::i;:::-;:31;;;30411:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30529:1;30515:16;;:2;:16;;;;30507:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30585:39;30606:4;30612:2;30616:7;30585:20;:39::i;:::-;30689:29;30706:1;30710:7;30689:8;:29::i;:::-;30750:1;30731:9;:15;30741:4;30731:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30779:1;30762:9;:13;30772:2;30762:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30810:2;30791:7;:16;30799:7;30791:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30849:7;30845:2;30830:27;;30839:4;30830:27;;;;;;;;;;;;30287:578;;;:::o;27985:110::-;28061:26;28071:2;28075:7;28061:26;;;;;;;;;;;;:9;:26::i;:::-;27985:110;;:::o;44247:191::-;44321:16;44340:6;;;;;;;;;;;44321:25;;44366:8;44357:6;;:17;;;;;;;;;;;;;;;;;;44421:8;44390:40;;44411:8;44390:40;;;;;;;;;;;;44247:191;;:::o;31299:315::-;31454:8;31445:17;;:5;:17;;;;31437:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31541:8;31503:18;:25;31522:5;31503:25;;;;;;;;;;;;;;;:35;31529:8;31503:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31587:8;31565:41;;31580:5;31565:41;;;31597:8;31565:41;;;;;;:::i;:::-;;;;;;;;31299:315;;;:::o;26373:::-;26530:28;26540:4;26546:2;26550:7;26530:9;:28::i;:::-;26577:48;26600:4;26606:2;26610:7;26619:5;26577:22;:48::i;:::-;26569:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26373:315;;;;:::o;50393:117::-;50453:13;50486:16;50479:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50393:117;:::o;17063:723::-;17119:13;17349:1;17340:5;:10;17336:53;;;17367:10;;;;;;;;;;;;;;;;;;;;;17336:53;17399:12;17414:5;17399:20;;17430:14;17455:78;17470:1;17462:4;:9;17455:78;;17488:8;;;;;:::i;:::-;;;;17519:2;17511:10;;;;;:::i;:::-;;;17455:78;;;17543:19;17575:6;17565:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17543:39;;17593:154;17609:1;17600:5;:10;17593:154;;17637:1;17627:11;;;;;:::i;:::-;;;17704:2;17696:5;:10;;;;:::i;:::-;17683:2;:24;;;;:::i;:::-;17670:39;;17653:6;17660;17653:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17733:2;17724:11;;;;;:::i;:::-;;;17593:154;;;17771:6;17757:21;;;;;17063:723;;;;:::o;45353:190::-;45478:4;45531;45502:25;45515:5;45522:4;45502:12;:25::i;:::-;:33;45495:40;;45353:190;;;;;:::o;19687:157::-;19772:4;19811:25;19796:40;;;:11;:40;;;;19789:47;;19687:157;;;:::o;37443:589::-;37587:45;37614:4;37620:2;37624:7;37587:26;:45::i;:::-;37665:1;37649:18;;:4;:18;;;37645:187;;;37684:40;37716:7;37684:31;:40::i;:::-;37645:187;;;37754:2;37746:10;;:4;:10;;;37742:90;;37773:47;37806:4;37812:7;37773:32;:47::i;:::-;37742:90;37645:187;37860:1;37846:16;;:2;:16;;;37842:183;;;37879:45;37916:7;37879:36;:45::i;:::-;37842:183;;;37952:4;37946:10;;:2;:10;;;37942:83;;37973:40;38001:2;38005:7;37973:27;:40::i;:::-;37942:83;37842:183;37443:589;;;:::o;28322:321::-;28452:18;28458:2;28462:7;28452:5;:18::i;:::-;28503:54;28534:1;28538:2;28542:7;28551:5;28503:22;:54::i;:::-;28481:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28322:321;;;:::o;32179:799::-;32334:4;32355:15;:2;:13;;;:15::i;:::-;32351:620;;;32407:2;32391:36;;;32428:12;:10;:12::i;:::-;32442:4;32448:7;32457:5;32391:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32387:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32650:1;32633:6;:13;:18;32629:272;;;32676:60;;;;;;;;;;:::i;:::-;;;;;;;;32629:272;32851:6;32845:13;32836:6;32832:2;32828:15;32821:38;32387:529;32524:41;;;32514:51;;;:6;:51;;;;32507:58;;;;;32351:620;32955:4;32948:11;;32179:799;;;;;;;:::o;45905:701::-;45988:7;46008:20;46031:4;46008:27;;46051:9;46046:523;46070:5;:12;46066:1;:16;46046:523;;;46104:20;46127:5;46133:1;46127:8;;;;;;;;;;;;;;;;;;;;;;46104:31;;46170:12;46154;:28;46150:408;;46324:12;46338;46307:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46297:55;;;;;;46282:70;;46150:408;;;46514:12;46528;46497:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46487:55;;;;;;46472:70;;46150:408;46046:523;46084:3;;;;;:::i;:::-;;;;46046:523;;;;46586:12;46579:19;;;45905:701;;;;:::o;33550:126::-;;;;:::o;38755:164::-;38859:10;:17;;;;38832:15;:24;38848:7;38832:24;;;;;;;;;;;:44;;;;38887:10;38903:7;38887:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38755:164;:::o;39546:988::-;39812:22;39862:1;39837:22;39854:4;39837:16;:22::i;:::-;:26;;;;:::i;:::-;39812:51;;39874:18;39895:17;:26;39913:7;39895:26;;;;;;;;;;;;39874:47;;40042:14;40028:10;:28;40024:328;;40073:19;40095:12;:18;40108:4;40095:18;;;;;;;;;;;;;;;:34;40114:14;40095:34;;;;;;;;;;;;40073:56;;40179:11;40146:12;:18;40159:4;40146:18;;;;;;;;;;;;;;;:30;40165:10;40146:30;;;;;;;;;;;:44;;;;40296:10;40263:17;:30;40281:11;40263:30;;;;;;;;;;;:43;;;;40024:328;;40448:17;:26;40466:7;40448:26;;;;;;;;;;;40441:33;;;40492:12;:18;40505:4;40492:18;;;;;;;;;;;;;;;:34;40511:14;40492:34;;;;;;;;;;;40485:41;;;39546:988;;;;:::o;40829:1079::-;41082:22;41127:1;41107:10;:17;;;;:21;;;;:::i;:::-;41082:46;;41139:18;41160:15;:24;41176:7;41160:24;;;;;;;;;;;;41139:45;;41511:19;41533:10;41544:14;41533:26;;;;;;;;;;;;;;;;;;;;;;;;41511:48;;41597:11;41572:10;41583;41572:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;41708:10;41677:15;:28;41693:11;41677:28;;;;;;;;;;;:41;;;;41849:15;:24;41865:7;41849:24;;;;;;;;;;;41842:31;;;41884:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40829:1079;;;;:::o;38333:221::-;38418:14;38435:20;38452:2;38435:16;:20::i;:::-;38418:37;;38493:7;38466:12;:16;38479:2;38466:16;;;;;;;;;;;;;;;:24;38483:6;38466:24;;;;;;;;;;;:34;;;;38540:6;38511:17;:26;38529:7;38511:26;;;;;;;;;;;:35;;;;38333:221;;;:::o;28979:382::-;29073:1;29059:16;;:2;:16;;;;29051:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29132:16;29140:7;29132;:16::i;:::-;29131:17;29123:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29194:45;29223:1;29227:2;29231:7;29194:20;:45::i;:::-;29269:1;29252:9;:13;29262:2;29252:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29300:2;29281:7;:16;29289:7;29281:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29345:7;29341:2;29320:33;;29337:1;29320:33;;;;;;;;;;;;28979:382;;:::o;8474:387::-;8534:4;8742:12;8809:7;8797:20;8789:28;;8852:1;8845:4;:8;8838:15;;;8474:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:273::-;;2223:3;2216:4;2208:6;2204:17;2200:27;2190:2;;2241:1;2238;2231:12;2190:2;2281:6;2268:20;2306:79;2381:3;2373:6;2366:4;2358:6;2354:17;2306:79;:::i;:::-;2297:88;;2180:211;;;;;:::o;2397:139::-;;2481:6;2468:20;2459:29;;2497:33;2524:5;2497:33;:::i;:::-;2449:87;;;;:::o;2542:262::-;;2650:2;2638:9;2629:7;2625:23;2621:32;2618:2;;;2666:1;2663;2656:12;2618:2;2709:1;2734:53;2779:7;2770:6;2759:9;2755:22;2734:53;:::i;:::-;2724:63;;2680:117;2608:196;;;;:::o;2810:407::-;;;2935:2;2923:9;2914:7;2910:23;2906:32;2903:2;;;2951:1;2948;2941:12;2903:2;2994:1;3019:53;3064:7;3055:6;3044:9;3040:22;3019:53;:::i;:::-;3009:63;;2965:117;3121:2;3147:53;3192:7;3183:6;3172:9;3168:22;3147:53;:::i;:::-;3137:63;;3092:118;2893:324;;;;;:::o;3223:552::-;;;;3365:2;3353:9;3344:7;3340:23;3336:32;3333:2;;;3381:1;3378;3371:12;3333:2;3424:1;3449:53;3494:7;3485:6;3474:9;3470:22;3449:53;:::i;:::-;3439:63;;3395:117;3551:2;3577:53;3622:7;3613:6;3602:9;3598:22;3577:53;:::i;:::-;3567:63;;3522:118;3679:2;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3650:118;3323:452;;;;;:::o;3781:809::-;;;;;3949:3;3937:9;3928:7;3924:23;3920:33;3917:2;;;3966:1;3963;3956:12;3917:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;4264:2;4290:53;4335:7;4326:6;4315:9;4311:22;4290:53;:::i;:::-;4280:63;;4235:118;4420:2;4409:9;4405:18;4392:32;4451:18;4443:6;4440:30;4437:2;;;4483:1;4480;4473:12;4437:2;4511:62;4565:7;4556:6;4545:9;4541:22;4511:62;:::i;:::-;4501:72;;4363:220;3907:683;;;;;;;:::o;4596:401::-;;;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4777:1;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4748:117;4904:2;4930:50;4972:7;4963:6;4952:9;4948:22;4930:50;:::i;:::-;4920:60;;4875:115;4676:321;;;;;:::o;5003:407::-;;;5128:2;5116:9;5107:7;5103:23;5099:32;5096:2;;;5144:1;5141;5134:12;5096:2;5187:1;5212:53;5257:7;5248:6;5237:9;5233:22;5212:53;:::i;:::-;5202:63;;5158:117;5314:2;5340:53;5385:7;5376:6;5365:9;5361:22;5340:53;:::i;:::-;5330:63;;5285:118;5086:324;;;;;:::o;5416:570::-;;;;5576:2;5564:9;5555:7;5551:23;5547:32;5544:2;;;5592:1;5589;5582:12;5544:2;5663:1;5652:9;5648:17;5635:31;5693:18;5685:6;5682:30;5679:2;;;5725:1;5722;5715:12;5679:2;5761:80;5833:7;5824:6;5813:9;5809:22;5761:80;:::i;:::-;5743:98;;;;5606:245;5890:2;5916:53;5961:7;5952:6;5941:9;5937:22;5916:53;:::i;:::-;5906:63;;5861:118;5534:452;;;;;:::o;5992:262::-;;6100:2;6088:9;6079:7;6075:23;6071:32;6068:2;;;6116:1;6113;6106:12;6068:2;6159:1;6184:53;6229:7;6220:6;6209:9;6205:22;6184:53;:::i;:::-;6174:63;;6130:117;6058:196;;;;:::o;6260:260::-;;6367:2;6355:9;6346:7;6342:23;6338:32;6335:2;;;6383:1;6380;6373:12;6335:2;6426:1;6451:52;6495:7;6486:6;6475:9;6471:22;6451:52;:::i;:::-;6441:62;;6397:116;6325:195;;;;:::o;6526:282::-;;6644:2;6632:9;6623:7;6619:23;6615:32;6612:2;;;6660:1;6657;6650:12;6612:2;6703:1;6728:63;6783:7;6774:6;6763:9;6759:22;6728:63;:::i;:::-;6718:73;;6674:127;6602:206;;;;:::o;6814:375::-;;6932:2;6920:9;6911:7;6907:23;6903:32;6900:2;;;6948:1;6945;6938:12;6900:2;7019:1;7008:9;7004:17;6991:31;7049:18;7041:6;7038:30;7035:2;;;7081:1;7078;7071:12;7035:2;7109:63;7164:7;7155:6;7144:9;7140:22;7109:63;:::i;:::-;7099:73;;6962:220;6890:299;;;;:::o;7195:262::-;;7303:2;7291:9;7282:7;7278:23;7274:32;7271:2;;;7319:1;7316;7309:12;7271:2;7362:1;7387:53;7432:7;7423:6;7412:9;7408:22;7387:53;:::i;:::-;7377:63;;7333:117;7261:196;;;;:::o;7463:179::-;;7553:46;7595:3;7587:6;7553:46;:::i;:::-;7631:4;7626:3;7622:14;7608:28;;7543:99;;;;:::o;7648:118::-;7735:24;7753:5;7735:24;:::i;:::-;7730:3;7723:37;7713:53;;:::o;7772:157::-;7877:45;7897:24;7915:5;7897:24;:::i;:::-;7877:45;:::i;:::-;7872:3;7865:58;7855:74;;:::o;7965:732::-;;8113:54;8161:5;8113:54;:::i;:::-;8183:86;8262:6;8257:3;8183:86;:::i;:::-;8176:93;;8293:56;8343:5;8293:56;:::i;:::-;8372:7;8403:1;8388:284;8413:6;8410:1;8407:13;8388:284;;;8489:6;8483:13;8516:63;8575:3;8560:13;8516:63;:::i;:::-;8509:70;;8602:60;8655:6;8602:60;:::i;:::-;8592:70;;8448:224;8435:1;8432;8428:9;8423:14;;8388:284;;;8392:14;8688:3;8681:10;;8089:608;;;;;;;:::o;8703:109::-;8784:21;8799:5;8784:21;:::i;:::-;8779:3;8772:34;8762:50;;:::o;8818:118::-;8905:24;8923:5;8905:24;:::i;:::-;8900:3;8893:37;8883:53;;:::o;8942:157::-;9047:45;9067:24;9085:5;9067:24;:::i;:::-;9047:45;:::i;:::-;9042:3;9035:58;9025:74;;:::o;9105:360::-;;9219:38;9251:5;9219:38;:::i;:::-;9273:70;9336:6;9331:3;9273:70;:::i;:::-;9266:77;;9352:52;9397:6;9392:3;9385:4;9378:5;9374:16;9352:52;:::i;:::-;9429:29;9451:6;9429:29;:::i;:::-;9424:3;9420:39;9413:46;;9195:270;;;;;:::o;9471:364::-;;9587:39;9620:5;9587:39;:::i;:::-;9642:71;9706:6;9701:3;9642:71;:::i;:::-;9635:78;;9722:52;9767:6;9762:3;9755:4;9748:5;9744:16;9722:52;:::i;:::-;9799:29;9821:6;9799:29;:::i;:::-;9794:3;9790:39;9783:46;;9563:272;;;;;:::o;9841:377::-;;9975:39;10008:5;9975:39;:::i;:::-;10030:89;10112:6;10107:3;10030:89;:::i;:::-;10023:96;;10128:52;10173:6;10168:3;10161:4;10154:5;10150:16;10128:52;:::i;:::-;10205:6;10200:3;10196:16;10189:23;;9951:267;;;;;:::o;10224:371::-;;10387:67;10451:2;10446:3;10387:67;:::i;:::-;10380:74;;10484:34;10480:1;10475:3;10471:11;10464:55;10550:9;10545:2;10540:3;10536:12;10529:31;10586:2;10581:3;10577:12;10570:19;;10370:225;;;:::o;10601:380::-;;10764:67;10828:2;10823:3;10764:67;:::i;:::-;10757:74;;10861:34;10857:1;10852:3;10848:11;10841:55;10927:18;10922:2;10917:3;10913:12;10906:40;10972:2;10967:3;10963:12;10956:19;;10747:234;;;:::o;10987:372::-;;11150:67;11214:2;11209:3;11150:67;:::i;:::-;11143:74;;11247:34;11243:1;11238:3;11234:11;11227:55;11313:10;11308:2;11303:3;11299:12;11292:32;11350:2;11345:3;11341:12;11334:19;;11133:226;;;:::o;11365:375::-;;11528:67;11592:2;11587:3;11528:67;:::i;:::-;11521:74;;11625:34;11621:1;11616:3;11612:11;11605:55;11691:13;11686:2;11681:3;11677:12;11670:35;11731:2;11726:3;11722:12;11715:19;;11511:229;;;:::o;11746:382::-;;11909:67;11973:2;11968:3;11909:67;:::i;:::-;11902:74;;12006:34;12002:1;11997:3;11993:11;11986:55;12072:20;12067:2;12062:3;12058:12;12051:42;12119:2;12114:3;12110:12;12103:19;;11892:236;;;:::o;12134:370::-;;12297:67;12361:2;12356:3;12297:67;:::i;:::-;12290:74;;12394:34;12390:1;12385:3;12381:11;12374:55;12460:8;12455:2;12450:3;12446:12;12439:30;12495:2;12490:3;12486:12;12479:19;;12280:224;;;:::o;12510:326::-;;12673:67;12737:2;12732:3;12673:67;:::i;:::-;12666:74;;12770:30;12766:1;12761:3;12757:11;12750:51;12827:2;12822:3;12818:12;12811:19;;12656:180;;;:::o;12842:368::-;;13005:67;13069:2;13064:3;13005:67;:::i;:::-;12998:74;;13102:34;13098:1;13093:3;13089:11;13082:55;13168:6;13163:2;13158:3;13154:12;13147:28;13201:2;13196:3;13192:12;13185:19;;12988:222;;;:::o;13216:323::-;;13379:67;13443:2;13438:3;13379:67;:::i;:::-;13372:74;;13476:27;13472:1;13467:3;13463:11;13456:48;13530:2;13525:3;13521:12;13514:19;;13362:177;;;:::o;13545:329::-;;13708:67;13772:2;13767:3;13708:67;:::i;:::-;13701:74;;13805:33;13801:1;13796:3;13792:11;13785:54;13865:2;13860:3;13856:12;13849:19;;13691:183;;;:::o;13880:376::-;;14043:67;14107:2;14102:3;14043:67;:::i;:::-;14036:74;;14140:34;14136:1;14131:3;14127:11;14120:55;14206:14;14201:2;14196:3;14192:12;14185:36;14247:2;14242:3;14238:12;14231:19;;14026:230;;;:::o;14262:382::-;;14425:67;14489:2;14484:3;14425:67;:::i;:::-;14418:74;;14522:34;14518:1;14513:3;14509:11;14502:55;14588:20;14583:2;14578:3;14574:12;14567:42;14635:2;14630:3;14626:12;14619:19;;14408:236;;;:::o;14650:388::-;;14813:67;14877:2;14872:3;14813:67;:::i;:::-;14806:74;;14910:34;14906:1;14901:3;14897:11;14890:55;14976:26;14971:2;14966:3;14962:12;14955:48;15029:2;15024:3;15020:12;15013:19;;14796:242;;;:::o;15044:374::-;;15207:67;15271:2;15266:3;15207:67;:::i;:::-;15200:74;;15304:34;15300:1;15295:3;15291:11;15284:55;15370:12;15365:2;15360:3;15356:12;15349:34;15409:2;15404:3;15400:12;15393:19;;15190:228;;;:::o;15424:373::-;;15587:67;15651:2;15646:3;15587:67;:::i;:::-;15580:74;;15684:34;15680:1;15675:3;15671:11;15664:55;15750:11;15745:2;15740:3;15736:12;15729:33;15788:2;15783:3;15779:12;15772:19;;15570:227;;;:::o;15803:329::-;;15966:67;16030:2;16025:3;15966:67;:::i;:::-;15959:74;;16063:33;16059:1;16054:3;16050:11;16043:54;16123:2;16118:3;16114:12;16107:19;;15949:183;;;:::o;16138:374::-;;16301:67;16365:2;16360:3;16301:67;:::i;:::-;16294:74;;16398:34;16394:1;16389:3;16385:11;16378:55;16464:12;16459:2;16454:3;16450:12;16443:34;16503:2;16498:3;16494:12;16487:19;;16284:228;;;:::o;16518:330::-;;16681:67;16745:2;16740:3;16681:67;:::i;:::-;16674:74;;16778:34;16774:1;16769:3;16765:11;16758:55;16839:2;16834:3;16830:12;16823:19;;16664:184;;;:::o;16854:376::-;;17017:67;17081:2;17076:3;17017:67;:::i;:::-;17010:74;;17114:34;17110:1;17105:3;17101:11;17094:55;17180:14;17175:2;17170:3;17166:12;17159:36;17221:2;17216:3;17212:12;17205:19;;17000:230;;;:::o;17236:330::-;;17399:67;17463:2;17458:3;17399:67;:::i;:::-;17392:74;;17496:34;17492:1;17487:3;17483:11;17476:55;17557:2;17552:3;17548:12;17541:19;;17382:184;;;:::o;17572:373::-;;17735:67;17799:2;17794:3;17735:67;:::i;:::-;17728:74;;17832:34;17828:1;17823:3;17819:11;17812:55;17898:11;17893:2;17888:3;17884:12;17877:33;17936:2;17931:3;17927:12;17920:19;;17718:227;;;:::o;17951:379::-;;18114:67;18178:2;18173:3;18114:67;:::i;:::-;18107:74;;18211:34;18207:1;18202:3;18198:11;18191:55;18277:17;18272:2;18267:3;18263:12;18256:39;18321:2;18316:3;18312:12;18305:19;;18097:233;;;:::o;18336:372::-;;18499:67;18563:2;18558:3;18499:67;:::i;:::-;18492:74;;18596:34;18592:1;18587:3;18583:11;18576:55;18662:10;18657:2;18652:3;18648:12;18641:32;18699:2;18694:3;18690:12;18683:19;;18482:226;;;:::o;18714:365::-;;18877:67;18941:2;18936:3;18877:67;:::i;:::-;18870:74;;18974:34;18970:1;18965:3;18961:11;18954:55;19040:3;19035:2;19030:3;19026:12;19019:25;19070:2;19065:3;19061:12;19054:19;;18860:219;;;:::o;19085:325::-;;19248:67;19312:2;19307:3;19248:67;:::i;:::-;19241:74;;19345:29;19341:1;19336:3;19332:11;19325:50;19401:2;19396:3;19392:12;19385:19;;19231:179;;;:::o;19416:381::-;;19579:67;19643:2;19638:3;19579:67;:::i;:::-;19572:74;;19676:34;19672:1;19667:3;19663:11;19656:55;19742:19;19737:2;19732:3;19728:12;19721:41;19788:2;19783:3;19779:12;19772:19;;19562:235;;;:::o;19803:376::-;;19966:67;20030:2;20025:3;19966:67;:::i;:::-;19959:74;;20063:34;20059:1;20054:3;20050:11;20043:55;20129:14;20124:2;20119:3;20115:12;20108:36;20170:2;20165:3;20161:12;20154:19;;19949:230;;;:::o;20185:311::-;;20348:67;20412:2;20407:3;20348:67;:::i;:::-;20341:74;;20445:15;20441:1;20436:3;20432:11;20425:36;20487:2;20482:3;20478:12;20471:19;;20331:165;;;:::o;20502:108::-;20579:24;20597:5;20579:24;:::i;:::-;20574:3;20567:37;20557:53;;:::o;20616:118::-;20703:24;20721:5;20703:24;:::i;:::-;20698:3;20691:37;20681:53;;:::o;20740:256::-;;20867:75;20938:3;20929:6;20867:75;:::i;:::-;20967:2;20962:3;20958:12;20951:19;;20987:3;20980:10;;20856:140;;;;:::o;21002:397::-;;21157:75;21228:3;21219:6;21157:75;:::i;:::-;21257:2;21252:3;21248:12;21241:19;;21270:75;21341:3;21332:6;21270:75;:::i;:::-;21370:2;21365:3;21361:12;21354:19;;21390:3;21383:10;;21146:253;;;;;:::o;21405:435::-;;21607:95;21698:3;21689:6;21607:95;:::i;:::-;21600:102;;21719:95;21810:3;21801:6;21719:95;:::i;:::-;21712:102;;21831:3;21824:10;;21589:251;;;;;:::o;21846:222::-;;21977:2;21966:9;21962:18;21954:26;;21990:71;22058:1;22047:9;22043:17;22034:6;21990:71;:::i;:::-;21944:124;;;;:::o;22074:640::-;;22307:3;22296:9;22292:19;22284:27;;22321:71;22389:1;22378:9;22374:17;22365:6;22321:71;:::i;:::-;22402:72;22470:2;22459:9;22455:18;22446:6;22402:72;:::i;:::-;22484;22552:2;22541:9;22537:18;22528:6;22484:72;:::i;:::-;22603:9;22597:4;22593:20;22588:2;22577:9;22573:18;22566:48;22631:76;22702:4;22693:6;22631:76;:::i;:::-;22623:84;;22274:440;;;;;;;:::o;22720:373::-;;22901:2;22890:9;22886:18;22878:26;;22950:9;22944:4;22940:20;22936:1;22925:9;22921:17;22914:47;22978:108;23081:4;23072:6;22978:108;:::i;:::-;22970:116;;22868:225;;;;:::o;23099:210::-;;23224:2;23213:9;23209:18;23201:26;;23237:65;23299:1;23288:9;23284:17;23275:6;23237:65;:::i;:::-;23191:118;;;;:::o;23315:222::-;;23446:2;23435:9;23431:18;23423:26;;23459:71;23527:1;23516:9;23512:17;23503:6;23459:71;:::i;:::-;23413:124;;;;:::o;23543:313::-;;23694:2;23683:9;23679:18;23671:26;;23743:9;23737:4;23733:20;23729:1;23718:9;23714:17;23707:47;23771:78;23844:4;23835:6;23771:78;:::i;:::-;23763:86;;23661:195;;;;:::o;23862:419::-;;24066:2;24055:9;24051:18;24043:26;;24115:9;24109:4;24105:20;24101:1;24090:9;24086:17;24079:47;24143:131;24269:4;24143:131;:::i;:::-;24135:139;;24033:248;;;:::o;24287:419::-;;24491:2;24480:9;24476:18;24468:26;;24540:9;24534:4;24530:20;24526:1;24515:9;24511:17;24504:47;24568:131;24694:4;24568:131;:::i;:::-;24560:139;;24458:248;;;:::o;24712:419::-;;24916:2;24905:9;24901:18;24893:26;;24965:9;24959:4;24955:20;24951:1;24940:9;24936:17;24929:47;24993:131;25119:4;24993:131;:::i;:::-;24985:139;;24883:248;;;:::o;25137:419::-;;25341:2;25330:9;25326:18;25318:26;;25390:9;25384:4;25380:20;25376:1;25365:9;25361:17;25354:47;25418:131;25544:4;25418:131;:::i;:::-;25410:139;;25308:248;;;:::o;25562:419::-;;25766:2;25755:9;25751:18;25743:26;;25815:9;25809:4;25805:20;25801:1;25790:9;25786:17;25779:47;25843:131;25969:4;25843:131;:::i;:::-;25835:139;;25733:248;;;:::o;25987:419::-;;26191:2;26180:9;26176:18;26168:26;;26240:9;26234:4;26230:20;26226:1;26215:9;26211:17;26204:47;26268:131;26394:4;26268:131;:::i;:::-;26260:139;;26158:248;;;:::o;26412:419::-;;26616:2;26605:9;26601:18;26593:26;;26665:9;26659:4;26655:20;26651:1;26640:9;26636:17;26629:47;26693:131;26819:4;26693:131;:::i;:::-;26685:139;;26583:248;;;:::o;26837:419::-;;27041:2;27030:9;27026:18;27018:26;;27090:9;27084:4;27080:20;27076:1;27065:9;27061:17;27054:47;27118:131;27244:4;27118:131;:::i;:::-;27110:139;;27008:248;;;:::o;27262:419::-;;27466:2;27455:9;27451:18;27443:26;;27515:9;27509:4;27505:20;27501:1;27490:9;27486:17;27479:47;27543:131;27669:4;27543:131;:::i;:::-;27535:139;;27433:248;;;:::o;27687:419::-;;27891:2;27880:9;27876:18;27868:26;;27940:9;27934:4;27930:20;27926:1;27915:9;27911:17;27904:47;27968:131;28094:4;27968:131;:::i;:::-;27960:139;;27858:248;;;:::o;28112:419::-;;28316:2;28305:9;28301:18;28293:26;;28365:9;28359:4;28355:20;28351:1;28340:9;28336:17;28329:47;28393:131;28519:4;28393:131;:::i;:::-;28385:139;;28283:248;;;:::o;28537:419::-;;28741:2;28730:9;28726:18;28718:26;;28790:9;28784:4;28780:20;28776:1;28765:9;28761:17;28754:47;28818:131;28944:4;28818:131;:::i;:::-;28810:139;;28708:248;;;:::o;28962:419::-;;29166:2;29155:9;29151:18;29143:26;;29215:9;29209:4;29205:20;29201:1;29190:9;29186:17;29179:47;29243:131;29369:4;29243:131;:::i;:::-;29235:139;;29133:248;;;:::o;29387:419::-;;29591:2;29580:9;29576:18;29568:26;;29640:9;29634:4;29630:20;29626:1;29615:9;29611:17;29604:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29558:248;;;:::o;29812:419::-;;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29983:248;;;:::o;30237:419::-;;30441:2;30430:9;30426:18;30418:26;;30490:9;30484:4;30480:20;30476:1;30465:9;30461:17;30454:47;30518:131;30644:4;30518:131;:::i;:::-;30510:139;;30408:248;;;:::o;30662:419::-;;30866:2;30855:9;30851:18;30843:26;;30915:9;30909:4;30905:20;30901:1;30890:9;30886:17;30879:47;30943:131;31069:4;30943:131;:::i;:::-;30935:139;;30833:248;;;:::o;31087:419::-;;31291:2;31280:9;31276:18;31268:26;;31340:9;31334:4;31330:20;31326:1;31315:9;31311:17;31304:47;31368:131;31494:4;31368:131;:::i;:::-;31360:139;;31258:248;;;:::o;31512:419::-;;31716:2;31705:9;31701:18;31693:26;;31765:9;31759:4;31755:20;31751:1;31740:9;31736:17;31729:47;31793:131;31919:4;31793:131;:::i;:::-;31785:139;;31683:248;;;:::o;31937:419::-;;32141:2;32130:9;32126:18;32118:26;;32190:9;32184:4;32180:20;32176:1;32165:9;32161:17;32154:47;32218:131;32344:4;32218:131;:::i;:::-;32210:139;;32108:248;;;:::o;32362:419::-;;32566:2;32555:9;32551:18;32543:26;;32615:9;32609:4;32605:20;32601:1;32590:9;32586:17;32579:47;32643:131;32769:4;32643:131;:::i;:::-;32635:139;;32533:248;;;:::o;32787:419::-;;32991:2;32980:9;32976:18;32968:26;;33040:9;33034:4;33030:20;33026:1;33015:9;33011:17;33004:47;33068:131;33194:4;33068:131;:::i;:::-;33060:139;;32958:248;;;:::o;33212:419::-;;33416:2;33405:9;33401:18;33393:26;;33465:9;33459:4;33455:20;33451:1;33440:9;33436:17;33429:47;33493:131;33619:4;33493:131;:::i;:::-;33485:139;;33383:248;;;:::o;33637:419::-;;33841:2;33830:9;33826:18;33818:26;;33890:9;33884:4;33880:20;33876:1;33865:9;33861:17;33854:47;33918:131;34044:4;33918:131;:::i;:::-;33910:139;;33808:248;;;:::o;34062:419::-;;34266:2;34255:9;34251:18;34243:26;;34315:9;34309:4;34305:20;34301:1;34290:9;34286:17;34279:47;34343:131;34469:4;34343:131;:::i;:::-;34335:139;;34233:248;;;:::o;34487:419::-;;34691:2;34680:9;34676:18;34668:26;;34740:9;34734:4;34730:20;34726:1;34715:9;34711:17;34704:47;34768:131;34894:4;34768:131;:::i;:::-;34760:139;;34658:248;;;:::o;34912:419::-;;35116:2;35105:9;35101:18;35093:26;;35165:9;35159:4;35155:20;35151:1;35140:9;35136:17;35129:47;35193:131;35319:4;35193:131;:::i;:::-;35185:139;;35083:248;;;:::o;35337:419::-;;35541:2;35530:9;35526:18;35518:26;;35590:9;35584:4;35580:20;35576:1;35565:9;35561:17;35554:47;35618:131;35744:4;35618:131;:::i;:::-;35610:139;;35508:248;;;:::o;35762:222::-;;35893:2;35882:9;35878:18;35870:26;;35906:71;35974:1;35963:9;35959:17;35950:6;35906:71;:::i;:::-;35860:124;;;;:::o;35990:283::-;;36056:2;36050:9;36040:19;;36098:4;36090:6;36086:17;36205:6;36193:10;36190:22;36169:18;36157:10;36154:34;36151:62;36148:2;;;36216:18;;:::i;:::-;36148:2;36256:10;36252:2;36245:22;36030:243;;;;:::o;36279:331::-;;36430:18;36422:6;36419:30;36416:2;;;36452:18;;:::i;:::-;36416:2;36537:4;36533:9;36526:4;36518:6;36514:17;36510:33;36502:41;;36598:4;36592;36588:15;36580:23;;36345:265;;;:::o;36616:332::-;;36768:18;36760:6;36757:30;36754:2;;;36790:18;;:::i;:::-;36754:2;36875:4;36871:9;36864:4;36856:6;36852:17;36848:33;36840:41;;36936:4;36930;36926:15;36918:23;;36683:265;;;:::o;36954:132::-;;37044:3;37036:11;;37074:4;37069:3;37065:14;37057:22;;37026:60;;;:::o;37092:114::-;;37193:5;37187:12;37177:22;;37166:40;;;:::o;37212:98::-;;37297:5;37291:12;37281:22;;37270:40;;;:::o;37316:99::-;;37402:5;37396:12;37386:22;;37375:40;;;:::o;37421:113::-;;37523:4;37518:3;37514:14;37506:22;;37496:38;;;:::o;37540:184::-;;37673:6;37668:3;37661:19;37713:4;37708:3;37704:14;37689:29;;37651:73;;;;:::o;37730:168::-;;37847:6;37842:3;37835:19;37887:4;37882:3;37878:14;37863:29;;37825:73;;;;:::o;37904:169::-;;38022:6;38017:3;38010:19;38062:4;38057:3;38053:14;38038:29;;38000:73;;;;:::o;38079:148::-;;38218:3;38203:18;;38193:34;;;;:::o;38233:305::-;;38292:20;38310:1;38292:20;:::i;:::-;38287:25;;38326:20;38344:1;38326:20;:::i;:::-;38321:25;;38480:1;38412:66;38408:74;38405:1;38402:81;38399:2;;;38486:18;;:::i;:::-;38399:2;38530:1;38527;38523:9;38516:16;;38277:261;;;;:::o;38544:185::-;;38601:20;38619:1;38601:20;:::i;:::-;38596:25;;38635:20;38653:1;38635:20;:::i;:::-;38630:25;;38674:1;38664:2;;38679:18;;:::i;:::-;38664:2;38721:1;38718;38714:9;38709:14;;38586:143;;;;:::o;38735:348::-;;38798:20;38816:1;38798:20;:::i;:::-;38793:25;;38832:20;38850:1;38832:20;:::i;:::-;38827:25;;39020:1;38952:66;38948:74;38945:1;38942:81;38937:1;38930:9;38923:17;38919:105;38916:2;;;39027:18;;:::i;:::-;38916:2;39075:1;39072;39068:9;39057:20;;38783:300;;;;:::o;39089:191::-;;39149:20;39167:1;39149:20;:::i;:::-;39144:25;;39183:20;39201:1;39183:20;:::i;:::-;39178:25;;39222:1;39219;39216:8;39213:2;;;39227:18;;:::i;:::-;39213:2;39272:1;39269;39265:9;39257:17;;39134:146;;;;:::o;39286:96::-;;39352:24;39370:5;39352:24;:::i;:::-;39341:35;;39331:51;;;:::o;39388:90::-;;39465:5;39458:13;39451:21;39440:32;;39430:48;;;:::o;39484:77::-;;39550:5;39539:16;;39529:32;;;:::o;39567:149::-;;39643:66;39636:5;39632:78;39621:89;;39611:105;;;:::o;39722:126::-;;39799:42;39792:5;39788:54;39777:65;;39767:81;;;:::o;39854:77::-;;39920:5;39909:16;;39899:32;;;:::o;39937:154::-;40021:6;40016:3;40011;39998:30;40083:1;40074:6;40069:3;40065:16;40058:27;39988:103;;;:::o;40097:307::-;40165:1;40175:113;40189:6;40186:1;40183:13;40175:113;;;40274:1;40269:3;40265:11;40259:18;40255:1;40250:3;40246:11;40239:39;40211:2;40208:1;40204:10;40199:15;;40175:113;;;40306:6;40303:1;40300:13;40297:2;;;40386:1;40377:6;40372:3;40368:16;40361:27;40297:2;40146:258;;;;:::o;40410:320::-;;40491:1;40485:4;40481:12;40471:22;;40538:1;40532:4;40528:12;40559:18;40549:2;;40615:4;40607:6;40603:17;40593:27;;40549:2;40677;40669:6;40666:14;40646:18;40643:38;40640:2;;;40696:18;;:::i;:::-;40640:2;40461:269;;;;:::o;40736:233::-;;40798:24;40816:5;40798:24;:::i;:::-;40789:33;;40844:66;40837:5;40834:77;40831:2;;;40914:18;;:::i;:::-;40831:2;40961:1;40954:5;40950:13;40943:20;;40779:190;;;:::o;40975:100::-;;41043:26;41063:5;41043:26;:::i;:::-;41032:37;;41022:53;;;:::o;41081:79::-;;41149:5;41138:16;;41128:32;;;:::o;41166:94::-;;41234:20;41248:5;41234:20;:::i;:::-;41223:31;;41213:47;;;:::o;41266:176::-;;41315:20;41333:1;41315:20;:::i;:::-;41310:25;;41349:20;41367:1;41349:20;:::i;:::-;41344:25;;41388:1;41378:2;;41393:18;;:::i;:::-;41378:2;41434:1;41431;41427:9;41422:14;;41300:142;;;;:::o;41448:180::-;41496:77;41493:1;41486:88;41593:4;41590:1;41583:15;41617:4;41614:1;41607:15;41634:180;41682:77;41679:1;41672:88;41779:4;41776:1;41769:15;41803:4;41800:1;41793:15;41820:180;41868:77;41865:1;41858:88;41965:4;41962:1;41955:15;41989:4;41986:1;41979:15;42006:180;42054:77;42051:1;42044:88;42151:4;42148:1;42141:15;42175:4;42172:1;42165:15;42192:102;;42284:2;42280:7;42275:2;42268:5;42264:14;42260:28;42250:38;;42240:54;;;:::o;42300:94::-;;42381:5;42377:2;42373:14;42352:35;;42342:52;;;:::o;42400:122::-;42473:24;42491:5;42473:24;:::i;:::-;42466:5;42463:35;42453:2;;42512:1;42509;42502:12;42453:2;42443:79;:::o;42528:116::-;42598:21;42613:5;42598:21;:::i;:::-;42591:5;42588:32;42578:2;;42634:1;42631;42624:12;42578:2;42568:76;:::o;42650:122::-;42723:24;42741:5;42723:24;:::i;:::-;42716:5;42713:35;42703:2;;42762:1;42759;42752:12;42703:2;42693:79;:::o;42778:120::-;42850:23;42867:5;42850:23;:::i;:::-;42843:5;42840:34;42830:2;;42888:1;42885;42878:12;42830:2;42820:78;:::o;42904:122::-;42977:24;42995:5;42977:24;:::i;:::-;42970:5;42967:35;42957:2;;43016:1;43013;43006:12;42957:2;42947:79;:::o

Swarm Source

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