ETH Price: $3,101.72 (+1.09%)
Gas: 14 Gwei

Token

Vinci Protocol NFT (VinciNFT)
 

Overview

Max Total Supply

283 VinciNFT

Holders

283

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x5ac163a73831f1c6d6b2d3d1b34a24c2e7d15a85
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Vinci Protocol is an NFT-backed DeFi protocol for boosting liquidity and hedging volatility.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
VinciNFT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-27
*/

// Sources flattened with hardhat v2.9.3 https://hardhat.org

// File @openzeppelin/contracts/utils/cryptography/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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/ERC1155/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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/[email protected]

// 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/introspection/[email protected]

// 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/ERC1155/[email protected]

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @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, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// 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/[email protected]

// 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 contracts/VinciNFT.sol

pragma solidity ^0.8.0;




contract VinciNFT is ERC1155, Ownable {
    bytes32 public merkleRoot;
    string public baseURI;
    mapping(address=>bool) public claimed;

    constructor(bytes32 _merkleRoot, string memory _baseURI) ERC1155(_baseURI) {
        merkleRoot = _merkleRoot;
        baseURI = _baseURI;
    }

    function setParams(bytes32 _merkleRoot, string memory _baseURI) external onlyOwner {
        merkleRoot = _merkleRoot;
        baseURI = _baseURI;
    }
    
    function mint(bytes32[] calldata _merkleProof, uint256 _amount) public {
        require(claimed[msg.sender] == false, "already claimed");
        claimed[msg.sender] = true;
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, _amount));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf) == true, "wrong merkle proof");
        _mint(msg.sender, 1, 1, "");
    }

    function hasClaimed(address _addr) public view returns (bool) {
        return claimed[_addr];
    }

    function tokenURI(uint256 _id) public view returns (string memory) {
        return string(abi.encodePacked(baseURI, Strings.toString(_id), ".json"));
    }

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI, "1.json"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setParams","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":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162003fee38038062003fee8339818101604052810190620000379190620002b5565b8062000049816200009260201b60201c565b506200006a6200005e620000ae60201b60201c565b620000b660201b60201c565b816004819055508060059080519060200190620000899291906200017c565b505050620004a3565b8060029080519060200190620000aa9291906200017c565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200018a90620003ae565b90600052602060002090601f016020900481019282620001ae5760008555620001fa565b82601f10620001c957805160ff1916838001178555620001fa565b82800160010185558215620001fa579182015b82811115620001f9578251825591602001919060010190620001dc565b5b5090506200020991906200020d565b5090565b5b80821115620002285760008160009055506001016200020e565b5090565b6000620002436200023d8462000338565b6200030f565b9050828152602081018484840111156200025c57600080fd5b6200026984828562000378565b509392505050565b600081519050620002828162000489565b92915050565b600082601f8301126200029a57600080fd5b8151620002ac8482602086016200022c565b91505092915050565b60008060408385031215620002c957600080fd5b6000620002d98582860162000271565b925050602083015167ffffffffffffffff811115620002f757600080fd5b620003058582860162000288565b9150509250929050565b60006200031b6200032e565b9050620003298282620003e4565b919050565b6000604051905090565b600067ffffffffffffffff82111562000356576200035562000449565b5b620003618262000478565b9050602081019050919050565b6000819050919050565b60005b83811015620003985780820151818401526020810190506200037b565b83811115620003a8576000848401525b50505050565b60006002820490506001821680620003c757607f821691505b60208210811415620003de57620003dd6200041a565b5b50919050565b620003ef8262000478565b810181811067ffffffffffffffff8211171562000411576200041062000449565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b62000494816200036e565b8114620004a057600080fd5b50565b613b3b80620004b36000396000f3fe608060405234801561001057600080fd5b50600436106101205760003560e01c8063715018a6116100ad578063c884ef8311610071578063c884ef8314610319578063e8a3d48514610349578063e985e9c514610367578063f242432a14610397578063f2fde38b146103b357610120565b8063715018a61461027557806373b2e80e1461027f5780638da5cb5b146102af578063a22cb465146102cd578063c87b56dd146102e957610120565b80632eb4a7ab116100f45780632eb4a7ab146101d15780633316550d146101ef57806345de0d9b1461020b5780634e1273f4146102275780636c0360eb1461025757610120565b8062fdd58e1461012557806301ffc9a7146101555780630e89341c146101855780632eb2c2d6146101b5575b600080fd5b61013f600480360381019061013a919061261a565b6103cf565b60405161014c9190613038565b60405180910390f35b61016f600480360381019061016a919061276e565b610498565b60405161017c9190612e00565b60405180910390f35b61019f600480360381019061019a91906127c0565b61057a565b6040516101ac9190612e36565b60405180910390f35b6101cf60048036038101906101ca9190612490565b61060e565b005b6101d96106af565b6040516101e69190612e1b565b60405180910390f35b6102096004803603810190610204919061271a565b6106b5565b005b610225600480360381019061022091906126c2565b610753565b005b610241600480360381019061023c9190612656565b610921565b60405161024e9190612da7565b60405180910390f35b61025f610ad2565b60405161026c9190612e36565b60405180910390f35b61027d610b60565b005b6102996004803603810190610294919061242b565b610be8565b6040516102a69190612e00565b60405180910390f35b6102b7610c3e565b6040516102c49190612cca565b60405180910390f35b6102e760048036038101906102e291906125de565b610c68565b005b61030360048036038101906102fe91906127c0565b610c7e565b6040516103109190612e36565b60405180910390f35b610333600480360381019061032e919061242b565b610cb2565b6040516103409190612e00565b60405180910390f35b610351610cd2565b60405161035e9190612e36565b60405180910390f35b610381600480360381019061037c9190612454565b610cfa565b60405161038e9190612e00565b60405180910390f35b6103b160048036038101906103ac919061254f565b610d8e565b005b6103cd60048036038101906103c8919061242b565b610e2f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043790612e98565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061056357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610573575061057282610f27565b5b9050919050565b60606002805461058990613367565b80601f01602080910402602001604051908101604052809291908181526020018280546105b590613367565b80156106025780601f106105d757610100808354040283529160200191610602565b820191906000526020600020905b8154815290600101906020018083116105e557829003601f168201915b50505050509050919050565b610616610f91565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061065c575061065b85610656610f91565b610cfa565b5b61069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069290612f58565b60405180910390fd5b6106a88585858585610f99565b5050505050565b60045481565b6106bd610f91565b73ffffffffffffffffffffffffffffffffffffffff166106db610c3e565b73ffffffffffffffffffffffffffffffffffffffff1614610731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072890612f98565b60405180910390fd5b81600481905550806005908051906020019061074e9291906120c4565b505050565b60001515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd90612ed8565b60405180910390fd5b6001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060003382604051602001610853929190612c4d565b604051602081830303815290604052805190602001209050600115156108bd858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060045484611307565b1515146108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f690612f18565b60405180910390fd5b61091b336001806040518060200160405280600081525061131e565b50505050565b60608151835114610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e90612fd8565b60405180910390fd5b6000835167ffffffffffffffff8111156109aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109d85781602001602082028036833780820191505090505b50905060005b8451811015610ac757610a71858281518110610a23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516103cf565b828281518110610aaa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610ac0906133ca565b90506109de565b508091505092915050565b60058054610adf90613367565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90613367565b8015610b585780601f10610b2d57610100808354040283529160200191610b58565b820191906000526020600020905b815481529060010190602001808311610b3b57829003601f168201915b505050505081565b610b68610f91565b73ffffffffffffffffffffffffffffffffffffffff16610b86610c3e565b73ffffffffffffffffffffffffffffffffffffffff1614610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390612f98565b60405180910390fd5b610be660006114cf565b565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c7a610c73610f91565b8383611595565b5050565b60606005610c8b83611702565b604051602001610c9c929190612c79565b6040516020818303038152906040529050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b60606005604051602001610ce69190612ca8565b604051602081830303815290604052905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d96610f91565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ddc5750610ddb85610dd6610f91565b610cfa565b5b610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1290612ef8565b60405180910390fd5b610e2885858585856118af565b5050505050565b610e37610f91565b73ffffffffffffffffffffffffffffffffffffffff16610e55610c3e565b73ffffffffffffffffffffffffffffffffffffffff1614610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290612f98565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1290612eb8565b60405180910390fd5b610f24816114cf565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8151835114610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490612ff8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490612f38565b60405180910390fd5b6000611057610f91565b9050611067818787878787611b4b565b60005b84518110156112645760008582815181106110ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106110f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b90612f78565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461124991906131ec565b925050819055505050508061125d906133ca565b905061106a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112db929190612dc9565b60405180910390a46112f1818787878787611b53565b6112ff818787878787611b5b565b505050505050565b6000826113148584611d42565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138590613018565b60405180910390fd5b6000611398610f91565b905060006113a585611ddd565b905060006113b285611ddd565b90506113c383600089858589611b4b565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461142291906131ec565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516114a0929190613053565b60405180910390a46114b783600089858589611b53565b6114c683600089898989611ea3565b50505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90612fb8565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116f59190612e00565b60405180910390a3505050565b6060600082141561174a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118aa565b600082905060005b6000821461177c578080611765906133ca565b915050600a826117759190613242565b9150611752565b60008167ffffffffffffffff8111156117be577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156117f05781602001600182028036833780820191505090505b5090505b600085146118a3576001826118099190613273565b9150600a856118189190613441565b603061182491906131ec565b60f81b818381518110611860577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561189c9190613242565b94506117f4565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690612f38565b60405180910390fd5b6000611929610f91565b9050600061193685611ddd565b9050600061194385611ddd565b9050611953838989858589611b4b565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190612f78565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a9f91906131ec565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611b1c929190613053565b60405180910390a4611b32848a8a86868a611b53565b611b40848a8a8a8a8a611ea3565b505050505050505050565b505050505050565b505050505050565b611b7a8473ffffffffffffffffffffffffffffffffffffffff1661208a565b15611d3a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611bc0959493929190612ce5565b602060405180830381600087803b158015611bda57600080fd5b505af1925050508015611c0b57506040513d601f19601f82011682018060405250810190611c089190612797565b60015b611cb157611c1761352e565b806308c379a01415611c745750611c2c6139fc565b80611c375750611c76565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b9190612e36565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890612e58565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90612e78565b60405180910390fd5b505b505050505050565b60008082905060005b8451811015611dd2576000858281518110611d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611db157611daa83826120ad565b9250611dbe565b611dbb81846120ad565b92505b508080611dca906133ca565b915050611d4b565b508091505092915050565b60606000600167ffffffffffffffff811115611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e505781602001602082028036833780820191505090505b5090508281600081518110611e8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b611ec28473ffffffffffffffffffffffffffffffffffffffff1661208a565b15612082578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611f08959493929190612d4d565b602060405180830381600087803b158015611f2257600080fd5b505af1925050508015611f5357506040513d601f19601f82011682018060405250810190611f509190612797565b60015b611ff957611f5f61352e565b806308c379a01415611fbc5750611f746139fc565b80611f7f5750611fbe565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb39190612e36565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090612e58565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207790612e78565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b8280546120d090613367565b90600052602060002090601f0160209004810192826120f25760008555612139565b82601f1061210b57805160ff1916838001178555612139565b82800160010185558215612139579182015b8281111561213857825182559160200191906001019061211d565b5b509050612146919061214a565b5090565b5b8082111561216357600081600090555060010161214b565b5090565b600061217a612175846130a1565b61307c565b9050808382526020820190508285602086028201111561219957600080fd5b60005b858110156121c957816121af88826122bb565b84526020840193506020830192505060018101905061219c565b5050509392505050565b60006121e66121e1846130cd565b61307c565b9050808382526020820190508285602086028201111561220557600080fd5b60005b85811015612235578161221b8882612416565b845260208401935060208301925050600181019050612208565b5050509392505050565b600061225261224d846130f9565b61307c565b90508281526020810184848401111561226a57600080fd5b612275848285613325565b509392505050565b600061229061228b8461312a565b61307c565b9050828152602081018484840111156122a857600080fd5b6122b3848285613325565b509392505050565b6000813590506122ca81613a92565b92915050565b600082601f8301126122e157600080fd5b81356122f1848260208601612167565b91505092915050565b60008083601f84011261230c57600080fd5b8235905067ffffffffffffffff81111561232557600080fd5b60208301915083602082028301111561233d57600080fd5b9250929050565b600082601f83011261235557600080fd5b81356123658482602086016121d3565b91505092915050565b60008135905061237d81613aa9565b92915050565b60008135905061239281613ac0565b92915050565b6000813590506123a781613ad7565b92915050565b6000815190506123bc81613ad7565b92915050565b600082601f8301126123d357600080fd5b81356123e384826020860161223f565b91505092915050565b600082601f8301126123fd57600080fd5b813561240d84826020860161227d565b91505092915050565b60008135905061242581613aee565b92915050565b60006020828403121561243d57600080fd5b600061244b848285016122bb565b91505092915050565b6000806040838503121561246757600080fd5b6000612475858286016122bb565b9250506020612486858286016122bb565b9150509250929050565b600080600080600060a086880312156124a857600080fd5b60006124b6888289016122bb565b95505060206124c7888289016122bb565b945050604086013567ffffffffffffffff8111156124e457600080fd5b6124f088828901612344565b935050606086013567ffffffffffffffff81111561250d57600080fd5b61251988828901612344565b925050608086013567ffffffffffffffff81111561253657600080fd5b612542888289016123c2565b9150509295509295909350565b600080600080600060a0868803121561256757600080fd5b6000612575888289016122bb565b9550506020612586888289016122bb565b945050604061259788828901612416565b93505060606125a888828901612416565b925050608086013567ffffffffffffffff8111156125c557600080fd5b6125d1888289016123c2565b9150509295509295909350565b600080604083850312156125f157600080fd5b60006125ff858286016122bb565b92505060206126108582860161236e565b9150509250929050565b6000806040838503121561262d57600080fd5b600061263b858286016122bb565b925050602061264c85828601612416565b9150509250929050565b6000806040838503121561266957600080fd5b600083013567ffffffffffffffff81111561268357600080fd5b61268f858286016122d0565b925050602083013567ffffffffffffffff8111156126ac57600080fd5b6126b885828601612344565b9150509250929050565b6000806000604084860312156126d757600080fd5b600084013567ffffffffffffffff8111156126f157600080fd5b6126fd868287016122fa565b9350935050602061271086828701612416565b9150509250925092565b6000806040838503121561272d57600080fd5b600061273b85828601612383565b925050602083013567ffffffffffffffff81111561275857600080fd5b612764858286016123ec565b9150509250929050565b60006020828403121561278057600080fd5b600061278e84828501612398565b91505092915050565b6000602082840312156127a957600080fd5b60006127b7848285016123ad565b91505092915050565b6000602082840312156127d257600080fd5b60006127e084828501612416565b91505092915050565b60006127f58383612c18565b60208301905092915050565b61280a816132a7565b82525050565b61282161281c826132a7565b613413565b82525050565b600061283282613180565b61283c81856131ae565b93506128478361315b565b8060005b8381101561287857815161285f88826127e9565b975061286a836131a1565b92505060018101905061284b565b5085935050505092915050565b61288e816132b9565b82525050565b61289d816132c5565b82525050565b60006128ae8261318b565b6128b881856131bf565b93506128c8818560208601613334565b6128d181613550565b840191505092915050565b60006128e782613196565b6128f181856131d0565b9350612901818560208601613334565b61290a81613550565b840191505092915050565b600061292082613196565b61292a81856131e1565b935061293a818560208601613334565b80840191505092915050565b6000815461295381613367565b61295d81866131e1565b945060018216600081146129785760018114612989576129bc565b60ff198316865281860193506129bc565b6129928561316b565b60005b838110156129b457815481890152600182019150602081019050612995565b838801955050505b50505092915050565b60006129d26034836131d0565b91506129dd8261357b565b604082019050919050565b60006129f56028836131d0565b9150612a00826135ca565b604082019050919050565b6000612a18602b836131d0565b9150612a2382613619565b604082019050919050565b6000612a3b6026836131d0565b9150612a4682613668565b604082019050919050565b6000612a5e6006836131e1565b9150612a69826136b7565b600682019050919050565b6000612a81600f836131d0565b9150612a8c826136e0565b602082019050919050565b6000612aa46029836131d0565b9150612aaf82613709565b604082019050919050565b6000612ac76012836131d0565b9150612ad282613758565b602082019050919050565b6000612aea6025836131d0565b9150612af582613781565b604082019050919050565b6000612b0d6032836131d0565b9150612b18826137d0565b604082019050919050565b6000612b30602a836131d0565b9150612b3b8261381f565b604082019050919050565b6000612b536005836131e1565b9150612b5e8261386e565b600582019050919050565b6000612b766020836131d0565b9150612b8182613897565b602082019050919050565b6000612b996029836131d0565b9150612ba4826138c0565b604082019050919050565b6000612bbc6029836131d0565b9150612bc78261390f565b604082019050919050565b6000612bdf6028836131d0565b9150612bea8261395e565b604082019050919050565b6000612c026021836131d0565b9150612c0d826139ad565b604082019050919050565b612c218161331b565b82525050565b612c308161331b565b82525050565b612c47612c428261331b565b613437565b82525050565b6000612c598285612810565b601482019150612c698284612c36565b6020820191508190509392505050565b6000612c858285612946565b9150612c918284612915565b9150612c9c82612b46565b91508190509392505050565b6000612cb48284612946565b9150612cbf82612a51565b915081905092915050565b6000602082019050612cdf6000830184612801565b92915050565b600060a082019050612cfa6000830188612801565b612d076020830187612801565b8181036040830152612d198186612827565b90508181036060830152612d2d8185612827565b90508181036080830152612d4181846128a3565b90509695505050505050565b600060a082019050612d626000830188612801565b612d6f6020830187612801565b612d7c6040830186612c27565b612d896060830185612c27565b8181036080830152612d9b81846128a3565b90509695505050505050565b60006020820190508181036000830152612dc18184612827565b905092915050565b60006040820190508181036000830152612de38185612827565b90508181036020830152612df78184612827565b90509392505050565b6000602082019050612e156000830184612885565b92915050565b6000602082019050612e306000830184612894565b92915050565b60006020820190508181036000830152612e5081846128dc565b905092915050565b60006020820190508181036000830152612e71816129c5565b9050919050565b60006020820190508181036000830152612e91816129e8565b9050919050565b60006020820190508181036000830152612eb181612a0b565b9050919050565b60006020820190508181036000830152612ed181612a2e565b9050919050565b60006020820190508181036000830152612ef181612a74565b9050919050565b60006020820190508181036000830152612f1181612a97565b9050919050565b60006020820190508181036000830152612f3181612aba565b9050919050565b60006020820190508181036000830152612f5181612add565b9050919050565b60006020820190508181036000830152612f7181612b00565b9050919050565b60006020820190508181036000830152612f9181612b23565b9050919050565b60006020820190508181036000830152612fb181612b69565b9050919050565b60006020820190508181036000830152612fd181612b8c565b9050919050565b60006020820190508181036000830152612ff181612baf565b9050919050565b6000602082019050818103600083015261301181612bd2565b9050919050565b6000602082019050818103600083015261303181612bf5565b9050919050565b600060208201905061304d6000830184612c27565b92915050565b60006040820190506130686000830185612c27565b6130756020830184612c27565b9392505050565b6000613086613097565b90506130928282613399565b919050565b6000604051905090565b600067ffffffffffffffff8211156130bc576130bb6134ff565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156130e8576130e76134ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613114576131136134ff565b5b61311d82613550565b9050602081019050919050565b600067ffffffffffffffff821115613145576131446134ff565b5b61314e82613550565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006131f78261331b565b91506132028361331b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561323757613236613472565b5b828201905092915050565b600061324d8261331b565b91506132588361331b565b925082613268576132676134a1565b5b828204905092915050565b600061327e8261331b565b91506132898361331b565b92508282101561329c5761329b613472565b5b828203905092915050565b60006132b2826132fb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613352578082015181840152602081019050613337565b83811115613361576000848401525b50505050565b6000600282049050600182168061337f57607f821691505b60208210811415613393576133926134d0565b5b50919050565b6133a282613550565b810181811067ffffffffffffffff821117156133c1576133c06134ff565b5b80604052505050565b60006133d58261331b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561340857613407613472565b5b600182019050919050565b600061341e82613425565b9050919050565b600061343082613561565b9050919050565b6000819050919050565b600061344c8261331b565b91506134578361331b565b925082613467576134666134a1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561354d5760046000803e61354a60005161356e565b90505b90565b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f312e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f77726f6e67206d65726b6c652070726f6f660000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d1015613a0c57613a8f565b613a14613097565b60043d036004823e80513d602482011167ffffffffffffffff82111715613a3c575050613a8f565b808201805167ffffffffffffffff811115613a5a5750505050613a8f565b80602083010160043d038501811115613a77575050505050613a8f565b613a8682602001850186613399565b82955050505050505b90565b613a9b816132a7565b8114613aa657600080fd5b50565b613ab2816132b9565b8114613abd57600080fd5b50565b613ac9816132c5565b8114613ad457600080fd5b50565b613ae0816132cf565b8114613aeb57600080fd5b50565b613af78161331b565b8114613b0257600080fd5b5056fea26469706673582212206ededd222aa414fd878a782e55ab04499e9c43982f065bdb7dd7845139abfd9764736f6c634300080400330bed57ea81ca5934d2217e6e793140d4fe160467f71d445b52387c7656b0419d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f697066732e696f2f697066732f6261667962656965647a69627237667562656c796b35777861366561636c637933707761797274726d6f347678756f7337617070693765757569712f000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101205760003560e01c8063715018a6116100ad578063c884ef8311610071578063c884ef8314610319578063e8a3d48514610349578063e985e9c514610367578063f242432a14610397578063f2fde38b146103b357610120565b8063715018a61461027557806373b2e80e1461027f5780638da5cb5b146102af578063a22cb465146102cd578063c87b56dd146102e957610120565b80632eb4a7ab116100f45780632eb4a7ab146101d15780633316550d146101ef57806345de0d9b1461020b5780634e1273f4146102275780636c0360eb1461025757610120565b8062fdd58e1461012557806301ffc9a7146101555780630e89341c146101855780632eb2c2d6146101b5575b600080fd5b61013f600480360381019061013a919061261a565b6103cf565b60405161014c9190613038565b60405180910390f35b61016f600480360381019061016a919061276e565b610498565b60405161017c9190612e00565b60405180910390f35b61019f600480360381019061019a91906127c0565b61057a565b6040516101ac9190612e36565b60405180910390f35b6101cf60048036038101906101ca9190612490565b61060e565b005b6101d96106af565b6040516101e69190612e1b565b60405180910390f35b6102096004803603810190610204919061271a565b6106b5565b005b610225600480360381019061022091906126c2565b610753565b005b610241600480360381019061023c9190612656565b610921565b60405161024e9190612da7565b60405180910390f35b61025f610ad2565b60405161026c9190612e36565b60405180910390f35b61027d610b60565b005b6102996004803603810190610294919061242b565b610be8565b6040516102a69190612e00565b60405180910390f35b6102b7610c3e565b6040516102c49190612cca565b60405180910390f35b6102e760048036038101906102e291906125de565b610c68565b005b61030360048036038101906102fe91906127c0565b610c7e565b6040516103109190612e36565b60405180910390f35b610333600480360381019061032e919061242b565b610cb2565b6040516103409190612e00565b60405180910390f35b610351610cd2565b60405161035e9190612e36565b60405180910390f35b610381600480360381019061037c9190612454565b610cfa565b60405161038e9190612e00565b60405180910390f35b6103b160048036038101906103ac919061254f565b610d8e565b005b6103cd60048036038101906103c8919061242b565b610e2f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043790612e98565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061056357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610573575061057282610f27565b5b9050919050565b60606002805461058990613367565b80601f01602080910402602001604051908101604052809291908181526020018280546105b590613367565b80156106025780601f106105d757610100808354040283529160200191610602565b820191906000526020600020905b8154815290600101906020018083116105e557829003601f168201915b50505050509050919050565b610616610f91565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061065c575061065b85610656610f91565b610cfa565b5b61069b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069290612f58565b60405180910390fd5b6106a88585858585610f99565b5050505050565b60045481565b6106bd610f91565b73ffffffffffffffffffffffffffffffffffffffff166106db610c3e565b73ffffffffffffffffffffffffffffffffffffffff1614610731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072890612f98565b60405180910390fd5b81600481905550806005908051906020019061074e9291906120c4565b505050565b60001515600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146107e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107dd90612ed8565b60405180910390fd5b6001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060003382604051602001610853929190612c4d565b604051602081830303815290604052805190602001209050600115156108bd858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060045484611307565b1515146108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f690612f18565b60405180910390fd5b61091b336001806040518060200160405280600081525061131e565b50505050565b60608151835114610967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095e90612fd8565b60405180910390fd5b6000835167ffffffffffffffff8111156109aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109d85781602001602082028036833780820191505090505b50905060005b8451811015610ac757610a71858281518110610a23577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610a64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516103cf565b828281518110610aaa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610ac0906133ca565b90506109de565b508091505092915050565b60058054610adf90613367565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90613367565b8015610b585780601f10610b2d57610100808354040283529160200191610b58565b820191906000526020600020905b815481529060010190602001808311610b3b57829003601f168201915b505050505081565b610b68610f91565b73ffffffffffffffffffffffffffffffffffffffff16610b86610c3e565b73ffffffffffffffffffffffffffffffffffffffff1614610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd390612f98565b60405180910390fd5b610be660006114cf565b565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c7a610c73610f91565b8383611595565b5050565b60606005610c8b83611702565b604051602001610c9c929190612c79565b6040516020818303038152906040529050919050565b60066020528060005260406000206000915054906101000a900460ff1681565b60606005604051602001610ce69190612ca8565b604051602081830303815290604052905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d96610f91565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ddc5750610ddb85610dd6610f91565b610cfa565b5b610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1290612ef8565b60405180910390fd5b610e2885858585856118af565b5050505050565b610e37610f91565b73ffffffffffffffffffffffffffffffffffffffff16610e55610c3e565b73ffffffffffffffffffffffffffffffffffffffff1614610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290612f98565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1290612eb8565b60405180910390fd5b610f24816114cf565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8151835114610fdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd490612ff8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104490612f38565b60405180910390fd5b6000611057610f91565b9050611067818787878787611b4b565b60005b84518110156112645760008582815181106110ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106110f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b90612f78565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461124991906131ec565b925050819055505050508061125d906133ca565b905061106a565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112db929190612dc9565b60405180910390a46112f1818787878787611b53565b6112ff818787878787611b5b565b505050505050565b6000826113148584611d42565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138590613018565b60405180910390fd5b6000611398610f91565b905060006113a585611ddd565b905060006113b285611ddd565b90506113c383600089858589611b4b565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461142291906131ec565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516114a0929190613053565b60405180910390a46114b783600089858589611b53565b6114c683600089898989611ea3565b50505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fb90612fb8565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116f59190612e00565b60405180910390a3505050565b6060600082141561174a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118aa565b600082905060005b6000821461177c578080611765906133ca565b915050600a826117759190613242565b9150611752565b60008167ffffffffffffffff8111156117be577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156117f05781602001600182028036833780820191505090505b5090505b600085146118a3576001826118099190613273565b9150600a856118189190613441565b603061182491906131ec565b60f81b818381518110611860577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561189c9190613242565b94506117f4565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561191f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191690612f38565b60405180910390fd5b6000611929610f91565b9050600061193685611ddd565b9050600061194385611ddd565b9050611953838989858589611b4b565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e190612f78565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a9f91906131ec565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611b1c929190613053565b60405180910390a4611b32848a8a86868a611b53565b611b40848a8a8a8a8a611ea3565b505050505050505050565b505050505050565b505050505050565b611b7a8473ffffffffffffffffffffffffffffffffffffffff1661208a565b15611d3a578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611bc0959493929190612ce5565b602060405180830381600087803b158015611bda57600080fd5b505af1925050508015611c0b57506040513d601f19601f82011682018060405250810190611c089190612797565b60015b611cb157611c1761352e565b806308c379a01415611c745750611c2c6139fc565b80611c375750611c76565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b9190612e36565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca890612e58565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90612e78565b60405180910390fd5b505b505050505050565b60008082905060005b8451811015611dd2576000858281518110611d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611db157611daa83826120ad565b9250611dbe565b611dbb81846120ad565b92505b508080611dca906133ca565b915050611d4b565b508091505092915050565b60606000600167ffffffffffffffff811115611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e505781602001602082028036833780820191505090505b5090508281600081518110611e8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b611ec28473ffffffffffffffffffffffffffffffffffffffff1661208a565b15612082578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611f08959493929190612d4d565b602060405180830381600087803b158015611f2257600080fd5b505af1925050508015611f5357506040513d601f19601f82011682018060405250810190611f509190612797565b60015b611ff957611f5f61352e565b806308c379a01415611fbc5750611f746139fc565b80611f7f5750611fbe565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb39190612e36565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090612e58565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207790612e78565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b8280546120d090613367565b90600052602060002090601f0160209004810192826120f25760008555612139565b82601f1061210b57805160ff1916838001178555612139565b82800160010185558215612139579182015b8281111561213857825182559160200191906001019061211d565b5b509050612146919061214a565b5090565b5b8082111561216357600081600090555060010161214b565b5090565b600061217a612175846130a1565b61307c565b9050808382526020820190508285602086028201111561219957600080fd5b60005b858110156121c957816121af88826122bb565b84526020840193506020830192505060018101905061219c565b5050509392505050565b60006121e66121e1846130cd565b61307c565b9050808382526020820190508285602086028201111561220557600080fd5b60005b85811015612235578161221b8882612416565b845260208401935060208301925050600181019050612208565b5050509392505050565b600061225261224d846130f9565b61307c565b90508281526020810184848401111561226a57600080fd5b612275848285613325565b509392505050565b600061229061228b8461312a565b61307c565b9050828152602081018484840111156122a857600080fd5b6122b3848285613325565b509392505050565b6000813590506122ca81613a92565b92915050565b600082601f8301126122e157600080fd5b81356122f1848260208601612167565b91505092915050565b60008083601f84011261230c57600080fd5b8235905067ffffffffffffffff81111561232557600080fd5b60208301915083602082028301111561233d57600080fd5b9250929050565b600082601f83011261235557600080fd5b81356123658482602086016121d3565b91505092915050565b60008135905061237d81613aa9565b92915050565b60008135905061239281613ac0565b92915050565b6000813590506123a781613ad7565b92915050565b6000815190506123bc81613ad7565b92915050565b600082601f8301126123d357600080fd5b81356123e384826020860161223f565b91505092915050565b600082601f8301126123fd57600080fd5b813561240d84826020860161227d565b91505092915050565b60008135905061242581613aee565b92915050565b60006020828403121561243d57600080fd5b600061244b848285016122bb565b91505092915050565b6000806040838503121561246757600080fd5b6000612475858286016122bb565b9250506020612486858286016122bb565b9150509250929050565b600080600080600060a086880312156124a857600080fd5b60006124b6888289016122bb565b95505060206124c7888289016122bb565b945050604086013567ffffffffffffffff8111156124e457600080fd5b6124f088828901612344565b935050606086013567ffffffffffffffff81111561250d57600080fd5b61251988828901612344565b925050608086013567ffffffffffffffff81111561253657600080fd5b612542888289016123c2565b9150509295509295909350565b600080600080600060a0868803121561256757600080fd5b6000612575888289016122bb565b9550506020612586888289016122bb565b945050604061259788828901612416565b93505060606125a888828901612416565b925050608086013567ffffffffffffffff8111156125c557600080fd5b6125d1888289016123c2565b9150509295509295909350565b600080604083850312156125f157600080fd5b60006125ff858286016122bb565b92505060206126108582860161236e565b9150509250929050565b6000806040838503121561262d57600080fd5b600061263b858286016122bb565b925050602061264c85828601612416565b9150509250929050565b6000806040838503121561266957600080fd5b600083013567ffffffffffffffff81111561268357600080fd5b61268f858286016122d0565b925050602083013567ffffffffffffffff8111156126ac57600080fd5b6126b885828601612344565b9150509250929050565b6000806000604084860312156126d757600080fd5b600084013567ffffffffffffffff8111156126f157600080fd5b6126fd868287016122fa565b9350935050602061271086828701612416565b9150509250925092565b6000806040838503121561272d57600080fd5b600061273b85828601612383565b925050602083013567ffffffffffffffff81111561275857600080fd5b612764858286016123ec565b9150509250929050565b60006020828403121561278057600080fd5b600061278e84828501612398565b91505092915050565b6000602082840312156127a957600080fd5b60006127b7848285016123ad565b91505092915050565b6000602082840312156127d257600080fd5b60006127e084828501612416565b91505092915050565b60006127f58383612c18565b60208301905092915050565b61280a816132a7565b82525050565b61282161281c826132a7565b613413565b82525050565b600061283282613180565b61283c81856131ae565b93506128478361315b565b8060005b8381101561287857815161285f88826127e9565b975061286a836131a1565b92505060018101905061284b565b5085935050505092915050565b61288e816132b9565b82525050565b61289d816132c5565b82525050565b60006128ae8261318b565b6128b881856131bf565b93506128c8818560208601613334565b6128d181613550565b840191505092915050565b60006128e782613196565b6128f181856131d0565b9350612901818560208601613334565b61290a81613550565b840191505092915050565b600061292082613196565b61292a81856131e1565b935061293a818560208601613334565b80840191505092915050565b6000815461295381613367565b61295d81866131e1565b945060018216600081146129785760018114612989576129bc565b60ff198316865281860193506129bc565b6129928561316b565b60005b838110156129b457815481890152600182019150602081019050612995565b838801955050505b50505092915050565b60006129d26034836131d0565b91506129dd8261357b565b604082019050919050565b60006129f56028836131d0565b9150612a00826135ca565b604082019050919050565b6000612a18602b836131d0565b9150612a2382613619565b604082019050919050565b6000612a3b6026836131d0565b9150612a4682613668565b604082019050919050565b6000612a5e6006836131e1565b9150612a69826136b7565b600682019050919050565b6000612a81600f836131d0565b9150612a8c826136e0565b602082019050919050565b6000612aa46029836131d0565b9150612aaf82613709565b604082019050919050565b6000612ac76012836131d0565b9150612ad282613758565b602082019050919050565b6000612aea6025836131d0565b9150612af582613781565b604082019050919050565b6000612b0d6032836131d0565b9150612b18826137d0565b604082019050919050565b6000612b30602a836131d0565b9150612b3b8261381f565b604082019050919050565b6000612b536005836131e1565b9150612b5e8261386e565b600582019050919050565b6000612b766020836131d0565b9150612b8182613897565b602082019050919050565b6000612b996029836131d0565b9150612ba4826138c0565b604082019050919050565b6000612bbc6029836131d0565b9150612bc78261390f565b604082019050919050565b6000612bdf6028836131d0565b9150612bea8261395e565b604082019050919050565b6000612c026021836131d0565b9150612c0d826139ad565b604082019050919050565b612c218161331b565b82525050565b612c308161331b565b82525050565b612c47612c428261331b565b613437565b82525050565b6000612c598285612810565b601482019150612c698284612c36565b6020820191508190509392505050565b6000612c858285612946565b9150612c918284612915565b9150612c9c82612b46565b91508190509392505050565b6000612cb48284612946565b9150612cbf82612a51565b915081905092915050565b6000602082019050612cdf6000830184612801565b92915050565b600060a082019050612cfa6000830188612801565b612d076020830187612801565b8181036040830152612d198186612827565b90508181036060830152612d2d8185612827565b90508181036080830152612d4181846128a3565b90509695505050505050565b600060a082019050612d626000830188612801565b612d6f6020830187612801565b612d7c6040830186612c27565b612d896060830185612c27565b8181036080830152612d9b81846128a3565b90509695505050505050565b60006020820190508181036000830152612dc18184612827565b905092915050565b60006040820190508181036000830152612de38185612827565b90508181036020830152612df78184612827565b90509392505050565b6000602082019050612e156000830184612885565b92915050565b6000602082019050612e306000830184612894565b92915050565b60006020820190508181036000830152612e5081846128dc565b905092915050565b60006020820190508181036000830152612e71816129c5565b9050919050565b60006020820190508181036000830152612e91816129e8565b9050919050565b60006020820190508181036000830152612eb181612a0b565b9050919050565b60006020820190508181036000830152612ed181612a2e565b9050919050565b60006020820190508181036000830152612ef181612a74565b9050919050565b60006020820190508181036000830152612f1181612a97565b9050919050565b60006020820190508181036000830152612f3181612aba565b9050919050565b60006020820190508181036000830152612f5181612add565b9050919050565b60006020820190508181036000830152612f7181612b00565b9050919050565b60006020820190508181036000830152612f9181612b23565b9050919050565b60006020820190508181036000830152612fb181612b69565b9050919050565b60006020820190508181036000830152612fd181612b8c565b9050919050565b60006020820190508181036000830152612ff181612baf565b9050919050565b6000602082019050818103600083015261301181612bd2565b9050919050565b6000602082019050818103600083015261303181612bf5565b9050919050565b600060208201905061304d6000830184612c27565b92915050565b60006040820190506130686000830185612c27565b6130756020830184612c27565b9392505050565b6000613086613097565b90506130928282613399565b919050565b6000604051905090565b600067ffffffffffffffff8211156130bc576130bb6134ff565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156130e8576130e76134ff565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613114576131136134ff565b5b61311d82613550565b9050602081019050919050565b600067ffffffffffffffff821115613145576131446134ff565b5b61314e82613550565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006131f78261331b565b91506132028361331b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561323757613236613472565b5b828201905092915050565b600061324d8261331b565b91506132588361331b565b925082613268576132676134a1565b5b828204905092915050565b600061327e8261331b565b91506132898361331b565b92508282101561329c5761329b613472565b5b828203905092915050565b60006132b2826132fb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613352578082015181840152602081019050613337565b83811115613361576000848401525b50505050565b6000600282049050600182168061337f57607f821691505b60208210811415613393576133926134d0565b5b50919050565b6133a282613550565b810181811067ffffffffffffffff821117156133c1576133c06134ff565b5b80604052505050565b60006133d58261331b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561340857613407613472565b5b600182019050919050565b600061341e82613425565b9050919050565b600061343082613561565b9050919050565b6000819050919050565b600061344c8261331b565b91506134578361331b565b925082613467576134666134a1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561354d5760046000803e61354a60005161356e565b90505b90565b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f312e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b7f616c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f77726f6e67206d65726b6c652070726f6f660000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d1015613a0c57613a8f565b613a14613097565b60043d036004823e80513d602482011167ffffffffffffffff82111715613a3c575050613a8f565b808201805167ffffffffffffffff811115613a5a5750505050613a8f565b80602083010160043d038501811115613a77575050505050613a8f565b613a8682602001850186613399565b82955050505050505b90565b613a9b816132a7565b8114613aa657600080fd5b50565b613ab2816132b9565b8114613abd57600080fd5b50565b613ac9816132c5565b8114613ad457600080fd5b50565b613ae0816132cf565b8114613aeb57600080fd5b50565b613af78161331b565b8114613b0257600080fd5b5056fea26469706673582212206ededd222aa414fd878a782e55ab04499e9c43982f065bdb7dd7845139abfd9764736f6c63430008040033

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

0bed57ea81ca5934d2217e6e793140d4fe160467f71d445b52387c7656b0419d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f697066732e696f2f697066732f6261667962656965647a69627237667562656c796b35777861366561636c637933707761797274726d6f347678756f7337617070693765757569712f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0x0bed57ea81ca5934d2217e6e793140d4fe160467f71d445b52387c7656b0419d
Arg [1] : _baseURI (string): https://ipfs.io/ipfs/bafybeiedzibr7fubelyk5wxa6eaclcy3pwayrtrmo4vxuos7appi7euuiq/

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0bed57ea81ca5934d2217e6e793140d4fe160467f71d445b52387c7656b0419d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [3] : 68747470733a2f2f697066732e696f2f697066732f6261667962656965647a69
Arg [4] : 627237667562656c796b35777861366561636c637933707761797274726d6f34
Arg [5] : 7678756f7337617070693765757569712f000000000000000000000000000000


Deployed Bytecode Sourcemap

43799:1283:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23686:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22709:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23430:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25625:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43844:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44105:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44272:395;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24083:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43876:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40783:103;;;:::i;:::-;;44675:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40132:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24680:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44785:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43904:37;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44951:128;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24907:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25147:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41041:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23686:231;23772:7;23819:1;23800:21;;:7;:21;;;;23792:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;23887:9;:13;23897:2;23887:13;;;;;;;;;;;:22;23901:7;23887:22;;;;;;;;;;;;;;;;23880:29;;23686:231;;;;:::o;22709:310::-;22811:4;22863:26;22848:41;;;:11;:41;;;;:110;;;;22921:37;22906:52;;;:11;:52;;;;22848:110;:163;;;;22975:36;22999:11;22975:23;:36::i;:::-;22848:163;22828:183;;22709:310;;;:::o;23430:105::-;23490:13;23523:4;23516:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23430:105;;;:::o;25625:442::-;25866:12;:10;:12::i;:::-;25858:20;;:4;:20;;;:60;;;;25882:36;25899:4;25905:12;:10;:12::i;:::-;25882:16;:36::i;:::-;25858:60;25836:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;26007:52;26030:4;26036:2;26040:3;26045:7;26054:4;26007:22;:52::i;:::-;25625:442;;;;;:::o;43844:25::-;;;;:::o;44105:155::-;40363:12;:10;:12::i;:::-;40352:23;;:7;:5;:7::i;:::-;:23;;;40344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44212:11:::1;44199:10;:24;;;;44244:8;44234:7;:18;;;;;;;;;;;;:::i;:::-;;44105:155:::0;;:::o;44272:395::-;44385:5;44362:28;;:7;:19;44370:10;44362:19;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;44354:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;44443:4;44421:7;:19;44429:10;44421:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;44458:12;44500:10;44512:7;44483:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44473:48;;;;;;44458:63;;44594:4;44540:58;;:50;44559:12;;44540:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44573:10;;44585:4;44540:18;:50::i;:::-;:58;;;44532:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;44632:27;44638:10;44650:1;44653;44632:27;;;;;;;;;;;;:5;:27::i;:::-;44272:395;;;;:::o;24083:524::-;24239:16;24300:3;:10;24281:8;:15;:29;24273:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;24369:30;24416:8;:15;24402:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24369:63;;24450:9;24445:122;24469:8;:15;24465:1;:19;24445:122;;;24525:30;24535:8;24544:1;24535:11;;;;;;;;;;;;;;;;;;;;;;24548:3;24552:1;24548:6;;;;;;;;;;;;;;;;;;;;;;24525:9;:30::i;:::-;24506:13;24520:1;24506:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;24486:3;;;;:::i;:::-;;;24445:122;;;;24586:13;24579:20;;;24083:524;;;;:::o;43876:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40783:103::-;40363:12;:10;:12::i;:::-;40352:23;;:7;:5;:7::i;:::-;:23;;;40344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40848:30:::1;40875:1;40848:18;:30::i;:::-;40783:103::o:0;44675:102::-;44731:4;44755:7;:14;44763:5;44755:14;;;;;;;;;;;;;;;;;;;;;;;;;44748:21;;44675:102;;;:::o;40132:87::-;40178:7;40205:6;;;;;;;;;;;40198:13;;40132:87;:::o;24680:155::-;24775:52;24794:12;:10;:12::i;:::-;24808:8;24818;24775:18;:52::i;:::-;24680:155;;:::o;44785:158::-;44837:13;44894:7;44903:21;44920:3;44903:16;:21::i;:::-;44877:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44863:72;;44785:158;;;:::o;43904:37::-;;;;;;;;;;;;;;;;;;;;;;:::o;44951:128::-;44995:13;45052:7;45035:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;45021:50;;44951:128;:::o;24907:168::-;25006:4;25030:18;:27;25049:7;25030:27;;;;;;;;;;;;;;;:37;25058:8;25030:37;;;;;;;;;;;;;;;;;;;;;;;;;25023:44;;24907:168;;;;:::o;25147:401::-;25363:12;:10;:12::i;:::-;25355:20;;:4;:20;;;:60;;;;25379:36;25396:4;25402:12;:10;:12::i;:::-;25379:16;:36::i;:::-;25355:60;25333:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;25495:45;25513:4;25519:2;25523;25527:6;25535:4;25495:17;:45::i;:::-;25147:401;;;;;:::o;41041:201::-;40363:12;:10;:12::i;:::-;40352:23;;:7;:5;:7::i;:::-;:23;;;40344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41150:1:::1;41130:22;;:8;:22;;;;41122:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41206:28;41225:8;41206:18;:28::i;:::-;41041:201:::0;:::o;21449:157::-;21534:4;21573:25;21558:40;;;:11;:40;;;;21551:47;;21449:157;;;:::o;20366:98::-;20419:7;20446:10;20439:17;;20366:98;:::o;27863:1146::-;28090:7;:14;28076:3;:10;:28;28068:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28182:1;28168:16;;:2;:16;;;;28160:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;28239:16;28258:12;:10;:12::i;:::-;28239:31;;28283:60;28304:8;28314:4;28320:2;28324:3;28329:7;28338:4;28283:20;:60::i;:::-;28361:9;28356:421;28380:3;:10;28376:1;:14;28356:421;;;28412:10;28425:3;28429:1;28425:6;;;;;;;;;;;;;;;;;;;;;;28412:19;;28446:14;28463:7;28471:1;28463:10;;;;;;;;;;;;;;;;;;;;;;28446:27;;28490:19;28512:9;:13;28522:2;28512:13;;;;;;;;;;;:19;28526:4;28512:19;;;;;;;;;;;;;;;;28490:41;;28569:6;28554:11;:21;;28546:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28702:6;28688:11;:20;28666:9;:13;28676:2;28666:13;;;;;;;;;;;:19;28680:4;28666:19;;;;;;;;;;;;;;;:42;;;;28759:6;28738:9;:13;28748:2;28738:13;;;;;;;;;;;:17;28752:2;28738:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;28356:421;;;28392:3;;;;:::i;:::-;;;28356:421;;;;28824:2;28794:47;;28818:4;28794:47;;28808:8;28794:47;;;28828:3;28833:7;28794:47;;;;;;;:::i;:::-;;;;;;;;28854:59;28874:8;28884:4;28890:2;28894:3;28899:7;28908:4;28854:19;:59::i;:::-;28926:75;28962:8;28972:4;28978:2;28982:3;28987:7;28996:4;28926:35;:75::i;:::-;27863:1146;;;;;;:::o;1321:190::-;1446:4;1499;1470:25;1483:5;1490:4;1470:12;:25::i;:::-;:33;1463:40;;1321:190;;;;;:::o;30327:729::-;30494:1;30480:16;;:2;:16;;;;30472:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30547:16;30566:12;:10;:12::i;:::-;30547:31;;30589:20;30612:21;30630:2;30612:17;:21::i;:::-;30589:44;;30644:24;30671:25;30689:6;30671:17;:25::i;:::-;30644:52;;30709:66;30730:8;30748:1;30752:2;30756:3;30761:7;30770:4;30709:20;:66::i;:::-;30809:6;30788:9;:13;30798:2;30788:13;;;;;;;;;;;:17;30802:2;30788:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;30868:2;30831:52;;30864:1;30831:52;;30846:8;30831:52;;;30872:2;30876:6;30831:52;;;;;;;:::i;:::-;;;;;;;;30896:65;30916:8;30934:1;30938:2;30942:3;30947:7;30956:4;30896:19;:65::i;:::-;30974:74;31005:8;31023:1;31027:2;31031;31035:6;31043:4;30974:30;:74::i;:::-;30327:729;;;;;;;:::o;41402:191::-;41476:16;41495:6;;;;;;;;;;;41476:25;;41521:8;41512:6;;:17;;;;;;;;;;;;;;;;;;41576:8;41545:40;;41566:8;41545:40;;;;;;;;;;;;41402:191;;:::o;34597:331::-;34752:8;34743:17;;:5;:17;;;;34735:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34855:8;34817:18;:25;34836:5;34817:25;;;;;;;;;;;;;;;:35;34843:8;34817:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34901:8;34879:41;;34894:5;34879:41;;;34911:8;34879:41;;;;;;:::i;:::-;;;;;;;;34597:331;;;:::o;41971:723::-;42027:13;42257:1;42248:5;:10;42244:53;;;42275:10;;;;;;;;;;;;;;;;;;;;;42244:53;42307:12;42322:5;42307:20;;42338:14;42363:78;42378:1;42370:4;:9;42363:78;;42396:8;;;;;:::i;:::-;;;;42427:2;42419:10;;;;;:::i;:::-;;;42363:78;;;42451:19;42483:6;42473:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42451:39;;42501:154;42517:1;42508:5;:10;42501:154;;42545:1;42535:11;;;;;:::i;:::-;;;42612:2;42604:5;:10;;;;:::i;:::-;42591:2;:24;;;;:::i;:::-;42578:39;;42561:6;42568;42561:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;42641:2;42632:11;;;;;:::i;:::-;;;42501:154;;;42679:6;42665:21;;;;;41971:723;;;;:::o;26531:974::-;26733:1;26719:16;;:2;:16;;;;26711:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26790:16;26809:12;:10;:12::i;:::-;26790:31;;26832:20;26855:21;26873:2;26855:17;:21::i;:::-;26832:44;;26887:24;26914:25;26932:6;26914:17;:25::i;:::-;26887:52;;26952:60;26973:8;26983:4;26989:2;26993:3;26998:7;27007:4;26952:20;:60::i;:::-;27025:19;27047:9;:13;27057:2;27047:13;;;;;;;;;;;:19;27061:4;27047:19;;;;;;;;;;;;;;;;27025:41;;27100:6;27085:11;:21;;27077:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27225:6;27211:11;:20;27189:9;:13;27199:2;27189:13;;;;;;;;;;;:19;27203:4;27189:19;;;;;;;;;;;;;;;:42;;;;27274:6;27253:9;:13;27263:2;27253:13;;;;;;;;;;;:17;27267:2;27253:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27329:2;27298:46;;27323:4;27298:46;;27313:8;27298:46;;;27333:2;27337:6;27298:46;;;;;;;:::i;:::-;;;;;;;;27357:59;27377:8;27387:4;27393:2;27397:3;27402:7;27411:4;27357:19;:59::i;:::-;27429:68;27460:8;27470:4;27476:2;27480;27484:6;27492:4;27429:30;:68::i;:::-;26531:974;;;;;;;;;:::o;35884:221::-;;;;;;;:::o;37060:220::-;;;;;;;:::o;38040:813::-;38280:15;:2;:13;;;:15::i;:::-;38276:570;;;38333:2;38316:43;;;38360:8;38370:4;38376:3;38381:7;38390:4;38316:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38312:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;38708:6;38701:14;;;;;;;;;;;:::i;:::-;;;;;;;;38312:523;;;38757:62;;;;;;;;;;:::i;:::-;;;;;;;;38312:523;38489:48;;;38477:60;;;:8;:60;;;;38473:159;;38562:50;;;;;;;;;;:::i;:::-;;;;;;;;38473:159;38396:251;38276:570;38040:813;;;;;;:::o;1872:675::-;1955:7;1975:20;1998:4;1975:27;;2018:9;2013:497;2037:5;:12;2033:1;:16;2013:497;;;2071:20;2094:5;2100:1;2094:8;;;;;;;;;;;;;;;;;;;;;;2071:31;;2137:12;2121;:28;2117:382;;2264:42;2279:12;2293;2264:14;:42::i;:::-;2249:57;;2117:382;;;2441:42;2456:12;2470;2441:14;:42::i;:::-;2426:57;;2117:382;2013:497;2051:3;;;;;:::i;:::-;;;;2013:497;;;;2527:12;2520:19;;;1872:675;;;;:::o;38861:198::-;38927:16;38956:22;38995:1;38981:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38956:41;;39019:7;39008:5;39014:1;39008:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;39046:5;39039:12;;;38861:198;;;:::o;37288:744::-;37503:15;:2;:13;;;:15::i;:::-;37499:526;;;37556:2;37539:38;;;37578:8;37588:4;37594:2;37598:6;37606:4;37539:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37535:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37887:6;37880:14;;;;;;;;;;;:::i;:::-;;;;;;;;37535:479;;;37936:62;;;;;;;;;;:::i;:::-;;;;;;;;37535:479;37673:43;;;37661:55;;;:8;:55;;;;37657:154;;37741:50;;;;;;;;;;:::i;:::-;;;;;;;;37657:154;37612:214;37499:526;37288:744;;;;;;:::o;12411:326::-;12471:4;12728:1;12706:7;:19;;;:23;12699:30;;12411:326;;;:::o;2555:224::-;2623:13;2686:1;2680:4;2673:15;2715:1;2709:4;2702:15;2756:4;2750;2740:21;2731:30;;2658:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:367::-;2624:8;2634:6;2684:3;2677:4;2669:6;2665:17;2661:27;2651:2;;2702:1;2699;2692:12;2651:2;2738:6;2725:20;2715:30;;2768:18;2760:6;2757:30;2754:2;;;2800:1;2797;2790:12;2754:2;2837:4;2829:6;2825:17;2813:29;;2891:3;2883:4;2875:6;2871:17;2861:8;2857:32;2854:41;2851:2;;;2908:1;2905;2898:12;2851:2;2641:277;;;;;:::o;2941:303::-;3012:5;3061:3;3054:4;3046:6;3042:17;3038:27;3028:2;;3079:1;3076;3069:12;3028:2;3119:6;3106:20;3144:94;3234:3;3226:6;3219:4;3211:6;3207:17;3144:94;:::i;:::-;3135:103;;3018:226;;;;;:::o;3250:133::-;3293:5;3331:6;3318:20;3309:29;;3347:30;3371:5;3347:30;:::i;:::-;3299:84;;;;:::o;3389:139::-;3435:5;3473:6;3460:20;3451:29;;3489:33;3516:5;3489:33;:::i;:::-;3441:87;;;;:::o;3534:137::-;3579:5;3617:6;3604:20;3595:29;;3633:32;3659:5;3633:32;:::i;:::-;3585:86;;;;:::o;3677:141::-;3733:5;3764:6;3758:13;3749:22;;3780:32;3806:5;3780:32;:::i;:::-;3739:79;;;;:::o;3837:271::-;3892:5;3941:3;3934:4;3926:6;3922:17;3918:27;3908:2;;3959:1;3956;3949:12;3908:2;3999:6;3986:20;4024:78;4098:3;4090:6;4083:4;4075:6;4071:17;4024:78;:::i;:::-;4015:87;;3898:210;;;;;:::o;4128:273::-;4184:5;4233:3;4226:4;4218:6;4214:17;4210:27;4200:2;;4251:1;4248;4241:12;4200:2;4291:6;4278:20;4316:79;4391:3;4383:6;4376:4;4368:6;4364:17;4316:79;:::i;:::-;4307:88;;4190:211;;;;;:::o;4407:139::-;4453:5;4491:6;4478:20;4469:29;;4507:33;4534:5;4507:33;:::i;:::-;4459:87;;;;:::o;4552:262::-;4611:6;4660:2;4648:9;4639:7;4635:23;4631:32;4628:2;;;4676:1;4673;4666:12;4628:2;4719:1;4744:53;4789:7;4780:6;4769:9;4765:22;4744:53;:::i;:::-;4734:63;;4690:117;4618:196;;;;:::o;4820:407::-;4888:6;4896;4945:2;4933:9;4924:7;4920:23;4916:32;4913:2;;;4961:1;4958;4951:12;4913:2;5004:1;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4975:117;5131:2;5157:53;5202:7;5193:6;5182:9;5178:22;5157:53;:::i;:::-;5147:63;;5102:118;4903:324;;;;;:::o;5233:1241::-;5387:6;5395;5403;5411;5419;5468:3;5456:9;5447:7;5443:23;5439:33;5436:2;;;5485:1;5482;5475:12;5436:2;5528:1;5553:53;5598:7;5589:6;5578:9;5574:22;5553:53;:::i;:::-;5543:63;;5499:117;5655:2;5681:53;5726:7;5717:6;5706:9;5702:22;5681:53;:::i;:::-;5671:63;;5626:118;5811:2;5800:9;5796:18;5783:32;5842:18;5834:6;5831:30;5828:2;;;5874:1;5871;5864:12;5828:2;5902:78;5972:7;5963:6;5952:9;5948:22;5902:78;:::i;:::-;5892:88;;5754:236;6057:2;6046:9;6042:18;6029:32;6088:18;6080:6;6077:30;6074:2;;;6120:1;6117;6110:12;6074:2;6148:78;6218:7;6209:6;6198:9;6194:22;6148:78;:::i;:::-;6138:88;;6000:236;6303:3;6292:9;6288:19;6275:33;6335:18;6327:6;6324:30;6321:2;;;6367:1;6364;6357:12;6321:2;6395:62;6449:7;6440:6;6429:9;6425:22;6395:62;:::i;:::-;6385:72;;6246:221;5426:1048;;;;;;;;:::o;6480:955::-;6584:6;6592;6600;6608;6616;6665:3;6653:9;6644:7;6640:23;6636:33;6633:2;;;6682:1;6679;6672:12;6633:2;6725:1;6750:53;6795:7;6786:6;6775:9;6771:22;6750:53;:::i;:::-;6740:63;;6696:117;6852:2;6878:53;6923:7;6914:6;6903:9;6899:22;6878:53;:::i;:::-;6868:63;;6823:118;6980:2;7006:53;7051:7;7042:6;7031:9;7027:22;7006:53;:::i;:::-;6996:63;;6951:118;7108:2;7134:53;7179:7;7170:6;7159:9;7155:22;7134:53;:::i;:::-;7124:63;;7079:118;7264:3;7253:9;7249:19;7236:33;7296:18;7288:6;7285:30;7282:2;;;7328:1;7325;7318:12;7282:2;7356:62;7410:7;7401:6;7390:9;7386:22;7356:62;:::i;:::-;7346:72;;7207:221;6623:812;;;;;;;;:::o;7441:401::-;7506:6;7514;7563:2;7551:9;7542:7;7538:23;7534:32;7531:2;;;7579:1;7576;7569:12;7531:2;7622:1;7647:53;7692:7;7683:6;7672:9;7668:22;7647:53;:::i;:::-;7637:63;;7593:117;7749:2;7775:50;7817:7;7808:6;7797:9;7793:22;7775:50;:::i;:::-;7765:60;;7720:115;7521:321;;;;;:::o;7848:407::-;7916:6;7924;7973:2;7961:9;7952:7;7948:23;7944:32;7941:2;;;7989:1;7986;7979:12;7941:2;8032:1;8057:53;8102:7;8093:6;8082:9;8078:22;8057:53;:::i;:::-;8047:63;;8003:117;8159:2;8185:53;8230:7;8221:6;8210:9;8206:22;8185:53;:::i;:::-;8175:63;;8130:118;7931:324;;;;;:::o;8261:693::-;8379:6;8387;8436:2;8424:9;8415:7;8411:23;8407:32;8404:2;;;8452:1;8449;8442:12;8404:2;8523:1;8512:9;8508:17;8495:31;8553:18;8545:6;8542:30;8539:2;;;8585:1;8582;8575:12;8539:2;8613:78;8683:7;8674:6;8663:9;8659:22;8613:78;:::i;:::-;8603:88;;8466:235;8768:2;8757:9;8753:18;8740:32;8799:18;8791:6;8788:30;8785:2;;;8831:1;8828;8821:12;8785:2;8859:78;8929:7;8920:6;8909:9;8905:22;8859:78;:::i;:::-;8849:88;;8711:236;8394:560;;;;;:::o;8960:570::-;9055:6;9063;9071;9120:2;9108:9;9099:7;9095:23;9091:32;9088:2;;;9136:1;9133;9126:12;9088:2;9207:1;9196:9;9192:17;9179:31;9237:18;9229:6;9226:30;9223:2;;;9269:1;9266;9259:12;9223:2;9305:80;9377:7;9368:6;9357:9;9353:22;9305:80;:::i;:::-;9287:98;;;;9150:245;9434:2;9460:53;9505:7;9496:6;9485:9;9481:22;9460:53;:::i;:::-;9450:63;;9405:118;9078:452;;;;;:::o;9536:520::-;9614:6;9622;9671:2;9659:9;9650:7;9646:23;9642:32;9639:2;;;9687:1;9684;9677:12;9639:2;9730:1;9755:53;9800:7;9791:6;9780:9;9776:22;9755:53;:::i;:::-;9745:63;;9701:117;9885:2;9874:9;9870:18;9857:32;9916:18;9908:6;9905:30;9902:2;;;9948:1;9945;9938:12;9902:2;9976:63;10031:7;10022:6;10011:9;10007:22;9976:63;:::i;:::-;9966:73;;9828:221;9629:427;;;;;:::o;10062:260::-;10120:6;10169:2;10157:9;10148:7;10144:23;10140:32;10137:2;;;10185:1;10182;10175:12;10137:2;10228:1;10253:52;10297:7;10288:6;10277:9;10273:22;10253:52;:::i;:::-;10243:62;;10199:116;10127:195;;;;:::o;10328:282::-;10397:6;10446:2;10434:9;10425:7;10421:23;10417:32;10414:2;;;10462:1;10459;10452:12;10414:2;10505:1;10530:63;10585:7;10576:6;10565:9;10561:22;10530:63;:::i;:::-;10520:73;;10476:127;10404:206;;;;:::o;10616:262::-;10675:6;10724:2;10712:9;10703:7;10699:23;10695:32;10692:2;;;10740:1;10737;10730:12;10692:2;10783:1;10808:53;10853:7;10844:6;10833:9;10829:22;10808:53;:::i;:::-;10798:63;;10754:117;10682:196;;;;:::o;10884:179::-;10953:10;10974:46;11016:3;11008:6;10974:46;:::i;:::-;11052:4;11047:3;11043:14;11029:28;;10964:99;;;;:::o;11069:118::-;11156:24;11174:5;11156:24;:::i;:::-;11151:3;11144:37;11134:53;;:::o;11193:157::-;11298:45;11318:24;11336:5;11318:24;:::i;:::-;11298:45;:::i;:::-;11293:3;11286:58;11276:74;;:::o;11386:732::-;11505:3;11534:54;11582:5;11534:54;:::i;:::-;11604:86;11683:6;11678:3;11604:86;:::i;:::-;11597:93;;11714:56;11764:5;11714:56;:::i;:::-;11793:7;11824:1;11809:284;11834:6;11831:1;11828:13;11809:284;;;11910:6;11904:13;11937:63;11996:3;11981:13;11937:63;:::i;:::-;11930:70;;12023:60;12076:6;12023:60;:::i;:::-;12013:70;;11869:224;11856:1;11853;11849:9;11844:14;;11809:284;;;11813:14;12109:3;12102:10;;11510:608;;;;;;;:::o;12124:109::-;12205:21;12220:5;12205:21;:::i;:::-;12200:3;12193:34;12183:50;;:::o;12239:118::-;12326:24;12344:5;12326:24;:::i;:::-;12321:3;12314:37;12304:53;;:::o;12363:360::-;12449:3;12477:38;12509:5;12477:38;:::i;:::-;12531:70;12594:6;12589:3;12531:70;:::i;:::-;12524:77;;12610:52;12655:6;12650:3;12643:4;12636:5;12632:16;12610:52;:::i;:::-;12687:29;12709:6;12687:29;:::i;:::-;12682:3;12678:39;12671:46;;12453:270;;;;;:::o;12729:364::-;12817:3;12845:39;12878:5;12845:39;:::i;:::-;12900:71;12964:6;12959:3;12900:71;:::i;:::-;12893:78;;12980:52;13025:6;13020:3;13013:4;13006:5;13002:16;12980:52;:::i;:::-;13057:29;13079:6;13057:29;:::i;:::-;13052:3;13048:39;13041:46;;12821:272;;;;;:::o;13099:377::-;13205:3;13233:39;13266:5;13233:39;:::i;:::-;13288:89;13370:6;13365:3;13288:89;:::i;:::-;13281:96;;13386:52;13431:6;13426:3;13419:4;13412:5;13408:16;13386:52;:::i;:::-;13463:6;13458:3;13454:16;13447:23;;13209:267;;;;;:::o;13506:845::-;13609:3;13646:5;13640:12;13675:36;13701:9;13675:36;:::i;:::-;13727:89;13809:6;13804:3;13727:89;:::i;:::-;13720:96;;13847:1;13836:9;13832:17;13863:1;13858:137;;;;14009:1;14004:341;;;;13825:520;;13858:137;13942:4;13938:9;13927;13923:25;13918:3;13911:38;13978:6;13973:3;13969:16;13962:23;;13858:137;;14004:341;14071:38;14103:5;14071:38;:::i;:::-;14131:1;14145:154;14159:6;14156:1;14153:13;14145:154;;;14233:7;14227:14;14223:1;14218:3;14214:11;14207:35;14283:1;14274:7;14270:15;14259:26;;14181:4;14178:1;14174:12;14169:17;;14145:154;;;14328:6;14323:3;14319:16;14312:23;;14011:334;;13825:520;;13613:738;;;;;;:::o;14357:366::-;14499:3;14520:67;14584:2;14579:3;14520:67;:::i;:::-;14513:74;;14596:93;14685:3;14596:93;:::i;:::-;14714:2;14709:3;14705:12;14698:19;;14503:220;;;:::o;14729:366::-;14871:3;14892:67;14956:2;14951:3;14892:67;:::i;:::-;14885:74;;14968:93;15057:3;14968:93;:::i;:::-;15086:2;15081:3;15077:12;15070:19;;14875:220;;;:::o;15101:366::-;15243:3;15264:67;15328:2;15323:3;15264:67;:::i;:::-;15257:74;;15340:93;15429:3;15340:93;:::i;:::-;15458:2;15453:3;15449:12;15442:19;;15247:220;;;:::o;15473:366::-;15615:3;15636:67;15700:2;15695:3;15636:67;:::i;:::-;15629:74;;15712:93;15801:3;15712:93;:::i;:::-;15830:2;15825:3;15821:12;15814:19;;15619:220;;;:::o;15845:400::-;16005:3;16026:84;16108:1;16103:3;16026:84;:::i;:::-;16019:91;;16119:93;16208:3;16119:93;:::i;:::-;16237:1;16232:3;16228:11;16221:18;;16009:236;;;:::o;16251:366::-;16393:3;16414:67;16478:2;16473:3;16414:67;:::i;:::-;16407:74;;16490:93;16579:3;16490:93;:::i;:::-;16608:2;16603:3;16599:12;16592:19;;16397:220;;;:::o;16623:366::-;16765:3;16786:67;16850:2;16845:3;16786:67;:::i;:::-;16779:74;;16862:93;16951:3;16862:93;:::i;:::-;16980:2;16975:3;16971:12;16964:19;;16769:220;;;:::o;16995:366::-;17137:3;17158:67;17222:2;17217:3;17158:67;:::i;:::-;17151:74;;17234:93;17323:3;17234:93;:::i;:::-;17352:2;17347:3;17343:12;17336:19;;17141:220;;;:::o;17367:366::-;17509:3;17530:67;17594:2;17589:3;17530:67;:::i;:::-;17523:74;;17606:93;17695:3;17606:93;:::i;:::-;17724:2;17719:3;17715:12;17708:19;;17513:220;;;:::o;17739:366::-;17881:3;17902:67;17966:2;17961:3;17902:67;:::i;:::-;17895:74;;17978:93;18067:3;17978:93;:::i;:::-;18096:2;18091:3;18087:12;18080:19;;17885:220;;;:::o;18111:366::-;18253:3;18274:67;18338:2;18333:3;18274:67;:::i;:::-;18267:74;;18350:93;18439:3;18350:93;:::i;:::-;18468:2;18463:3;18459:12;18452:19;;18257:220;;;:::o;18483:400::-;18643:3;18664:84;18746:1;18741:3;18664:84;:::i;:::-;18657:91;;18757:93;18846:3;18757:93;:::i;:::-;18875:1;18870:3;18866:11;18859:18;;18647:236;;;:::o;18889:366::-;19031:3;19052:67;19116:2;19111:3;19052:67;:::i;:::-;19045:74;;19128:93;19217:3;19128:93;:::i;:::-;19246:2;19241:3;19237:12;19230:19;;19035:220;;;:::o;19261:366::-;19403:3;19424:67;19488:2;19483:3;19424:67;:::i;:::-;19417:74;;19500:93;19589:3;19500:93;:::i;:::-;19618:2;19613:3;19609:12;19602:19;;19407:220;;;:::o;19633:366::-;19775:3;19796:67;19860:2;19855:3;19796:67;:::i;:::-;19789:74;;19872:93;19961:3;19872:93;:::i;:::-;19990:2;19985:3;19981:12;19974:19;;19779:220;;;:::o;20005:366::-;20147:3;20168:67;20232:2;20227:3;20168:67;:::i;:::-;20161:74;;20244:93;20333:3;20244:93;:::i;:::-;20362:2;20357:3;20353:12;20346:19;;20151:220;;;:::o;20377:366::-;20519:3;20540:67;20604:2;20599:3;20540:67;:::i;:::-;20533:74;;20616:93;20705:3;20616:93;:::i;:::-;20734:2;20729:3;20725:12;20718:19;;20523:220;;;:::o;20749:108::-;20826:24;20844:5;20826:24;:::i;:::-;20821:3;20814:37;20804:53;;:::o;20863:118::-;20950:24;20968:5;20950:24;:::i;:::-;20945:3;20938:37;20928:53;;:::o;20987:157::-;21092:45;21112:24;21130:5;21112:24;:::i;:::-;21092:45;:::i;:::-;21087:3;21080:58;21070:74;;:::o;21150:397::-;21290:3;21305:75;21376:3;21367:6;21305:75;:::i;:::-;21405:2;21400:3;21396:12;21389:19;;21418:75;21489:3;21480:6;21418:75;:::i;:::-;21518:2;21513:3;21509:12;21502:19;;21538:3;21531:10;;21294:253;;;;;:::o;21553:695::-;21831:3;21853:92;21941:3;21932:6;21853:92;:::i;:::-;21846:99;;21962:95;22053:3;22044:6;21962:95;:::i;:::-;21955:102;;22074:148;22218:3;22074:148;:::i;:::-;22067:155;;22239:3;22232:10;;21835:413;;;;;:::o;22254:535::-;22484:3;22506:92;22594:3;22585:6;22506:92;:::i;:::-;22499:99;;22615:148;22759:3;22615:148;:::i;:::-;22608:155;;22780:3;22773:10;;22488:301;;;;:::o;22795:222::-;22888:4;22926:2;22915:9;22911:18;22903:26;;22939:71;23007:1;22996:9;22992:17;22983:6;22939:71;:::i;:::-;22893:124;;;;:::o;23023:1053::-;23346:4;23384:3;23373:9;23369:19;23361:27;;23398:71;23466:1;23455:9;23451:17;23442:6;23398:71;:::i;:::-;23479:72;23547:2;23536:9;23532:18;23523:6;23479:72;:::i;:::-;23598:9;23592:4;23588:20;23583:2;23572:9;23568:18;23561:48;23626:108;23729:4;23720:6;23626:108;:::i;:::-;23618:116;;23781:9;23775:4;23771:20;23766:2;23755:9;23751:18;23744:48;23809:108;23912:4;23903:6;23809:108;:::i;:::-;23801:116;;23965:9;23959:4;23955:20;23949:3;23938:9;23934:19;23927:49;23993:76;24064:4;24055:6;23993:76;:::i;:::-;23985:84;;23351:725;;;;;;;;:::o;24082:751::-;24305:4;24343:3;24332:9;24328:19;24320:27;;24357:71;24425:1;24414:9;24410:17;24401:6;24357:71;:::i;:::-;24438:72;24506:2;24495:9;24491:18;24482:6;24438:72;:::i;:::-;24520;24588:2;24577:9;24573:18;24564:6;24520:72;:::i;:::-;24602;24670:2;24659:9;24655:18;24646:6;24602:72;:::i;:::-;24722:9;24716:4;24712:20;24706:3;24695:9;24691:19;24684:49;24750:76;24821:4;24812:6;24750:76;:::i;:::-;24742:84;;24310:523;;;;;;;;:::o;24839:373::-;24982:4;25020:2;25009:9;25005:18;24997:26;;25069:9;25063:4;25059:20;25055:1;25044:9;25040:17;25033:47;25097:108;25200:4;25191:6;25097:108;:::i;:::-;25089:116;;24987:225;;;;:::o;25218:634::-;25439:4;25477:2;25466:9;25462:18;25454:26;;25526:9;25520:4;25516:20;25512:1;25501:9;25497:17;25490:47;25554:108;25657:4;25648:6;25554:108;:::i;:::-;25546:116;;25709:9;25703:4;25699:20;25694:2;25683:9;25679:18;25672:48;25737:108;25840:4;25831:6;25737:108;:::i;:::-;25729:116;;25444:408;;;;;:::o;25858:210::-;25945:4;25983:2;25972:9;25968:18;25960:26;;25996:65;26058:1;26047:9;26043:17;26034:6;25996:65;:::i;:::-;25950:118;;;;:::o;26074:222::-;26167:4;26205:2;26194:9;26190:18;26182:26;;26218:71;26286:1;26275:9;26271:17;26262:6;26218:71;:::i;:::-;26172:124;;;;:::o;26302:313::-;26415:4;26453:2;26442:9;26438:18;26430:26;;26502:9;26496:4;26492:20;26488:1;26477:9;26473:17;26466:47;26530:78;26603:4;26594:6;26530:78;:::i;:::-;26522:86;;26420:195;;;;:::o;26621:419::-;26787:4;26825:2;26814:9;26810:18;26802:26;;26874:9;26868:4;26864:20;26860:1;26849:9;26845:17;26838:47;26902:131;27028:4;26902:131;:::i;:::-;26894:139;;26792:248;;;:::o;27046:419::-;27212:4;27250:2;27239:9;27235:18;27227:26;;27299:9;27293:4;27289:20;27285:1;27274:9;27270:17;27263:47;27327:131;27453:4;27327:131;:::i;:::-;27319:139;;27217:248;;;:::o;27471:419::-;27637:4;27675:2;27664:9;27660:18;27652:26;;27724:9;27718:4;27714:20;27710:1;27699:9;27695:17;27688:47;27752:131;27878:4;27752:131;:::i;:::-;27744:139;;27642:248;;;:::o;27896:419::-;28062:4;28100:2;28089:9;28085:18;28077:26;;28149:9;28143:4;28139:20;28135:1;28124:9;28120:17;28113:47;28177:131;28303:4;28177:131;:::i;:::-;28169:139;;28067:248;;;:::o;28321:419::-;28487:4;28525:2;28514:9;28510:18;28502:26;;28574:9;28568:4;28564:20;28560:1;28549:9;28545:17;28538:47;28602:131;28728:4;28602:131;:::i;:::-;28594:139;;28492:248;;;:::o;28746:419::-;28912:4;28950:2;28939:9;28935:18;28927:26;;28999:9;28993:4;28989:20;28985:1;28974:9;28970:17;28963:47;29027:131;29153:4;29027:131;:::i;:::-;29019:139;;28917:248;;;:::o;29171:419::-;29337:4;29375:2;29364:9;29360:18;29352:26;;29424:9;29418:4;29414:20;29410:1;29399:9;29395:17;29388:47;29452:131;29578:4;29452:131;:::i;:::-;29444:139;;29342:248;;;:::o;29596:419::-;29762:4;29800:2;29789:9;29785:18;29777:26;;29849:9;29843:4;29839:20;29835:1;29824:9;29820:17;29813:47;29877:131;30003:4;29877:131;:::i;:::-;29869:139;;29767:248;;;:::o;30021:419::-;30187:4;30225:2;30214:9;30210:18;30202:26;;30274:9;30268:4;30264:20;30260:1;30249:9;30245:17;30238:47;30302:131;30428:4;30302:131;:::i;:::-;30294:139;;30192:248;;;:::o;30446:419::-;30612:4;30650:2;30639:9;30635:18;30627:26;;30699:9;30693:4;30689:20;30685:1;30674:9;30670:17;30663:47;30727:131;30853:4;30727:131;:::i;:::-;30719:139;;30617:248;;;:::o;30871:419::-;31037:4;31075:2;31064:9;31060:18;31052:26;;31124:9;31118:4;31114:20;31110:1;31099:9;31095:17;31088:47;31152:131;31278:4;31152:131;:::i;:::-;31144:139;;31042:248;;;:::o;31296:419::-;31462:4;31500:2;31489:9;31485:18;31477:26;;31549:9;31543:4;31539:20;31535:1;31524:9;31520:17;31513:47;31577:131;31703:4;31577:131;:::i;:::-;31569:139;;31467:248;;;:::o;31721:419::-;31887:4;31925:2;31914:9;31910:18;31902:26;;31974:9;31968:4;31964:20;31960:1;31949:9;31945:17;31938:47;32002:131;32128:4;32002:131;:::i;:::-;31994:139;;31892:248;;;:::o;32146:419::-;32312:4;32350:2;32339:9;32335:18;32327:26;;32399:9;32393:4;32389:20;32385:1;32374:9;32370:17;32363:47;32427:131;32553:4;32427:131;:::i;:::-;32419:139;;32317:248;;;:::o;32571:419::-;32737:4;32775:2;32764:9;32760:18;32752:26;;32824:9;32818:4;32814:20;32810:1;32799:9;32795:17;32788:47;32852:131;32978:4;32852:131;:::i;:::-;32844:139;;32742:248;;;:::o;32996:222::-;33089:4;33127:2;33116:9;33112:18;33104:26;;33140:71;33208:1;33197:9;33193:17;33184:6;33140:71;:::i;:::-;33094:124;;;;:::o;33224:332::-;33345:4;33383:2;33372:9;33368:18;33360:26;;33396:71;33464:1;33453:9;33449:17;33440:6;33396:71;:::i;:::-;33477:72;33545:2;33534:9;33530:18;33521:6;33477:72;:::i;:::-;33350:206;;;;;:::o;33562:129::-;33596:6;33623:20;;:::i;:::-;33613:30;;33652:33;33680:4;33672:6;33652:33;:::i;:::-;33603:88;;;:::o;33697:75::-;33730:6;33763:2;33757:9;33747:19;;33737:35;:::o;33778:311::-;33855:4;33945:18;33937:6;33934:30;33931:2;;;33967:18;;:::i;:::-;33931:2;34017:4;34009:6;34005:17;33997:25;;34077:4;34071;34067:15;34059:23;;33860:229;;;:::o;34095:311::-;34172:4;34262:18;34254:6;34251:30;34248:2;;;34284:18;;:::i;:::-;34248:2;34334:4;34326:6;34322:17;34314:25;;34394:4;34388;34384:15;34376:23;;34177:229;;;:::o;34412:307::-;34473:4;34563:18;34555:6;34552:30;34549:2;;;34585:18;;:::i;:::-;34549:2;34623:29;34645:6;34623:29;:::i;:::-;34615:37;;34707:4;34701;34697:15;34689:23;;34478:241;;;:::o;34725:308::-;34787:4;34877:18;34869:6;34866:30;34863:2;;;34899:18;;:::i;:::-;34863:2;34937:29;34959:6;34937:29;:::i;:::-;34929:37;;35021:4;35015;35011:15;35003:23;;34792:241;;;:::o;35039:132::-;35106:4;35129:3;35121:11;;35159:4;35154:3;35150:14;35142:22;;35111:60;;;:::o;35177:141::-;35226:4;35249:3;35241:11;;35272:3;35269:1;35262:14;35306:4;35303:1;35293:18;35285:26;;35231:87;;;:::o;35324:114::-;35391:6;35425:5;35419:12;35409:22;;35398:40;;;:::o;35444:98::-;35495:6;35529:5;35523:12;35513:22;;35502:40;;;:::o;35548:99::-;35600:6;35634:5;35628:12;35618:22;;35607:40;;;:::o;35653:113::-;35723:4;35755;35750:3;35746:14;35738:22;;35728:38;;;:::o;35772:184::-;35871:11;35905:6;35900:3;35893:19;35945:4;35940:3;35936:14;35921:29;;35883:73;;;;:::o;35962:168::-;36045:11;36079:6;36074:3;36067:19;36119:4;36114:3;36110:14;36095:29;;36057:73;;;;:::o;36136:169::-;36220:11;36254:6;36249:3;36242:19;36294:4;36289:3;36285:14;36270:29;;36232:73;;;;:::o;36311:148::-;36413:11;36450:3;36435:18;;36425:34;;;;:::o;36465:305::-;36505:3;36524:20;36542:1;36524:20;:::i;:::-;36519:25;;36558:20;36576:1;36558:20;:::i;:::-;36553:25;;36712:1;36644:66;36640:74;36637:1;36634:81;36631:2;;;36718:18;;:::i;:::-;36631:2;36762:1;36759;36755:9;36748:16;;36509:261;;;;:::o;36776:185::-;36816:1;36833:20;36851:1;36833:20;:::i;:::-;36828:25;;36867:20;36885:1;36867:20;:::i;:::-;36862:25;;36906:1;36896:2;;36911:18;;:::i;:::-;36896:2;36953:1;36950;36946:9;36941:14;;36818:143;;;;:::o;36967:191::-;37007:4;37027:20;37045:1;37027:20;:::i;:::-;37022:25;;37061:20;37079:1;37061:20;:::i;:::-;37056:25;;37100:1;37097;37094:8;37091:2;;;37105:18;;:::i;:::-;37091:2;37150:1;37147;37143:9;37135:17;;37012:146;;;;:::o;37164:96::-;37201:7;37230:24;37248:5;37230:24;:::i;:::-;37219:35;;37209:51;;;:::o;37266:90::-;37300:7;37343:5;37336:13;37329:21;37318:32;;37308:48;;;:::o;37362:77::-;37399:7;37428:5;37417:16;;37407:32;;;:::o;37445:149::-;37481:7;37521:66;37514:5;37510:78;37499:89;;37489:105;;;:::o;37600:126::-;37637:7;37677:42;37670:5;37666:54;37655:65;;37645:81;;;:::o;37732:77::-;37769:7;37798:5;37787:16;;37777:32;;;:::o;37815:154::-;37899:6;37894:3;37889;37876:30;37961:1;37952:6;37947:3;37943:16;37936:27;37866:103;;;:::o;37975:307::-;38043:1;38053:113;38067:6;38064:1;38061:13;38053:113;;;38152:1;38147:3;38143:11;38137:18;38133:1;38128:3;38124:11;38117:39;38089:2;38086:1;38082:10;38077:15;;38053:113;;;38184:6;38181:1;38178:13;38175:2;;;38264:1;38255:6;38250:3;38246:16;38239:27;38175:2;38024:258;;;;:::o;38288:320::-;38332:6;38369:1;38363:4;38359:12;38349:22;;38416:1;38410:4;38406:12;38437:18;38427:2;;38493:4;38485:6;38481:17;38471:27;;38427:2;38555;38547:6;38544:14;38524:18;38521:38;38518:2;;;38574:18;;:::i;:::-;38518:2;38339:269;;;;:::o;38614:281::-;38697:27;38719:4;38697:27;:::i;:::-;38689:6;38685:40;38827:6;38815:10;38812:22;38791:18;38779:10;38776:34;38773:62;38770:2;;;38838:18;;:::i;:::-;38770:2;38878:10;38874:2;38867:22;38657:238;;;:::o;38901:233::-;38940:3;38963:24;38981:5;38963:24;:::i;:::-;38954:33;;39009:66;39002:5;38999:77;38996:2;;;39079:18;;:::i;:::-;38996:2;39126:1;39119:5;39115:13;39108:20;;38944:190;;;:::o;39140:100::-;39179:7;39208:26;39228:5;39208:26;:::i;:::-;39197:37;;39187:53;;;:::o;39246:94::-;39285:7;39314:20;39328:5;39314:20;:::i;:::-;39303:31;;39293:47;;;:::o;39346:79::-;39385:7;39414:5;39403:16;;39393:32;;;:::o;39431:176::-;39463:1;39480:20;39498:1;39480:20;:::i;:::-;39475:25;;39514:20;39532:1;39514:20;:::i;:::-;39509:25;;39553:1;39543:2;;39558:18;;:::i;:::-;39543:2;39599:1;39596;39592:9;39587:14;;39465:142;;;;:::o;39613:180::-;39661:77;39658:1;39651:88;39758:4;39755:1;39748:15;39782:4;39779:1;39772:15;39799:180;39847:77;39844:1;39837:88;39944:4;39941:1;39934:15;39968:4;39965:1;39958:15;39985:180;40033:77;40030:1;40023:88;40130:4;40127:1;40120:15;40154:4;40151:1;40144:15;40171:180;40219:77;40216:1;40209:88;40316:4;40313:1;40306:15;40340:4;40337:1;40330:15;40357:183;40392:3;40430:1;40412:16;40409:23;40406:2;;;40468:1;40465;40462;40447:23;40490:34;40521:1;40515:8;40490:34;:::i;:::-;40483:41;;40406:2;40396:144;:::o;40546:102::-;40587:6;40638:2;40634:7;40629:2;40622:5;40618:14;40614:28;40604:38;;40594:54;;;:::o;40654:94::-;40687:8;40735:5;40731:2;40727:14;40706:35;;40696:52;;;:::o;40754:106::-;40798:8;40847:5;40842:3;40838:15;40817:36;;40807:53;;;:::o;40866:239::-;41006:34;41002:1;40994:6;40990:14;40983:58;41075:22;41070:2;41062:6;41058:15;41051:47;40972:133;:::o;41111:227::-;41251:34;41247:1;41239:6;41235:14;41228:58;41320:10;41315:2;41307:6;41303:15;41296:35;41217:121;:::o;41344:230::-;41484:34;41480:1;41472:6;41468:14;41461:58;41553:13;41548:2;41540:6;41536:15;41529:38;41450:124;:::o;41580:225::-;41720:34;41716:1;41708:6;41704:14;41697:58;41789:8;41784:2;41776:6;41772:15;41765:33;41686:119;:::o;41811:156::-;41951:8;41947:1;41939:6;41935:14;41928:32;41917:50;:::o;41973:165::-;42113:17;42109:1;42101:6;42097:14;42090:41;42079:59;:::o;42144:228::-;42284:34;42280:1;42272:6;42268:14;42261:58;42353:11;42348:2;42340:6;42336:15;42329:36;42250:122;:::o;42378:168::-;42518:20;42514:1;42506:6;42502:14;42495:44;42484:62;:::o;42552:224::-;42692:34;42688:1;42680:6;42676:14;42669:58;42761:7;42756:2;42748:6;42744:15;42737:32;42658:118;:::o;42782:237::-;42922:34;42918:1;42910:6;42906:14;42899:58;42991:20;42986:2;42978:6;42974:15;42967:45;42888:131;:::o;43025:229::-;43165:34;43161:1;43153:6;43149:14;43142:58;43234:12;43229:2;43221:6;43217:15;43210:37;43131:123;:::o;43260:155::-;43400:7;43396:1;43388:6;43384:14;43377:31;43366:49;:::o;43421:182::-;43561:34;43557:1;43549:6;43545:14;43538:58;43527:76;:::o;43609:228::-;43749:34;43745:1;43737:6;43733:14;43726:58;43818:11;43813:2;43805:6;43801:15;43794:36;43715:122;:::o;43843:228::-;43983:34;43979:1;43971:6;43967:14;43960:58;44052:11;44047:2;44039:6;44035:15;44028:36;43949:122;:::o;44077:227::-;44217:34;44213:1;44205:6;44201:14;44194:58;44286:10;44281:2;44273:6;44269:15;44262:35;44183:121;:::o;44310:220::-;44450:34;44446:1;44438:6;44434:14;44427:58;44519:3;44514:2;44506:6;44502:15;44495:28;44416:114;:::o;44536:711::-;44575:3;44613:4;44595:16;44592:26;44589:2;;;44621:5;;44589:2;44650:20;;:::i;:::-;44725:1;44707:16;44703:24;44700:1;44694:4;44679:49;44758:4;44752:11;44857:16;44850:4;44842:6;44838:17;44835:39;44802:18;44794:6;44791:30;44775:113;44772:2;;;44903:5;;;;44772:2;44949:6;44943:4;44939:17;44985:3;44979:10;45012:18;45004:6;45001:30;44998:2;;;45034:5;;;;;;44998:2;45082:6;45075:4;45070:3;45066:14;45062:27;45141:1;45123:16;45119:24;45113:4;45109:35;45104:3;45101:44;45098:2;;;45148:5;;;;;;;45098:2;45165:57;45213:6;45207:4;45203:17;45195:6;45191:30;45185:4;45165:57;:::i;:::-;45238:3;45231:10;;44579:668;;;;;;;:::o;45253:122::-;45326:24;45344:5;45326:24;:::i;:::-;45319:5;45316:35;45306:2;;45365:1;45362;45355:12;45306:2;45296:79;:::o;45381:116::-;45451:21;45466:5;45451:21;:::i;:::-;45444:5;45441:32;45431:2;;45487:1;45484;45477:12;45431:2;45421:76;:::o;45503:122::-;45576:24;45594:5;45576:24;:::i;:::-;45569:5;45566:35;45556:2;;45615:1;45612;45605:12;45556:2;45546:79;:::o;45631:120::-;45703:23;45720:5;45703:23;:::i;:::-;45696:5;45693:34;45683:2;;45741:1;45738;45731:12;45683:2;45673:78;:::o;45757:122::-;45830:24;45848:5;45830:24;:::i;:::-;45823:5;45820:35;45810:2;;45869:1;45866;45859:12;45810:2;45800:79;:::o

Swarm Source

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