ETH Price: $2,418.20 (+0.15%)

Token

RandyTheRugger (RANDY)
 

Overview

Max Total Supply

35 RANDY

Holders

18

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xC5Def20E12A3c62d3f536c20A7bd72D89c23E7A8
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:
RandyTheRugger

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-17
*/

//SPDX-License-Identifier: MIT
// File: https://github.com/dievardump/EIP2981-implementation/contracts/IERC2981Royalties.sol


pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

// File: @a16z/contracts/licenses/ICantBeEvil.sol


// a16z Contracts v0.0.1 (ICantBeEvil.sol)
pragma solidity ^0.8.13;

interface ICantBeEvil {
    function getLicenseURI() external view returns (string memory);
    function getLicenseName() external view returns (string memory);
}
// 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/Base64.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}

// 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: https://github.com/msfeldstein/EIP712-whitelisting/contracts/EIP712Whitelisting.sol

pragma solidity ^0.8.0;



contract EIP712Whitelisting is Ownable {
    using ECDSA for bytes32;

    // The key used to sign whitelist signatures.
    // We will check to ensure that the key that signed the signature
    // is this one that we expect.
    address whitelistSigningKey = address(0);

    // Domain Separator is the EIP-712 defined structure that defines what contract
    // and chain these signatures can be used for.  This ensures people can't take
    // a signature used to mint on one contract and use it for another, or a signature
    // from testnet to replay on mainnet.
    // It has to be created in the constructor so we can dynamically grab the chainId.
    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#definition-of-domainseparator
    bytes32 public DOMAIN_SEPARATOR;

    // The typehash for the data type specified in the structured data
    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#rationale-for-typehash
    // This should match whats in the client side whitelist signing code
    // https://github.com/msfeldstein/EIP712-whitelisting/blob/main/test/signWhitelist.ts#L22
    bytes32 public constant MINTER_TYPEHASH =
        keccak256("Minter(address wallet)");

    constructor() {
        // This should match whats in the client side whitelist signing code
        // https://github.com/msfeldstein/EIP712-whitelisting/blob/main/test/signWhitelist.ts#L12
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256(
                    "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                ),
                // This should match the domain you set in your client side signing.
                keccak256(bytes("RandyWhitelisting")),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
    }

    function setWhitelistSigningAddress(address newSigningKey) public onlyOwner {
        whitelistSigningKey = newSigningKey;
    }

    modifier requiresWhitelist(bytes calldata signature) {
        require(whitelistSigningKey != address(0), "whitelist not enabled");
        // Verify EIP-712 signature by recreating the data structure
        // that we signed on the client side, and then using that to recover
        // the address that signed the signature for this data.
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(MINTER_TYPEHASH, msg.sender))
            )
        );
        // Use the recover method to see what address was used to create
        // the signature on this data.
        // Note that if the digest doesn't exactly match what was signed we'll
        // get a random recovered address.
        address recoveredAddress = digest.recover(signature);
        require(recoveredAddress == whitelistSigningKey, "Invalid Signature");
        _;
    }
}

// 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/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: https://github.com/dievardump/EIP2981-implementation/contracts/ERC2981Base.sol


pragma solidity ^0.8.0;



/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

// File: https://github.com/dievardump/EIP2981-implementation/contracts/ERC2981ContractWideRoyalties.sol


pragma solidity ^0.8.0;



/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
/// @dev This implementation has the same royalties for each and every tokens
abstract contract ERC2981ContractWideRoyalties is ERC2981Base {
    RoyaltyInfo private _royalties;

    /// @dev Sets token royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setRoyalties(address recipient, uint256 value) internal {
        require(value <= 10000, 'ERC2981Royalties: Too high');
        _royalties = RoyaltyInfo(recipient, uint24(value));
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        RoyaltyInfo memory royalties = _royalties;
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
}

// File: @a16z/contracts/licenses/CantBeEvil.sol


// a16z Contracts v0.0.1 (CantBeEvil.sol)
pragma solidity ^0.8.13;




enum LicenseVersion {
    CBE_CC0,
    CBE_ECR,
    CBE_NECR,
    CBE_NECR_HS,
    CBE_PR,
    CBE_PR_HS
}

contract CantBeEvil is ERC165, ICantBeEvil {
    using Strings for uint;
    string internal constant _BASE_LICENSE_URI = "ar://_D9kN1WrNWbCq55BSAGRbTB4bS3v8QAPTYmBThSbX3A/";
    LicenseVersion public licenseVersion; // return string
    constructor(LicenseVersion _licenseVersion) {
        licenseVersion = _licenseVersion;
    }

    function getLicenseURI() public view returns (string memory) {
        return string.concat(_BASE_LICENSE_URI, uint(licenseVersion).toString());
    }

    function getLicenseName() public view returns (string memory) {
        return _getLicenseVersionKeyByValue(licenseVersion);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool) {
        return
            interfaceId == type(ICantBeEvil).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function _getLicenseVersionKeyByValue(LicenseVersion _licenseVersion) internal pure returns (string memory) {
        require(uint8(_licenseVersion) <= 6);
        if (LicenseVersion.CBE_CC0 == _licenseVersion) return "CBE_CC0";
        if (LicenseVersion.CBE_ECR == _licenseVersion) return "CBE_ECR";
        if (LicenseVersion.CBE_NECR == _licenseVersion) return "CBE_NECR";
        if (LicenseVersion.CBE_NECR_HS == _licenseVersion) return "CBE_NECR_HS";
        if (LicenseVersion.CBE_PR == _licenseVersion) return "CBE_PR";
        else return "CBE_PR_HS";
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File: RandyTheRuggerFinal.sol


pragma solidity ^0.8.13;

/*                                                
                                                                                                                                            --_   
                                                                                                                                    #          `@,    
                                                                                        /@@@@@@@@@@@@/                                           @    
                                                                                 .@@@@@@@@@@@@@@@@@@@@@@@@@@                                    @@    
                                                                             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                               @@     
                                              .@@@@@@@@@@@@@@@@@@@@@,     (@@@@@@@@@@@@@@@              @@@@@@@@@@@                          @@@      
       @@@       /                        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(   @@@@@@@@                        @@@@@@@@                     @@@@        
     @`                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@       &@&                              #@@@@@@@@             @@@@@.          
     @.                              @@@@@@@@@                   @@@@@                                              @@@@@@@@@@@@@@@@@@@@              
      @@                           @@@@@@@                                                                                (@@@@@@%                    
       @@@                       @@@@@@/                                                                                                              
         ,@@@@                @@@@@@@                                                                                                                 
             @@@@@@@@@@@@@@@@@@@@@                                                                                                                    
                  @@@@@@@@@@@,                                                                                                                        

                                                     MISnFTS | Randy the Rugger | September 2022                                                                   
*/

contract RandyTheRugger is ERC1155, EIP712Whitelisting, ERC2981ContractWideRoyalties, CantBeEvil(LicenseVersion.CBE_PR_HS){

  using Strings for uint256;
  string private _contractURI;

  string public name;
  string public symbol;
  address public proxyRegistryAddress;

  struct tokens{
    string tokenURI;
    mapping(address => bool) userRedeemed;
    bool validation;
    bool isPaused;
  }
  
  uint[] randyLimited;
  mapping(uint => tokens) tokenList;

   constructor(address _proxyRegistryAddress, string memory contractURI_) ERC1155("") EIP712Whitelisting(){
    proxyRegistryAddress = _proxyRegistryAddress;
    _contractURI = contractURI_;
    name = "RandyTheRugger";
    symbol = "RANDY";
  }
 
  modifier randyWatch(){
    uint length = randyLimited.length;
    for(uint i = 0; i < length; i++){
      require(!tokenList[randyLimited[i]].userRedeemed[msg.sender], "User already owns a Limited Randy.");
    }
    _;
  }

  function initiateTokens(uint[] calldata _tokenIds, uint[] calldata _amountsToInit) public onlyOwner{
    require(_tokenIds.length == _amountsToInit.length, "Fix initiation params.");
    uint length = _tokenIds.length;
    for(uint i = 0; i < length; i++){
        require(!tokenList[_tokenIds[i]].validation, "Token already exists.");
        _mint(msg.sender, _tokenIds[i], _amountsToInit[i], "");
        tokenList[_tokenIds[i]].validation = true;
        tokenList[_tokenIds[i]].isPaused = true;
    }
  }
  
  function adminMint(address[] calldata _receivers, uint _tokenId) public onlyOwner {
    uint length = _receivers.length;
    require(tokenList[_tokenId].validation, "Token doesn't exist.");
	  for(uint i = 0; i < length; i++) {
      _mint(_receivers[i], _tokenId, 1, "");
      tokenList[_tokenId].userRedeemed[_receivers[i]] = true;
    }
  }
  
  function randyMint(uint _tokenId, bytes calldata _signature) public payable requiresWhitelist(_signature){
    require(tokenList[_tokenId].userRedeemed[msg.sender] == false, "User redeemed Randy already.");
    require(tokenList[_tokenId].validation, "Token doesn't exist.");
    require(!tokenList[_tokenId].isPaused, "Minting is paused.");
    _mint(msg.sender, _tokenId, 1, "");
    tokenList[_tokenId].userRedeemed[msg.sender] = true;
  }

  function limitedMint(uint _tokenId, bytes calldata _signature) public payable randyWatch requiresWhitelist(_signature){
    require(tokenList[_tokenId].userRedeemed[msg.sender] == false, "User redeemed Randy already.");
    require(tokenList[_tokenId].validation, "Token doesn't exist.");
    require(!tokenList[_tokenId].isPaused, "Minting is paused.");
    _mint(msg.sender, _tokenId, 1, "");
    tokenList[_tokenId].userRedeemed[msg.sender] = true;
  }

  function burn(uint _tokenId, uint _amount) external {
    _burn(msg.sender, _tokenId, _amount);
  }

  function setTokenURIS(uint[] calldata _tokenIds, string[] memory _uris) external onlyOwner {
    require(_tokenIds.length == _uris.length, "Fix initiation params.");
    uint length = _tokenIds.length;
    for(uint i = 0; i < length; i++){
        tokenList[_tokenIds[i]].tokenURI = _uris[i];
        emit URI(_uris[i], _tokenIds[i]);
    }
  }

  function uri(uint _tokenId) public override view returns (string memory) {
    return tokenList[_tokenId].tokenURI;
  }

  function setContractURI(string memory contractURI_) public onlyOwner {
    _contractURI = contractURI_;
  }

  function contractURI() public view returns (string memory) {
    return _contractURI;
  }

  function togglePause(uint[] calldata _tokenIds) public onlyOwner {
    uint length = _tokenIds.length;
    for(uint i = 0; i < length; i++){
        if(tokenList[_tokenIds[i]].isPaused == true) tokenList[_tokenIds[i]].isPaused = false;
        else tokenList[_tokenIds[i]].isPaused = true;
    }
  }

  function checkIsPaused(uint _tokenId) public view returns (bool) {
    if(tokenList[_tokenId].isPaused == true) return true;
    else return false;
  }

  function limitedRandyPush(uint[] calldata _tokenIds) public onlyOwner {
    uint length = _tokenIds.length;
    for(uint i = 0; i < length; i++) randyLimited.push(_tokenIds[i]);
  }

  function clearLimitedRandy() public onlyOwner{
    uint length = randyLimited.length;
    for(uint i = 0; i < length; i++) if(tokenList[randyLimited[i]].isPaused == false) tokenList[randyLimited[i]].isPaused = true;
    delete randyLimited;
  }

  function withdrawFunds() public payable onlyOwner {
    uint256 balance = address(this).balance;
    require(balance > 0, "No balance to withdraw");
    (bool successA, ) = payable(0x4912b5F460eadA85B4239C2Ff174221494B0F8fA).call{value: (balance)}("");
    require(successA, "Withdraw failed");
    assert(address(this).balance == 0);
  }

  function setRoyalties(address recipient, uint256 value) public onlyOwner {
    _setRoyalties(recipient, value);
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981Base, CantBeEvil) returns (bool) {
    return super.supportsInterface(interfaceId);
  }

    /////////////////////////////////////////////
    //opensea proxy removal and gasless listing
    /////////////////////////////////////////////

  function setProxyRegistry(address _newRegistry) external onlyOwner {
	  proxyRegistryAddress = _newRegistry;
	}

  function isApprovedForAll(address _owner, address operator) public view override returns (bool) {
      OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress);
      if (address(proxyRegistry.proxies(_owner)) == operator) return true;
      return super.isApprovedForAll(_owner, operator);
    }
}

contract OwnableDelegateProxy { }
contract OpenSeaProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"contractURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_receivers","type":"address[]"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"checkIsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearLimitedRandy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLicenseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amountsToInit","type":"uint256[]"}],"name":"initiateTokens","outputs":[],"stateMutability":"nonpayable","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":"licenseVersion","outputs":[{"internalType":"enum LicenseVersion","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"limitedMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"limitedRandyPush","outputs":[],"stateMutability":"nonpayable","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":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"randyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRegistry","type":"address"}],"name":"setProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"_uris","type":"string[]"}],"name":"setTokenURIS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigningKey","type":"address"}],"name":"setWhitelistSigningAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600480546001600160a01b03191690553480156200002157600080fd5b506040516200456b3803806200456b833981016040819052620000449162000340565b604080516020810190915260008152600590620000618162000219565b506200006d3362000232565b604080518082018252601181527052616e647957686974656c697374696e6760781b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527fec7fda44bd1fc9bcec60502a9283e003d021f175b8646bf64b9fcdac5e29878f918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c0016040516020818303038152906040528051906020012060058190555080600760006101000a81548160ff0219169083600581111562000173576200017362000440565b021790555050600b80546001600160a01b0319166001600160a01b0384161790558051620001a990600890602084019062000284565b5060408051808201909152600e8082526d2930b7323caa3432a93ab3b3b2b960911b6020909201918252620001e19160099162000284565b506040805180820190915260058082526452414e445960d81b60209092019182526200021091600a9162000284565b50505062000492565b80516200022e90600290602084019062000284565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002929062000456565b90600052602060002090601f016020900481019282620002b6576000855562000301565b82601f10620002d157805160ff191683800117855562000301565b8280016001018555821562000301579182015b8281111562000301578251825591602001919060010190620002e4565b506200030f92915062000313565b5090565b5b808211156200030f576000815560010162000314565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200035457600080fd5b82516001600160a01b03811681146200036c57600080fd5b602084810151919350906001600160401b03808211156200038c57600080fd5b818601915086601f830112620003a157600080fd5b815181811115620003b657620003b66200032a565b604051601f8201601f19908116603f01168101908382118183101715620003e157620003e16200032a565b816040528281528986848701011115620003fa57600080fd5b600093505b828410156200041e5784840186015181850187015292850192620003ff565b82841115620004305760008684830101525b8096505050505050509250929050565b634e487b7160e01b600052602160045260246000fd5b600181811c908216806200046b57607f821691505b6020821081036200048c57634e487b7160e01b600052602260045260246000fd5b50919050565b6140c980620004a26000396000f3fe60806040526004361061024e5760003560e01c8063a22cb46511610138578063cd7c0326116100b0578063f053807a1161007f578063f242432a11610064578063f242432a14610661578063f2fde38b14610681578063fa4d280c146106a157600080fd5b8063f053807a14610621578063f1f11fc91461064157600080fd5b8063cd7c0326146105ac578063da8444c8146105cc578063e8a3d485146105ec578063e985e9c51461060157600080fd5b8063adfdeef911610107578063c21d8875116100ec578063c21d887514610564578063c7db289314610577578063cd7708331461058c57600080fd5b8063adfdeef914610524578063b390c0ab1461054457600080fd5b8063a22cb465146104af578063a2db55c0146104cf578063a341793b146104ef578063aaec62971461050457600080fd5b80634e1273f4116101cb5780638da5cb5b1161019a578063938e3d7b1161017f578063938e3d7b1461046557806395d89b41146104855780639dd39ea31461049a57600080fd5b80638da5cb5b14610420578063924835e61461045257600080fd5b80634e1273f41461039757806350a5292f146103c4578063715018a6146103eb5780638c7ea24b1461040057600080fd5b806324600fc3116102225780632eb2c2d6116102075780632eb2c2d6146103415780633644e515146103615780634a4e1f781461037757600080fd5b806324600fc3146102f85780632a55205a1461030257600080fd5b8062fdd58e1461025357806301ffc9a71461028657806306fdde03146102b65780630e89341c146102d8575b600080fd5b34801561025f57600080fd5b5061027361026e366004613527565b6106d5565b6040519081526020015b60405180910390f35b34801561029257600080fd5b506102a66102a1366004613569565b610781565b604051901515815260200161027d565b3480156102c257600080fd5b506102cb61078c565b60405161027d91906135e5565b3480156102e457600080fd5b506102cb6102f33660046135f8565b61081a565b6103006108bc565b005b34801561030e57600080fd5b5061032261031d366004613611565b610a10565b604080516001600160a01b03909316835260208301919091520161027d565b34801561034d57600080fd5b5061030061035c36600461377f565b610a65565b34801561036d57600080fd5b5061027360055481565b34801561038357600080fd5b50610300610392366004613872565b610b07565b3480156103a357600080fd5b506103b76103b23660046138de565b610d21565b60405161027d91906139dc565b3480156103d057600080fd5b506007546103de9060ff1681565b60405161027d9190613a05565b3480156103f757600080fd5b50610300610e5f565b34801561040c57600080fd5b5061030061041b366004613527565b610eb3565b34801561042c57600080fd5b506003546001600160a01b03165b6040516001600160a01b03909116815260200161027d565b610300610460366004613a2d565b610f05565b34801561047157600080fd5b50610300610480366004613aa9565b61121a565b34801561049157600080fd5b506102cb611275565b3480156104a657600080fd5b50610300611282565b3480156104bb57600080fd5b506103006104ca366004613ade565b611393565b3480156104db57600080fd5b506103006104ea366004613b1c565b61139e565b3480156104fb57600080fd5b506102cb611440565b34801561051057600080fd5b506102a661051f3660046135f8565b611457565b34801561053057600080fd5b5061030061053f366004613b5e565b61148a565b34801561055057600080fd5b5061030061055f366004613611565b611501565b610300610572366004613a2d565b61150c565b34801561058357600080fd5b506102cb6118fa565b34801561059857600080fd5b506103006105a7366004613b5e565b61195a565b3480156105b857600080fd5b50600b5461043a906001600160a01b031681565b3480156105d857600080fd5b506103006105e7366004613b7b565b6119d1565b3480156105f857600080fd5b506102cb611b3f565b34801561060d57600080fd5b506102a661061c366004613bc7565b611bd1565b34801561062d57600080fd5b5061030061063c366004613b1c565b611caa565b34801561064d57600080fd5b5061030061065c366004613bf5565b611deb565b34801561066d57600080fd5b5061030061067c366004613cda565b611f66565b34801561068d57600080fd5b5061030061069c366004613b5e565b612001565b3480156106ad57600080fd5b506102737f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c981565b60006001600160a01b0383166107585760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b600061077b826120ce565b6009805461079990613d43565b80601f01602080910402602001604051908101604052809291908181526020018280546107c590613d43565b80156108125780601f106107e757610100808354040283529160200191610812565b820191906000526020600020905b8154815290600101906020018083116107f557829003601f168201915b505050505081565b6000818152600d6020526040902080546060919061083790613d43565b80601f016020809104026020016040519081016040528092919081815260200182805461086390613d43565b80156108b05780601f10610885576101008083540402835291602001916108b0565b820191906000526020600020905b81548152906001019060200180831161089357829003601f168201915b50505050509050919050565b6003546001600160a01b031633146109045760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b47806109525760405162461bcd60e51b815260206004820152601660248201527f4e6f2062616c616e636520746f20776974686472617700000000000000000000604482015260640161074f565b604051600090734912b5f460eada85b4239c2ff174221494b0f8fa9083908381818185875af1925050503d80600081146109a8576040519150601f19603f3d011682016040523d82523d6000602084013e6109ad565b606091505b50509050806109fe5760405162461bcd60e51b815260206004820152600f60248201527f5769746864726177206661696c65640000000000000000000000000000000000604482015260640161074f565b4715610a0c57610a0c613d7d565b5050565b604080518082019091526006546001600160a01b038116808352600160a01b90910462ffffff1660208301819052909160009161271090610a519086613da9565b610a5b9190613dde565b9150509250929050565b6001600160a01b038516331480610a815750610a818533611bd1565b610af35760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161074f565b610b00858585858561210c565b5050505050565b6003546001600160a01b03163314610b4f5760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b828114610b9e5760405162461bcd60e51b815260206004820152601660248201527f46697820696e6974696174696f6e20706172616d732e00000000000000000000604482015260640161074f565b8260005b81811015610d1957600d6000878784818110610bc057610bc0613df2565b602090810292909201358352508101919091526040016000206002015460ff1615610c2d5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c7265616479206578697374732e0000000000000000000000604482015260640161074f565b610c7833878784818110610c4357610c43613df2565b90506020020135868685818110610c5c57610c5c613df2565b9050602002013560405180602001604052806000815250612377565b6001600d6000888885818110610c9057610c90613df2565b90506020020135815260200190815260200160002060020160006101000a81548160ff0219169083151502179055506001600d6000888885818110610cd757610cd7613df2565b90506020020135815260200190815260200160002060020160016101000a81548160ff0219169083151502179055508080610d1190613e08565b915050610ba2565b505050505050565b60608151835114610d9a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161074f565b6000835167ffffffffffffffff811115610db657610db6613633565b604051908082528060200260200182016040528015610ddf578160200160208202803683370190505b50905060005b8451811015610e5757610e2a858281518110610e0357610e03613df2565b6020026020010151858381518110610e1d57610e1d613df2565b60200260200101516106d5565b828281518110610e3c57610e3c613df2565b6020908102919091010152610e5081613e08565b9050610de5565b509392505050565b6003546001600160a01b03163314610ea75760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b610eb1600061249d565b565b6003546001600160a01b03163314610efb5760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b610a0c82826124fc565b600454829082906001600160a01b0316610f615760405162461bcd60e51b815260206004820152601560248201527f77686974656c697374206e6f7420656e61626c65640000000000000000000000604482015260640161074f565b600554604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c9602082015233918101919091526000919060600160405160208183030381529060405280519060200120604051602001610fda92919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050600061103684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506125b09050565b6004549091506001600160a01b038083169116146110965760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015260640161074f565b6000878152600d6020908152604080832033845260010190915290205460ff16156111035760405162461bcd60e51b815260206004820152601c60248201527f557365722072656465656d65642052616e647920616c72656164792e00000000604482015260640161074f565b6000878152600d602052604090206002015460ff166111645760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f65736e27742065786973742e000000000000000000000000604482015260640161074f565b6000878152600d6020526040902060020154610100900460ff16156111cb5760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973207061757365642e0000000000000000000000000000604482015260640161074f565b6111e73388600160405180602001604052806000815250612377565b50505060009384525050600d602090815260408084203385526001908101909252909220805460ff191690921790915550565b6003546001600160a01b031633146112625760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b8051610a0c90600890602084019061345f565b600a805461079990613d43565b6003546001600160a01b031633146112ca5760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b600c5460005b8181101561138357600d6000600c83815481106112ef576112ef613df2565b9060005260206000200154815260200190815260200160002060020160019054906101000a900460ff1615156000151503611371576001600d6000600c848154811061133d5761133d613df2565b9060005260206000200154815260200190815260200160002060020160016101000a81548160ff0219169083151502179055505b8061137b81613e08565b9150506112d0565b50611390600c60006134e3565b50565b610a0c3383836125cc565b6003546001600160a01b031633146113e65760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b8060005b8181101561143a57600c84848381811061140657611406613df2565b835460018101855560009485526020948590209190940292909201359190920155508061143281613e08565b9150506113ea565b50505050565b6007546060906114529060ff166126c0565b905090565b6000818152600d6020526040812060020154610100900460ff16151560010361148257506001919050565b506000919050565b6003546001600160a01b031633146114d25760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b600b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b610a0c3383836128b7565b600c5460005b818110156115e357600d6000600c838154811061153157611531613df2565b60009182526020808320909101548352828101939093526040918201812033825260010190925290205460ff16156115d15760405162461bcd60e51b815260206004820152602260248201527f5573657220616c7265616479206f776e732061204c696d697465642052616e6460448201527f792e000000000000000000000000000000000000000000000000000000000000606482015260840161074f565b806115db81613e08565b915050611512565b50600454839083906001600160a01b03166116405760405162461bcd60e51b815260206004820152601560248201527f77686974656c697374206e6f7420656e61626c65640000000000000000000000604482015260640161074f565b600554604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c96020820152339181019190915260009190606001604051602081830303815290604052805190602001206040516020016116b992919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050600061171584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506125b09050565b6004549091506001600160a01b038083169116146117755760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015260640161074f565b6000888152600d6020908152604080832033845260010190915290205460ff16156117e25760405162461bcd60e51b815260206004820152601c60248201527f557365722072656465656d65642052616e647920616c72656164792e00000000604482015260640161074f565b6000888152600d602052604090206002015460ff166118435760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f65736e27742065786973742e000000000000000000000000604482015260640161074f565b6000888152600d6020526040902060020154610100900460ff16156118aa5760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973207061757365642e0000000000000000000000000000604482015260640161074f565b6118c63389600160405180602001604052806000815250612377565b50505060009485525050600d602090815260408085203386526001908101909252909320805460ff19169093179092555050565b6060604051806060016040528060318152602001614043603191396007546119359060ff166005811115611930576119306139ef565b612a64565b604051602001611946929190613e21565b604051602081830303815290604052905090565b6003546001600160a01b031633146119a25760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6003546001600160a01b03163314611a195760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b6000818152600d6020526040902060020154829060ff16611a7c5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f65736e27742065786973742e000000000000000000000000604482015260640161074f565b60005b81811015610b0057611ac9858583818110611a9c57611a9c613df2565b9050602002016020810190611ab19190613b5e565b84600160405180602001604052806000815250612377565b6000838152600d6020526040812060019190820190878785818110611af057611af0613df2565b9050602002016020810190611b059190613b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611b3781613e08565b915050611a7f565b606060088054611b4e90613d43565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7a90613d43565b8015611bc75780601f10611b9c57610100808354040283529160200191611bc7565b820191906000526020600020905b815481529060010190602001808311611baa57829003601f168201915b5050505050905090565b600b546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c609190613e50565b6001600160a01b031603611c7857600191505061077b565b6001600160a01b0380851660009081526001602090815260408083209387168352929052205460ff165b949350505050565b6003546001600160a01b03163314611cf25760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b8060005b8181101561143a57600d6000858584818110611d1457611d14613df2565b90506020020135815260200190815260200160002060020160019054906101000a900460ff1615156001151503611d91576000600d6000868685818110611d5d57611d5d613df2565b90506020020135815260200190815260200160002060020160016101000a81548160ff021916908315150217905550611dd9565b6001600d6000868685818110611da957611da9613df2565b90506020020135815260200190815260200160002060020160016101000a81548160ff0219169083151502179055505b80611de381613e08565b915050611cf6565b6003546001600160a01b03163314611e335760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b80518214611e835760405162461bcd60e51b815260206004820152601660248201527f46697820696e6974696174696f6e20706172616d732e00000000000000000000604482015260640161074f565b8160005b81811015610b0057828181518110611ea157611ea1613df2565b6020026020010151600d6000878785818110611ebf57611ebf613df2565b9050602002013581526020019081526020016000206000019080519060200190611eea92919061345f565b50848482818110611efd57611efd613df2565b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b848381518110611f3757611f37613df2565b6020026020010151604051611f4c91906135e5565b60405180910390a280611f5e81613e08565b915050611e87565b6001600160a01b038516331480611f825750611f828533611bd1565b611ff45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161074f565b610b008585858585612b99565b6003546001600160a01b031633146120495760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b6001600160a01b0381166120c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161074f565b6113908161249d565b60006001600160e01b031982167f649a51a800000000000000000000000000000000000000000000000000000000148061077b575061077b82612d37565b81518351146121835760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161074f565b6001600160a01b0384166121e75760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161074f565b3360005b845181101561231157600085828151811061220857612208613df2565b60200260200101519050600085838151811061222657612226613df2565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156122b95760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161074f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906122f6908490613e6d565b925050819055505050508061230a90613e08565b90506121eb565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612361929190613e85565b60405180910390a4610d19818787878787612d75565b6001600160a01b0384166123f35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161074f565b3361240d8160008761240488612f1a565b610b0088612f1a565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061243d908490613e6d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610b0081600087878787612f65565b600380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61271081111561254e5760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f2068696768000000000000604482015260640161074f565b604080518082019091526001600160a01b0390921680835262ffffff909116602090920182905260068054600160a01b9093027fffffffffffffffffff0000000000000000000000000000000000000000000000909316909117919091179055565b60008060006125bf8585613061565b91509150610e57816130cf565b816001600160a01b0316836001600160a01b0316036126535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161074f565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606060068260058111156126d6576126d66139ef565b60ff1611156126e457600080fd5b8160058111156126f6576126f66139ef565b60000361273657505060408051808201909152600781527f4342455f43433000000000000000000000000000000000000000000000000000602082015290565b816005811115612748576127486139ef565b60010361278857505060408051808201909152600781527f4342455f45435200000000000000000000000000000000000000000000000000602082015290565b81600581111561279a5761279a6139ef565b6002036127da57505060408051808201909152600881527f4342455f4e454352000000000000000000000000000000000000000000000000602082015290565b8160058111156127ec576127ec6139ef565b60030361282c57505060408051808201909152600b81527f4342455f4e4543525f4853000000000000000000000000000000000000000000602082015290565b81600581111561283e5761283e6139ef565b60040361287e57505060408051808201909152600681527f4342455f50520000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600981527f4342455f50525f48530000000000000000000000000000000000000000000000602082015290565b6001600160a01b0383166129335760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161074f565b336129638185600061294487612f1a565b61294d87612f1a565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156129f95760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161074f565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b606081600003612aa757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ad15780612abb81613e08565b9150612aca9050600a83613dde565b9150612aab565b60008167ffffffffffffffff811115612aec57612aec613633565b6040519080825280601f01601f191660200182016040528015612b16576020820181803683370190505b5090505b8415611ca257612b2b600183613eb3565b9150612b38600a86613eca565b612b43906030613e6d565b60f81b818381518110612b5857612b58613df2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b92600a86613dde565b9450612b1a565b6001600160a01b038416612bfd5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161074f565b33612c0d81878761240488612f1a565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612c915760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161074f565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612cce908490613e6d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612d2e828888888888612f65565b50505050505050565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061077b575061077b82613285565b6001600160a01b0384163b15610d195760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612db99089908990889088908890600401613ede565b6020604051808303816000875af1925050508015612df4575060408051601f3d908101601f19168201909252612df191810190613f3c565b60015b612ea957612e00613f59565b806308c379a003612e395750612e14613f75565b80612e1f5750612e3b565b8060405162461bcd60e51b815260040161074f91906135e5565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161074f565b6001600160e01b0319811663bc197c8160e01b14612d2e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161074f565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612f5457612f54613df2565b602090810291909101015292915050565b6001600160a01b0384163b15610d195760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612fa99089908990889088908890600401613fff565b6020604051808303816000875af1925050508015612fe4575060408051601f3d908101601f19168201909252612fe191810190613f3c565b60015b612ff057612e00613f59565b6001600160e01b0319811663f23a6e6160e01b14612d2e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161074f565b60008082516041036130975760208301516040840151606085015160001a61308b87828585613320565b945094505050506130c8565b82516040036130c057602083015160408401516130b586838361340d565b9350935050506130c8565b506000905060025b9250929050565b60008160048111156130e3576130e36139ef565b036130eb5750565b60018160048111156130ff576130ff6139ef565b0361314c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161074f565b6002816004811115613160576131606139ef565b036131ad5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161074f565b60038160048111156131c1576131c16139ef565b036132195760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161074f565b600481600481111561322d5761322d6139ef565b036113905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161074f565b60006001600160e01b031982167fd9b67a260000000000000000000000000000000000000000000000000000000014806132e857506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061077b57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461077b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156133575750600090506003613404565b8460ff16601b1415801561336f57508460ff16601c14155b156133805750600090506004613404565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133d4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133fd57600060019250925050613404565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161344360ff86901c601b613e6d565b905061345187828885613320565b935093505050935093915050565b82805461346b90613d43565b90600052602060002090601f01602090048101928261348d57600085556134d3565b82601f106134a657805160ff19168380011785556134d3565b828001600101855582156134d3579182015b828111156134d35782518255916020019190600101906134b8565b506134df9291506134fd565b5090565b508054600082559060005260206000209081019061139091905b5b808211156134df57600081556001016134fe565b6001600160a01b038116811461139057600080fd5b6000806040838503121561353a57600080fd5b823561354581613512565b946020939093013593505050565b6001600160e01b03198116811461139057600080fd5b60006020828403121561357b57600080fd5b813561358681613553565b9392505050565b60005b838110156135a8578181015183820152602001613590565b8381111561143a5750506000910152565b600081518084526135d181602086016020860161358d565b601f01601f19169290920160200192915050565b60208152600061358660208301846135b9565b60006020828403121561360a57600080fd5b5035919050565b6000806040838503121561362457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561366f5761366f613633565b6040525050565b600067ffffffffffffffff82111561369057613690613633565b5060051b60200190565b600082601f8301126136ab57600080fd5b813560206136b882613676565b6040516136c58282613649565b83815260059390931b85018201928281019150868411156136e557600080fd5b8286015b8481101561370057803583529183019183016136e9565b509695505050505050565b600082601f83011261371c57600080fd5b813567ffffffffffffffff81111561373657613736613633565b60405161374d601f8301601f191660200182613649565b81815284602083860101111561376257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561379757600080fd5b85356137a281613512565b945060208601356137b281613512565b9350604086013567ffffffffffffffff808211156137cf57600080fd5b6137db89838a0161369a565b945060608801359150808211156137f157600080fd5b6137fd89838a0161369a565b9350608088013591508082111561381357600080fd5b506138208882890161370b565b9150509295509295909350565b60008083601f84011261383f57600080fd5b50813567ffffffffffffffff81111561385757600080fd5b6020830191508360208260051b85010111156130c857600080fd5b6000806000806040858703121561388857600080fd5b843567ffffffffffffffff808211156138a057600080fd5b6138ac8883890161382d565b909650945060208701359150808211156138c557600080fd5b506138d28782880161382d565b95989497509550505050565b600080604083850312156138f157600080fd5b823567ffffffffffffffff8082111561390957600080fd5b818501915085601f83011261391d57600080fd5b8135602061392a82613676565b6040516139378282613649565b83815260059390931b850182019282810191508984111561395757600080fd5b948201945b8386101561397e57853561396f81613512565b8252948201949082019061395c565b9650508601359250508082111561399457600080fd5b50610a5b8582860161369a565b600081518084526020808501945080840160005b838110156139d1578151875295820195908201906001016139b5565b509495945050505050565b60208152600061358660208301846139a1565b634e487b7160e01b600052602160045260246000fd5b6020810160068310613a2757634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060408486031215613a4257600080fd5b83359250602084013567ffffffffffffffff80821115613a6157600080fd5b818601915086601f830112613a7557600080fd5b813581811115613a8457600080fd5b876020828501011115613a9657600080fd5b6020830194508093505050509250925092565b600060208284031215613abb57600080fd5b813567ffffffffffffffff811115613ad257600080fd5b611ca28482850161370b565b60008060408385031215613af157600080fd5b8235613afc81613512565b915060208301358015158114613b1157600080fd5b809150509250929050565b60008060208385031215613b2f57600080fd5b823567ffffffffffffffff811115613b4657600080fd5b613b528582860161382d565b90969095509350505050565b600060208284031215613b7057600080fd5b813561358681613512565b600080600060408486031215613b9057600080fd5b833567ffffffffffffffff811115613ba757600080fd5b613bb38682870161382d565b909790965060209590950135949350505050565b60008060408385031215613bda57600080fd5b8235613be581613512565b91506020830135613b1181613512565b600080600060408486031215613c0a57600080fd5b833567ffffffffffffffff80821115613c2257600080fd5b613c2e8783880161382d565b9095509350602091508582013581811115613c4857600080fd5b8601601f81018813613c5957600080fd5b8035613c6481613676565b604051613c718282613649565b82815260059290921b830185019185810191508a831115613c9157600080fd5b8584015b83811015613cc957803586811115613cad5760008081fd5b613cbb8d898389010161370b565b845250918601918601613c95565b508096505050505050509250925092565b600080600080600060a08688031215613cf257600080fd5b8535613cfd81613512565b94506020860135613d0d81613512565b93506040860135925060608601359150608086013567ffffffffffffffff811115613d3757600080fd5b6138208882890161370b565b600181811c90821680613d5757607f821691505b602082108103613d7757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613dc357613dc3613d93565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613ded57613ded613dc8565b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201613e1a57613e1a613d93565b5060010190565b60008351613e3381846020880161358d565b835190830190613e4781836020880161358d565b01949350505050565b600060208284031215613e6257600080fd5b815161358681613512565b60008219821115613e8057613e80613d93565b500190565b604081526000613e9860408301856139a1565b8281036020840152613eaa81856139a1565b95945050505050565b600082821015613ec557613ec5613d93565b500390565b600082613ed957613ed9613dc8565b500690565b60006001600160a01b03808816835280871660208401525060a06040830152613f0a60a08301866139a1565b8281036060840152613f1c81866139a1565b90508281036080840152613f3081856135b9565b98975050505050505050565b600060208284031215613f4e57600080fd5b815161358681613553565b600060033d1115613f725760046000803e5060005160e01c5b90565b600060443d1015613f835790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715613fb357505050505090565b8285019150815181811115613fcb5750505050505090565b843d8701016020828501011115613fe55750505050505090565b613ff460208286010187613649565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261403760a08301846135b9565b97965050505050505056fe61723a2f2f5f44396b4e3157724e576243713535425341475262544234625333763851415054596d42546853625833412f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220ea3bee310da8b4012aa2da1f2cc62ca4e00a406014eef5713d01fa301ba530cf64736f6c634300080e0033000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004d68747470733a2f2f6173736574732e6d69736e6674732e696f2f697066732f516d557950334846427345756178756b47556e4847787a33624c624a3831544b7354776336395874325464426d7400000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061024e5760003560e01c8063a22cb46511610138578063cd7c0326116100b0578063f053807a1161007f578063f242432a11610064578063f242432a14610661578063f2fde38b14610681578063fa4d280c146106a157600080fd5b8063f053807a14610621578063f1f11fc91461064157600080fd5b8063cd7c0326146105ac578063da8444c8146105cc578063e8a3d485146105ec578063e985e9c51461060157600080fd5b8063adfdeef911610107578063c21d8875116100ec578063c21d887514610564578063c7db289314610577578063cd7708331461058c57600080fd5b8063adfdeef914610524578063b390c0ab1461054457600080fd5b8063a22cb465146104af578063a2db55c0146104cf578063a341793b146104ef578063aaec62971461050457600080fd5b80634e1273f4116101cb5780638da5cb5b1161019a578063938e3d7b1161017f578063938e3d7b1461046557806395d89b41146104855780639dd39ea31461049a57600080fd5b80638da5cb5b14610420578063924835e61461045257600080fd5b80634e1273f41461039757806350a5292f146103c4578063715018a6146103eb5780638c7ea24b1461040057600080fd5b806324600fc3116102225780632eb2c2d6116102075780632eb2c2d6146103415780633644e515146103615780634a4e1f781461037757600080fd5b806324600fc3146102f85780632a55205a1461030257600080fd5b8062fdd58e1461025357806301ffc9a71461028657806306fdde03146102b65780630e89341c146102d8575b600080fd5b34801561025f57600080fd5b5061027361026e366004613527565b6106d5565b6040519081526020015b60405180910390f35b34801561029257600080fd5b506102a66102a1366004613569565b610781565b604051901515815260200161027d565b3480156102c257600080fd5b506102cb61078c565b60405161027d91906135e5565b3480156102e457600080fd5b506102cb6102f33660046135f8565b61081a565b6103006108bc565b005b34801561030e57600080fd5b5061032261031d366004613611565b610a10565b604080516001600160a01b03909316835260208301919091520161027d565b34801561034d57600080fd5b5061030061035c36600461377f565b610a65565b34801561036d57600080fd5b5061027360055481565b34801561038357600080fd5b50610300610392366004613872565b610b07565b3480156103a357600080fd5b506103b76103b23660046138de565b610d21565b60405161027d91906139dc565b3480156103d057600080fd5b506007546103de9060ff1681565b60405161027d9190613a05565b3480156103f757600080fd5b50610300610e5f565b34801561040c57600080fd5b5061030061041b366004613527565b610eb3565b34801561042c57600080fd5b506003546001600160a01b03165b6040516001600160a01b03909116815260200161027d565b610300610460366004613a2d565b610f05565b34801561047157600080fd5b50610300610480366004613aa9565b61121a565b34801561049157600080fd5b506102cb611275565b3480156104a657600080fd5b50610300611282565b3480156104bb57600080fd5b506103006104ca366004613ade565b611393565b3480156104db57600080fd5b506103006104ea366004613b1c565b61139e565b3480156104fb57600080fd5b506102cb611440565b34801561051057600080fd5b506102a661051f3660046135f8565b611457565b34801561053057600080fd5b5061030061053f366004613b5e565b61148a565b34801561055057600080fd5b5061030061055f366004613611565b611501565b610300610572366004613a2d565b61150c565b34801561058357600080fd5b506102cb6118fa565b34801561059857600080fd5b506103006105a7366004613b5e565b61195a565b3480156105b857600080fd5b50600b5461043a906001600160a01b031681565b3480156105d857600080fd5b506103006105e7366004613b7b565b6119d1565b3480156105f857600080fd5b506102cb611b3f565b34801561060d57600080fd5b506102a661061c366004613bc7565b611bd1565b34801561062d57600080fd5b5061030061063c366004613b1c565b611caa565b34801561064d57600080fd5b5061030061065c366004613bf5565b611deb565b34801561066d57600080fd5b5061030061067c366004613cda565b611f66565b34801561068d57600080fd5b5061030061069c366004613b5e565b612001565b3480156106ad57600080fd5b506102737f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c981565b60006001600160a01b0383166107585760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b600061077b826120ce565b6009805461079990613d43565b80601f01602080910402602001604051908101604052809291908181526020018280546107c590613d43565b80156108125780601f106107e757610100808354040283529160200191610812565b820191906000526020600020905b8154815290600101906020018083116107f557829003601f168201915b505050505081565b6000818152600d6020526040902080546060919061083790613d43565b80601f016020809104026020016040519081016040528092919081815260200182805461086390613d43565b80156108b05780601f10610885576101008083540402835291602001916108b0565b820191906000526020600020905b81548152906001019060200180831161089357829003601f168201915b50505050509050919050565b6003546001600160a01b031633146109045760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b47806109525760405162461bcd60e51b815260206004820152601660248201527f4e6f2062616c616e636520746f20776974686472617700000000000000000000604482015260640161074f565b604051600090734912b5f460eada85b4239c2ff174221494b0f8fa9083908381818185875af1925050503d80600081146109a8576040519150601f19603f3d011682016040523d82523d6000602084013e6109ad565b606091505b50509050806109fe5760405162461bcd60e51b815260206004820152600f60248201527f5769746864726177206661696c65640000000000000000000000000000000000604482015260640161074f565b4715610a0c57610a0c613d7d565b5050565b604080518082019091526006546001600160a01b038116808352600160a01b90910462ffffff1660208301819052909160009161271090610a519086613da9565b610a5b9190613dde565b9150509250929050565b6001600160a01b038516331480610a815750610a818533611bd1565b610af35760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161074f565b610b00858585858561210c565b5050505050565b6003546001600160a01b03163314610b4f5760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b828114610b9e5760405162461bcd60e51b815260206004820152601660248201527f46697820696e6974696174696f6e20706172616d732e00000000000000000000604482015260640161074f565b8260005b81811015610d1957600d6000878784818110610bc057610bc0613df2565b602090810292909201358352508101919091526040016000206002015460ff1615610c2d5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20616c7265616479206578697374732e0000000000000000000000604482015260640161074f565b610c7833878784818110610c4357610c43613df2565b90506020020135868685818110610c5c57610c5c613df2565b9050602002013560405180602001604052806000815250612377565b6001600d6000888885818110610c9057610c90613df2565b90506020020135815260200190815260200160002060020160006101000a81548160ff0219169083151502179055506001600d6000888885818110610cd757610cd7613df2565b90506020020135815260200190815260200160002060020160016101000a81548160ff0219169083151502179055508080610d1190613e08565b915050610ba2565b505050505050565b60608151835114610d9a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161074f565b6000835167ffffffffffffffff811115610db657610db6613633565b604051908082528060200260200182016040528015610ddf578160200160208202803683370190505b50905060005b8451811015610e5757610e2a858281518110610e0357610e03613df2565b6020026020010151858381518110610e1d57610e1d613df2565b60200260200101516106d5565b828281518110610e3c57610e3c613df2565b6020908102919091010152610e5081613e08565b9050610de5565b509392505050565b6003546001600160a01b03163314610ea75760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b610eb1600061249d565b565b6003546001600160a01b03163314610efb5760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b610a0c82826124fc565b600454829082906001600160a01b0316610f615760405162461bcd60e51b815260206004820152601560248201527f77686974656c697374206e6f7420656e61626c65640000000000000000000000604482015260640161074f565b600554604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c9602082015233918101919091526000919060600160405160208183030381529060405280519060200120604051602001610fda92919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050600061103684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506125b09050565b6004549091506001600160a01b038083169116146110965760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015260640161074f565b6000878152600d6020908152604080832033845260010190915290205460ff16156111035760405162461bcd60e51b815260206004820152601c60248201527f557365722072656465656d65642052616e647920616c72656164792e00000000604482015260640161074f565b6000878152600d602052604090206002015460ff166111645760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f65736e27742065786973742e000000000000000000000000604482015260640161074f565b6000878152600d6020526040902060020154610100900460ff16156111cb5760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973207061757365642e0000000000000000000000000000604482015260640161074f565b6111e73388600160405180602001604052806000815250612377565b50505060009384525050600d602090815260408084203385526001908101909252909220805460ff191690921790915550565b6003546001600160a01b031633146112625760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b8051610a0c90600890602084019061345f565b600a805461079990613d43565b6003546001600160a01b031633146112ca5760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b600c5460005b8181101561138357600d6000600c83815481106112ef576112ef613df2565b9060005260206000200154815260200190815260200160002060020160019054906101000a900460ff1615156000151503611371576001600d6000600c848154811061133d5761133d613df2565b9060005260206000200154815260200190815260200160002060020160016101000a81548160ff0219169083151502179055505b8061137b81613e08565b9150506112d0565b50611390600c60006134e3565b50565b610a0c3383836125cc565b6003546001600160a01b031633146113e65760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b8060005b8181101561143a57600c84848381811061140657611406613df2565b835460018101855560009485526020948590209190940292909201359190920155508061143281613e08565b9150506113ea565b50505050565b6007546060906114529060ff166126c0565b905090565b6000818152600d6020526040812060020154610100900460ff16151560010361148257506001919050565b506000919050565b6003546001600160a01b031633146114d25760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b600b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b610a0c3383836128b7565b600c5460005b818110156115e357600d6000600c838154811061153157611531613df2565b60009182526020808320909101548352828101939093526040918201812033825260010190925290205460ff16156115d15760405162461bcd60e51b815260206004820152602260248201527f5573657220616c7265616479206f776e732061204c696d697465642052616e6460448201527f792e000000000000000000000000000000000000000000000000000000000000606482015260840161074f565b806115db81613e08565b915050611512565b50600454839083906001600160a01b03166116405760405162461bcd60e51b815260206004820152601560248201527f77686974656c697374206e6f7420656e61626c65640000000000000000000000604482015260640161074f565b600554604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c96020820152339181019190915260009190606001604051602081830303815290604052805190602001206040516020016116b992919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050600061171584848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506125b09050565b6004549091506001600160a01b038083169116146117755760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015260640161074f565b6000888152600d6020908152604080832033845260010190915290205460ff16156117e25760405162461bcd60e51b815260206004820152601c60248201527f557365722072656465656d65642052616e647920616c72656164792e00000000604482015260640161074f565b6000888152600d602052604090206002015460ff166118435760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f65736e27742065786973742e000000000000000000000000604482015260640161074f565b6000888152600d6020526040902060020154610100900460ff16156118aa5760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973207061757365642e0000000000000000000000000000604482015260640161074f565b6118c63389600160405180602001604052806000815250612377565b50505060009485525050600d602090815260408085203386526001908101909252909320805460ff19169093179092555050565b6060604051806060016040528060318152602001614043603191396007546119359060ff166005811115611930576119306139ef565b612a64565b604051602001611946929190613e21565b604051602081830303815290604052905090565b6003546001600160a01b031633146119a25760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b6004805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6003546001600160a01b03163314611a195760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b6000818152600d6020526040902060020154829060ff16611a7c5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f65736e27742065786973742e000000000000000000000000604482015260640161074f565b60005b81811015610b0057611ac9858583818110611a9c57611a9c613df2565b9050602002016020810190611ab19190613b5e565b84600160405180602001604052806000815250612377565b6000838152600d6020526040812060019190820190878785818110611af057611af0613df2565b9050602002016020810190611b059190613b5e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611b3781613e08565b915050611a7f565b606060088054611b4e90613d43565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7a90613d43565b8015611bc75780601f10611b9c57610100808354040283529160200191611bc7565b820191906000526020600020905b815481529060010190602001808311611baa57829003601f168201915b5050505050905090565b600b546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611c3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c609190613e50565b6001600160a01b031603611c7857600191505061077b565b6001600160a01b0380851660009081526001602090815260408083209387168352929052205460ff165b949350505050565b6003546001600160a01b03163314611cf25760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b8060005b8181101561143a57600d6000858584818110611d1457611d14613df2565b90506020020135815260200190815260200160002060020160019054906101000a900460ff1615156001151503611d91576000600d6000868685818110611d5d57611d5d613df2565b90506020020135815260200190815260200160002060020160016101000a81548160ff021916908315150217905550611dd9565b6001600d6000868685818110611da957611da9613df2565b90506020020135815260200190815260200160002060020160016101000a81548160ff0219169083151502179055505b80611de381613e08565b915050611cf6565b6003546001600160a01b03163314611e335760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b80518214611e835760405162461bcd60e51b815260206004820152601660248201527f46697820696e6974696174696f6e20706172616d732e00000000000000000000604482015260640161074f565b8160005b81811015610b0057828181518110611ea157611ea1613df2565b6020026020010151600d6000878785818110611ebf57611ebf613df2565b9050602002013581526020019081526020016000206000019080519060200190611eea92919061345f565b50848482818110611efd57611efd613df2565b905060200201357f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b848381518110611f3757611f37613df2565b6020026020010151604051611f4c91906135e5565b60405180910390a280611f5e81613e08565b915050611e87565b6001600160a01b038516331480611f825750611f828533611bd1565b611ff45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161074f565b610b008585858585612b99565b6003546001600160a01b031633146120495760405162461bcd60e51b81526020600482018190526024820152600080516020614074833981519152604482015260640161074f565b6001600160a01b0381166120c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161074f565b6113908161249d565b60006001600160e01b031982167f649a51a800000000000000000000000000000000000000000000000000000000148061077b575061077b82612d37565b81518351146121835760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161074f565b6001600160a01b0384166121e75760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161074f565b3360005b845181101561231157600085828151811061220857612208613df2565b60200260200101519050600085838151811061222657612226613df2565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156122b95760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161074f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906122f6908490613e6d565b925050819055505050508061230a90613e08565b90506121eb565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612361929190613e85565b60405180910390a4610d19818787878787612d75565b6001600160a01b0384166123f35760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161074f565b3361240d8160008761240488612f1a565b610b0088612f1a565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061243d908490613e6d565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610b0081600087878787612f65565b600380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61271081111561254e5760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f2068696768000000000000604482015260640161074f565b604080518082019091526001600160a01b0390921680835262ffffff909116602090920182905260068054600160a01b9093027fffffffffffffffffff0000000000000000000000000000000000000000000000909316909117919091179055565b60008060006125bf8585613061565b91509150610e57816130cf565b816001600160a01b0316836001600160a01b0316036126535760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161074f565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606060068260058111156126d6576126d66139ef565b60ff1611156126e457600080fd5b8160058111156126f6576126f66139ef565b60000361273657505060408051808201909152600781527f4342455f43433000000000000000000000000000000000000000000000000000602082015290565b816005811115612748576127486139ef565b60010361278857505060408051808201909152600781527f4342455f45435200000000000000000000000000000000000000000000000000602082015290565b81600581111561279a5761279a6139ef565b6002036127da57505060408051808201909152600881527f4342455f4e454352000000000000000000000000000000000000000000000000602082015290565b8160058111156127ec576127ec6139ef565b60030361282c57505060408051808201909152600b81527f4342455f4e4543525f4853000000000000000000000000000000000000000000602082015290565b81600581111561283e5761283e6139ef565b60040361287e57505060408051808201909152600681527f4342455f50520000000000000000000000000000000000000000000000000000602082015290565b505060408051808201909152600981527f4342455f50525f48530000000000000000000000000000000000000000000000602082015290565b6001600160a01b0383166129335760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161074f565b336129638185600061294487612f1a565b61294d87612f1a565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156129f95760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c60448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161074f565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b606081600003612aa757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ad15780612abb81613e08565b9150612aca9050600a83613dde565b9150612aab565b60008167ffffffffffffffff811115612aec57612aec613633565b6040519080825280601f01601f191660200182016040528015612b16576020820181803683370190505b5090505b8415611ca257612b2b600183613eb3565b9150612b38600a86613eca565b612b43906030613e6d565b60f81b818381518110612b5857612b58613df2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b92600a86613dde565b9450612b1a565b6001600160a01b038416612bfd5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161074f565b33612c0d81878761240488612f1a565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612c915760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161074f565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290612cce908490613e6d565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612d2e828888888888612f65565b50505050505050565b60006001600160e01b031982167f2a55205a00000000000000000000000000000000000000000000000000000000148061077b575061077b82613285565b6001600160a01b0384163b15610d195760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612db99089908990889088908890600401613ede565b6020604051808303816000875af1925050508015612df4575060408051601f3d908101601f19168201909252612df191810190613f3c565b60015b612ea957612e00613f59565b806308c379a003612e395750612e14613f75565b80612e1f5750612e3b565b8060405162461bcd60e51b815260040161074f91906135e5565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161074f565b6001600160e01b0319811663bc197c8160e01b14612d2e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161074f565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612f5457612f54613df2565b602090810291909101015292915050565b6001600160a01b0384163b15610d195760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612fa99089908990889088908890600401613fff565b6020604051808303816000875af1925050508015612fe4575060408051601f3d908101601f19168201909252612fe191810190613f3c565b60015b612ff057612e00613f59565b6001600160e01b0319811663f23a6e6160e01b14612d2e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161074f565b60008082516041036130975760208301516040840151606085015160001a61308b87828585613320565b945094505050506130c8565b82516040036130c057602083015160408401516130b586838361340d565b9350935050506130c8565b506000905060025b9250929050565b60008160048111156130e3576130e36139ef565b036130eb5750565b60018160048111156130ff576130ff6139ef565b0361314c5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161074f565b6002816004811115613160576131606139ef565b036131ad5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161074f565b60038160048111156131c1576131c16139ef565b036132195760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161074f565b600481600481111561322d5761322d6139ef565b036113905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161074f565b60006001600160e01b031982167fd9b67a260000000000000000000000000000000000000000000000000000000014806132e857506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061077b57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461077b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156133575750600090506003613404565b8460ff16601b1415801561336f57508460ff16601c14155b156133805750600090506004613404565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133d4573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133fd57600060019250925050613404565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161344360ff86901c601b613e6d565b905061345187828885613320565b935093505050935093915050565b82805461346b90613d43565b90600052602060002090601f01602090048101928261348d57600085556134d3565b82601f106134a657805160ff19168380011785556134d3565b828001600101855582156134d3579182015b828111156134d35782518255916020019190600101906134b8565b506134df9291506134fd565b5090565b508054600082559060005260206000209081019061139091905b5b808211156134df57600081556001016134fe565b6001600160a01b038116811461139057600080fd5b6000806040838503121561353a57600080fd5b823561354581613512565b946020939093013593505050565b6001600160e01b03198116811461139057600080fd5b60006020828403121561357b57600080fd5b813561358681613553565b9392505050565b60005b838110156135a8578181015183820152602001613590565b8381111561143a5750506000910152565b600081518084526135d181602086016020860161358d565b601f01601f19169290920160200192915050565b60208152600061358660208301846135b9565b60006020828403121561360a57600080fd5b5035919050565b6000806040838503121561362457600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561366f5761366f613633565b6040525050565b600067ffffffffffffffff82111561369057613690613633565b5060051b60200190565b600082601f8301126136ab57600080fd5b813560206136b882613676565b6040516136c58282613649565b83815260059390931b85018201928281019150868411156136e557600080fd5b8286015b8481101561370057803583529183019183016136e9565b509695505050505050565b600082601f83011261371c57600080fd5b813567ffffffffffffffff81111561373657613736613633565b60405161374d601f8301601f191660200182613649565b81815284602083860101111561376257600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561379757600080fd5b85356137a281613512565b945060208601356137b281613512565b9350604086013567ffffffffffffffff808211156137cf57600080fd5b6137db89838a0161369a565b945060608801359150808211156137f157600080fd5b6137fd89838a0161369a565b9350608088013591508082111561381357600080fd5b506138208882890161370b565b9150509295509295909350565b60008083601f84011261383f57600080fd5b50813567ffffffffffffffff81111561385757600080fd5b6020830191508360208260051b85010111156130c857600080fd5b6000806000806040858703121561388857600080fd5b843567ffffffffffffffff808211156138a057600080fd5b6138ac8883890161382d565b909650945060208701359150808211156138c557600080fd5b506138d28782880161382d565b95989497509550505050565b600080604083850312156138f157600080fd5b823567ffffffffffffffff8082111561390957600080fd5b818501915085601f83011261391d57600080fd5b8135602061392a82613676565b6040516139378282613649565b83815260059390931b850182019282810191508984111561395757600080fd5b948201945b8386101561397e57853561396f81613512565b8252948201949082019061395c565b9650508601359250508082111561399457600080fd5b50610a5b8582860161369a565b600081518084526020808501945080840160005b838110156139d1578151875295820195908201906001016139b5565b509495945050505050565b60208152600061358660208301846139a1565b634e487b7160e01b600052602160045260246000fd5b6020810160068310613a2757634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060408486031215613a4257600080fd5b83359250602084013567ffffffffffffffff80821115613a6157600080fd5b818601915086601f830112613a7557600080fd5b813581811115613a8457600080fd5b876020828501011115613a9657600080fd5b6020830194508093505050509250925092565b600060208284031215613abb57600080fd5b813567ffffffffffffffff811115613ad257600080fd5b611ca28482850161370b565b60008060408385031215613af157600080fd5b8235613afc81613512565b915060208301358015158114613b1157600080fd5b809150509250929050565b60008060208385031215613b2f57600080fd5b823567ffffffffffffffff811115613b4657600080fd5b613b528582860161382d565b90969095509350505050565b600060208284031215613b7057600080fd5b813561358681613512565b600080600060408486031215613b9057600080fd5b833567ffffffffffffffff811115613ba757600080fd5b613bb38682870161382d565b909790965060209590950135949350505050565b60008060408385031215613bda57600080fd5b8235613be581613512565b91506020830135613b1181613512565b600080600060408486031215613c0a57600080fd5b833567ffffffffffffffff80821115613c2257600080fd5b613c2e8783880161382d565b9095509350602091508582013581811115613c4857600080fd5b8601601f81018813613c5957600080fd5b8035613c6481613676565b604051613c718282613649565b82815260059290921b830185019185810191508a831115613c9157600080fd5b8584015b83811015613cc957803586811115613cad5760008081fd5b613cbb8d898389010161370b565b845250918601918601613c95565b508096505050505050509250925092565b600080600080600060a08688031215613cf257600080fd5b8535613cfd81613512565b94506020860135613d0d81613512565b93506040860135925060608601359150608086013567ffffffffffffffff811115613d3757600080fd5b6138208882890161370b565b600181811c90821680613d5757607f821691505b602082108103613d7757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613dc357613dc3613d93565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613ded57613ded613dc8565b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201613e1a57613e1a613d93565b5060010190565b60008351613e3381846020880161358d565b835190830190613e4781836020880161358d565b01949350505050565b600060208284031215613e6257600080fd5b815161358681613512565b60008219821115613e8057613e80613d93565b500190565b604081526000613e9860408301856139a1565b8281036020840152613eaa81856139a1565b95945050505050565b600082821015613ec557613ec5613d93565b500390565b600082613ed957613ed9613dc8565b500690565b60006001600160a01b03808816835280871660208401525060a06040830152613f0a60a08301866139a1565b8281036060840152613f1c81866139a1565b90508281036080840152613f3081856135b9565b98975050505050505050565b600060208284031215613f4e57600080fd5b815161358681613553565b600060033d1115613f725760046000803e5060005160e01c5b90565b600060443d1015613f835790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715613fb357505050505090565b8285019150815181811115613fcb5750505050505090565b843d8701016020828501011115613fe55750505050505090565b613ff460208286010187613649565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261403760a08301846135b9565b97965050505050505056fe61723a2f2f5f44396b4e3157724e576243713535425341475262544234625333763851415054596d42546853625833412f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220ea3bee310da8b4012aa2da1f2cc62ca4e00a406014eef5713d01fa301ba530cf64736f6c634300080e0033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004d68747470733a2f2f6173736574732e6d69736e6674732e696f2f697066732f516d557950334846427345756178756b47556e4847787a33624c624a3831544b7354776336395874325464426d7400000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [1] : contractURI_ (string): https://assets.misnfts.io/ipfs/QmUyP3HFBsEuaxukGUnHGxz3bLbJ81TKsTwc69Xt2TdBmt

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 000000000000000000000000000000000000000000000000000000000000004d
Arg [3] : 68747470733a2f2f6173736574732e6d69736e6674732e696f2f697066732f51
Arg [4] : 6d557950334846427345756178756b47556e4847787a33624c624a3831544b73
Arg [5] : 54776336395874325464426d7400000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62426:5755:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46508:231;;;;;;;;;;-1:-1:-1;46508:231:0;;;;;:::i;:::-;;:::i;:::-;;;639:25:1;;;627:2;612:18;46508:231:0;;;;;;;;67395:181;;;;;;;;;;-1:-1:-1;67395:181:0;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;67395:181:0;1107:187:1;62619:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;65668:121::-;;;;;;;;;;-1:-1:-1;65668:121:0;;;;;:::i;:::-;;:::i;66922:344::-;;;:::i;:::-;;34957:321;;;;;;;;;;-1:-1:-1;34957:321:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;2680:55:1;;;2662:74;;2767:2;2752:18;;2745:34;;;;2635:18;34957:321:0;2488:297:1;48447:442:0;;;;;;;;;;-1:-1:-1;48447:442:0;;;;;:::i;:::-;;:::i;20744:31::-;;;;;;;;;;;;;;;;63398:518;;;;;;;;;;-1:-1:-1;63398:518:0;;;;;:::i;:::-;;:::i;46905:524::-;;;;;;;;;;-1:-1:-1;46905:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35715:36::-;;;;;;;;;;-1:-1:-1;35715:36:0;;;;;;;;;;;;;;;:::i;19028:103::-;;;;;;;;;;;;;:::i;67272:117::-;;;;;;;;;;-1:-1:-1;67272:117:0;;;;;:::i;:::-;;:::i;18377:87::-;;;;;;;;;;-1:-1:-1;18450:6:0;;-1:-1:-1;;;;;18450:6:0;18377:87;;;-1:-1:-1;;;;;9868:55:1;;;9850:74;;9838:2;9823:18;18377:87:0;9704:226:1;64283:448:0;;;;;;:::i;:::-;;:::i;65795:109::-;;;;;;;;;;-1:-1:-1;65795:109:0;;;;;:::i;:::-;;:::i;62642:20::-;;;;;;;;;;;;;:::i;66668:248::-;;;;;;;;;;;;;:::i;47502:155::-;;;;;;;;;;-1:-1:-1;47502:155:0;;;;;:::i;:::-;;:::i;66478:184::-;;;;;;;;;;-1:-1:-1;66478:184:0;;;;;:::i;:::-;;:::i;36038:132::-;;;;;;;;;;;;;:::i;66318:154::-;;;;;;;;;;-1:-1:-1;66318:154:0;;;;;:::i;:::-;;:::i;67735:113::-;;;;;;;;;;-1:-1:-1;67735:113:0;;;;;:::i;:::-;;:::i;65204:101::-;;;;;;;;;;-1:-1:-1;65204:101:0;;;;;:::i;:::-;;:::i;64737:461::-;;;;;;:::i;:::-;;:::i;35878:152::-;;;;;;;;;;;;;:::i;21909:130::-;;;;;;;;;;-1:-1:-1;21909:130:0;;;;;:::i;:::-;;:::i;62667:35::-;;;;;;;;;;-1:-1:-1;62667:35:0;;;;-1:-1:-1;;;;;62667:35:0;;;63924:351;;;;;;;;;;-1:-1:-1;63924:351:0;;;;;:::i;:::-;;:::i;65910:91::-;;;;;;;;;;;;;:::i;67854:324::-;;;;;;;;;;-1:-1:-1;67854:324:0;;;;;:::i;:::-;;:::i;66007:305::-;;;;;;;;;;-1:-1:-1;66007:305:0;;;;;:::i;:::-;;:::i;65311:351::-;;;;;;;;;;-1:-1:-1;65311:351:0;;;;;:::i;:::-;;:::i;47969:401::-;;;;;;;;;;-1:-1:-1;47969:401:0;;;;;:::i;:::-;;:::i;19286:201::-;;;;;;;;;;-1:-1:-1;19286:201:0;;;;;:::i;:::-;;:::i;21117:86::-;;;;;;;;;;;;21168:35;21117:86;;46508:231;46594:7;-1:-1:-1;;;;;46622:21:0;;46614:77;;;;-1:-1:-1;;;46614:77:0;;15398:2:1;46614:77:0;;;15380:21:1;15437:2;15417:18;;;15410:30;15476:34;15456:18;;;15449:62;15547:13;15527:18;;;15520:41;15578:19;;46614:77:0;;;;;;;;;-1:-1:-1;46709:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;46709:22:0;;;;;;;;;;46508:231;;;;;:::o;67395:181::-;67514:4;67534:36;67558:11;67534:23;:36::i;62619:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65668:121::-;65755:19;;;;:9;:19;;;;;65748:35;;65726:13;;65755:19;65748:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65668:121;;;:::o;66922:344::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;66997:21:::1;67033:11:::0;67025:46:::1;;;::::0;-1:-1:-1;;;67025:46:0;;16613:2:1;67025:46:0::1;::::0;::::1;16595:21:1::0;16652:2;16632:18;;;16625:30;16691:24;16671:18;;;16664:52;16733:18;;67025:46:0::1;16411:346:1::0;67025:46:0::1;67098:78;::::0;67079:13:::1;::::0;67106:42:::1;::::0;67163:7;;67079:13;67098:78;67079:13;67098:78;67163:7;67106:42;67098:78:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67078:98;;;67191:8;67183:36;;;::::0;-1:-1:-1;;;67183:36:0;;17174:2:1;67183:36:0::1;::::0;::::1;17156:21:1::0;17213:2;17193:18;;;17186:30;17252:17;17232:18;;;17225:45;17287:18;;67183:36:0::1;16972:339:1::0;67183:36:0::1;67233:21;:26:::0;67226:34:::1;;;;:::i;:::-;66972:294;;66922:344::o:0;34957:321::-;35127:41;;;;;;;;;35158:10;35127:41;-1:-1:-1;;;;;35127:41:0;;;;;-1:-1:-1;;;35127:41:0;;;;;;;;;;;;;-1:-1:-1;;35265:5:0;;35237:24;;:5;:24;:::i;:::-;35236:34;;;;:::i;:::-;35220:50;;35116:162;34957:321;;;;;:::o;48447:442::-;-1:-1:-1;;;;;48680:20:0;;17181:10;48680:20;;:60;;-1:-1:-1;48704:36:0;48721:4;17181:10;67854:324;:::i;48704:36::-;48658:160;;;;-1:-1:-1;;;48658:160:0;;18383:2:1;48658:160:0;;;18365:21:1;18422:2;18402:18;;;18395:30;18461:34;18441:18;;;18434:62;18532:20;18512:18;;;18505:48;18570:19;;48658:160:0;18181:414:1;48658:160:0;48829:52;48852:4;48858:2;48862:3;48867:7;48876:4;48829:22;:52::i;:::-;48447:442;;;;;:::o;63398:518::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;63512:41;;::::1;63504:76;;;::::0;-1:-1:-1;;;63504:76:0;;18802:2:1;63504:76:0::1;::::0;::::1;18784:21:1::0;18841:2;18821:18;;;18814:30;18880:24;18860:18;;;18853:52;18922:18;;63504:76:0::1;18600:346:1::0;63504:76:0::1;63601:9:::0;63587:11:::1;63624:287;63644:6;63640:1;:10;63624:287;;;63676:9;:23;63686:9;;63696:1;63686:12;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;63676:23:::0;;-1:-1:-1;63676:23:0;::::1;::::0;;;;;;-1:-1:-1;63676:23:0;:34:::1;;::::0;::::1;;63675:35;63667:69;;;::::0;-1:-1:-1;;;63667:69:0;;19342:2:1;63667:69:0::1;::::0;::::1;19324:21:1::0;19381:2;19361:18;;;19354:30;19420:23;19400:18;;;19393:51;19461:18;;63667:69:0::1;19140:345:1::0;63667:69:0::1;63747:54;63753:10;63765:9;;63775:1;63765:12;;;;;;;:::i;:::-;;;;;;;63779:14;;63794:1;63779:17;;;;;;;:::i;:::-;;;;;;;63747:54;;;;;;;;;;;::::0;:5:::1;:54::i;:::-;63849:4;63812:9;:23;63822:9;;63832:1;63822:12;;;;;;;:::i;:::-;;;;;;;63812:23;;;;;;;;;;;:34;;;:41;;;;;;;;;;;;;;;;;;63899:4;63864:9;:23;63874:9;;63884:1;63874:12;;;;;;;:::i;:::-;;;;;;;63864:23;;;;;;;;;;;:32;;;:39;;;;;;;;;;;;;;;;;;63652:3;;;;;:::i;:::-;;;;63624:287;;;;63497:419;63398:518:::0;;;;:::o;46905:524::-;47061:16;47122:3;:10;47103:8;:15;:29;47095:83;;;;-1:-1:-1;;;47095:83:0;;19832:2:1;47095:83:0;;;19814:21:1;19871:2;19851:18;;;19844:30;19910:34;19890:18;;;19883:62;19981:11;19961:18;;;19954:39;20010:19;;47095:83:0;19630:405:1;47095:83:0;47191:30;47238:8;:15;47224:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47224:30:0;;47191:63;;47272:9;47267:122;47291:8;:15;47287:1;:19;47267:122;;;47347:30;47357:8;47366:1;47357:11;;;;;;;;:::i;:::-;;;;;;;47370:3;47374:1;47370:6;;;;;;;;:::i;:::-;;;;;;;47347:9;:30::i;:::-;47328:13;47342:1;47328:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;47308:3;;;:::i;:::-;;;47267:122;;;-1:-1:-1;47408:13:0;46905:524;-1:-1:-1;;;46905:524:0:o;19028:103::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;19093:30:::1;19120:1;19093:18;:30::i;:::-;19028:103::o:0;67272:117::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;67352:31:::1;67366:9;67377:5;67352:13;:31::i;64283:448::-:0;22119:19;;64377:10;;;;-1:-1:-1;;;;;22119:19:0;22111:67;;;;-1:-1:-1;;;22111:67:0;;20242:2:1;22111:67:0;;;20224:21:1;20281:2;20261:18;;;20254:30;20320:23;20300:18;;;20293:51;20361:18;;22111:67:0;20040:345:1;22111:67:0;22507:16;;22552:39;;;21168:35;22552:39;;;20564:25:1;22580:10:0;20605:18:1;;;20598:83;;;;22402:14:0;;22507:16;20537:18:1;;22552:39:0;;;;;;;;;;;;22542:50;;;;;;22443:164;;;;;;;;-1:-1:-1;;;20950:79:1;;21054:1;21045:11;;21038:27;;;;21090:2;21081:12;;21074:28;21127:2;21118:12;;20692:444;22443:164:0;;;;;;;;;;;;;22419:199;;;;;;22402:216;;22867:24;22894:25;22909:9;;22894:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22894:6:0;;:25;-1:-1:-1;;22894:14:0;:25;-1:-1:-1;22894:25:0:i;:::-;22958:19;;22867:52;;-1:-1:-1;;;;;;22938:39:0;;;22958:19;;22938:39;22930:69;;;;-1:-1:-1;;;22930:69:0;;21343:2:1;22930:69:0;;;21325:21:1;21382:2;21362:18;;;21355:30;21421:19;21401:18;;;21394:47;21458:18;;22930:69:0;21141:341:1;22930:69:0;64403:19:::1;::::0;;;:9:::1;:19;::::0;;;;;;;64436:10:::1;64403:44:::0;;:32:::1;;:44:::0;;;;;;::::1;;:53;64395:94;;;::::0;-1:-1:-1;;;64395:94:0;;21689:2:1;64395:94:0::1;::::0;::::1;21671:21:1::0;21728:2;21708:18;;;21701:30;21767;21747:18;;;21740:58;21815:18;;64395:94:0::1;21487:352:1::0;64395:94:0::1;64504:19;::::0;;;:9:::1;:19;::::0;;;;:30:::1;;::::0;::::1;;64496:63;;;::::0;-1:-1:-1;;;64496:63:0;;22046:2:1;64496:63:0::1;::::0;::::1;22028:21:1::0;22085:2;22065:18;;;22058:30;22124:22;22104:18;;;22097:50;22164:18;;64496:63:0::1;21844:344:1::0;64496:63:0::1;64575:19;::::0;;;:9:::1;:19;::::0;;;;:28:::1;;::::0;::::1;::::0;::::1;;;64574:29;64566:60;;;::::0;-1:-1:-1;;;64566:60:0;;22395:2:1;64566:60:0::1;::::0;::::1;22377:21:1::0;22434:2;22414:18;;;22407:30;22473:20;22453:18;;;22446:48;22511:18;;64566:60:0::1;22193:342:1::0;64566:60:0::1;64633:34;64639:10;64651:8;64661:1;64633:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;-1:-1:-1::0;;;64674:19:0::1;::::0;;;-1:-1:-1;;64674:9:0::1;:19;::::0;;;;;;;64707:10:::1;64674:44:::0;;64721:4:::1;64674:32:::0;;::::1;:44:::0;;;;;;:51;;-1:-1:-1;;64674:51:0::1;::::0;;::::1;::::0;;;-1:-1:-1;64283:448:0:o;65795:109::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;65871:27;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;62642:20::-:0;;;;;;;:::i;66668:248::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;66734:12:::1;:19:::0;66720:11:::1;66760:124;66780:6;66776:1;:10;66760:124;;;66796:9;:26;66806:12;66819:1;66806:15;;;;;;;;:::i;:::-;;;;;;;;;66796:26;;;;;;;;;;;:35;;;;;;;;;;;;:44;;66835:5;66796:44;;::::0;66793:91:::1;;66880:4;66842:9;:26;66852:12;66865:1;66852:15;;;;;;;;:::i;:::-;;;;;;;;;66842:26;;;;;;;;;;;:35;;;:42;;;;;;;;;;;;;;;;;;66793:91;66788:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66760:124;;;-1:-1:-1::0;66891:19:0::1;66898:12;;66891:19;:::i;:::-;66713:203;66668:248::o:0;47502:155::-;47597:52;17181:10;47630:8;47640;47597:18;:52::i;66478:184::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;66569:9;66555:11:::1;66592:64;66612:6;66608:1;:10;66592:64;;;66625:12;66643:9;;66653:1;66643:12;;;;;;;:::i;:::-;66625:31:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;66625:31:0;;;66643:12:::1;66625:31:::0;;;;66643:12;;;::::1;::::0;;;::::1;;66625:31:::0;;;::::1;::::0;-1:-1:-1;66620:3:0;::::1;::::0;::::1;:::i;:::-;;;;66592:64;;;;66548:114;66478:184:::0;;:::o;36038:132::-;36147:14;;36085:13;;36118:44;;36147:14;;36118:28;:44::i;:::-;36111:51;;36038:132;:::o;66318:154::-;66377:4;66393:19;;;:9;:19;;;;;:28;;;;;;;;:36;;:28;:36;66390:76;;-1:-1:-1;66438:4:0;;66318:154;-1:-1:-1;66318:154:0:o;66390:76::-;-1:-1:-1;66461:5:0;;66318:154;-1:-1:-1;66318:154:0:o;67735:113::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;67808:20:::1;:35:::0;;-1:-1:-1;;67808:35:0::1;-1:-1:-1::0;;;;;67808:35:0;;;::::1;::::0;;;::::1;::::0;;67735:113::o;65204:101::-;65263:36;65269:10;65281:8;65291:7;65263:5;:36::i;64737:461::-;63205:12;:19;63191:11;63231:148;63251:6;63247:1;:10;63231:148;;;63281:9;:26;63291:12;63304:1;63291:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;63281:26;;;;;;;;;;;;;;;63321:10;63281:51;;:39;;:51;;;;;;;;63280:52;63272:99;;;;-1:-1:-1;;;63272:99:0;;22742:2:1;63272:99:0;;;22724:21:1;22781:2;22761:18;;;22754:30;22820:34;22800:18;;;22793:62;22891:4;22871:18;;;22864:32;22913:19;;63272:99:0;22540:398:1;63272:99:0;63259:3;;;;:::i;:::-;;;;63231:148;;;-1:-1:-1;22119:19:0::1;::::0;64844:10;;;;-1:-1:-1;;;;;22119:19:0::1;22111:67;;;::::0;-1:-1:-1;;;22111:67:0;;20242:2:1;22111:67:0::1;::::0;::::1;20224:21:1::0;20281:2;20261:18;;;20254:30;20320:23;20300:18;;;20293:51;20361:18;;22111:67:0::1;20040:345:1::0;22111:67:0::1;22507:16;::::0;22552:39:::1;::::0;;21168:35:::1;22552:39;::::0;::::1;20564:25:1::0;22580:10:0::1;20605:18:1::0;;;20598:83;;;;22402:14:0::1;::::0;22507:16;20537:18:1;;22552:39:0::1;;;;;;;;;;;;22542:50;;;;;;22443:164;;;;;;;;-1:-1:-1::0;;;20950:79:1;;21054:1;21045:11;;21038:27;;;;21090:2;21081:12;;21074:28;21127:2;21118:12;;20692:444;22443:164:0::1;;;;;;;;;;;;;22419:199;;;;;;22402:216;;22867:24;22894:25;22909:9;;22894:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22894:6:0;;:25;-1:-1:-1;;22894:14:0::1;:25:::0;-1:-1:-1;22894:25:0:i:1;:::-;22958:19;::::0;22867:52;;-1:-1:-1;;;;;;22938:39:0;;::::1;22958:19:::0;::::1;22938:39;22930:69;;;::::0;-1:-1:-1;;;22930:69:0;;21343:2:1;22930:69:0::1;::::0;::::1;21325:21:1::0;21382:2;21362:18;;;21355:30;21421:19;21401:18;;;21394:47;21458:18;;22930:69:0::1;21141:341:1::0;22930:69:0::1;64870:19:::2;::::0;;;:9:::2;:19;::::0;;;;;;;64903:10:::2;64870:44:::0;;:32:::2;;:44:::0;;;;;;::::2;;:53;64862:94;;;::::0;-1:-1:-1;;;64862:94:0;;21689:2:1;64862:94:0::2;::::0;::::2;21671:21:1::0;21728:2;21708:18;;;21701:30;21767;21747:18;;;21740:58;21815:18;;64862:94:0::2;21487:352:1::0;64862:94:0::2;64971:19;::::0;;;:9:::2;:19;::::0;;;;:30:::2;;::::0;::::2;;64963:63;;;::::0;-1:-1:-1;;;64963:63:0;;22046:2:1;64963:63:0::2;::::0;::::2;22028:21:1::0;22085:2;22065:18;;;22058:30;22124:22;22104:18;;;22097:50;22164:18;;64963:63:0::2;21844:344:1::0;64963:63:0::2;65042:19;::::0;;;:9:::2;:19;::::0;;;;:28:::2;;::::0;::::2;::::0;::::2;;;65041:29;65033:60;;;::::0;-1:-1:-1;;;65033:60:0;;22395:2:1;65033:60:0::2;::::0;::::2;22377:21:1::0;22434:2;22414:18;;;22407:30;22473:20;22453:18;;;22446:48;22511:18;;65033:60:0::2;22193:342:1::0;65033:60:0::2;65100:34;65106:10;65118:8;65128:1;65100:34;;;;;;;;;;;::::0;:5:::2;:34::i;:::-;-1:-1:-1::0;;;65141:19:0::2;::::0;;;-1:-1:-1;;65141:9:0::2;:19;::::0;;;;;;;65174:10:::2;65141:44:::0;;65188:4:::2;65141:32:::0;;::::2;:44:::0;;;;;;:51;;-1:-1:-1;;65141:51:0::2;::::0;;::::2;::::0;;;-1:-1:-1;;64737:461:0:o;35878:152::-;35924:13;35971:17;;;;;;;;;;;;;;;;;35995:14;;35990:31;;35995:14;;35990:20;;;;;;;;:::i;:::-;:29;:31::i;:::-;35957:65;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35950:72;;35878:152;:::o;21909:130::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;21996:19:::1;:35:::0;;-1:-1:-1;;21996:35:0::1;-1:-1:-1::0;;;;;21996:35:0;;;::::1;::::0;;;::::1;::::0;;21909:130::o;63924:351::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;64013:11:::1;64059:19:::0;;;:9:::1;:19;::::0;;;;:30:::1;;::::0;64027:10;;64059:30:::1;;64051:63;;;::::0;-1:-1:-1;;;64051:63:0;;22046:2:1;64051:63:0::1;::::0;::::1;22028:21:1::0;22085:2;22065:18;;;22058:30;22124:22;22104:18;;;22097:50;22164:18;;64051:63:0::1;21844:344:1::0;64051:63:0::1;64124:6;64120:150;64140:6;64136:1;:10;64120:150;;;64162:37;64168:10;;64179:1;64168:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;64183:8;64193:1;64162:37;;;;;;;;;;;::::0;:5:::1;:37::i;:::-;64208:19;::::0;;;:9:::1;:19;::::0;;;;64258:4:::1;::::0;64208:32;;::::1;::::0;64241:10;;64252:1;64241:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64208:47:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;64208:47:0;:54;;-1:-1:-1;;64208:54:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64148:3;::::1;::::0;::::1;:::i;:::-;;;;64120:150;;65910:91:::0;65954:13;65983:12;65976:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65910:91;:::o;67854:324::-;68017:20;;68059:29;;;;;-1:-1:-1;;;;;9868:55:1;;;68059:29:0;;;9850:74:1;67944:4:0;;68017:20;;;68051:50;;;;68017:20;;68059:21;;9823:18:1;;68059:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;68051:50:0;;68047:67;;68110:4;68103:11;;;;;68047:67;-1:-1:-1;;;;;47852:27:0;;;47828:4;47852:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;68130:40;68123:47;67854:324;-1:-1:-1;;;;67854:324:0:o;66007:305::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;66093:9;66079:11:::1;66116:191;66136:6;66132:1;:10;66116:191;;;66162:9;:23;66172:9;;66182:1;66172:12;;;;;;;:::i;:::-;;;;;;;66162:23;;;;;;;;;;;:32;;;;;;;;;;;;:40;;66198:4;66162:40;;::::0;66159:140:::1;;66239:5;66204:9;:23;66214:9;;66224:1;66214:12;;;;;;;:::i;:::-;;;;;;;66204:23;;;;;;;;;;;:32;;;:40;;;;;;;;;;;;;;;;;;66159:140;;;66295:4;66260:9;:23;66270:9;;66280:1;66270:12;;;;;;;:::i;:::-;;;;;;;66260:23;;;;;;;;;;;:32;;;:39;;;;;;;;;;;;;;;;;;66159:140;66144:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66116:191;;65311:351:::0;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;65437:12;;65417:32;::::1;65409:67;;;::::0;-1:-1:-1;;;65409:67:0;;18802:2:1;65409:67:0::1;::::0;::::1;18784:21:1::0;18841:2;18821:18;;;18814:30;18880:24;18860:18;;;18853:52;18922:18;;65409:67:0::1;18600:346:1::0;65409:67:0::1;65497:9:::0;65483:11:::1;65520:137;65540:6;65536:1;:10;65520:137;;;65598:5;65604:1;65598:8;;;;;;;;:::i;:::-;;;;;;;65563:9;:23;65573:9;;65583:1;65573:12;;;;;;;:::i;:::-;;;;;;;65563:23;;;;;;;;;;;:32;;:43;;;;;;;;;;;;:::i;:::-;;65636:9;;65646:1;65636:12;;;;;;;:::i;:::-;;;;;;;65622:27;65626:5;65632:1;65626:8;;;;;;;;:::i;:::-;;;;;;;65622:27;;;;;;:::i;:::-;;;;;;;;65548:3:::0;::::1;::::0;::::1;:::i;:::-;;;;65520:137;;47969:401:::0;-1:-1:-1;;;;;48177:20:0;;17181:10;48177:20;;:60;;-1:-1:-1;48201:36:0;48218:4;17181:10;67854:324;:::i;48201:36::-;48155:151;;;;-1:-1:-1;;;48155:151:0;;23905:2:1;48155:151:0;;;23887:21:1;23944:2;23924:18;;;23917:30;23983:34;23963:18;;;23956:62;24054:11;24034:18;;;24027:39;24083:19;;48155:151:0;23703:405:1;48155:151:0;48317:45;48335:4;48341:2;48345;48349:6;48357:4;48317:17;:45::i;19286:201::-;18450:6;;-1:-1:-1;;;;;18450:6:0;17181:10;18597:23;18589:68;;;;-1:-1:-1;;;18589:68:0;;16252:2:1;18589:68:0;;;16234:21:1;;;16271:18;;;16264:30;-1:-1:-1;;;;;;;;;;;16310:18:1;;;16303:62;16382:18;;18589:68:0;16050:356:1;18589:68:0;-1:-1:-1;;;;;19375:22:0;::::1;19367:73;;;::::0;-1:-1:-1;;;19367:73:0;;24315:2:1;19367:73:0::1;::::0;::::1;24297:21:1::0;24354:2;24334:18;;;24327:30;24393:34;24373:18;;;24366:62;24464:8;24444:18;;;24437:36;24490:19;;19367:73:0::1;24113:402:1::0;19367:73:0::1;19451:28;19470:8;19451:18;:28::i;36178:235::-:0;36271:4;-1:-1:-1;;;;;;36308:44:0;;36323:29;36308:44;;:97;;;36369:36;36393:11;36369:23;:36::i;50531:1074::-;50758:7;:14;50744:3;:10;:28;50736:81;;;;-1:-1:-1;;;50736:81:0;;24722:2:1;50736:81:0;;;24704:21:1;24761:2;24741:18;;;24734:30;24800:34;24780:18;;;24773:62;24871:10;24851:18;;;24844:38;24899:19;;50736:81:0;24520:404:1;50736:81:0;-1:-1:-1;;;;;50836:16:0;;50828:66;;;;-1:-1:-1;;;50828:66:0;;25131:2:1;50828:66:0;;;25113:21:1;25170:2;25150:18;;;25143:30;25209:34;25189:18;;;25182:62;-1:-1:-1;;;25260:18:1;;;25253:35;25305:19;;50828:66:0;24929:401:1;50828:66:0;17181:10;50907:16;51024:421;51048:3;:10;51044:1;:14;51024:421;;;51080:10;51093:3;51097:1;51093:6;;;;;;;;:::i;:::-;;;;;;;51080:19;;51114:14;51131:7;51139:1;51131:10;;;;;;;;:::i;:::-;;;;;;;;;;;;51158:19;51180:13;;;;;;;;;;-1:-1:-1;;;;;51180:19:0;;;;;;;;;;;;51131:10;;-1:-1:-1;51222:21:0;;;;51214:76;;;;-1:-1:-1;;;51214:76:0;;25537:2:1;51214:76:0;;;25519:21:1;25576:2;25556:18;;;25549:30;25615:34;25595:18;;;25588:62;-1:-1:-1;;;25666:18:1;;;25659:40;25716:19;;51214:76:0;25335:406:1;51214:76:0;51334:9;:13;;;;;;;;;;;-1:-1:-1;;;;;51334:19:0;;;;;;;;;;51356:20;;;51334:42;;51406:17;;;;;;;:27;;51356:20;;51334:9;51406:27;;51356:20;;51406:27;:::i;:::-;;;;;;;;51065:380;;;51060:3;;;;:::i;:::-;;;51024:421;;;;51492:2;-1:-1:-1;;;;;51462:47:0;51486:4;-1:-1:-1;;;;;51462:47:0;51476:8;-1:-1:-1;;;;;51462:47:0;;51496:3;51501:7;51462:47;;;;;;;:::i;:::-;;;;;;;;51522:75;51558:8;51568:4;51574:2;51578:3;51583:7;51592:4;51522:35;:75::i;52923:569::-;-1:-1:-1;;;;;53076:16:0;;53068:62;;;;-1:-1:-1;;;53068:62:0;;26551:2:1;53068:62:0;;;26533:21:1;26590:2;26570:18;;;26563:30;26629:34;26609:18;;;26602:62;26700:3;26680:18;;;26673:31;26721:19;;53068:62:0;26349:397:1;53068:62:0;17181:10;53187:102;17181:10;53143:16;53230:2;53234:21;53252:2;53234:17;:21::i;:::-;53257:25;53275:6;53257:17;:25::i;53187:102::-;53302:9;:13;;;;;;;;;;;-1:-1:-1;;;;;53302:17:0;;;;;;;;;:27;;53323:6;;53302:9;:27;;53323:6;;53302:27;:::i;:::-;;;;-1:-1:-1;;53345:52:0;;;26925:25:1;;;26981:2;26966:18;;26959:34;;;-1:-1:-1;;;;;53345:52:0;;;;53378:1;;53345:52;;;;;;26898:18:1;53345:52:0;;;;;;;53410:74;53441:8;53459:1;53463:2;53467;53471:6;53479:4;53410:30;:74::i;19647:191::-;19740:6;;;-1:-1:-1;;;;;19757:17:0;;;-1:-1:-1;;19757:17:0;;;;;;;19790:40;;19740:6;;;19757:17;19740:6;;19790:40;;19721:16;;19790:40;19710:128;19647:191;:::o;34711:199::-;34805:5;34796;:14;;34788:53;;;;-1:-1:-1;;;34788:53:0;;27206:2:1;34788:53:0;;;27188:21:1;27245:2;27225:18;;;27218:30;27284:28;27264:18;;;27257:56;27330:18;;34788:53:0;27004:350:1;34788:53:0;34865:37;;;;;;;;;-1:-1:-1;;;;;34865:37:0;;;;;;;;;;;;;;;;;34852:10;:50;;-1:-1:-1;;;34852:50:0;;;;;;;;;;;;;;;;34711:199::o;7699:231::-;7777:7;7798:17;7817:18;7839:27;7850:4;7856:9;7839:10;:27::i;:::-;7797:69;;;;7877:18;7889:5;7877:11;:18::i;56717:331::-;56872:8;-1:-1:-1;;;;;56863:17:0;:5;-1:-1:-1;;;;;56863:17:0;;56855:71;;;;-1:-1:-1;;;56855:71:0;;27561:2:1;56855:71:0;;;27543:21:1;27600:2;27580:18;;;27573:30;27639:34;27619:18;;;27612:62;27710:11;27690:18;;;27683:39;27739:19;;56855:71:0;27359:405:1;56855:71:0;-1:-1:-1;;;;;56937:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;56937:46:0;;;;;;;;;;56999:41;;1247::1;;;56999::0;;1220:18:1;56999:41:0;;;;;;;56717:331;;;:::o;36421:575::-;36514:13;36574:1;36554:15;36548:22;;;;;;;;:::i;:::-;:27;;;;36540:36;;;;;;36617:15;36591:41;;;;;;;;:::i;:::-;:22;:41;36587:63;;-1:-1:-1;;36634:16:0;;;;;;;;;;;;;;;;;;36421:575::o;36587:63::-;36691:15;36665:41;;;;;;;;:::i;:::-;:22;:41;36661:63;;-1:-1:-1;;36708:16:0;;;;;;;;;;;;;;;;;;36421:575::o;36661:63::-;36766:15;36739:42;;;;;;;;:::i;:::-;:23;:42;36735:65;;-1:-1:-1;;36783:17:0;;;;;;;;;;;;;;;;;;36421:575::o;36735:65::-;36845:15;36815:45;;;;;;;;:::i;:::-;:26;:45;36811:71;;-1:-1:-1;;36862:20:0;;;;;;;;;;;;;;;;;;36421:575::o;36811:71::-;36922:15;36897:40;;;;;;;;:::i;:::-;:21;:40;36893:95;;-1:-1:-1;;36939:15:0;;;;;;;;;;;;;;;;;;36421:575::o;36893:95::-;-1:-1:-1;;36970:18:0;;;;;;;;;;;;;;;;;;36421:575::o;54833:648::-;-1:-1:-1;;;;;54960:18:0;;54952:66;;;;-1:-1:-1;;;54952:66:0;;27971:2:1;54952:66:0;;;27953:21:1;28010:2;27990:18;;;27983:30;28049:34;28029:18;;;28022:62;28120:5;28100:18;;;28093:33;28143:19;;54952:66:0;27769:399:1;54952:66:0;17181:10;55075:102;17181:10;55106:4;55031:16;55124:21;55142:2;55124:17;:21::i;:::-;55147:25;55165:6;55147:17;:25::i;:::-;-1:-1:-1;;55075:102:0;;;;;;;;;-1:-1:-1;55075:102:0;;-1:-1:-1;;;63398:518:0;55075:102;55190:19;55212:13;;;;;;;;;;;-1:-1:-1;;;;;55212:19:0;;;;;;;;;;55250:21;;;;55242:70;;;;-1:-1:-1;;;55242:70:0;;28375:2:1;55242:70:0;;;28357:21:1;28414:2;28394:18;;;28387:30;28453:34;28433:18;;;28426:62;28524:6;28504:18;;;28497:34;28548:19;;55242:70:0;28173:400:1;55242:70:0;55348:9;:13;;;;;;;;;;;-1:-1:-1;;;;;55348:19:0;;;;;;;;;;;;55370:20;;;55348:42;;55419:54;;26925:25:1;;;26966:18;;;26959:34;;;55348:19:0;;55419:54;;;;;;26898:18:1;55419:54:0;;;;;;;54941:540;;54833:648;;;:::o;1523:723::-;1579:13;1800:5;1809:1;1800:10;1796:53;;-1:-1:-1;;1827:10:0;;;;;;;;;;;;;;;;;;1523:723::o;1796:53::-;1874:5;1859:12;1915:78;1922:9;;1915:78;;1948:8;;;;:::i;:::-;;-1:-1:-1;1971:10:0;;-1:-1:-1;1979:2:0;1971:10;;:::i;:::-;;;1915:78;;;2003:19;2035:6;2025:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2025:17:0;;2003:39;;2053:154;2060:10;;2053:154;;2087:11;2097:1;2087:11;;:::i;:::-;;-1:-1:-1;2156:10:0;2164:2;2156:5;:10;:::i;:::-;2143:24;;:2;:24;:::i;:::-;2130:39;;2113:6;2120;2113:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;2184:11:0;2193:2;2184:11;;:::i;:::-;;;2053:154;;49353:820;-1:-1:-1;;;;;49541:16:0;;49533:66;;;;-1:-1:-1;;;49533:66:0;;25131:2:1;49533:66:0;;;25113:21:1;25170:2;25150:18;;;25143:30;25209:34;25189:18;;;25182:62;-1:-1:-1;;;25260:18:1;;;25253:35;25305:19;;49533:66:0;24929:401:1;49533:66:0;17181:10;49656:96;17181:10;49687:4;49693:2;49697:21;49715:2;49697:17;:21::i;49656:96::-;49765:19;49787:13;;;;;;;;;;;-1:-1:-1;;;;;49787:19:0;;;;;;;;;;49825:21;;;;49817:76;;;;-1:-1:-1;;;49817:76:0;;25537:2:1;49817:76:0;;;25519:21:1;25576:2;25556:18;;;25549:30;25615:34;25595:18;;;25588:62;-1:-1:-1;;;25666:18:1;;;25659:40;25716:19;;49817:76:0;25335:406:1;49817:76:0;49929:9;:13;;;;;;;;;;;-1:-1:-1;;;;;49929:19:0;;;;;;;;;;49951:20;;;49929:42;;49993:17;;;;;;;:27;;49951:20;;49929:9;49993:27;;49951:20;;49993:27;:::i;:::-;;;;-1:-1:-1;;50038:46:0;;;26925:25:1;;;26981:2;26966:18;;26959:34;;;-1:-1:-1;;;;;50038:46:0;;;;;;;;;;;;;;26898:18:1;50038:46:0;;;;;;;50097:68;50128:8;50138:4;50144:2;50148;50152:6;50160:4;50097:30;:68::i;:::-;49522:651;;49353:820;;;;;:::o;33856:283::-;33986:4;-1:-1:-1;;;;;;34028:50:0;;34043:35;34028:50;;:103;;;34095:36;34119:11;34095:23;:36::i;58985:813::-;-1:-1:-1;;;;;59225:13:0;;24554:19;:23;59221:570;;59261:79;;-1:-1:-1;;;59261:79:0;;-1:-1:-1;;;;;59261:43:0;;;;;:79;;59305:8;;59315:4;;59321:3;;59326:7;;59335:4;;59261:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59261:79:0;;;;;;;;-1:-1:-1;;59261:79:0;;;;;;;;;;;;:::i;:::-;;;59257:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;59653:6;59646:14;;-1:-1:-1;;;59646:14:0;;;;;;;;:::i;59257:523::-;;;59702:62;;-1:-1:-1;;;59702:62:0;;30996:2:1;59702:62:0;;;30978:21:1;31035:2;31015:18;;;31008:30;31074:34;31054:18;;;31047:62;31145:22;31125:18;;;31118:50;31185:19;;59702:62:0;30794:416:1;59257:523:0;-1:-1:-1;;;;;;59422:60:0;;-1:-1:-1;;;59422:60:0;59418:159;;59507:50;;-1:-1:-1;;;59507:50:0;;31417:2:1;59507:50:0;;;31399:21:1;31456:2;31436:18;;;31429:30;31495:34;31475:18;;;31468:62;-1:-1:-1;;;31546:18:1;;;31539:38;31594:19;;59507:50:0;31215:404:1;59806:198:0;59926:16;;;59940:1;59926:16;;;;;;;;;59872;;59901:22;;59926:16;;;;;;;;;;;;-1:-1:-1;59926:16:0;59901:41;;59964:7;59953:5;59959:1;59953:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;59991:5;59806:198;-1:-1:-1;;59806:198:0:o;58233:744::-;-1:-1:-1;;;;;58448:13:0;;24554:19;:23;58444:526;;58484:72;;-1:-1:-1;;;58484:72:0;;-1:-1:-1;;;;;58484:38:0;;;;;:72;;58523:8;;58533:4;;58539:2;;58543:6;;58551:4;;58484:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58484:72:0;;;;;;;;-1:-1:-1;;58484:72:0;;;;;;;;;;;;:::i;:::-;;;58480:479;;;;:::i;:::-;-1:-1:-1;;;;;;58606:55:0;;-1:-1:-1;;;58606:55:0;58602:154;;58686:50;;-1:-1:-1;;;58686:50:0;;31417:2:1;58686:50:0;;;31399:21:1;31456:2;31436:18;;;31429:30;31495:34;31475:18;;;31468:62;-1:-1:-1;;;31546:18:1;;;31539:38;31594:19;;58686:50:0;31215:404:1;5589:1308:0;5670:7;5679:12;5904:9;:16;5924:2;5904:22;5900:990;;6200:4;6185:20;;6179:27;6250:4;6235:20;;6229:27;6308:4;6293:20;;6287:27;5943:9;6279:36;6351:25;6362:4;6279:36;6179:27;6229;6351:10;:25::i;:::-;6344:32;;;;;;;;;5900:990;6398:9;:16;6418:2;6398:22;6394:496;;6673:4;6658:20;;6652:27;6724:4;6709:20;;6703:27;6766:23;6777:4;6652:27;6703;6766:10;:23::i;:::-;6759:30;;;;;;;;6394:496;-1:-1:-1;6838:1:0;;-1:-1:-1;6842:35:0;6394:496;5589:1308;;;;;:::o;3860:643::-;3938:20;3929:5;:29;;;;;;;;:::i;:::-;;3925:571;;3860:643;:::o;3925:571::-;4036:29;4027:5;:38;;;;;;;;:::i;:::-;;4023:473;;4082:34;;-1:-1:-1;;;4082:34:0;;32415:2:1;4082:34:0;;;32397:21:1;32454:2;32434:18;;;32427:30;32493:26;32473:18;;;32466:54;32537:18;;4082:34:0;32213:348:1;4023:473:0;4147:35;4138:5;:44;;;;;;;;:::i;:::-;;4134:362;;4199:41;;-1:-1:-1;;;4199:41:0;;32768:2:1;4199:41:0;;;32750:21:1;32807:2;32787:18;;;32780:30;32846:33;32826:18;;;32819:61;32897:18;;4199:41:0;32566:355:1;4134:362:0;4271:30;4262:5;:39;;;;;;;;:::i;:::-;;4258:238;;4318:44;;-1:-1:-1;;;4318:44:0;;33128:2:1;4318:44:0;;;33110:21:1;33167:2;33147:18;;;33140:30;33206:34;33186:18;;;33179:62;-1:-1:-1;;;33257:18:1;;;33250:32;33299:19;;4318:44:0;32926:398:1;4258:238:0;4393:30;4384:5;:39;;;;;;;;:::i;:::-;;4380:116;;4440:44;;-1:-1:-1;;;4440:44:0;;33531:2:1;4440:44:0;;;33513:21:1;33570:2;33550:18;;;33543:30;33609:34;33589:18;;;33582:62;-1:-1:-1;;;33660:18:1;;;33653:32;33702:19;;4440:44:0;33329:398:1;45531:310:0;45633:4;-1:-1:-1;;;;;;45670:41:0;;45685:26;45670:41;;:110;;-1:-1:-1;;;;;;;45728:52:0;;45743:37;45728:52;45670:110;:163;;;-1:-1:-1;33435:25:0;-1:-1:-1;;;;;;33420:40:0;;;45797:36;33311:157;9151:1632;9282:7;;10216:66;10203:79;;10199:163;;;-1:-1:-1;10315:1:0;;-1:-1:-1;10319:30:0;10299:51;;10199:163;10376:1;:7;;10381:2;10376:7;;:18;;;;;10387:1;:7;;10392:2;10387:7;;10376:18;10372:102;;;-1:-1:-1;10427:1:0;;-1:-1:-1;10431:30:0;10411:51;;10372:102;10588:24;;;10571:14;10588:24;;;;;;;;;33959:25:1;;;34032:4;34020:17;;34000:18;;;33993:45;;;;34054:18;;;34047:34;;;34097:18;;;34090:34;;;10588:24:0;;33931:19:1;;10588:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10588:24:0;;-1:-1:-1;;10588:24:0;;;-1:-1:-1;;;;;;;10627:20:0;;10623:103;;10680:1;10684:29;10664:50;;;;;;;10623:103;10746:6;-1:-1:-1;10754:20:0;;-1:-1:-1;9151:1632:0;;;;;;;;:::o;8193:344::-;8307:7;;8366:66;8353:80;;8307:7;8460:25;8476:3;8461:18;;;8483:2;8460:25;:::i;:::-;8444:42;;8504:25;8515:4;8521:1;8524;8527;8504:10;:25::i;:::-;8497:32;;;;;;8193:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:154:1;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:315;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;:::-;426:5;478:2;463:18;;;;450:32;;-1:-1:-1;;;173:315:1:o;675:177::-;-1:-1:-1;;;;;;753:5:1;749:78;742:5;739:89;729:117;;842:1;839;832:12;857:245;915:6;968:2;956:9;947:7;943:23;939:32;936:52;;;984:1;981;974:12;936:52;1023:9;1010:23;1042:30;1066:5;1042:30;:::i;:::-;1091:5;857:245;-1:-1:-1;;;857:245:1:o;1299:258::-;1371:1;1381:113;1395:6;1392:1;1389:13;1381:113;;;1471:11;;;1465:18;1452:11;;;1445:39;1417:2;1410:10;1381:113;;;1512:6;1509:1;1506:13;1503:48;;;-1:-1:-1;;1547:1:1;1529:16;;1522:27;1299:258::o;1562:::-;1604:3;1642:5;1636:12;1669:6;1664:3;1657:19;1685:63;1741:6;1734:4;1729:3;1725:14;1718:4;1711:5;1707:16;1685:63;:::i;:::-;1802:2;1781:15;-1:-1:-1;;1777:29:1;1768:39;;;;1809:4;1764:50;;1562:258;-1:-1:-1;;1562:258:1:o;1825:220::-;1974:2;1963:9;1956:21;1937:4;1994:45;2035:2;2024:9;2020:18;2012:6;1994:45;:::i;2050:180::-;2109:6;2162:2;2150:9;2141:7;2137:23;2133:32;2130:52;;;2178:1;2175;2168:12;2130:52;-1:-1:-1;2201:23:1;;2050:180;-1:-1:-1;2050:180:1:o;2235:248::-;2303:6;2311;2364:2;2352:9;2343:7;2339:23;2335:32;2332:52;;;2380:1;2377;2370:12;2332:52;-1:-1:-1;;2403:23:1;;;2473:2;2458:18;;;2445:32;;-1:-1:-1;2235:248:1:o;2790:184::-;-1:-1:-1;;;2839:1:1;2832:88;2939:4;2936:1;2929:15;2963:4;2960:1;2953:15;2979:249;3089:2;3070:13;;-1:-1:-1;;3066:27:1;3054:40;;3124:18;3109:34;;3145:22;;;3106:62;3103:88;;;3171:18;;:::i;:::-;3207:2;3200:22;-1:-1:-1;;2979:249:1:o;3233:183::-;3293:4;3326:18;3318:6;3315:30;3312:56;;;3348:18;;:::i;:::-;-1:-1:-1;3393:1:1;3389:14;3405:4;3385:25;;3233:183::o;3421:724::-;3475:5;3528:3;3521:4;3513:6;3509:17;3505:27;3495:55;;3546:1;3543;3536:12;3495:55;3582:6;3569:20;3608:4;3631:43;3671:2;3631:43;:::i;:::-;3703:2;3697:9;3715:31;3743:2;3735:6;3715:31;:::i;:::-;3781:18;;;3873:1;3869:10;;;;3857:23;;3853:32;;;3815:15;;;;-1:-1:-1;3897:15:1;;;3894:35;;;3925:1;3922;3915:12;3894:35;3961:2;3953:6;3949:15;3973:142;3989:6;3984:3;3981:15;3973:142;;;4055:17;;4043:30;;4093:12;;;;4006;;3973:142;;;-1:-1:-1;4133:6:1;3421:724;-1:-1:-1;;;;;;3421:724:1:o;4150:555::-;4192:5;4245:3;4238:4;4230:6;4226:17;4222:27;4212:55;;4263:1;4260;4253:12;4212:55;4299:6;4286:20;4325:18;4321:2;4318:26;4315:52;;;4347:18;;:::i;:::-;4396:2;4390:9;4408:67;4463:2;4444:13;;-1:-1:-1;;4440:27:1;4469:4;4436:38;4390:9;4408:67;:::i;:::-;4499:2;4491:6;4484:18;4545:3;4538:4;4533:2;4525:6;4521:15;4517:26;4514:35;4511:55;;;4562:1;4559;4552:12;4511:55;4626:2;4619:4;4611:6;4607:17;4600:4;4592:6;4588:17;4575:54;4673:1;4649:15;;;4666:4;4645:26;4638:37;;;;4653:6;4150:555;-1:-1:-1;;;4150:555:1:o;4710:1071::-;4864:6;4872;4880;4888;4896;4949:3;4937:9;4928:7;4924:23;4920:33;4917:53;;;4966:1;4963;4956:12;4917:53;5005:9;4992:23;5024:31;5049:5;5024:31;:::i;:::-;5074:5;-1:-1:-1;5131:2:1;5116:18;;5103:32;5144:33;5103:32;5144:33;:::i;:::-;5196:7;-1:-1:-1;5254:2:1;5239:18;;5226:32;5277:18;5307:14;;;5304:34;;;5334:1;5331;5324:12;5304:34;5357:61;5410:7;5401:6;5390:9;5386:22;5357:61;:::i;:::-;5347:71;;5471:2;5460:9;5456:18;5443:32;5427:48;;5500:2;5490:8;5487:16;5484:36;;;5516:1;5513;5506:12;5484:36;5539:63;5594:7;5583:8;5572:9;5568:24;5539:63;:::i;:::-;5529:73;;5655:3;5644:9;5640:19;5627:33;5611:49;;5685:2;5675:8;5672:16;5669:36;;;5701:1;5698;5691:12;5669:36;;5724:51;5767:7;5756:8;5745:9;5741:24;5724:51;:::i;:::-;5714:61;;;4710:1071;;;;;;;;:::o;5968:367::-;6031:8;6041:6;6095:3;6088:4;6080:6;6076:17;6072:27;6062:55;;6113:1;6110;6103:12;6062:55;-1:-1:-1;6136:20:1;;6179:18;6168:30;;6165:50;;;6211:1;6208;6201:12;6165:50;6248:4;6240:6;6236:17;6224:29;;6308:3;6301:4;6291:6;6288:1;6284:14;6276:6;6272:27;6268:38;6265:47;6262:67;;;6325:1;6322;6315:12;6340:773;6462:6;6470;6478;6486;6539:2;6527:9;6518:7;6514:23;6510:32;6507:52;;;6555:1;6552;6545:12;6507:52;6595:9;6582:23;6624:18;6665:2;6657:6;6654:14;6651:34;;;6681:1;6678;6671:12;6651:34;6720:70;6782:7;6773:6;6762:9;6758:22;6720:70;:::i;:::-;6809:8;;-1:-1:-1;6694:96:1;-1:-1:-1;6897:2:1;6882:18;;6869:32;;-1:-1:-1;6913:16:1;;;6910:36;;;6942:1;6939;6932:12;6910:36;;6981:72;7045:7;7034:8;7023:9;7019:24;6981:72;:::i;:::-;6340:773;;;;-1:-1:-1;7072:8:1;-1:-1:-1;;;;6340:773:1:o;7118:1277::-;7236:6;7244;7297:2;7285:9;7276:7;7272:23;7268:32;7265:52;;;7313:1;7310;7303:12;7265:52;7353:9;7340:23;7382:18;7423:2;7415:6;7412:14;7409:34;;;7439:1;7436;7429:12;7409:34;7477:6;7466:9;7462:22;7452:32;;7522:7;7515:4;7511:2;7507:13;7503:27;7493:55;;7544:1;7541;7534:12;7493:55;7580:2;7567:16;7602:4;7625:43;7665:2;7625:43;:::i;:::-;7697:2;7691:9;7709:31;7737:2;7729:6;7709:31;:::i;:::-;7775:18;;;7863:1;7859:10;;;;7851:19;;7847:28;;;7809:15;;;;-1:-1:-1;7887:19:1;;;7884:39;;;7919:1;7916;7909:12;7884:39;7943:11;;;;7963:217;7979:6;7974:3;7971:15;7963:217;;;8059:3;8046:17;8076:31;8101:5;8076:31;:::i;:::-;8120:18;;7996:12;;;;8158;;;;7963:217;;;8199:6;-1:-1:-1;;8243:18:1;;8230:32;;-1:-1:-1;;8274:16:1;;;8271:36;;;8303:1;8300;8293:12;8271:36;;8326:63;8381:7;8370:8;8359:9;8355:24;8326:63;:::i;8400:435::-;8453:3;8491:5;8485:12;8518:6;8513:3;8506:19;8544:4;8573:2;8568:3;8564:12;8557:19;;8610:2;8603:5;8599:14;8631:1;8641:169;8655:6;8652:1;8649:13;8641:169;;;8716:13;;8704:26;;8750:12;;;;8785:15;;;;8677:1;8670:9;8641:169;;;-1:-1:-1;8826:3:1;;8400:435;-1:-1:-1;;;;;8400:435:1:o;8840:261::-;9019:2;9008:9;9001:21;8982:4;9039:56;9091:2;9080:9;9076:18;9068:6;9039:56;:::i;9106:184::-;-1:-1:-1;;;9155:1:1;9148:88;9255:4;9252:1;9245:15;9279:4;9276:1;9269:15;9295:404;9446:2;9431:18;;9479:1;9468:13;;9458:201;;-1:-1:-1;;;9512:1:1;9505:88;9616:4;9613:1;9606:15;9644:4;9641:1;9634:15;9458:201;9668:25;;;9295:404;:::o;9935:659::-;10014:6;10022;10030;10083:2;10071:9;10062:7;10058:23;10054:32;10051:52;;;10099:1;10096;10089:12;10051:52;10135:9;10122:23;10112:33;;10196:2;10185:9;10181:18;10168:32;10219:18;10260:2;10252:6;10249:14;10246:34;;;10276:1;10273;10266:12;10246:34;10314:6;10303:9;10299:22;10289:32;;10359:7;10352:4;10348:2;10344:13;10340:27;10330:55;;10381:1;10378;10371:12;10330:55;10421:2;10408:16;10447:2;10439:6;10436:14;10433:34;;;10463:1;10460;10453:12;10433:34;10508:7;10503:2;10494:6;10490:2;10486:15;10482:24;10479:37;10476:57;;;10529:1;10526;10519:12;10476:57;10560:2;10556;10552:11;10542:21;;10582:6;10572:16;;;;;9935:659;;;;;:::o;10599:321::-;10668:6;10721:2;10709:9;10700:7;10696:23;10692:32;10689:52;;;10737:1;10734;10727:12;10689:52;10777:9;10764:23;10810:18;10802:6;10799:30;10796:50;;;10842:1;10839;10832:12;10796:50;10865:49;10906:7;10897:6;10886:9;10882:22;10865:49;:::i;10925:416::-;10990:6;10998;11051:2;11039:9;11030:7;11026:23;11022:32;11019:52;;;11067:1;11064;11057:12;11019:52;11106:9;11093:23;11125:31;11150:5;11125:31;:::i;:::-;11175:5;-1:-1:-1;11232:2:1;11217:18;;11204:32;11274:15;;11267:23;11255:36;;11245:64;;11305:1;11302;11295:12;11245:64;11328:7;11318:17;;;10925:416;;;;;:::o;11346:437::-;11432:6;11440;11493:2;11481:9;11472:7;11468:23;11464:32;11461:52;;;11509:1;11506;11499:12;11461:52;11549:9;11536:23;11582:18;11574:6;11571:30;11568:50;;;11614:1;11611;11604:12;11568:50;11653:70;11715:7;11706:6;11695:9;11691:22;11653:70;:::i;:::-;11742:8;;11627:96;;-1:-1:-1;11346:437:1;-1:-1:-1;;;;11346:437:1:o;11788:247::-;11847:6;11900:2;11888:9;11879:7;11875:23;11871:32;11868:52;;;11916:1;11913;11906:12;11868:52;11955:9;11942:23;11974:31;11999:5;11974:31;:::i;12040:505::-;12135:6;12143;12151;12204:2;12192:9;12183:7;12179:23;12175:32;12172:52;;;12220:1;12217;12210:12;12172:52;12260:9;12247:23;12293:18;12285:6;12282:30;12279:50;;;12325:1;12322;12315:12;12279:50;12364:70;12426:7;12417:6;12406:9;12402:22;12364:70;:::i;:::-;12453:8;;12338:96;;-1:-1:-1;12535:2:1;12520:18;;;;12507:32;;12040:505;-1:-1:-1;;;;12040:505:1:o;12550:388::-;12618:6;12626;12679:2;12667:9;12658:7;12654:23;12650:32;12647:52;;;12695:1;12692;12685:12;12647:52;12734:9;12721:23;12753:31;12778:5;12753:31;:::i;:::-;12803:5;-1:-1:-1;12860:2:1;12845:18;;12832:32;12873:33;12832:32;12873:33;:::i;12943:1509::-;13073:6;13081;13089;13142:2;13130:9;13121:7;13117:23;13113:32;13110:52;;;13158:1;13155;13148:12;13110:52;13198:9;13185:23;13227:18;13268:2;13260:6;13257:14;13254:34;;;13284:1;13281;13274:12;13254:34;13323:70;13385:7;13376:6;13365:9;13361:22;13323:70;:::i;:::-;13412:8;;-1:-1:-1;13297:96:1;-1:-1:-1;13466:2:1;;-1:-1:-1;13506:18:1;;;13493:32;13537:16;;;13534:36;;;13566:1;13563;13556:12;13534:36;13589:24;;13644:4;13636:13;;13632:27;-1:-1:-1;13622:55:1;;13673:1;13670;13663:12;13622:55;13709:2;13696:16;13731:43;13771:2;13731:43;:::i;:::-;13803:2;13797:9;13815:31;13843:2;13835:6;13815:31;:::i;:::-;13881:18;;;13969:1;13965:10;;;;13957:19;;13953:28;;;13915:15;;;;-1:-1:-1;13993:19:1;;;13990:39;;;14025:1;14022;14015:12;13990:39;14057:2;14053;14049:11;14069:352;14085:6;14080:3;14077:15;14069:352;;;14171:3;14158:17;14207:2;14194:11;14191:19;14188:109;;;14251:1;14280:2;14276;14269:14;14188:109;14322:56;14370:7;14365:2;14351:11;14347:2;14343:20;14339:29;14322:56;:::i;:::-;14310:69;;-1:-1:-1;14399:12:1;;;;14102;;14069:352;;;14073:3;14440:6;14430:16;;;;;;;;12943:1509;;;;;:::o;14457:734::-;14561:6;14569;14577;14585;14593;14646:3;14634:9;14625:7;14621:23;14617:33;14614:53;;;14663:1;14660;14653:12;14614:53;14702:9;14689:23;14721:31;14746:5;14721:31;:::i;:::-;14771:5;-1:-1:-1;14828:2:1;14813:18;;14800:32;14841:33;14800:32;14841:33;:::i;:::-;14893:7;-1:-1:-1;14947:2:1;14932:18;;14919:32;;-1:-1:-1;14998:2:1;14983:18;;14970:32;;-1:-1:-1;15053:3:1;15038:19;;15025:33;15081:18;15070:30;;15067:50;;;15113:1;15110;15103:12;15067:50;15136:49;15177:7;15168:6;15157:9;15153:22;15136:49;:::i;15608:437::-;15687:1;15683:12;;;;15730;;;15751:61;;15805:4;15797:6;15793:17;15783:27;;15751:61;15858:2;15850:6;15847:14;15827:18;15824:38;15821:218;;-1:-1:-1;;;15892:1:1;15885:88;15996:4;15993:1;15986:15;16024:4;16021:1;16014:15;15821:218;;15608:437;;;:::o;17316:184::-;-1:-1:-1;;;17365:1:1;17358:88;17465:4;17462:1;17455:15;17489:4;17486:1;17479:15;17505:184;-1:-1:-1;;;17554:1:1;17547:88;17654:4;17651:1;17644:15;17678:4;17675:1;17668:15;17694:168;17734:7;17800:1;17796;17792:6;17788:14;17785:1;17782:21;17777:1;17770:9;17763:17;17759:45;17756:71;;;17807:18;;:::i;:::-;-1:-1:-1;17847:9:1;;17694:168::o;17867:184::-;-1:-1:-1;;;17916:1:1;17909:88;18016:4;18013:1;18006:15;18040:4;18037:1;18030:15;18056:120;18096:1;18122;18112:35;;18127:18;;:::i;:::-;-1:-1:-1;18161:9:1;;18056:120::o;18951:184::-;-1:-1:-1;;;19000:1:1;18993:88;19100:4;19097:1;19090:15;19124:4;19121:1;19114:15;19490:135;19529:3;19550:17;;;19547:43;;19570:18;;:::i;:::-;-1:-1:-1;19617:1:1;19606:13;;19490:135::o;22943:470::-;23122:3;23160:6;23154:13;23176:53;23222:6;23217:3;23210:4;23202:6;23198:17;23176:53;:::i;:::-;23292:13;;23251:16;;;;23314:57;23292:13;23251:16;23348:4;23336:17;;23314:57;:::i;:::-;23387:20;;22943:470;-1:-1:-1;;;;22943:470:1:o;23418:280::-;23517:6;23570:2;23558:9;23549:7;23545:23;23541:32;23538:52;;;23586:1;23583;23576:12;23538:52;23618:9;23612:16;23637:31;23662:5;23637:31;:::i;25746:128::-;25786:3;25817:1;25813:6;25810:1;25807:13;25804:39;;;25823:18;;:::i;:::-;-1:-1:-1;25859:9:1;;25746:128::o;25879:465::-;26136:2;26125:9;26118:21;26099:4;26162:56;26214:2;26203:9;26199:18;26191:6;26162:56;:::i;:::-;26266:9;26258:6;26254:22;26249:2;26238:9;26234:18;26227:50;26294:44;26331:6;26323;26294:44;:::i;:::-;26286:52;25879:465;-1:-1:-1;;;;;25879:465:1:o;28578:125::-;28618:4;28646:1;28643;28640:8;28637:34;;;28651:18;;:::i;:::-;-1:-1:-1;28688:9:1;;28578:125::o;28708:112::-;28740:1;28766;28756:35;;28771:18;;:::i;:::-;-1:-1:-1;28805:9:1;;28708:112::o;28825:850::-;29147:4;-1:-1:-1;;;;;29257:2:1;29249:6;29245:15;29234:9;29227:34;29309:2;29301:6;29297:15;29292:2;29281:9;29277:18;29270:43;;29349:3;29344:2;29333:9;29329:18;29322:31;29376:57;29428:3;29417:9;29413:19;29405:6;29376:57;:::i;:::-;29481:9;29473:6;29469:22;29464:2;29453:9;29449:18;29442:50;29515:44;29552:6;29544;29515:44;:::i;:::-;29501:58;;29608:9;29600:6;29596:22;29590:3;29579:9;29575:19;29568:51;29636:33;29662:6;29654;29636:33;:::i;:::-;29628:41;28825:850;-1:-1:-1;;;;;;;;28825:850:1:o;29680:249::-;29749:6;29802:2;29790:9;29781:7;29777:23;29773:32;29770:52;;;29818:1;29815;29808:12;29770:52;29850:9;29844:16;29869:30;29893:5;29869:30;:::i;29934:179::-;29969:3;30011:1;29993:16;29990:23;29987:120;;;30057:1;30054;30051;30036:23;-1:-1:-1;30094:1:1;30088:8;30083:3;30079:18;29987:120;29934:179;:::o;30118:671::-;30157:3;30199:4;30181:16;30178:26;30175:39;;;30118:671;:::o;30175:39::-;30241:2;30235:9;-1:-1:-1;;30306:16:1;30302:25;;30299:1;30235:9;30278:50;30357:4;30351:11;30381:16;30416:18;30487:2;30480:4;30472:6;30468:17;30465:25;30460:2;30452:6;30449:14;30446:45;30443:58;;;30494:5;;;;;30118:671;:::o;30443:58::-;30531:6;30525:4;30521:17;30510:28;;30567:3;30561:10;30594:2;30586:6;30583:14;30580:27;;;30600:5;;;;;;30118:671;:::o;30580:27::-;30684:2;30665:16;30659:4;30655:27;30651:36;30644:4;30635:6;30630:3;30626:16;30622:27;30619:69;30616:82;;;30691:5;;;;;;30118:671;:::o;30616:82::-;30707:57;30758:4;30749:6;30741;30737:19;30733:30;30727:4;30707:57;:::i;:::-;-1:-1:-1;30780:3:1;;30118:671;-1:-1:-1;;;;;30118:671:1:o;31624:584::-;31846:4;-1:-1:-1;;;;;31956:2:1;31948:6;31944:15;31933:9;31926:34;32008:2;32000:6;31996:15;31991:2;31980:9;31976:18;31969:43;;32048:6;32043:2;32032:9;32028:18;32021:34;32091:6;32086:2;32075:9;32071:18;32064:34;32135:3;32129;32118:9;32114:19;32107:32;32156:46;32197:3;32186:9;32182:19;32174:6;32156:46;:::i;:::-;32148:54;31624:584;-1:-1:-1;;;;;;;31624:584:1:o

Swarm Source

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