ETH Price: $3,352.46 (+0.83%)

Token

3DMutantMfers (3DMM)
 

Overview

Max Total Supply

1,509 3DMM

Holders

536

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 3DMM
0xDeDC5bE40bbf1898785cc09737F86A356325aA95
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MutantMfers

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// 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/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


// 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/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721B.sol



pragma solidity ^0.8.4;

/********************
* @author: Squeebo *
********************/







abstract contract ERC721B is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
          if( owner == _owners[i] ){
            ++count;
          }
        }

        delete length;
        return count;
    }

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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


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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

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

        _beforeTokenTransfer(address(0), to, tokenId);
        _owners.push(to);

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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


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

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



pragma solidity ^0.8.4;

/****************************************
 * @author: CryptoMoonHawk              *
 ****************************************/





contract MutantMfers is Ownable, ERC721B {
  using Strings for uint;

  uint public MAX_SUPPLY     = 4444;
  uint public MAX_PER_WALLET = 1000;

  uint public price          = 0.029 ether;
  bool public isActive       = false;
  uint public maxOrder       = 20;

  // Mapping from token ID to owner address
  string[] public contract1ClaimedTokens;
  uint public contract1ClaimedTokensCount = 0;

  string[] public contract2ClaimedTokens;
  uint public contract2ClaimedTokensCount = 0;

  // Count of NFTs minted per wallet
  mapping(address => uint) public addressMintedBalance;

  // signer address for verification
  address public signerAddress;

  string private _baseTokenURI = 'ipfs://QmVTHEc3TC1wbAmWs2G2aeUerdehAQnBVRLMgxFFeLg8bn/';
  string private _tokenURISuffix = '';

  constructor()
    ERC721B("3DMutantMfers", "3DMM"){
      signerAddress = msg.sender;
  }

  function totalSupply() external view returns (uint) {
    uint supply = _owners.length;
    return supply;
  }

  function getContract1ClaimedTokensAsString() external view returns (string memory) {
    string memory claimedTokens = "";
    for (uint i = 0;i < contract1ClaimedTokensCount; i++) {
      claimedTokens = string(abi.encodePacked(claimedTokens, contract1ClaimedTokens[i], i < contract1ClaimedTokensCount - 1 ? "," : ""));
    }
    
    return claimedTokens;
  }

  function getContract2ClaimedTokensAsString() external view returns (string memory) {
    string memory claimedTokens = "";
    for (uint i = 0;i < contract2ClaimedTokensCount; i++) {
      claimedTokens = string(abi.encodePacked(claimedTokens, contract2ClaimedTokens[i], i < contract2ClaimedTokensCount - 1 ? "," : ""));
    }
    
    return claimedTokens;
  }

  //external

  fallback() external payable {}

  receive() external payable {}

  modifier mintCompliance( uint numberOfTokens ) {
    require( isActive,                            "Sale must be active to mint 3DMutantMfers" );
    require( numberOfTokens <= maxOrder,          "Can only mint 20 tokens at a time" );
    require( numberOfTokens > 0,                  "Token Mint Count must be > 0" );

    uint256 supply = _owners.length;
    require( supply + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max supply of 3DMutantMfers" );
    
    uint256 mintedCount = addressMintedBalance[msg.sender];
    require(mintedCount + numberOfTokens <= MAX_PER_WALLET, "Max NFT per address exceeded");

    _;
  }

  function mint( uint numberOfTokens ) external payable mintCompliance( numberOfTokens ) {
    require( msg.value >= price * numberOfTokens, "Ether value sent is not correct" );

    _mintLoop( msg.sender, numberOfTokens );    
  }

  function verifySender(bytes memory signature, string[] memory contract1TokenIds, string[] memory contract2TokenIds) internal view returns (bool) {

    string memory contract1TokensString = "";
    string memory contract2TokensString = "";

    for (uint i = 0; i < contract1TokenIds.length; i++) {
      contract1TokensString = string(abi.encodePacked(contract1TokensString, contract1TokenIds[i], i < contract1TokenIds.length - 1 ? "," : ""));
    }
    
    for (uint i = 0; i < contract2TokenIds.length; i++) {
      contract2TokensString = string(abi.encodePacked(contract2TokensString, contract2TokenIds[i], i < contract2TokenIds.length - 1 ? "," : ""));
    }

    bytes32 hash = ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(msg.sender, contract1TokensString, contract2TokensString)));
    return ECDSA.recover(hash, signature) == signerAddress;
  }

  function freeClaimMint( uint numberOfTokens, bytes memory signature, string[] memory contract1TokenIds, string[] memory contract2TokenIds ) external mintCompliance( numberOfTokens ) {
    
    require(verifySender(signature, contract1TokenIds, contract2TokenIds), "Invalid Access");

    // Check to make sure there are token ids
    require(contract1TokenIds.length > 0 || contract2TokenIds.length > 0, "Empty Token IDs");

    uint totalTokenIds = contract1TokenIds.length + contract2TokenIds.length;
    require(totalTokenIds == numberOfTokens, "Token IDs and Mint Count mismatch");

    // Lets make sure we are not claiming for already claimed tokens of contract 1
    bool isValidTokenIds = true;
    for (uint i = 0; isValidTokenIds && i < contract1TokenIds.length; i++) {
      for (uint j = 0; isValidTokenIds && j < contract1ClaimedTokensCount; j++) {
        string memory contractClaimedToken = contract1ClaimedTokens[j];
        string memory tokenToClaim = contract1TokenIds[i];

        if (keccak256(bytes(tokenToClaim)) == keccak256(bytes(contractClaimedToken))) {
          isValidTokenIds = false;
        }
      } 
    } 
    require(isValidTokenIds, "Cosmo Creatures Token ID passed is already claimed");

    // Lets make sure we are not claiming for already claimed tokens of contract 2
    for (uint i = 0; isValidTokenIds && i < contract2TokenIds.length; i++) {
      for (uint j = 0; isValidTokenIds && j < contract2ClaimedTokensCount; j++) {
        string memory contractClaimedToken = contract2ClaimedTokens[j];
        string memory tokenToClaim = contract2TokenIds[i];

        if (keccak256(bytes(tokenToClaim)) == keccak256(bytes(contractClaimedToken))) {
          isValidTokenIds = false;
        }
      } 
    } 
    require(isValidTokenIds, "3D Mfrs Token ID passed is already claimed");


    for (uint i = 0; i < contract1TokenIds.length; i++) {
      contract1ClaimedTokensCount++;
      contract1ClaimedTokens.push(contract1TokenIds[i]);
    }
    
    for (uint i = 0; i < contract2TokenIds.length; i++) {
      contract2ClaimedTokensCount++;
      contract2ClaimedTokens.push(contract2TokenIds[i]);
    }

    _mintLoop( msg.sender, numberOfTokens );
  }

  function _mintLoop(address _receiver, uint256 numberOfTokens) internal {
    uint256 supply = _owners.length;

    for (uint256 i = 0; i < numberOfTokens; i++) {
      addressMintedBalance[_receiver]++;
      _safeMint( _receiver, supply++, "" );
    }
  }

  //delegated
  function gift(uint[] calldata quantity, address[] calldata recipient) external onlyOwner {
    require(quantity.length == recipient.length, "Must provide equal quantity and recipient" );

    uint totalQuantity = 0;
    uint256 supply = _owners.length;
    for(uint i = 0; i < quantity.length; ++i){
      totalQuantity += quantity[i];
    }
    require( supply + totalQuantity <= MAX_SUPPLY, "Mint/order would exceed max supply of 3DMutantMfers" );
    delete totalQuantity;

    for(uint i = 0; i < recipient.length; ++i){
      _mintLoop(recipient[i], quantity[i]);
    }
  }

  function walletOfOwner(address _owner) external view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 0;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= MAX_SUPPLY) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;
        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function setActive(bool isActive_) external onlyOwner {
    if( isActive != isActive_ )
      isActive = isActive_;
  }

  function setMaxOrder(uint maxOrder_) external onlyOwner {
    if( maxOrder != maxOrder_ )
      maxOrder = maxOrder_;
  }

  function setPrice(uint price_ ) external onlyOwner {
    if( price != price_ )
      price = price_;
  }

  function setBaseURI(string calldata _newBaseURI) external onlyOwner {
    _baseTokenURI = _newBaseURI;
  }

  //onlyOwner
  function setMaxSupply(uint maxSupply_ ) external onlyOwner {
    if( MAX_SUPPLY != maxSupply_ ){
      require(maxSupply_ >= _owners.length, "Specified supply is lower than current balance" );
      MAX_SUPPLY = maxSupply_;
    }
  }

  // Update Max Tokens A Wallet can mint
  function setMaxPerWallet(uint maxPerWallet_ ) external onlyOwner {
    if( MAX_PER_WALLET != maxPerWallet_ ){
      MAX_PER_WALLET = maxPerWallet_;
    }
  }

  function setSignerAddress(address _newSignerAddress) external onlyOwner {
    signerAddress = _newSignerAddress;
  }

  function withdraw(uint256 _percentWithdrawl) external onlyOwner {
      require(address(this).balance >= 0, "No funds available");
      require(_percentWithdrawl > 0 && _percentWithdrawl <= 100, "Withdrawl percent should be > 0 and <= 100");

      Address.sendValue(payable(owner()), (address(this).balance * _percentWithdrawl) / 100);
  }

  //public
  function tokenURI(uint tokenId) external view virtual override returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
    return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), _tokenURISuffix));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"contract1ClaimedTokens","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contract1ClaimedTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"contract2ClaimedTokens","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contract2ClaimedTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string[]","name":"contract1TokenIds","type":"string[]"},{"internalType":"string[]","name":"contract2TokenIds","type":"string[]"}],"name":"freeClaimMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContract1ClaimedTokensAsString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContract2ClaimedTokensAsString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive_","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxOrder_","type":"uint256"}],"name":"setMaxOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerWallet_","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSignerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentWithdrawl","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61115c6006556103e860075566670758aa7c80006008556009805460ff191690556014600a556000600c819055600e5560e0604052603660808181529062003aec60a0398051620000599160119160209091019062000180565b506040805160208101918290526000908190526200007a9160129162000180565b503480156200008857600080fd5b506040518060400160405280600d81526020016c33444d7574616e744d6665727360981b8152506040518060400160405280600481526020016333444d4d60e01b815250620000e6620000e06200012c60201b60201c565b62000130565b8151620000fb90600190602085019062000180565b5080516200011190600290602084019062000180565b5050601080546001600160a01b031916331790555062000263565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200018e9062000226565b90600052602060002090601f016020900481019282620001b25760008555620001fd565b82601f10620001cd57805160ff1916838001178555620001fd565b82800160010185558215620001fd579182015b82811115620001fd578251825591602001919060010190620001e0565b506200020b9291506200020f565b5090565b5b808211156200020b576000815560010162000210565b600181811c908216806200023b57607f821691505b602082108114156200025d57634e487b7160e01b600052602260045260246000fd5b50919050565b61387980620002736000396000f3fe60806040526004361061023c5760003560e01c80636352211e1161012d578063a0382d58116100b0578063c87b56dd11610077578063c87b56dd14610694578063d75fc489146106b4578063dde3d313146106d4578063e268e4d3146106f4578063e985e9c514610714578063f2fde38b1461075d57005b8063a0382d581461060c578063a0712d6814610621578063a22cb46514610634578063acec338a14610654578063b88d4fde1461067457005b80638da5cb5b116100f45780638da5cb5b1461058357806391b7f5ed146105a157806395d89b41146105c157806396ea3a47146105d6578063a035b1fe146105f657005b80636352211e146104f95780636f8b44b01461051957806370a0823114610539578063715018a6146105595780638879570f1461056e57005b806322f3e2d4116101c057806342842e0e1161018757806342842e0e14610436578063438b6300146104565780634c08aba51461048357806355f804b3146104995780635687ee84146104b95780635b7633d0146104d957005b806322f3e2d4146103a657806323b872dd146103c05780632e1a7d4d146103e057806332cb6b0c1461040057806332cc33711461041657005b80630917803b116102045780630917803b14610318578063095ea7b31461032e5780630f2cdd6c1461034e57806318160ddd1461036457806318cae2691461037957005b80624510261461024557806301ffc9a71461026e578063046dc1661461029e57806306fdde03146102be578063081812fc146102e057005b3661024357005b005b34801561025157600080fd5b5061025b600a5481565b6040519081526020015b60405180910390f35b34801561027a57600080fd5b5061028e61028936600461318a565b61077d565b6040519015158152602001610265565b3480156102aa57600080fd5b506102436102b9366004612fc1565b6107cf565b3480156102ca57600080fd5b506102d3610824565b6040516102659190613502565b3480156102ec57600080fd5b506103006102fb36600461322f565b6108b6565b6040516001600160a01b039091168152602001610265565b34801561032457600080fd5b5061025b600e5481565b34801561033a57600080fd5b506102436103493660046130de565b61093e565b34801561035a57600080fd5b5061025b60075481565b34801561037057600080fd5b5060035461025b565b34801561038557600080fd5b5061025b610394366004612fc1565b600f6020526000908152604090205481565b3480156103b257600080fd5b5060095461028e9060ff1681565b3480156103cc57600080fd5b506102436103db366004613014565b610a54565b3480156103ec57600080fd5b506102436103fb36600461322f565b610a85565b34801561040c57600080fd5b5061025b60065481565b34801561042257600080fd5b50610243610431366004613247565b610b52565b34801561044257600080fd5b50610243610451366004613014565b61121a565b34801561046257600080fd5b50610476610471366004612fc1565b611235565b60405161026591906134be565b34801561048f57600080fd5b5061025b600c5481565b3480156104a557600080fd5b506102436104b43660046131c2565b611331565b3480156104c557600080fd5b506102d36104d436600461322f565b611367565b3480156104e557600080fd5b50601054610300906001600160a01b031681565b34801561050557600080fd5b5061030061051436600461322f565b611413565b34801561052557600080fd5b5061024361053436600461322f565b6114ad565b34801561054557600080fd5b5061025b610554366004612fc1565b61154e565b34801561056557600080fd5b5061024361162e565b34801561057a57600080fd5b506102d3611664565b34801561058f57600080fd5b506000546001600160a01b0316610300565b3480156105ad57600080fd5b506102436105bc36600461322f565b611730565b3480156105cd57600080fd5b506102d3611768565b3480156105e257600080fd5b506102436105f1366004613107565b611777565b34801561060257600080fd5b5061025b60085481565b34801561061857600080fd5b506102d361195a565b61024361062f36600461322f565b611a20565b34801561064057600080fd5b5061024361064f3660046130b5565b611bbc565b34801561066057600080fd5b5061024361066f366004613170565b611c81565b34801561068057600080fd5b5061024361068f36600461304f565b611cce565b3480156106a057600080fd5b506102d36106af36600461322f565b611d00565b3480156106c057600080fd5b506102d36106cf36600461322f565b611da4565b3480156106e057600080fd5b506102436106ef36600461322f565b611db4565b34801561070057600080fd5b5061024361070f36600461322f565b611dec565b34801561072057600080fd5b5061028e61072f366004612fe2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561076957600080fd5b50610243610778366004612fc1565b611e24565b60006001600160e01b031982166380ac58cd60e01b14806107ae57506001600160e01b03198216635b5e139f60e01b145b806107c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108025760405162461bcd60e51b81526004016107f9906135f9565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461083390613787565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90613787565b80156108ac5780601f10610881576101008083540402835291602001916108ac565b820191906000526020600020905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b60006108c182611ebc565b6109225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b506000908152600460205260409020546001600160a01b031690565b600061094982611413565b9050806001600160a01b0316836001600160a01b031614156109b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107f9565b336001600160a01b03821614806109d357506109d3813361072f565b610a455760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107f9565b610a4f8383611f14565b505050565b610a5e3382611f82565b610a7a5760405162461bcd60e51b81526004016107f990613677565b610a4f83838361206c565b6000546001600160a01b03163314610aaf5760405162461bcd60e51b81526004016107f9906135f9565b600081118015610ac0575060648111155b610b1f5760405162461bcd60e51b815260206004820152602a60248201527f57697468647261776c2070657263656e742073686f756c64206265203e2030206044820152690616e64203c3d203130360b41b60648201526084016107f9565b610b4f610b346000546001600160a01b031690565b6064610b408447613725565b610b4a9190613711565b6121d0565b50565b600954849060ff16610b765760405162461bcd60e51b81526004016107f99061362e565b600a54811115610b985760405162461bcd60e51b81526004016107f990613567565b60008111610be85760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e204d696e7420436f756e74206d757374206265203e20300000000060448201526064016107f9565b600354600654610bf883836136f9565b1115610c165760405162461bcd60e51b81526004016107f9906135a8565b336000908152600f6020526040902054600754610c3384836136f9565b1115610c815760405162461bcd60e51b815260206004820152601c60248201527f4d6178204e46542070657220616464726573732065786365656465640000000060448201526064016107f9565b610c8c8686866122e9565b610cc95760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642041636365737360901b60448201526064016107f9565b600085511180610cda575060008451115b610d185760405162461bcd60e51b815260206004820152600f60248201526e456d70747920546f6b656e2049447360881b60448201526064016107f9565b600084518651610d2891906136f9565b9050878114610d835760405162461bcd60e51b815260206004820152602160248201527f546f6b656e2049447320616e64204d696e7420436f756e74206d69736d6174636044820152600d60fb1b60648201526084016107f9565b600160005b818015610d955750875181105b15610ed75760005b828015610dab5750600c5481105b15610ec4576000600b8281548110610dd357634e487b7160e01b600052603260045260246000fd5b906000526020600020018054610de890613787565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1490613787565b8015610e615780601f10610e3657610100808354040283529160200191610e61565b820191906000526020600020905b815481529060010190602001808311610e4457829003601f168201915b5050505050905060008a8481518110610e8a57634e487b7160e01b600052603260045260246000fd5b60200260200101519050818051906020012081805190602001201415610eaf57600094505b50508080610ebc906137bc565b915050610d9d565b5080610ecf816137bc565b915050610d88565b5080610f405760405162461bcd60e51b815260206004820152603260248201527f436f736d6f2043726561747572657320546f6b656e20494420706173736564206044820152711a5cc8185b1c9958591e4818db185a5b595960721b60648201526084016107f9565b60005b818015610f505750865181105b156110925760005b828015610f665750600e5481105b1561107f576000600d8281548110610f8e57634e487b7160e01b600052603260045260246000fd5b906000526020600020018054610fa390613787565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcf90613787565b801561101c5780601f10610ff15761010080835404028352916020019161101c565b820191906000526020600020905b815481529060010190602001808311610fff57829003601f168201915b50505050509050600089848151811061104557634e487b7160e01b600052603260045260246000fd5b6020026020010151905081805190602001208180519060200120141561106a57600094505b50508080611077906137bc565b915050610f58565b508061108a816137bc565b915050610f43565b50806110f35760405162461bcd60e51b815260206004820152602a60248201527f3344204d66727320546f6b656e2049442070617373656420697320616c726561604482015269191e4818db185a5b595960b21b60648201526084016107f9565b60005b875181101561117b57600c805490600061110f836137bc565b9190505550600b88828151811061113657634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529282902081516111689491909101929190910190612d3a565b5080611173816137bc565b9150506110f6565b5060005b865181101561120457600e8054906000611198836137bc565b9190505550600d8782815181106111bf57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529282902081516111f19491909101929190910190612d3a565b50806111fc816137bc565b91505061117f565b5061120f338a61250b565b505050505050505050565b610a4f83838360405180602001604052806000815250611cce565b606060006112428361154e565b905060008167ffffffffffffffff81111561126d57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611296578160200160208202803683370190505b5090506000805b83811080156112ae57506006548211155b156113275760006112be83611413565b9050866001600160a01b0316816001600160a01b0316141561131457828483815181106112fb57634e487b7160e01b600052603260045260246000fd5b602090810291909101015281611310816137bc565b9250505b8261131e816137bc565b9350505061129d565b5090949350505050565b6000546001600160a01b0316331461135b5760405162461bcd60e51b81526004016107f9906135f9565b610a4f60118383612dbe565b600b818154811061137757600080fd5b90600052602060002001600091509050805461139290613787565b80601f01602080910402602001604051908101604052809291908181526020018280546113be90613787565b801561140b5780601f106113e05761010080835404028352916020019161140b565b820191906000526020600020905b8154815290600101906020018083116113ee57829003601f168201915b505050505081565b6000806003838154811061143757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050806107c95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107f9565b6000546001600160a01b031633146114d75760405162461bcd60e51b81526004016107f9906135f9565b8060065414610b4f576003548110156115495760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b60648201526084016107f9565b600655565b60006001600160a01b0382166115b95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107f9565b600354600090815b8181101561162557600381815481106115ea57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b038681169116141561161557611612836137bc565b92505b61161e816137bc565b90506115c1565b50909392505050565b6000546001600160a01b031633146116585760405162461bcd60e51b81526004016107f9906135f9565b611662600061257a565b565b60408051602081019091526000808252606091905b600e5481101561172a5781600d82815481106116a557634e487b7160e01b600052603260045260246000fd5b906000526020600020016001600e546116be9190613744565b83106116d957604051806020016040528060008152506116f4565b604051806040016040528060018152602001600b60fa1b8152505b6040516020016117069392919061341e565b60405160208183030381529060405291508080611722906137bc565b915050611679565b50919050565b6000546001600160a01b0316331461175a5760405162461bcd60e51b81526004016107f9906135f9565b8060085414610b4f57600855565b60606002805461083390613787565b6000546001600160a01b031633146117a15760405162461bcd60e51b81526004016107f9906135f9565b8281146118025760405162461bcd60e51b815260206004820152602960248201527f4d7573742070726f7669646520657175616c207175616e7469747920616e64206044820152681c9958da5c1a595b9d60ba1b60648201526084016107f9565b600354600090815b858110156118565786868281811061183257634e487b7160e01b600052603260045260246000fd5b905060200201358361184491906136f9565b925061184f816137bc565b905061180a565b5060065461186483836136f9565b11156118ce5760405162461bcd60e51b815260206004820152603360248201527f4d696e742f6f7264657220776f756c6420657863656564206d617820737570706044820152726c79206f662033444d7574616e744d6665727360681b60648201526084016107f9565b6000915060005b838110156119515761194185858381811061190057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119159190612fc1565b88888481811061193557634e487b7160e01b600052603260045260246000fd5b9050602002013561250b565b61194a816137bc565b90506118d5565b50505050505050565b60408051602081019091526000808252606091905b600c5481101561172a5781600b828154811061199b57634e487b7160e01b600052603260045260246000fd5b906000526020600020016001600c546119b49190613744565b83106119cf57604051806020016040528060008152506119ea565b604051806040016040528060018152602001600b60fa1b8152505b6040516020016119fc9392919061341e565b60405160208183030381529060405291508080611a18906137bc565b91505061196f565b600954819060ff16611a445760405162461bcd60e51b81526004016107f99061362e565b600a54811115611a665760405162461bcd60e51b81526004016107f990613567565b60008111611ab65760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e204d696e7420436f756e74206d757374206265203e20300000000060448201526064016107f9565b600354600654611ac683836136f9565b1115611ae45760405162461bcd60e51b81526004016107f9906135a8565b336000908152600f6020526040902054600754611b0184836136f9565b1115611b4f5760405162461bcd60e51b815260206004820152601c60248201527f4d6178204e46542070657220616464726573732065786365656465640000000060448201526064016107f9565b83600854611b5d9190613725565b341015611bac5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107f9565b611bb6338561250b565b50505050565b6001600160a01b038216331415611c155760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611cab5760405162461bcd60e51b81526004016107f9906135f9565b60095460ff16151581151514610b4f576009805482151560ff1990911617905550565b611cd83383611f82565b611cf45760405162461bcd60e51b81526004016107f990613677565b611bb6848484846125ca565b6060611d0b82611ebc565b611d6f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107f9565b6011611d7a836125fd565b6012604051602001611d8e9392919061344e565b6040516020818303038152906040529050919050565b600d818154811061137757600080fd5b6000546001600160a01b03163314611dde5760405162461bcd60e51b81526004016107f9906135f9565b80600a5414610b4f57600a55565b6000546001600160a01b03163314611e165760405162461bcd60e51b81526004016107f9906135f9565b8060075414610b4f57600755565b6000546001600160a01b03163314611e4e5760405162461bcd60e51b81526004016107f9906135f9565b6001600160a01b038116611eb35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610b4f8161257a565b600354600090821080156107c9575060006001600160a01b031660038381548110611ef757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f4982611413565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8d82611ebc565b611fee5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b6000611ff983611413565b9050806001600160a01b0316846001600160a01b031614806120345750836001600160a01b0316612029846108b6565b6001600160a01b0316145b8061206457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661207f82611413565b6001600160a01b0316146120e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107f9565b6001600160a01b0382166121495760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f9565b612154600082611f14565b816003828154811061217657634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b804710156122205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107f9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461226d576040519150601f19603f3d011682016040523d82523d6000602084013e612272565b606091505b5050905080610a4f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107f9565b604080516020808201835260008083528351918201909352828152825b85518110156123b2578286828151811061233057634e487b7160e01b600052603260045260246000fd5b6020026020010151600188516123469190613744565b8310612361576040518060200160405280600081525061237c565b604051806040016040528060018152602001600b60fa1b8152505b60405160200161238e939291906133db565b604051602081830303815290604052925080806123aa906137bc565b915050612306565b5060005b845181101561246257818582815181106123e057634e487b7160e01b600052603260045260246000fd5b6020026020010151600187516123f69190613744565b8310612411576040518060200160405280600081525061242c565b604051806040016040528060018152602001600b60fa1b8152505b60405160200161243e939291906133db565b6040516020818303038152906040529150808061245a906137bc565b9150506123b6565b5060006124dd33848460405160200161247d9392919061338d565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b6010549091506001600160a01b03166124f68289612717565b6001600160a01b031614979650505050505050565b60035460005b82811015611bb6576001600160a01b0384166000908152600f6020526040812080549161253d836137bc565b9190505550612568848380612551906137bc565b94506040518060200160405280600081525061273b565b80612572816137bc565b915050612511565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6125d584848461206c565b6125e18484848461276e565b611bb65760405162461bcd60e51b81526004016107f990613515565b6060816126215750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264b5780612635816137bc565b91506126449050600a83613711565b9150612625565b60008167ffffffffffffffff81111561267457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561269e576020820181803683370190505b5090505b8415612064576126b3600183613744565b91506126c0600a866137d7565b6126cb9060306136f9565b60f81b8183815181106126ee57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612710600a86613711565b94506126a2565b6000806000612726858561287b565b91509150612733816128eb565b509392505050565b6127458383612aec565b612752600084848461276e565b610a4f5760405162461bcd60e51b81526004016107f990613515565b60006001600160a01b0384163b1561287057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127b2903390899088908890600401613481565b602060405180830381600087803b1580156127cc57600080fd5b505af19250505080156127fc575060408051601f3d908101601f191682019092526127f9918101906131a6565b60015b612856573d80801561282a576040519150601f19603f3d011682016040523d82523d6000602084013e61282f565b606091505b50805161284e5760405162461bcd60e51b81526004016107f990613515565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612064565b506001949350505050565b6000808251604114156128b25760208301516040840151606085015160001a6128a687828585612c14565b945094505050506128e4565b8251604014156128dc57602083015160408401516128d1868383612d01565b9350935050506128e4565b506000905060025b9250929050565b600081600481111561290d57634e487b7160e01b600052602160045260246000fd5b14156129165750565b600181600481111561293857634e487b7160e01b600052602160045260246000fd5b14156129865760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107f9565b60028160048111156129a857634e487b7160e01b600052602160045260246000fd5b14156129f65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107f9565b6003816004811115612a1857634e487b7160e01b600052602160045260246000fd5b1415612a715760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107f9565b6004816004811115612a9357634e487b7160e01b600052602160045260246000fd5b1415610b4f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016107f9565b6001600160a01b038216612b425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107f9565b612b4b81611ebc565b15612b985760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f9565b6003805460018101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c4b5750600090506003612cf8565b8460ff16601b14158015612c6357508460ff16601c14155b15612c745750600090506004612cf8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cc8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612cf157600060019250925050612cf8565b9150600090505b94509492505050565b6000806001600160ff1b03831681612d1e60ff86901c601b6136f9565b9050612d2c87828885612c14565b935093505050935093915050565b828054612d4690613787565b90600052602060002090601f016020900481019282612d685760008555612dae565b82601f10612d8157805160ff1916838001178555612dae565b82800160010185558215612dae579182015b82811115612dae578251825591602001919060010190612d93565b50612dba929150612e32565b5090565b828054612dca90613787565b90600052602060002090601f016020900481019282612dec5760008555612dae565b82601f10612e055782800160ff19823516178555612dae565b82800160010185558215612dae579182015b82811115612dae578235825591602001919060010190612e17565b5b80821115612dba5760008155600101612e33565b80356001600160a01b0381168114612e5e57600080fd5b919050565b60008083601f840112612e74578182fd5b50813567ffffffffffffffff811115612e8b578182fd5b6020830191508360208260051b85010111156128e457600080fd5b600082601f830112612eb6578081fd5b8135602067ffffffffffffffff80831115612ed357612ed3613817565b8260051b612ee28382016136c8565b8481528381019087850183890186018a1015612efc578788fd5b8793505b86841015612f3957803585811115612f16578889fd5b612f248b88838d0101612f56565b84525060019390930192918501918501612f00565b5098975050505050505050565b80358015158114612e5e57600080fd5b600082601f830112612f66578081fd5b813567ffffffffffffffff811115612f8057612f80613817565b612f93601f8201601f19166020016136c8565b818152846020838601011115612fa7578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612fd2578081fd5b612fdb82612e47565b9392505050565b60008060408385031215612ff4578081fd5b612ffd83612e47565b915061300b60208401612e47565b90509250929050565b600080600060608486031215613028578081fd5b61303184612e47565b925061303f60208501612e47565b9150604084013590509250925092565b60008060008060808587031215613064578081fd5b61306d85612e47565b935061307b60208601612e47565b925060408501359150606085013567ffffffffffffffff81111561309d578182fd5b6130a987828801612f56565b91505092959194509250565b600080604083850312156130c7578182fd5b6130d083612e47565b915061300b60208401612f46565b600080604083850312156130f0578182fd5b6130f983612e47565b946020939093013593505050565b6000806000806040858703121561311c578384fd5b843567ffffffffffffffff80821115613133578586fd5b61313f88838901612e63565b90965094506020870135915080821115613157578384fd5b5061316487828801612e63565b95989497509550505050565b600060208284031215613181578081fd5b612fdb82612f46565b60006020828403121561319b578081fd5b8135612fdb8161382d565b6000602082840312156131b7578081fd5b8151612fdb8161382d565b600080602083850312156131d4578182fd5b823567ffffffffffffffff808211156131eb578384fd5b818501915085601f8301126131fe578384fd5b81358181111561320c578485fd5b86602082850101111561321d578485fd5b60209290920196919550909350505050565b600060208284031215613240578081fd5b5035919050565b6000806000806080858703121561325c578182fd5b84359350602085013567ffffffffffffffff8082111561327a578384fd5b61328688838901612f56565b9450604087013591508082111561329b578384fd5b6132a788838901612ea6565b935060608701359150808211156132bc578283fd5b506130a987828801612ea6565b600081518084526132e181602086016020860161375b565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061330f57607f831692505b602080841082141561332f57634e487b7160e01b86526022600452602486fd5b818015613343576001811461335457613381565b60ff19861689528489019650613381565b60008881526020902060005b868110156133795781548b820152908501908301613360565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198460601b168152600083516133b781601485016020880161375b565b8351908301906133ce81601484016020880161375b565b0160140195945050505050565b600084516133ed81846020890161375b565b84519083019061340181836020890161375b565b845191019061341481836020880161375b565b0195945050505050565b6000845161343081846020890161375b565b61343c818401866132f5565b9050835161341481836020880161375b565b600061345a82866132f5565b845161346a81836020890161375b565b613476818301866132f5565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b4908301846132c9565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134f6578351835292840192918401916001016134da565b50909695505050505050565b602081526000612fdb60208301846132c9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b60208082526031908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015270206f662033444d7574616e744d6665727360781b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f53616c65206d7573742062652061637469766520746f206d696e742033444d7560408201526874616e744d6665727360b81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156136f1576136f1613817565b604052919050565b6000821982111561370c5761370c6137eb565b500190565b60008261372057613720613801565b500490565b600081600019048311821515161561373f5761373f6137eb565b500290565b600082821015613756576137566137eb565b500390565b60005b8381101561377657818101518382015260200161375e565b83811115611bb65750506000910152565b600181811c9082168061379b57607f821691505b6020821081141561172a57634e487b7160e01b600052602260045260246000fd5b60006000198214156137d0576137d06137eb565b5060010190565b6000826137e6576137e6613801565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b4f57600080fdfea26469706673582212206bbe25da2d4b1dc1208116ad04d276f164faba09c0d5b40407865d8a9a8d1ae164736f6c63430008040033697066733a2f2f516d5654484563335443317762416d5773324732616555657264656841516e4256524c4d67784646654c6738626e2f

Deployed Bytecode

0x60806040526004361061023c5760003560e01c80636352211e1161012d578063a0382d58116100b0578063c87b56dd11610077578063c87b56dd14610694578063d75fc489146106b4578063dde3d313146106d4578063e268e4d3146106f4578063e985e9c514610714578063f2fde38b1461075d57005b8063a0382d581461060c578063a0712d6814610621578063a22cb46514610634578063acec338a14610654578063b88d4fde1461067457005b80638da5cb5b116100f45780638da5cb5b1461058357806391b7f5ed146105a157806395d89b41146105c157806396ea3a47146105d6578063a035b1fe146105f657005b80636352211e146104f95780636f8b44b01461051957806370a0823114610539578063715018a6146105595780638879570f1461056e57005b806322f3e2d4116101c057806342842e0e1161018757806342842e0e14610436578063438b6300146104565780634c08aba51461048357806355f804b3146104995780635687ee84146104b95780635b7633d0146104d957005b806322f3e2d4146103a657806323b872dd146103c05780632e1a7d4d146103e057806332cb6b0c1461040057806332cc33711461041657005b80630917803b116102045780630917803b14610318578063095ea7b31461032e5780630f2cdd6c1461034e57806318160ddd1461036457806318cae2691461037957005b80624510261461024557806301ffc9a71461026e578063046dc1661461029e57806306fdde03146102be578063081812fc146102e057005b3661024357005b005b34801561025157600080fd5b5061025b600a5481565b6040519081526020015b60405180910390f35b34801561027a57600080fd5b5061028e61028936600461318a565b61077d565b6040519015158152602001610265565b3480156102aa57600080fd5b506102436102b9366004612fc1565b6107cf565b3480156102ca57600080fd5b506102d3610824565b6040516102659190613502565b3480156102ec57600080fd5b506103006102fb36600461322f565b6108b6565b6040516001600160a01b039091168152602001610265565b34801561032457600080fd5b5061025b600e5481565b34801561033a57600080fd5b506102436103493660046130de565b61093e565b34801561035a57600080fd5b5061025b60075481565b34801561037057600080fd5b5060035461025b565b34801561038557600080fd5b5061025b610394366004612fc1565b600f6020526000908152604090205481565b3480156103b257600080fd5b5060095461028e9060ff1681565b3480156103cc57600080fd5b506102436103db366004613014565b610a54565b3480156103ec57600080fd5b506102436103fb36600461322f565b610a85565b34801561040c57600080fd5b5061025b60065481565b34801561042257600080fd5b50610243610431366004613247565b610b52565b34801561044257600080fd5b50610243610451366004613014565b61121a565b34801561046257600080fd5b50610476610471366004612fc1565b611235565b60405161026591906134be565b34801561048f57600080fd5b5061025b600c5481565b3480156104a557600080fd5b506102436104b43660046131c2565b611331565b3480156104c557600080fd5b506102d36104d436600461322f565b611367565b3480156104e557600080fd5b50601054610300906001600160a01b031681565b34801561050557600080fd5b5061030061051436600461322f565b611413565b34801561052557600080fd5b5061024361053436600461322f565b6114ad565b34801561054557600080fd5b5061025b610554366004612fc1565b61154e565b34801561056557600080fd5b5061024361162e565b34801561057a57600080fd5b506102d3611664565b34801561058f57600080fd5b506000546001600160a01b0316610300565b3480156105ad57600080fd5b506102436105bc36600461322f565b611730565b3480156105cd57600080fd5b506102d3611768565b3480156105e257600080fd5b506102436105f1366004613107565b611777565b34801561060257600080fd5b5061025b60085481565b34801561061857600080fd5b506102d361195a565b61024361062f36600461322f565b611a20565b34801561064057600080fd5b5061024361064f3660046130b5565b611bbc565b34801561066057600080fd5b5061024361066f366004613170565b611c81565b34801561068057600080fd5b5061024361068f36600461304f565b611cce565b3480156106a057600080fd5b506102d36106af36600461322f565b611d00565b3480156106c057600080fd5b506102d36106cf36600461322f565b611da4565b3480156106e057600080fd5b506102436106ef36600461322f565b611db4565b34801561070057600080fd5b5061024361070f36600461322f565b611dec565b34801561072057600080fd5b5061028e61072f366004612fe2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561076957600080fd5b50610243610778366004612fc1565b611e24565b60006001600160e01b031982166380ac58cd60e01b14806107ae57506001600160e01b03198216635b5e139f60e01b145b806107c957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108025760405162461bcd60e51b81526004016107f9906135f9565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60606001805461083390613787565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90613787565b80156108ac5780601f10610881576101008083540402835291602001916108ac565b820191906000526020600020905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b60006108c182611ebc565b6109225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b506000908152600460205260409020546001600160a01b031690565b600061094982611413565b9050806001600160a01b0316836001600160a01b031614156109b75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107f9565b336001600160a01b03821614806109d357506109d3813361072f565b610a455760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107f9565b610a4f8383611f14565b505050565b610a5e3382611f82565b610a7a5760405162461bcd60e51b81526004016107f990613677565b610a4f83838361206c565b6000546001600160a01b03163314610aaf5760405162461bcd60e51b81526004016107f9906135f9565b600081118015610ac0575060648111155b610b1f5760405162461bcd60e51b815260206004820152602a60248201527f57697468647261776c2070657263656e742073686f756c64206265203e2030206044820152690616e64203c3d203130360b41b60648201526084016107f9565b610b4f610b346000546001600160a01b031690565b6064610b408447613725565b610b4a9190613711565b6121d0565b50565b600954849060ff16610b765760405162461bcd60e51b81526004016107f99061362e565b600a54811115610b985760405162461bcd60e51b81526004016107f990613567565b60008111610be85760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e204d696e7420436f756e74206d757374206265203e20300000000060448201526064016107f9565b600354600654610bf883836136f9565b1115610c165760405162461bcd60e51b81526004016107f9906135a8565b336000908152600f6020526040902054600754610c3384836136f9565b1115610c815760405162461bcd60e51b815260206004820152601c60248201527f4d6178204e46542070657220616464726573732065786365656465640000000060448201526064016107f9565b610c8c8686866122e9565b610cc95760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642041636365737360901b60448201526064016107f9565b600085511180610cda575060008451115b610d185760405162461bcd60e51b815260206004820152600f60248201526e456d70747920546f6b656e2049447360881b60448201526064016107f9565b600084518651610d2891906136f9565b9050878114610d835760405162461bcd60e51b815260206004820152602160248201527f546f6b656e2049447320616e64204d696e7420436f756e74206d69736d6174636044820152600d60fb1b60648201526084016107f9565b600160005b818015610d955750875181105b15610ed75760005b828015610dab5750600c5481105b15610ec4576000600b8281548110610dd357634e487b7160e01b600052603260045260246000fd5b906000526020600020018054610de890613787565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1490613787565b8015610e615780601f10610e3657610100808354040283529160200191610e61565b820191906000526020600020905b815481529060010190602001808311610e4457829003601f168201915b5050505050905060008a8481518110610e8a57634e487b7160e01b600052603260045260246000fd5b60200260200101519050818051906020012081805190602001201415610eaf57600094505b50508080610ebc906137bc565b915050610d9d565b5080610ecf816137bc565b915050610d88565b5080610f405760405162461bcd60e51b815260206004820152603260248201527f436f736d6f2043726561747572657320546f6b656e20494420706173736564206044820152711a5cc8185b1c9958591e4818db185a5b595960721b60648201526084016107f9565b60005b818015610f505750865181105b156110925760005b828015610f665750600e5481105b1561107f576000600d8281548110610f8e57634e487b7160e01b600052603260045260246000fd5b906000526020600020018054610fa390613787565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcf90613787565b801561101c5780601f10610ff15761010080835404028352916020019161101c565b820191906000526020600020905b815481529060010190602001808311610fff57829003601f168201915b50505050509050600089848151811061104557634e487b7160e01b600052603260045260246000fd5b6020026020010151905081805190602001208180519060200120141561106a57600094505b50508080611077906137bc565b915050610f58565b508061108a816137bc565b915050610f43565b50806110f35760405162461bcd60e51b815260206004820152602a60248201527f3344204d66727320546f6b656e2049442070617373656420697320616c726561604482015269191e4818db185a5b595960b21b60648201526084016107f9565b60005b875181101561117b57600c805490600061110f836137bc565b9190505550600b88828151811061113657634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529282902081516111689491909101929190910190612d3a565b5080611173816137bc565b9150506110f6565b5060005b865181101561120457600e8054906000611198836137bc565b9190505550600d8782815181106111bf57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529282902081516111f19491909101929190910190612d3a565b50806111fc816137bc565b91505061117f565b5061120f338a61250b565b505050505050505050565b610a4f83838360405180602001604052806000815250611cce565b606060006112428361154e565b905060008167ffffffffffffffff81111561126d57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611296578160200160208202803683370190505b5090506000805b83811080156112ae57506006548211155b156113275760006112be83611413565b9050866001600160a01b0316816001600160a01b0316141561131457828483815181106112fb57634e487b7160e01b600052603260045260246000fd5b602090810291909101015281611310816137bc565b9250505b8261131e816137bc565b9350505061129d565b5090949350505050565b6000546001600160a01b0316331461135b5760405162461bcd60e51b81526004016107f9906135f9565b610a4f60118383612dbe565b600b818154811061137757600080fd5b90600052602060002001600091509050805461139290613787565b80601f01602080910402602001604051908101604052809291908181526020018280546113be90613787565b801561140b5780601f106113e05761010080835404028352916020019161140b565b820191906000526020600020905b8154815290600101906020018083116113ee57829003601f168201915b505050505081565b6000806003838154811061143757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03169050806107c95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107f9565b6000546001600160a01b031633146114d75760405162461bcd60e51b81526004016107f9906135f9565b8060065414610b4f576003548110156115495760405162461bcd60e51b815260206004820152602e60248201527f53706563696669656420737570706c79206973206c6f776572207468616e206360448201526d757272656e742062616c616e636560901b60648201526084016107f9565b600655565b60006001600160a01b0382166115b95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107f9565b600354600090815b8181101561162557600381815481106115ea57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b038681169116141561161557611612836137bc565b92505b61161e816137bc565b90506115c1565b50909392505050565b6000546001600160a01b031633146116585760405162461bcd60e51b81526004016107f9906135f9565b611662600061257a565b565b60408051602081019091526000808252606091905b600e5481101561172a5781600d82815481106116a557634e487b7160e01b600052603260045260246000fd5b906000526020600020016001600e546116be9190613744565b83106116d957604051806020016040528060008152506116f4565b604051806040016040528060018152602001600b60fa1b8152505b6040516020016117069392919061341e565b60405160208183030381529060405291508080611722906137bc565b915050611679565b50919050565b6000546001600160a01b0316331461175a5760405162461bcd60e51b81526004016107f9906135f9565b8060085414610b4f57600855565b60606002805461083390613787565b6000546001600160a01b031633146117a15760405162461bcd60e51b81526004016107f9906135f9565b8281146118025760405162461bcd60e51b815260206004820152602960248201527f4d7573742070726f7669646520657175616c207175616e7469747920616e64206044820152681c9958da5c1a595b9d60ba1b60648201526084016107f9565b600354600090815b858110156118565786868281811061183257634e487b7160e01b600052603260045260246000fd5b905060200201358361184491906136f9565b925061184f816137bc565b905061180a565b5060065461186483836136f9565b11156118ce5760405162461bcd60e51b815260206004820152603360248201527f4d696e742f6f7264657220776f756c6420657863656564206d617820737570706044820152726c79206f662033444d7574616e744d6665727360681b60648201526084016107f9565b6000915060005b838110156119515761194185858381811061190057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906119159190612fc1565b88888481811061193557634e487b7160e01b600052603260045260246000fd5b9050602002013561250b565b61194a816137bc565b90506118d5565b50505050505050565b60408051602081019091526000808252606091905b600c5481101561172a5781600b828154811061199b57634e487b7160e01b600052603260045260246000fd5b906000526020600020016001600c546119b49190613744565b83106119cf57604051806020016040528060008152506119ea565b604051806040016040528060018152602001600b60fa1b8152505b6040516020016119fc9392919061341e565b60405160208183030381529060405291508080611a18906137bc565b91505061196f565b600954819060ff16611a445760405162461bcd60e51b81526004016107f99061362e565b600a54811115611a665760405162461bcd60e51b81526004016107f990613567565b60008111611ab65760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e204d696e7420436f756e74206d757374206265203e20300000000060448201526064016107f9565b600354600654611ac683836136f9565b1115611ae45760405162461bcd60e51b81526004016107f9906135a8565b336000908152600f6020526040902054600754611b0184836136f9565b1115611b4f5760405162461bcd60e51b815260206004820152601c60248201527f4d6178204e46542070657220616464726573732065786365656465640000000060448201526064016107f9565b83600854611b5d9190613725565b341015611bac5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016107f9565b611bb6338561250b565b50505050565b6001600160a01b038216331415611c155760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107f9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611cab5760405162461bcd60e51b81526004016107f9906135f9565b60095460ff16151581151514610b4f576009805482151560ff1990911617905550565b611cd83383611f82565b611cf45760405162461bcd60e51b81526004016107f990613677565b611bb6848484846125ca565b6060611d0b82611ebc565b611d6f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107f9565b6011611d7a836125fd565b6012604051602001611d8e9392919061344e565b6040516020818303038152906040529050919050565b600d818154811061137757600080fd5b6000546001600160a01b03163314611dde5760405162461bcd60e51b81526004016107f9906135f9565b80600a5414610b4f57600a55565b6000546001600160a01b03163314611e165760405162461bcd60e51b81526004016107f9906135f9565b8060075414610b4f57600755565b6000546001600160a01b03163314611e4e5760405162461bcd60e51b81526004016107f9906135f9565b6001600160a01b038116611eb35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f9565b610b4f8161257a565b600354600090821080156107c9575060006001600160a01b031660038381548110611ef757634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f4982611413565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8d82611ebc565b611fee5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107f9565b6000611ff983611413565b9050806001600160a01b0316846001600160a01b031614806120345750836001600160a01b0316612029846108b6565b6001600160a01b0316145b8061206457506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661207f82611413565b6001600160a01b0316146120e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107f9565b6001600160a01b0382166121495760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107f9565b612154600082611f14565b816003828154811061217657634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b804710156122205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107f9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461226d576040519150601f19603f3d011682016040523d82523d6000602084013e612272565b606091505b5050905080610a4f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107f9565b604080516020808201835260008083528351918201909352828152825b85518110156123b2578286828151811061233057634e487b7160e01b600052603260045260246000fd5b6020026020010151600188516123469190613744565b8310612361576040518060200160405280600081525061237c565b604051806040016040528060018152602001600b60fa1b8152505b60405160200161238e939291906133db565b604051602081830303815290604052925080806123aa906137bc565b915050612306565b5060005b845181101561246257818582815181106123e057634e487b7160e01b600052603260045260246000fd5b6020026020010151600187516123f69190613744565b8310612411576040518060200160405280600081525061242c565b604051806040016040528060018152602001600b60fa1b8152505b60405160200161243e939291906133db565b6040516020818303038152906040529150808061245a906137bc565b9150506123b6565b5060006124dd33848460405160200161247d9392919061338d565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b6010549091506001600160a01b03166124f68289612717565b6001600160a01b031614979650505050505050565b60035460005b82811015611bb6576001600160a01b0384166000908152600f6020526040812080549161253d836137bc565b9190505550612568848380612551906137bc565b94506040518060200160405280600081525061273b565b80612572816137bc565b915050612511565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6125d584848461206c565b6125e18484848461276e565b611bb65760405162461bcd60e51b81526004016107f990613515565b6060816126215750506040805180820190915260018152600360fc1b602082015290565b8160005b811561264b5780612635816137bc565b91506126449050600a83613711565b9150612625565b60008167ffffffffffffffff81111561267457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561269e576020820181803683370190505b5090505b8415612064576126b3600183613744565b91506126c0600a866137d7565b6126cb9060306136f9565b60f81b8183815181106126ee57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612710600a86613711565b94506126a2565b6000806000612726858561287b565b91509150612733816128eb565b509392505050565b6127458383612aec565b612752600084848461276e565b610a4f5760405162461bcd60e51b81526004016107f990613515565b60006001600160a01b0384163b1561287057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906127b2903390899088908890600401613481565b602060405180830381600087803b1580156127cc57600080fd5b505af19250505080156127fc575060408051601f3d908101601f191682019092526127f9918101906131a6565b60015b612856573d80801561282a576040519150601f19603f3d011682016040523d82523d6000602084013e61282f565b606091505b50805161284e5760405162461bcd60e51b81526004016107f990613515565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612064565b506001949350505050565b6000808251604114156128b25760208301516040840151606085015160001a6128a687828585612c14565b945094505050506128e4565b8251604014156128dc57602083015160408401516128d1868383612d01565b9350935050506128e4565b506000905060025b9250929050565b600081600481111561290d57634e487b7160e01b600052602160045260246000fd5b14156129165750565b600181600481111561293857634e487b7160e01b600052602160045260246000fd5b14156129865760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107f9565b60028160048111156129a857634e487b7160e01b600052602160045260246000fd5b14156129f65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107f9565b6003816004811115612a1857634e487b7160e01b600052602160045260246000fd5b1415612a715760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107f9565b6004816004811115612a9357634e487b7160e01b600052602160045260246000fd5b1415610b4f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016107f9565b6001600160a01b038216612b425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107f9565b612b4b81611ebc565b15612b985760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107f9565b6003805460018101825560009182527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c4b5750600090506003612cf8565b8460ff16601b14158015612c6357508460ff16601c14155b15612c745750600090506004612cf8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cc8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612cf157600060019250925050612cf8565b9150600090505b94509492505050565b6000806001600160ff1b03831681612d1e60ff86901c601b6136f9565b9050612d2c87828885612c14565b935093505050935093915050565b828054612d4690613787565b90600052602060002090601f016020900481019282612d685760008555612dae565b82601f10612d8157805160ff1916838001178555612dae565b82800160010185558215612dae579182015b82811115612dae578251825591602001919060010190612d93565b50612dba929150612e32565b5090565b828054612dca90613787565b90600052602060002090601f016020900481019282612dec5760008555612dae565b82601f10612e055782800160ff19823516178555612dae565b82800160010185558215612dae579182015b82811115612dae578235825591602001919060010190612e17565b5b80821115612dba5760008155600101612e33565b80356001600160a01b0381168114612e5e57600080fd5b919050565b60008083601f840112612e74578182fd5b50813567ffffffffffffffff811115612e8b578182fd5b6020830191508360208260051b85010111156128e457600080fd5b600082601f830112612eb6578081fd5b8135602067ffffffffffffffff80831115612ed357612ed3613817565b8260051b612ee28382016136c8565b8481528381019087850183890186018a1015612efc578788fd5b8793505b86841015612f3957803585811115612f16578889fd5b612f248b88838d0101612f56565b84525060019390930192918501918501612f00565b5098975050505050505050565b80358015158114612e5e57600080fd5b600082601f830112612f66578081fd5b813567ffffffffffffffff811115612f8057612f80613817565b612f93601f8201601f19166020016136c8565b818152846020838601011115612fa7578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612fd2578081fd5b612fdb82612e47565b9392505050565b60008060408385031215612ff4578081fd5b612ffd83612e47565b915061300b60208401612e47565b90509250929050565b600080600060608486031215613028578081fd5b61303184612e47565b925061303f60208501612e47565b9150604084013590509250925092565b60008060008060808587031215613064578081fd5b61306d85612e47565b935061307b60208601612e47565b925060408501359150606085013567ffffffffffffffff81111561309d578182fd5b6130a987828801612f56565b91505092959194509250565b600080604083850312156130c7578182fd5b6130d083612e47565b915061300b60208401612f46565b600080604083850312156130f0578182fd5b6130f983612e47565b946020939093013593505050565b6000806000806040858703121561311c578384fd5b843567ffffffffffffffff80821115613133578586fd5b61313f88838901612e63565b90965094506020870135915080821115613157578384fd5b5061316487828801612e63565b95989497509550505050565b600060208284031215613181578081fd5b612fdb82612f46565b60006020828403121561319b578081fd5b8135612fdb8161382d565b6000602082840312156131b7578081fd5b8151612fdb8161382d565b600080602083850312156131d4578182fd5b823567ffffffffffffffff808211156131eb578384fd5b818501915085601f8301126131fe578384fd5b81358181111561320c578485fd5b86602082850101111561321d578485fd5b60209290920196919550909350505050565b600060208284031215613240578081fd5b5035919050565b6000806000806080858703121561325c578182fd5b84359350602085013567ffffffffffffffff8082111561327a578384fd5b61328688838901612f56565b9450604087013591508082111561329b578384fd5b6132a788838901612ea6565b935060608701359150808211156132bc578283fd5b506130a987828801612ea6565b600081518084526132e181602086016020860161375b565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061330f57607f831692505b602080841082141561332f57634e487b7160e01b86526022600452602486fd5b818015613343576001811461335457613381565b60ff19861689528489019650613381565b60008881526020902060005b868110156133795781548b820152908501908301613360565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198460601b168152600083516133b781601485016020880161375b565b8351908301906133ce81601484016020880161375b565b0160140195945050505050565b600084516133ed81846020890161375b565b84519083019061340181836020890161375b565b845191019061341481836020880161375b565b0195945050505050565b6000845161343081846020890161375b565b61343c818401866132f5565b9050835161341481836020880161375b565b600061345a82866132f5565b845161346a81836020890161375b565b613476818301866132f5565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134b4908301846132c9565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134f6578351835292840192918401916001016134da565b50909695505050505050565b602081526000612fdb60208301846132c9565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6040820152606560f81b606082015260800190565b60208082526031908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015270206f662033444d7574616e744d6665727360781b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f53616c65206d7573742062652061637469766520746f206d696e742033444d7560408201526874616e744d6665727360b81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156136f1576136f1613817565b604052919050565b6000821982111561370c5761370c6137eb565b500190565b60008261372057613720613801565b500490565b600081600019048311821515161561373f5761373f6137eb565b500290565b600082821015613756576137566137eb565b500390565b60005b8381101561377657818101518382015260200161375e565b83811115611bb65750506000910152565b600181811c9082168061379b57607f821691505b6020821081141561172a57634e487b7160e01b600052602260045260246000fd5b60006000198214156137d0576137d06137eb565b5060010190565b6000826137e6576137e6613801565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b4f57600080fdfea26469706673582212206bbe25da2d4b1dc1208116ad04d276f164faba09c0d5b40407865d8a9a8d1ae164736f6c63430008040033

Deployed Bytecode Sourcemap

44961:9109:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45198:31;;;;;;;;;;;;;;;;;;;28772:25:1;;;28760:2;28745:18;45198:31:0;;;;;;;;33253:305;;;;;;;;;;-1:-1:-1;33253:305:0;;;;;:::i;:::-;;:::i;:::-;;;13060:14:1;;13053:22;13035:41;;13023:2;13008:18;33253:305:0;12990:92:1;53313:118:0;;;;;;;;;;-1:-1:-1;53313:118:0;;;;;:::i;:::-;;:::i;34408:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35221:221::-;;;;;;;;;;-1:-1:-1;35221:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11718:32:1;;;11700:51;;11688:2;11673:18;35221:221:0;11655:102:1;45417:43:0;;;;;;;;;;;;;;;;34743:412;;;;;;;;;;-1:-1:-1;34743:412:0;;;;;:::i;:::-;;:::i;45074:33::-;;;;;;;;;;;;;;;;45869:113;;;;;;;;;;-1:-1:-1;45942:7:0;:14;45869:113;;45505:52;;;;;;;;;;-1:-1:-1;45505:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;45159:34;;;;;;;;;;-1:-1:-1;45159:34:0;;;;;;;;36113:339;;;;;;;;;;-1:-1:-1;36113:339:0;;;;;:::i;:::-;;:::i;53437:346::-;;;;;;;;;;-1:-1:-1;53437:346:0;;;;;:::i;:::-;;:::i;45036:33::-;;;;;;;;;;;;;;;;48600:2248;;;;;;;;;;-1:-1:-1;48600:2248:0;;;;;:::i;:::-;;:::i;36523:185::-;;;;;;;;;;-1:-1:-1;36523:185:0;;;;;:::i;:::-;;:::i;51736:618::-;;;;;;;;;;-1:-1:-1;51736:618:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45324:43::-;;;;;;;;;;;;;;;;52731:108;;;;;;;;;;-1:-1:-1;52731:108:0;;;;;:::i;:::-;;:::i;45281:38::-;;;;;;;;;;-1:-1:-1;45281:38:0;;;;;:::i;:::-;;:::i;45602:28::-;;;;;;;;;;-1:-1:-1;45602:28:0;;;;-1:-1:-1;;;;;45602:28:0;;;34102:239;;;;;;;;;;-1:-1:-1;34102:239:0;;;;;:::i;:::-;;:::i;52860:238::-;;;;;;;;;;-1:-1:-1;52860:238:0;;;;;:::i;:::-;;:::i;33622:418::-;;;;;;;;;;-1:-1:-1;33622:418:0;;;;;:::i;:::-;;:::i;14297:103::-;;;;;;;;;;;;;:::i;46362:368::-;;;;;;;;;;;;;:::i;13646:87::-;;;;;;;;;;-1:-1:-1;13692:7:0;13719:6;-1:-1:-1;;;;;13719:6:0;13646:87;;52618:107;;;;;;;;;;-1:-1:-1;52618:107:0;;;;;:::i;:::-;;:::i;34577:104::-;;;;;;;;;;;;;:::i;51138:592::-;;;;;;;;;;-1:-1:-1;51138:592:0;;;;;:::i;:::-;;:::i;45114:40::-;;;;;;;;;;;;;;;;45988:368;;;;;;;;;;;;;:::i;47474:233::-;;;;;;:::i;:::-;;:::i;35514:295::-;;;;;;;;;;-1:-1:-1;35514:295:0;;;;;:::i;:::-;;:::i;52360:122::-;;;;;;;;;;-1:-1:-1;52360:122:0;;;;;:::i;:::-;;:::i;36779:328::-;;;;;;;;;;-1:-1:-1;36779:328:0;;;;;:::i;:::-;;:::i;53801:266::-;;;;;;;;;;-1:-1:-1;53801:266:0;;;;;:::i;:::-;;:::i;45374:38::-;;;;;;;;;;-1:-1:-1;45374:38:0;;;;;:::i;:::-;;:::i;52488:124::-;;;;;;;;;;-1:-1:-1;52488:124:0;;;;;:::i;:::-;;:::i;53146:161::-;;;;;;;;;;-1:-1:-1;53146:161:0;;;;;:::i;:::-;;:::i;35880:164::-;;;;;;;;;;-1:-1:-1;35880:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;36001:25:0;;;35977:4;36001:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35880:164;14555:201;;;;;;;;;;-1:-1:-1;14555:201:0;;;;;:::i;:::-;;:::i;33253:305::-;33355:4;-1:-1:-1;;;;;;33392:40:0;;-1:-1:-1;;;33392:40:0;;:105;;-1:-1:-1;;;;;;;33449:48:0;;-1:-1:-1;;;33449:48:0;33392:105;:158;;;-1:-1:-1;;;;;;;;;;26539:40:0;;;33514:36;33372:178;33253:305;-1:-1:-1;;33253:305:0:o;53313:118::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;;;;;;;;;53392:13:::1;:33:::0;;-1:-1:-1;;;;;;53392:33:0::1;-1:-1:-1::0;;;;;53392:33:0;;;::::1;::::0;;;::::1;::::0;;53313:118::o;34408:100::-;34462:13;34495:5;34488:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34408:100;:::o;35221:221::-;35297:7;35325:16;35333:7;35325;:16::i;:::-;35317:73;;;;-1:-1:-1;;;35317:73:0;;24455:2:1;35317:73:0;;;24437:21:1;24494:2;24474:18;;;24467:30;24533:34;24513:18;;;24506:62;-1:-1:-1;;;24584:18:1;;;24577:42;24636:19;;35317:73:0;24427:234:1;35317:73:0;-1:-1:-1;35410:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35410:24:0;;35221:221::o;34743:412::-;34824:13;34840:24;34856:7;34840:15;:24::i;:::-;34824:40;;34889:5;-1:-1:-1;;;;;34883:11:0;:2;-1:-1:-1;;;;;34883:11:0;;;34875:57;;;;-1:-1:-1;;;34875:57:0;;27187:2:1;34875:57:0;;;27169:21:1;27226:2;27206:18;;;27199:30;27265:34;27245:18;;;27238:62;-1:-1:-1;;;27316:18:1;;;27309:31;27357:19;;34875:57:0;27159:223:1;34875:57:0;12450:10;-1:-1:-1;;;;;34967:21:0;;;;:62;;-1:-1:-1;34992:37:0;35009:5;12450:10;35880:164;:::i;34992:37::-;34945:168;;;;-1:-1:-1;;;34945:168:0;;22025:2:1;34945:168:0;;;22007:21:1;22064:2;22044:18;;;22037:30;22103:34;22083:18;;;22076:62;22174:26;22154:18;;;22147:54;22218:19;;34945:168:0;21997:246:1;34945:168:0;35126:21;35135:2;35139:7;35126:8;:21::i;:::-;34743:412;;;:::o;36113:339::-;36308:41;12450:10;36341:7;36308:18;:41::i;:::-;36300:103;;;;-1:-1:-1;;;36300:103:0;;;;;;;:::i;:::-;36416:28;36426:4;36432:2;36436:7;36416:9;:28::i;53437:346::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;53604:1:::1;53584:17;:21;:49;;;;;53630:3;53609:17;:24;;53584:49;53576:104;;;::::0;-1:-1:-1;;;53576:104:0;;28417:2:1;53576:104:0::1;::::0;::::1;28399:21:1::0;28456:2;28436:18;;;28429:30;28495:34;28475:18;;;28468:62;-1:-1:-1;;;28546:18:1;;;28539:40;28596:19;;53576:104:0::1;28389:232:1::0;53576:104:0::1;53691:86;53717:7;13692::::0;13719:6;-1:-1:-1;;;;;13719:6:0;;13646:87;53717:7:::1;53773:3;53728:41;53752:17:::0;53728:21:::1;:41;:::i;:::-;53727:49;;;;:::i;:::-;53691:17;:86::i;:::-;53437:346:::0;:::o;48600:2248::-;46886:8;;48765:14;;46886:8;;46877:91;;;;-1:-1:-1;;;46877:91:0;;;;;;;:::i;:::-;47002:8;;46984:14;:26;;46975:83;;;;-1:-1:-1;;;46975:83:0;;;;;;;:::i;:::-;47091:1;47074:14;:18;47065:78;;;;-1:-1:-1;;;47065:78:0;;26473:2:1;47065:78:0;;;26455:21:1;26512:2;26492:18;;;26485:30;26551;26531:18;;;26524:58;26599:18;;47065:78:0;26445:178:1;47065:78:0;47169:7;:14;47226:10;;47199:23;47208:14;47169;47199:23;:::i;:::-;:37;;47190:101;;;;-1:-1:-1;;;47190:101:0;;;;;;;:::i;:::-;47347:10;47304:19;47326:32;;;:20;:32;;;;;;47405:14;;47373:28;47387:14;47326:32;47373:28;:::i;:::-;:46;;47365:87;;;;-1:-1:-1;;;47365:87:0;;26830:2:1;47365:87:0;;;26812:21:1;26869:2;26849:18;;;26842:30;26908;26888:18;;;26881:58;26956:18;;47365:87:0;26802:178:1;47365:87:0;48803:61:::1;48816:9;48827:17;48846;48803:12;:61::i;:::-;48795:88;;;::::0;-1:-1:-1;;;48795:88:0;;14671:2:1;48795:88:0::1;::::0;::::1;14653:21:1::0;14710:2;14690:18;;;14683:30;-1:-1:-1;;;14729:18:1;;;14722:44;14783:18;;48795:88:0::1;14643:164:1::0;48795:88:0::1;48974:1;48947:17;:24;:28;:60;;;;49006:1;48979:17;:24;:28;48947:60;48939:88;;;::::0;-1:-1:-1;;;48939:88:0;;17315:2:1;48939:88:0::1;::::0;::::1;17297:21:1::0;17354:2;17334:18;;;17327:30;-1:-1:-1;;;17373:18:1;;;17366:45;17428:18;;48939:88:0::1;17287:165:1::0;48939:88:0::1;49036:18;49084:17;:24;49057:17;:24;:51;;;;:::i;:::-;49036:72;;49140:14;49123:13;:31;49115:77;;;::::0;-1:-1:-1;;;49115:77:0;;14269:2:1;49115:77:0::1;::::0;::::1;14251:21:1::0;14308:2;14288:18;;;14281:30;14347:34;14327:18;;;14320:62;-1:-1:-1;;;14398:18:1;;;14391:31;14439:19;;49115:77:0::1;14241:223:1::0;49115:77:0::1;49308:4;49285:20;49319:443;49336:15;:47;;;;;49359:17;:24;49355:1;:28;49336:47;49319:443;;;49404:6;49399:355;49416:15;:50;;;;;49439:27;;49435:1;:31;49416:50;49399:355;;;49484:34;49521:22;49544:1;49521:25;;;;;;-1:-1:-1::0;;;49521:25:0::1;;;;;;;;;;;;;;;;49484:62;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49557:26;49586:17;49604:1;49586:20;;;;;;-1:-1:-1::0;;;49586:20:0::1;;;;;;;;;;;;;;;49557:49;;49673:20;49657:38;;;;;;49639:12;49623:30;;;;;;:72;49619:126;;;49728:5;49710:23;;49619:126;49399:355;;49468:3;;;;;:::i;:::-;;;;49399:355;;;-1:-1:-1::0;49385:3:0;::::1;::::0;::::1;:::i;:::-;;;;49319:443;;;;49777:15;49769:78;;;::::0;-1:-1:-1;;;49769:78:0;;18484:2:1;49769:78:0::1;::::0;::::1;18466:21:1::0;18523:2;18503:18;;;18496:30;18562:34;18542:18;;;18535:62;-1:-1:-1;;;18613:18:1;;;18606:48;18671:19;;49769:78:0::1;18456:240:1::0;49769:78:0::1;49945:6;49940:443;49957:15;:47;;;;;49980:17;:24;49976:1;:28;49957:47;49940:443;;;50025:6;50020:355;50037:15;:50;;;;;50060:27;;50056:1;:31;50037:50;50020:355;;;50105:34;50142:22;50165:1;50142:25;;;;;;-1:-1:-1::0;;;50142:25:0::1;;;;;;;;;;;;;;;;50105:62;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50178:26;50207:17;50225:1;50207:20;;;;;;-1:-1:-1::0;;;50207:20:0::1;;;;;;;;;;;;;;;50178:49;;50294:20;50278:38;;;;;;50260:12;50244:30;;;;;;:72;50240:126;;;50349:5;50331:23;;50240:126;50020:355;;50089:3;;;;;:::i;:::-;;;;50020:355;;;-1:-1:-1::0;50006:3:0;::::1;::::0;::::1;:::i;:::-;;;;49940:443;;;;50398:15;50390:70;;;::::0;-1:-1:-1;;;50390:70:0;;16904:2:1;50390:70:0::1;::::0;::::1;16886:21:1::0;16943:2;16923:18;;;16916:30;16982:34;16962:18;;;16955:62;-1:-1:-1;;;17033:18:1;;;17026:40;17083:19;;50390:70:0::1;16876:232:1::0;50390:70:0::1;50476:6;50471:156;50492:17;:24;50488:1;:28;50471:156;;;50532:27;:29:::0;;;:27:::1;:29;::::0;::::1;:::i;:::-;;;;;;50570:22;50598:17;50616:1;50598:20;;;;;;-1:-1:-1::0;;;50598:20:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;50570:49;;::::1;::::0;::::1;::::0;;-1:-1:-1;50570:49:0;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;50518:3:0;::::1;::::0;::::1;:::i;:::-;;;;50471:156;;;;50644:6;50639:156;50660:17;:24;50656:1;:28;50639:156;;;50700:27;:29:::0;;;:27:::1;:29;::::0;::::1;:::i;:::-;;;;;;50738:22;50766:17;50784:1;50766:20;;;;;;-1:-1:-1::0;;;50766:20:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;50738:49;;::::1;::::0;::::1;::::0;;-1:-1:-1;50738:49:0;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;50686:3:0;::::1;::::0;::::1;:::i;:::-;;;;50639:156;;;;50803:39;50814:10;50826:14;50803:9;:39::i;:::-;47461:1;;48600:2248:::0;;;;;;;:::o;36523:185::-;36661:39;36678:4;36684:2;36688:7;36661:39;;;;;;;;;;;;:16;:39::i;51736:618::-;51798:16;51823:23;51849:17;51859:6;51849:9;:17::i;:::-;51823:43;;51873:30;51920:15;51906:30;;;;;;-1:-1:-1;;;51906:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51906:30:0;;51873:63;;51943:22;51976:23;52012:308;52037:15;52019;:33;:65;;;;;52074:10;;52056:14;:28;;52019:65;52012:308;;;52095:25;52123:23;52131:14;52123:7;:23::i;:::-;52095:51;;52182:6;-1:-1:-1;;;;;52161:27:0;:17;-1:-1:-1;;;;;52161:27:0;;52157:129;;;52234:14;52201:13;52215:15;52201:30;;;;;;-1:-1:-1;;;52201:30:0;;;;;;;;;;;;;;;;;;:47;52259:17;;;;:::i;:::-;;;;52157:129;52296:16;;;;:::i;:::-;;;;52012:308;;;;-1:-1:-1;52335:13:0;;51736:618;-1:-1:-1;;;;51736:618:0:o;52731:108::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;52806:27:::1;:13;52822:11:::0;;52806:27:::1;:::i;45281:38::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34102:239::-;34174:7;34194:13;34210:7;34218;34210:16;;;;;;-1:-1:-1;;;34210:16:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34210:16:0;;-1:-1:-1;34245:19:0;34237:73;;;;-1:-1:-1;;;34237:73:0;;23281:2:1;34237:73:0;;;23263:21:1;23320:2;23300:18;;;23293:30;23359:34;23339:18;;;23332:62;-1:-1:-1;;;23410:18:1;;;23403:39;23459:19;;34237:73:0;23253:231:1;52860:238:0;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;52944:10:::1;52930;;:24;52926:167;;52987:7;:14:::0;52973:28;::::1;;52965:88;;;::::0;-1:-1:-1;;;52965:88:0;;18069:2:1;52965:88:0::1;::::0;::::1;18051:21:1::0;18108:2;18088:18;;;18081:30;18147:34;18127:18;;;18120:62;-1:-1:-1;;;18198:18:1;;;18191:44;18252:19;;52965:88:0::1;18041:236:1::0;52965:88:0::1;53062:10;:23:::0;52860:238::o;33622:418::-;33694:7;-1:-1:-1;;;;;33722:19:0;;33714:74;;;;-1:-1:-1;;;33714:74:0;;22870:2:1;33714:74:0;;;22852:21:1;22909:2;22889:18;;;22882:30;22948:34;22928:18;;;22921:62;-1:-1:-1;;;22999:18:1;;;22992:40;23049:19;;33714:74:0;22842:232:1;33714:74:0;33840:7;:14;33801:10;;;33865:119;33886:6;33882:1;:10;33865:119;;;33925:7;33933:1;33925:10;;;;;;-1:-1:-1;;;33925:10:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33916:19:0;;;33925:10;;33916:19;33912:61;;;33952:7;;;:::i;:::-;;;33912:61;33894:3;;;:::i;:::-;;;33865:119;;;-1:-1:-1;34027:5:0;;33622:418;-1:-1:-1;;;33622:418:0:o;14297:103::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;14362:30:::1;14389:1;14362:18;:30::i;:::-;14297:103::o:0;46362:368::-;46452:32;;;;;;;;;:27;:32;;;46430:13;;46452:32;46491:201;46511:27;;46507:1;:31;46491:201;;;46594:13;46609:22;46632:1;46609:25;;;;;;-1:-1:-1;;;46609:25:0;;;;;;;;;;;;;;;;46670:1;46640:27;;:31;;;;:::i;:::-;46636:1;:35;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46636:46:0;;;;46577:106;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46554:130;;46540:3;;;;;:::i;:::-;;;;46491:201;;;-1:-1:-1;46711:13:0;46362:368;-1:-1:-1;46362:368:0:o;52618:107::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;52689:6:::1;52680:5;;:15;52676:43;;52705:5;:14:::0;52618:107::o;34577:104::-;34633:13;34666:7;34659:14;;;;;:::i;51138:592::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;51242:35;;::::1;51234:90;;;::::0;-1:-1:-1;;;51234:90:0;;17659:2:1;51234:90:0::1;::::0;::::1;17641:21:1::0;17698:2;17678:18;;;17671:30;17737:34;17717:18;;;17710:62;-1:-1:-1;;;17788:18:1;;;17781:39;17837:19;;51234:90:0::1;17631:231:1::0;51234:90:0::1;51379:7;:14:::0;51333:18:::1;::::0;;51400:86:::1;51416:19:::0;;::::1;51400:86;;;51467:8;;51476:1;51467:11;;;;;-1:-1:-1::0;;;51467:11:0::1;;;;;;;;;;;;;;;51450:28;;;;;:::i;:::-;::::0;-1:-1:-1;51437:3:0::1;::::0;::::1;:::i;:::-;;;51400:86;;;-1:-1:-1::0;51527:10:0::1;::::0;51501:22:::1;51510:13:::0;51501:6;:22:::1;:::i;:::-;:36;;51492:102;;;::::0;-1:-1:-1;;;51492:102:0;;22450:2:1;51492:102:0::1;::::0;::::1;22432:21:1::0;22489:2;22469:18;;;22462:30;22528:34;22508:18;;;22501:62;-1:-1:-1;;;22579:18:1;;;22572:49;22638:19;;51492:102:0::1;22422:241:1::0;51492:102:0::1;51601:20;;;51634:6;51630:95;51646:20:::0;;::::1;51630:95;;;51681:36;51691:9;;51701:1;51691:12;;;;;-1:-1:-1::0;;;51691:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51705:8;;51714:1;51705:11;;;;;-1:-1:-1::0;;;51705:11:0::1;;;;;;;;;;;;;;;51681:9;:36::i;:::-;51668:3;::::0;::::1;:::i;:::-;;;51630:95;;;;13937:1;;51138:592:::0;;;;:::o;45988:368::-;46078:32;;;;;;;;;:27;:32;;;46056:13;;46078:32;46117:201;46137:27;;46133:1;:31;46117:201;;;46220:13;46235:22;46258:1;46235:25;;;;;;-1:-1:-1;;;46235:25:0;;;;;;;;;;;;;;;;46296:1;46266:27;;:31;;;;:::i;:::-;46262:1;:35;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46262:46:0;;;;46203:106;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46180:130;;46166:3;;;;;:::i;:::-;;;;46117:201;;47474:233;46886:8;;47544:14;;46886:8;;46877:91;;;;-1:-1:-1;;;46877:91:0;;;;;;;:::i;:::-;47002:8;;46984:14;:26;;46975:83;;;;-1:-1:-1;;;46975:83:0;;;;;;;:::i;:::-;47091:1;47074:14;:18;47065:78;;;;-1:-1:-1;;;47065:78:0;;26473:2:1;47065:78:0;;;26455:21:1;26512:2;26492:18;;;26485:30;26551;26531:18;;;26524:58;26599:18;;47065:78:0;26445:178:1;47065:78:0;47169:7;:14;47226:10;;47199:23;47208:14;47169;47199:23;:::i;:::-;:37;;47190:101;;;;-1:-1:-1;;;47190:101:0;;;;;;;:::i;:::-;47347:10;47304:19;47326:32;;;:20;:32;;;;;;47405:14;;47373:28;47387:14;47326:32;47373:28;:::i;:::-;:46;;47365:87;;;;-1:-1:-1;;;47365:87:0;;26830:2:1;47365:87:0;;;26812:21:1;26869:2;26849:18;;;26842:30;26908;26888:18;;;26881:58;26956:18;;47365:87:0;26802:178:1;47365:87:0;47598:14:::1;47590:5;;:22;;;;:::i;:::-;47577:9;:35;;47568:81;;;::::0;-1:-1:-1;;;47568:81:0;;19662:2:1;47568:81:0::1;::::0;::::1;19644:21:1::0;19701:2;19681:18;;;19674:30;19740:33;19720:18;;;19713:61;19791:18;;47568:81:0::1;19634:181:1::0;47568:81:0::1;47658:39;47669:10;47681:14;47658:9;:39::i;:::-;47474:233:::0;;;;:::o;35514:295::-;-1:-1:-1;;;;;35617:24:0;;12450:10;35617:24;;35609:62;;;;-1:-1:-1;;;35609:62:0;;19308:2:1;35609:62:0;;;19290:21:1;19347:2;19327:18;;;19320:30;19386:27;19366:18;;;19359:55;19431:18;;35609:62:0;19280:175:1;35609:62:0;12450:10;35684:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;35684:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;35684:53:0;;;;;;;;;;35753:48;;13035:41:1;;;35684:42:0;;12450:10;35753:48;;13008:18:1;35753:48:0;;;;;;;35514:295;;:::o;52360:122::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;52425:8:::1;::::0;::::1;;:21;;::::0;::::1;;;52421:55;;52456:8;:20:::0;;;::::1;;-1:-1:-1::0;;52456:20:0;;::::1;;::::0;;52360:122;:::o;36779:328::-;36954:41;12450:10;36987:7;36954:18;:41::i;:::-;36946:103;;;;-1:-1:-1;;;36946:103:0;;;;;;;:::i;:::-;37060:39;37074:4;37080:2;37084:7;37093:5;37060:13;:39::i;53801:266::-;53873:13;53903:16;53911:7;53903;:16::i;:::-;53895:76;;;;-1:-1:-1;;;53895:76:0;;26057:2:1;53895:76:0;;;26039:21:1;26096:2;26076:18;;;26069:30;26135:34;26115:18;;;26108:62;-1:-1:-1;;;26186:18:1;;;26179:45;26241:19;;53895:76:0;26029:237:1;53895:76:0;54009:13;54024:18;:7;:16;:18::i;:::-;54044:15;53992:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53978:83;;53801:266;;;:::o;45374:38::-;;;;;;;;;;;;52488:124;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;52567:9:::1;52555:8;;:21;52551:55;;52586:8;:20:::0;52488:124::o;53146:161::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;53240:13:::1;53222:14;;:31;53218:84;;53264:14;:30:::0;53146:161::o;14555:201::-;13692:7;13719:6;-1:-1:-1;;;;;13719:6:0;12450:10;13866:23;13858:68;;;;-1:-1:-1;;;13858:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14644:22:0;::::1;14636:73;;;::::0;-1:-1:-1;;;14636:73:0;;16140:2:1;14636:73:0::1;::::0;::::1;16122:21:1::0;16179:2;16159:18;;;16152:30;16218:34;16198:18;;;16191:62;-1:-1:-1;;;16269:18:1;;;16262:36;16315:19;;14636:73:0::1;16112:228:1::0;14636:73:0::1;14720:28;14739:8;14720:18;:28::i;38617:155::-:0;38716:7;:14;38682:4;;38706:24;;:58;;;;;38762:1;-1:-1:-1;;;;;38734:30:0;:7;38742;38734:16;;;;;;-1:-1:-1;;;38734:16:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38734:16:0;:30;;38699:65;38617:155;-1:-1:-1;;38617:155:0:o;42506:175::-;42581:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42581:29:0;-1:-1:-1;;;;;42581:29:0;;;;;;;;:24;;42635;42581;42635:15;:24::i;:::-;-1:-1:-1;;;;;42626:47:0;;;;;;;;;;;42506:175;;:::o;38939:349::-;39032:4;39057:16;39065:7;39057;:16::i;:::-;39049:73;;;;-1:-1:-1;;;39049:73:0;;21210:2:1;39049:73:0;;;21192:21:1;21249:2;21229:18;;;21222:30;21288:34;21268:18;;;21261:62;-1:-1:-1;;;21339:18:1;;;21332:42;21391:19;;39049:73:0;21182:234:1;39049:73:0;39133:13;39149:24;39165:7;39149:15;:24::i;:::-;39133:40;;39203:5;-1:-1:-1;;;;;39192:16:0;:7;-1:-1:-1;;;;;39192:16:0;;:51;;;;39236:7;-1:-1:-1;;;;;39212:31:0;:20;39224:7;39212:11;:20::i;:::-;-1:-1:-1;;;;;39212:31:0;;39192:51;:87;;;-1:-1:-1;;;;;;36001:25:0;;;35977:4;36001:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39247:32;39184:96;38939:349;-1:-1:-1;;;;38939:349:0:o;41871:517::-;42031:4;-1:-1:-1;;;;;42003:32:0;:24;42019:7;42003:15;:24::i;:::-;-1:-1:-1;;;;;42003:32:0;;41995:86;;;;-1:-1:-1;;;41995:86:0;;25647:2:1;41995:86:0;;;25629:21:1;25686:2;25666:18;;;25659:30;25725:34;25705:18;;;25698:62;-1:-1:-1;;;25776:18:1;;;25769:39;25825:19;;41995:86:0;25619:231:1;41995:86:0;-1:-1:-1;;;;;42100:16:0;;42092:65;;;;-1:-1:-1;;;42092:65:0;;18903:2:1;42092:65:0;;;18885:21:1;18942:2;18922:18;;;18915:30;18981:34;18961:18;;;18954:62;-1:-1:-1;;;19032:18:1;;;19025:34;19076:19;;42092:65:0;18875:226:1;42092:65:0;42274:29;42291:1;42295:7;42274:8;:29::i;:::-;42333:2;42314:7;42322;42314:16;;;;;;-1:-1:-1;;;42314:16:0;;;;;;;;;;;;;;;;;:21;;-1:-1:-1;;;;;;42314:21:0;-1:-1:-1;;;;;42314:21:0;;;;;;42353:27;;42372:7;;42353:27;;;;;;;;;;42314:16;42353:27;41871:517;;;:::o;17608:317::-;17723:6;17698:21;:31;;17690:73;;;;-1:-1:-1;;;17690:73:0;;20852:2:1;17690:73:0;;;20834:21:1;20891:2;20871:18;;;20864:30;20930:31;20910:18;;;20903:59;20979:18;;17690:73:0;20824:179:1;17690:73:0;17777:12;17795:9;-1:-1:-1;;;;;17795:14:0;17817:6;17795:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17776:52;;;17847:7;17839:78;;;;-1:-1:-1;;;17839:78:0;;20022:2:1;17839:78:0;;;20004:21:1;20061:2;20041:18;;;20034:30;20100:34;20080:18;;;20073:62;20171:28;20151:18;;;20144:56;20217:19;;17839:78:0;19994:248:1;47713:881:0;47867:40;;;;;;;;;47852:4;47867:40;;;47914;;;;;;;;;;;47852:4;47963:207;47984:17;:24;47980:1;:28;47963:207;;;48072:21;48095:17;48113:1;48095:20;;;;;;-1:-1:-1;;;48095:20:0;;;;;;;;;;;;;;;48148:1;48121:17;:24;:28;;;;:::i;:::-;48117:1;:32;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48117:43:0;;;;48055:106;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48024:138;;48010:3;;;;;:::i;:::-;;;;47963:207;;;;48187:6;48182:207;48203:17;:24;48199:1;:28;48182:207;;;48291:21;48314:17;48332:1;48314:20;;;;;;-1:-1:-1;;;48314:20:0;;;;;;;;;;;;;;;48367:1;48340:17;:24;:28;;;;:::i;:::-;48336:1;:32;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48336:43:0;;;;48274:106;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48243:138;;48229:3;;;;;:::i;:::-;;;;48182:207;;;;48397:12;48412:115;48468:10;48480:21;48503;48451:74;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48451:74:0;;;;;;;;;48441:85;;48451:74;48441:85;;;;11201:66:1;10578:58:0;;;11189:79:1;11284:12;;;;11277:28;;;;10578:58:0;;;;;;;;;;11321:12:1;;;;10578:58:0;;;10568:69;;;;;;10376:269;48412:115;48575:13;;48397:130;;-1:-1:-1;;;;;;48575:13:0;48541:30;48397:130;48561:9;48541:13;:30::i;:::-;-1:-1:-1;;;;;48541:47:0;;;47713:881;-1:-1:-1;;;;;;;47713:881:0:o;50854:263::-;50949:7;:14;50932;50972:140;50996:14;50992:1;:18;50972:140;;;-1:-1:-1;;;;;51026:31:0;;;;;;:20;:31;;;;;:33;;;;;;:::i;:::-;;;;;;51068:36;51079:9;51090:8;;;;;:::i;:::-;;;51068:36;;;;;;;;;;;;:9;:36::i;:::-;51012:3;;;;:::i;:::-;;;;50972:140;;14916:191;14990:16;15009:6;;-1:-1:-1;;;;;15026:17:0;;;-1:-1:-1;;;;;;15026:17:0;;;;;;15059:40;;15009:6;;;;;;;15059:40;;14990:16;15059:40;14916:191;;:::o;37989:315::-;38146:28;38156:4;38162:2;38166:7;38146:9;:28::i;:::-;38193:48;38216:4;38222:2;38226:7;38235:5;38193:22;:48::i;:::-;38185:111;;;;-1:-1:-1;;;38185:111:0;;;;;;;:::i;398:723::-;454:13;675:10;671:53;;-1:-1:-1;;702:10:0;;;;;;;;;;;;-1:-1:-1;;;702:10:0;;;;;398:723::o;671:53::-;749:5;734:12;790:78;797:9;;790:78;;823:8;;;;:::i;:::-;;-1:-1:-1;846:10:0;;-1:-1:-1;854:2:0;846:10;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;-1:-1:-1;;;900:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;900:17:0;;878:39;;928:154;935:10;;928:154;;962:11;972:1;962:11;;:::i;:::-;;-1:-1:-1;1031:10:0;1039:2;1031:5;:10;:::i;:::-;1018:24;;:2;:24;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;-1:-1:-1;;;988:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;988:56:0;;;;;;;;-1:-1:-1;1059:11:0;1068:2;1059:11;;:::i;:::-;;;928:154;;6574:231;6652:7;6673:17;6692:18;6714:27;6725:4;6731:9;6714:10;:27::i;:::-;6672:69;;;;6752:18;6764:5;6752:11;:18::i;:::-;-1:-1:-1;6788:9:0;6574:231;-1:-1:-1;;;6574:231:0:o;39969:321::-;40099:18;40105:2;40109:7;40099:5;:18::i;:::-;40150:54;40181:1;40185:2;40189:7;40198:5;40150:22;:54::i;:::-;40128:154;;;;-1:-1:-1;;;40128:154:0;;;;;;;:::i;43248:799::-;43403:4;-1:-1:-1;;;;;43424:13:0;;16642:19;:23;43420:620;;43460:72;;-1:-1:-1;;;43460:72:0;;-1:-1:-1;;;;;43460:36:0;;;;;:72;;12450:10;;43511:4;;43517:7;;43526:5;;43460:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43460:72:0;;;;;;;;-1:-1:-1;;43460:72:0;;;;;;;;;;;;:::i;:::-;;;43456:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43702:13:0;;43698:272;;43745:60;;-1:-1:-1;;;43745:60:0;;;;;;;:::i;43698:272::-;43920:6;43914:13;43905:6;43901:2;43897:15;43890:38;43456:529;-1:-1:-1;;;;;;43583:51:0;-1:-1:-1;;;43583:51:0;;-1:-1:-1;43576:58:0;;43420:620;-1:-1:-1;44024:4:0;43248:799;;;;;;:::o;4464:1308::-;4545:7;4554:12;4779:9;:16;4799:2;4779:22;4775:990;;;5075:4;5060:20;;5054:27;5125:4;5110:20;;5104:27;5183:4;5168:20;;5162:27;4818:9;5154:36;5226:25;5237:4;5154:36;5054:27;5104;5226:10;:25::i;:::-;5219:32;;;;;;;;;4775:990;5273:9;:16;5293:2;5273:22;5269:496;;;5548:4;5533:20;;5527:27;5599:4;5584:20;;5578:27;5641:23;5652:4;5527:27;5578;5641:10;:23::i;:::-;5634:30;;;;;;;;5269:496;-1:-1:-1;5713:1:0;;-1:-1:-1;5717:35:0;5269:496;4464:1308;;;;;:::o;2735:643::-;2813:20;2804:5;:29;;;;;;-1:-1:-1;;;2804:29:0;;;;;;;;;;2800:571;;;2735:643;:::o;2800:571::-;2911:29;2902:5;:38;;;;;;-1:-1:-1;;;2902:38:0;;;;;;;;;;2898:473;;;2957:34;;-1:-1:-1;;;2957:34:0;;13916:2:1;2957:34:0;;;13898:21:1;13955:2;13935:18;;;13928:30;13994:26;13974:18;;;13967:54;14038:18;;2957:34:0;13888:174:1;2898:473:0;3022:35;3013:5;:44;;;;;;-1:-1:-1;;;3013:44:0;;;;;;;;;;3009:362;;;3074:41;;-1:-1:-1;;;3074:41:0;;15014:2:1;3074:41:0;;;14996:21:1;15053:2;15033:18;;;15026:30;15092:33;15072:18;;;15065:61;15143:18;;3074:41:0;14986:181:1;3009:362:0;3146:30;3137:5;:39;;;;;;-1:-1:-1;;;3137:39:0;;;;;;;;;;3133:238;;;3193:44;;-1:-1:-1;;;3193:44:0;;20449:2:1;3193:44:0;;;20431:21:1;20488:2;20468:18;;;20461:30;20527:34;20507:18;;;20500:62;-1:-1:-1;;;20578:18:1;;;20571:32;20620:19;;3193:44:0;20421:224:1;3133:238:0;3268:30;3259:5;:39;;;;;;-1:-1:-1;;;3259:39:0;;;;;;;;;;3255:116;;;3315:44;;-1:-1:-1;;;3315:44:0;;23691:2:1;3315:44:0;;;23673:21:1;23730:2;23710:18;;;23703:30;23769:34;23749:18;;;23742:62;-1:-1:-1;;;23820:18:1;;;23813:32;23862:19;;3315:44:0;23663:224:1;40626:346:0;-1:-1:-1;;;;;40706:16:0;;40698:61;;;;-1:-1:-1;;;40698:61:0;;24094:2:1;40698:61:0;;;24076:21:1;;;24113:18;;;24106:30;24172:34;24152:18;;;24145:62;24224:18;;40698:61:0;24066:182:1;40698:61:0;40779:16;40787:7;40779;:16::i;:::-;40778:17;40770:58;;;;-1:-1:-1;;;40770:58:0;;16547:2:1;40770:58:0;;;16529:21:1;16586:2;16566:18;;;16559:30;16625;16605:18;;;16598:58;16673:18;;40770:58:0;16519:178:1;40770:58:0;40897:7;:16;;;;;;;-1:-1:-1;40897:16:0;;;;;;;-1:-1:-1;;;;;;40897:16:0;-1:-1:-1;;;;;40897:16:0;;;;;;;;40931:33;;40956:7;;-1:-1:-1;40931:33:0;;-1:-1:-1;;40931:33:0;40626:346;;:::o;8026:1632::-;8157:7;;9091:66;9078:79;;9074:163;;;-1:-1:-1;9190:1:0;;-1:-1:-1;9194:30:0;9174:51;;9074:163;9251:1;:7;;9256:2;9251:7;;:18;;;;;9262:1;:7;;9267:2;9262:7;;9251:18;9247:102;;;-1:-1:-1;9302:1:0;;-1:-1:-1;9306:30:0;9286:51;;9247:102;9463:24;;;9446:14;9463:24;;;;;;;;;13314:25:1;;;13387:4;13375:17;;13355:18;;;13348:45;;;;13409:18;;;13402:34;;;13452:18;;;13445:34;;;9463:24:0;;13286:19:1;;9463:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9463:24:0;;-1:-1:-1;;9463:24:0;;;-1:-1:-1;;;;;;;9502:20:0;;9498:103;;9555:1;9559:29;9539:50;;;;;;;9498:103;9621:6;-1:-1:-1;9629:20:0;;-1:-1:-1;8026:1632:0;;;;;;;;:::o;7068:344::-;7182:7;;-1:-1:-1;;;;;7228:80:0;;7182:7;7335:25;7351:3;7336:18;;;7358:2;7335:25;:::i;:::-;7319:42;;7379:25;7390:4;7396:1;7399;7402;7379:10;:25::i;:::-;7372:32;;;;;;7068:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:395::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:2;;344:8;334;327:26;286:2;-1:-1:-1;374:20:1;;417:18;406:30;;403:2;;;456:8;446;439:26;403:2;500:4;492:6;488:17;476:29;;560:3;553:4;543:6;540:1;536:14;528:6;524:27;520:38;517:47;514:2;;;577:1;574;567:12;592:911;645:5;698:3;691:4;683:6;679:17;675:27;665:2;;720:5;713;706:20;665:2;760:6;747:20;786:4;809:18;846:2;842;839:10;836:2;;;852:18;;:::i;:::-;898:2;895:1;891:10;921:28;945:2;941;937:11;921:28;:::i;:::-;983:15;;;1014:12;;;;1046:15;;;1080;;;1076:24;;1073:33;-1:-1:-1;1070:2:1;;;1123:5;1116;1109:20;1070:2;1149:5;1140:14;;1163:311;1177:2;1174:1;1171:9;1163:311;;;1254:3;1241:17;1290:2;1277:11;1274:19;1271:2;;;1310:5;1303;1296:20;1271:2;1343:56;1395:3;1390:2;1376:11;1368:6;1364:24;1360:33;1343:56;:::i;:::-;1331:69;;-1:-1:-1;1195:1:1;1188:9;;;;;1420:12;;;;1452;;1163:311;;;-1:-1:-1;1492:5:1;655:848;-1:-1:-1;;;;;;;;655:848:1:o;1508:160::-;1573:20;;1629:13;;1622:21;1612:32;;1602:2;;1658:1;1655;1648:12;1673:550;1715:5;1768:3;1761:4;1753:6;1749:17;1745:27;1735:2;;1790:5;1783;1776:20;1735:2;1830:6;1817:20;1856:18;1852:2;1849:26;1846:2;;;1878:18;;:::i;:::-;1922:55;1965:2;1946:13;;-1:-1:-1;;1942:27:1;1971:4;1938:38;1922:55;:::i;:::-;2002:2;1993:7;1986:19;2048:3;2041:4;2036:2;2028:6;2024:15;2020:26;2017:35;2014:2;;;2069:5;2062;2055:20;2014:2;2138;2131:4;2123:6;2119:17;2112:4;2103:7;2099:18;2086:55;2161:16;;;2179:4;2157:27;2150:42;;;;2165:7;1725:498;-1:-1:-1;;1725:498:1:o;2228:196::-;2287:6;2340:2;2328:9;2319:7;2315:23;2311:32;2308:2;;;2361:6;2353;2346:22;2308:2;2389:29;2408:9;2389:29;:::i;:::-;2379:39;2298:126;-1:-1:-1;;;2298:126:1:o;2429:270::-;2497:6;2505;2558:2;2546:9;2537:7;2533:23;2529:32;2526:2;;;2579:6;2571;2564:22;2526:2;2607:29;2626:9;2607:29;:::i;:::-;2597:39;;2655:38;2689:2;2678:9;2674:18;2655:38;:::i;:::-;2645:48;;2516:183;;;;;:::o;2704:338::-;2781:6;2789;2797;2850:2;2838:9;2829:7;2825:23;2821:32;2818:2;;;2871:6;2863;2856:22;2818:2;2899:29;2918:9;2899:29;:::i;:::-;2889:39;;2947:38;2981:2;2970:9;2966:18;2947:38;:::i;:::-;2937:48;;3032:2;3021:9;3017:18;3004:32;2994:42;;2808:234;;;;;:::o;3047:557::-;3142:6;3150;3158;3166;3219:3;3207:9;3198:7;3194:23;3190:33;3187:2;;;3241:6;3233;3226:22;3187:2;3269:29;3288:9;3269:29;:::i;:::-;3259:39;;3317:38;3351:2;3340:9;3336:18;3317:38;:::i;:::-;3307:48;;3402:2;3391:9;3387:18;3374:32;3364:42;;3457:2;3446:9;3442:18;3429:32;3484:18;3476:6;3473:30;3470:2;;;3521:6;3513;3506:22;3470:2;3549:49;3590:7;3581:6;3570:9;3566:22;3549:49;:::i;:::-;3539:59;;;3177:427;;;;;;;:::o;3609:264::-;3674:6;3682;3735:2;3723:9;3714:7;3710:23;3706:32;3703:2;;;3756:6;3748;3741:22;3703:2;3784:29;3803:9;3784:29;:::i;:::-;3774:39;;3832:35;3863:2;3852:9;3848:18;3832:35;:::i;3878:264::-;3946:6;3954;4007:2;3995:9;3986:7;3982:23;3978:32;3975:2;;;4028:6;4020;4013:22;3975:2;4056:29;4075:9;4056:29;:::i;:::-;4046:39;4132:2;4117:18;;;;4104:32;;-1:-1:-1;;;3965:177:1:o;4147:803::-;4269:6;4277;4285;4293;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4367:6;4359;4352:22;4314:2;4412:9;4399:23;4441:18;4482:2;4474:6;4471:14;4468:2;;;4503:6;4495;4488:22;4468:2;4547:70;4609:7;4600:6;4589:9;4585:22;4547:70;:::i;:::-;4636:8;;-1:-1:-1;4521:96:1;-1:-1:-1;4724:2:1;4709:18;;4696:32;;-1:-1:-1;4740:16:1;;;4737:2;;;4774:6;4766;4759:22;4737:2;;4818:72;4882:7;4871:8;4860:9;4856:24;4818:72;:::i;:::-;4304:646;;;;-1:-1:-1;4909:8:1;-1:-1:-1;;;;4304:646:1:o;4955:190::-;5011:6;5064:2;5052:9;5043:7;5039:23;5035:32;5032:2;;;5085:6;5077;5070:22;5032:2;5113:26;5129:9;5113:26;:::i;5150:255::-;5208:6;5261:2;5249:9;5240:7;5236:23;5232:32;5229:2;;;5282:6;5274;5267:22;5229:2;5326:9;5313:23;5345:30;5369:5;5345:30;:::i;5410:259::-;5479:6;5532:2;5520:9;5511:7;5507:23;5503:32;5500:2;;;5553:6;5545;5538:22;5500:2;5590:9;5584:16;5609:30;5633:5;5609:30;:::i;5674:642::-;5745:6;5753;5806:2;5794:9;5785:7;5781:23;5777:32;5774:2;;;5827:6;5819;5812:22;5774:2;5872:9;5859:23;5901:18;5942:2;5934:6;5931:14;5928:2;;;5963:6;5955;5948:22;5928:2;6006:6;5995:9;5991:22;5981:32;;6051:7;6044:4;6040:2;6036:13;6032:27;6022:2;;6078:6;6070;6063:22;6022:2;6123;6110:16;6149:2;6141:6;6138:14;6135:2;;;6170:6;6162;6155:22;6135:2;6220:7;6215:2;6206:6;6202:2;6198:15;6194:24;6191:37;6188:2;;;6246:6;6238;6231:22;6188:2;6282;6274:11;;;;;6304:6;;-1:-1:-1;5764:552:1;;-1:-1:-1;;;;5764:552:1:o;6321:190::-;6380:6;6433:2;6421:9;6412:7;6408:23;6404:32;6401:2;;;6454:6;6446;6439:22;6401:2;-1:-1:-1;6482:23:1;;6391:120;-1:-1:-1;6391:120:1:o;6516:920::-;6681:6;6689;6697;6705;6758:3;6746:9;6737:7;6733:23;6729:33;6726:2;;;6780:6;6772;6765:22;6726:2;6821:9;6808:23;6798:33;;6882:2;6871:9;6867:18;6854:32;6905:18;6946:2;6938:6;6935:14;6932:2;;;6967:6;6959;6952:22;6932:2;6995:49;7036:7;7027:6;7016:9;7012:22;6995:49;:::i;:::-;6985:59;;7097:2;7086:9;7082:18;7069:32;7053:48;;7126:2;7116:8;7113:16;7110:2;;;7147:6;7139;7132:22;7110:2;7175:62;7229:7;7218:8;7207:9;7203:24;7175:62;:::i;:::-;7165:72;;7290:2;7279:9;7275:18;7262:32;7246:48;;7319:2;7309:8;7306:16;7303:2;;;7340:6;7332;7325:22;7303:2;;7368:62;7422:7;7411:8;7400:9;7396:24;7368:62;:::i;7441:257::-;7482:3;7520:5;7514:12;7547:6;7542:3;7535:19;7563:63;7619:6;7612:4;7607:3;7603:14;7596:4;7589:5;7585:16;7563:63;:::i;:::-;7680:2;7659:15;-1:-1:-1;;7655:29:1;7646:39;;;;7687:4;7642:50;;7490:208;-1:-1:-1;;7490:208:1:o;7703:979::-;7788:12;;7753:3;;7845:1;7865:18;;;;7918;;;;7945:2;;7999:4;7991:6;7987:17;7977:27;;7945:2;8025;8073;8065:6;8062:14;8042:18;8039:38;8036:2;;;-1:-1:-1;;;8100:33:1;;8156:4;8153:1;8146:15;8186:4;8107:3;8174:17;8036:2;8217:18;8244:104;;;;8362:1;8357:319;;;;8210:466;;8244:104;-1:-1:-1;;8277:24:1;;8265:37;;8322:16;;;;-1:-1:-1;8244:104:1;;8357:319;29135:4;29154:17;;;29204:4;29188:21;;8451:1;8465:165;8479:6;8476:1;8473:13;8465:165;;;8557:14;;8544:11;;;8537:35;8600:16;;;;8494:10;;8465:165;;;8469:3;;8659:6;8654:3;8650:16;8643:23;;8210:466;;;;;;;7761:921;;;;:::o;8687:591::-;8949:26;8945:31;8936:6;8932:2;8928:15;8924:53;8919:3;8912:66;8894:3;9007:6;9001:13;9023:62;9078:6;9073:2;9068:3;9064:12;9057:4;9049:6;9045:17;9023:62;:::i;:::-;9145:13;;9104:16;;;;9167:63;9145:13;9216:2;9208:11;;9201:4;9189:17;;9167:63;:::i;:::-;9250:17;9269:2;9246:26;;8902:376;-1:-1:-1;;;;;8902:376:1:o;9283:664::-;9510:3;9548:6;9542:13;9564:53;9610:6;9605:3;9598:4;9590:6;9586:17;9564:53;:::i;:::-;9680:13;;9639:16;;;;9702:57;9680:13;9639:16;9736:4;9724:17;;9702:57;:::i;:::-;9826:13;;9781:20;;;9848:57;9826:13;9781:20;9882:4;9870:17;;9848:57;:::i;:::-;9921:20;;9518:429;-1:-1:-1;;;;;9518:429:1:o;9952:541::-;10176:3;10214:6;10208:13;10230:53;10276:6;10271:3;10264:4;10256:6;10252:17;10230:53;:::i;:::-;10302:51;10345:6;10340:3;10336:16;10328:6;10302:51;:::i;:::-;10292:61;;10384:6;10378:13;10400:54;10445:8;10441:2;10434:4;10426:6;10422:17;10400:54;:::i;10498:456::-;10719:3;10747:38;10781:3;10773:6;10747:38;:::i;:::-;10814:6;10808:13;10830:52;10875:6;10871:2;10864:4;10856:6;10852:17;10830:52;:::i;:::-;10898:50;10940:6;10936:2;10932:15;10924:6;10898:50;:::i;:::-;10891:57;10727:227;-1:-1:-1;;;;;;;10727:227:1:o;11762:488::-;-1:-1:-1;;;;;12031:15:1;;;12013:34;;12083:15;;12078:2;12063:18;;12056:43;12130:2;12115:18;;12108:34;;;12178:3;12173:2;12158:18;;12151:31;;;11956:4;;12199:45;;12224:19;;12216:6;12199:45;:::i;:::-;12191:53;11965:285;-1:-1:-1;;;;;;11965:285:1:o;12255:635::-;12426:2;12478:21;;;12548:13;;12451:18;;;12570:22;;;12397:4;;12426:2;12649:15;;;;12623:2;12608:18;;;12397:4;12695:169;12709:6;12706:1;12703:13;12695:169;;;12770:13;;12758:26;;12839:15;;;;12804:12;;;;12731:1;12724:9;12695:169;;;-1:-1:-1;12881:3:1;;12406:484;-1:-1:-1;;;;;;12406:484:1:o;13490:219::-;13639:2;13628:9;13621:21;13602:4;13659:44;13699:2;13688:9;13684:18;13676:6;13659:44;:::i;15519:414::-;15721:2;15703:21;;;15760:2;15740:18;;;15733:30;15799:34;15794:2;15779:18;;15772:62;-1:-1:-1;;;15865:2:1;15850:18;;15843:48;15923:3;15908:19;;15693:240::o;21421:397::-;21623:2;21605:21;;;21662:2;21642:18;;;21635:30;21701:34;21696:2;21681:18;;21674:62;-1:-1:-1;;;21767:2:1;21752:18;;21745:31;21808:3;21793:19;;21595:223::o;24666:413::-;24868:2;24850:21;;;24907:2;24887:18;;;24880:30;24946:34;24941:2;24926:18;;24919:62;-1:-1:-1;;;25012:2:1;24997:18;;24990:47;25069:3;25054:19;;24840:239::o;25084:356::-;25286:2;25268:21;;;25305:18;;;25298:30;25364:34;25359:2;25344:18;;25337:62;25431:2;25416:18;;25258:182::o;27387:405::-;27589:2;27571:21;;;27628:2;27608:18;;;27601:30;27667:34;27662:2;27647:18;;27640:62;-1:-1:-1;;;27733:2:1;27718:18;;27711:39;27782:3;27767:19;;27561:231::o;27797:413::-;27999:2;27981:21;;;28038:2;28018:18;;;28011:30;28077:34;28072:2;28057:18;;28050:62;-1:-1:-1;;;28143:2:1;28128:18;;28121:47;28200:3;28185:19;;27971:239::o;28808:275::-;28879:2;28873:9;28944:2;28925:13;;-1:-1:-1;;28921:27:1;28909:40;;28979:18;28964:34;;29000:22;;;28961:62;28958:2;;;29026:18;;:::i;:::-;29062:2;29055:22;28853:230;;-1:-1:-1;28853:230:1:o;29220:128::-;29260:3;29291:1;29287:6;29284:1;29281:13;29278:2;;;29297:18;;:::i;:::-;-1:-1:-1;29333:9:1;;29268:80::o;29353:120::-;29393:1;29419;29409:2;;29424:18;;:::i;:::-;-1:-1:-1;29458:9:1;;29399:74::o;29478:168::-;29518:7;29584:1;29580;29576:6;29572:14;29569:1;29566:21;29561:1;29554:9;29547:17;29543:45;29540:2;;;29591:18;;:::i;:::-;-1:-1:-1;29631:9:1;;29530:116::o;29651:125::-;29691:4;29719:1;29716;29713:8;29710:2;;;29724:18;;:::i;:::-;-1:-1:-1;29761:9:1;;29700:76::o;29781:258::-;29853:1;29863:113;29877:6;29874:1;29871:13;29863:113;;;29953:11;;;29947:18;29934:11;;;29927:39;29899:2;29892:10;29863:113;;;29994:6;29991:1;29988:13;29985:2;;;-1:-1:-1;;30029:1:1;30011:16;;30004:27;29834:205::o;30044:380::-;30123:1;30119:12;;;;30166;;;30187:2;;30241:4;30233:6;30229:17;30219:27;;30187:2;30294;30286:6;30283:14;30263:18;30260:38;30257:2;;;30340:10;30335:3;30331:20;30328:1;30321:31;30375:4;30372:1;30365:15;30403:4;30400:1;30393:15;30429:135;30468:3;-1:-1:-1;;30489:17:1;;30486:2;;;30509:18;;:::i;:::-;-1:-1:-1;30556:1:1;30545:13;;30476:88::o;30569:112::-;30601:1;30627;30617:2;;30632:18;;:::i;:::-;-1:-1:-1;30666:9:1;;30607:74::o;30686:127::-;30747:10;30742:3;30738:20;30735:1;30728:31;30778:4;30775:1;30768:15;30802:4;30799:1;30792:15;30818:127;30879:10;30874:3;30870:20;30867:1;30860:31;30910:4;30907:1;30900:15;30934:4;30931:1;30924:15;30950:127;31011:10;31006:3;31002:20;30999:1;30992:31;31042:4;31039:1;31032:15;31066:4;31063:1;31056:15;31082:131;-1:-1:-1;;;;;;31156:32:1;;31146:43;;31136:2;;31203:1;31200;31193:12

Swarm Source

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