ETH Price: $3,463.07 (+0.34%)

Token

 

Overview

Max Total Supply

100

Holders

85

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
keungz.eth
0x6c8ee01f1f8b62e987b3d18f6f28b22a0ada755f
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:
SyndicatePosters

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-15
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// 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 v4.4.1 (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;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 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/Address.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (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.
        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. 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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// 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/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: @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: contracts/4_AlphaPass.sol

//SPDX-License-Identifier: Unlicense

pragma solidity ^0.8.0;






contract SyndicatePosters is ERC1155, Ownable, ReentrancyGuard {
  using Address for address;
  using SafeMath for uint256;
  using ECDSA for bytes32;

  uint256 public constant MAX_SUPPLY = 100;
  uint256 public constant RESERVED = 10;
  uint256 public constant TOKEN_ID = 0;

  mapping(bytes => bool) public signatureUsed;
  uint256 public totalSupply;
  bool public saleActive;
  address public signer = 0xb6e1c43C748DF0F8F983bF9da9FffFd66018750F; 

  constructor(string memory _uri) ERC1155(_uri) {
    _mint(msg.sender, TOKEN_ID, RESERVED, "");
    totalSupply = totalSupply.add(RESERVED);
  }

  function setSigner(address _signer) public onlyOwner {
    signer = _signer;
  }

  function flipSaleActive() public onlyOwner {
    saleActive = !saleActive;
  }

  function setMetadata(string memory _uri) public onlyOwner {
    _setURI(_uri);
  }

  function mint(bytes memory signature) public nonReentrant validMinter(signature) {
    require(saleActive, "Sale is not active");
    require(totalSupply.add(1) <= MAX_SUPPLY, "Exceeds maximum number of tokens");

    signatureUsed[signature] = true;
    _mint(_msgSender(), TOKEN_ID, 1, "");
    totalSupply = totalSupply.add(1);
  }

  modifier validMinter(bytes memory signature) {
    require(!signatureUsed[signature], "Signature already used");
    address _signer = ECDSA.recover(
      ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_msgSender()))),
      signature
    );
    require(signer == _signer, "Invalid signature");
    _;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"flipSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_uri","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"signatureUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405273b6e1c43c748df0f8f983bf9da9ffffd66018750f600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b5060405162004e6a38038062004e6a83398181016040528101906200008c9190620007fa565b806200009e816200011660201b60201c565b50620000bf620000b36200013260201b60201c565b6200013a60201b60201c565b6001600481905550620000ec336000600a604051806020016040528060008152506200020060201b60201c565b62000109600a600654620003c560201b6200102c1790919060201c565b6006819055505062000f3b565b80600290805190602001906200012e92919062000683565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026a9062000a30565b60405180910390fd5b6000620002856200013260201b60201c565b9050620002be81600087620002a088620003dd60201b60201c565b620002b188620003dd60201b60201c565b876200045e60201b60201c565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200031f919062000b16565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516200039f92919062000a52565b60405180910390a4620003be816000878787876200046660201b60201c565b5050505050565b60008183620003d5919062000b16565b905092915050565b60606000600167ffffffffffffffff811115620003ff57620003fe62000d0c565b5b6040519080825280602002602001820160405280156200042e5781602001602082028036833780820191505090505b509050828160008151811062000449576200044862000cdd565b5b60200260200101818152505080915050919050565b505050505050565b620004928473ffffffffffffffffffffffffffffffffffffffff166200067060201b620010421760201c565b1562000668578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401620004db95949392919062000964565b602060405180830381600087803b158015620004f657600080fd5b505af19250505080156200052a57506040513d601f19601f82011682018060405250810190620005279190620007c8565b60015b620005dc576200053962000d3b565b806308c379a014156200059d57506200055162000e7f565b806200055e57506200059f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005949190620009c8565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d390620009ec565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161462000666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200065d9062000a0e565b60405180910390fd5b505b505050505050565b600080823b905060008111915050919050565b828054620006919062000c13565b90600052602060002090601f016020900481019282620006b5576000855562000701565b82601f10620006d057805160ff191683800117855562000701565b8280016001018555821562000701579182015b8281111562000700578251825591602001919060010190620006e3565b5b50905062000710919062000714565b5090565b5b808211156200072f57600081600090555060010162000715565b5090565b60006200074a620007448462000aa8565b62000a7f565b90508281526020810184848401111562000769576200076862000d65565b5b6200077684828562000bdd565b509392505050565b6000815190506200078f8162000f21565b92915050565b600082601f830112620007ad57620007ac62000d60565b5b8151620007bf84826020860162000733565b91505092915050565b600060208284031215620007e157620007e062000d6f565b5b6000620007f1848285016200077e565b91505092915050565b60006020828403121562000813576200081262000d6f565b5b600082015167ffffffffffffffff81111562000834576200083362000d6a565b5b620008428482850162000795565b91505092915050565b620008568162000b73565b82525050565b6000620008698262000ade565b62000875818562000af4565b93506200088781856020860162000bdd565b620008928162000d74565b840191505092915050565b6000620008aa8262000ae9565b620008b6818562000b05565b9350620008c881856020860162000bdd565b620008d38162000d74565b840191505092915050565b6000620008ed60348362000b05565b9150620008fa8262000d92565b604082019050919050565b60006200091460288362000b05565b9150620009218262000de1565b604082019050919050565b60006200093b60218362000b05565b9150620009488262000e30565b604082019050919050565b6200095e8162000bd3565b82525050565b600060a0820190506200097b60008301886200084b565b6200098a60208301876200084b565b62000999604083018662000953565b620009a8606083018562000953565b8181036080830152620009bc81846200085c565b90509695505050505050565b60006020820190508181036000830152620009e481846200089d565b905092915050565b6000602082019050818103600083015262000a0781620008de565b9050919050565b6000602082019050818103600083015262000a298162000905565b9050919050565b6000602082019050818103600083015262000a4b816200092c565b9050919050565b600060408201905062000a69600083018562000953565b62000a78602083018462000953565b9392505050565b600062000a8b62000a9e565b905062000a99828262000c49565b919050565b6000604051905090565b600067ffffffffffffffff82111562000ac65762000ac562000d0c565b5b62000ad18262000d74565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000b238262000bd3565b915062000b308362000bd3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b685762000b6762000c7f565b5b828201905092915050565b600062000b808262000bb3565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000bfd57808201518184015260208101905062000be0565b8381111562000c0d576000848401525b50505050565b6000600282049050600182168062000c2c57607f821691505b6020821081141562000c435762000c4262000cae565b5b50919050565b62000c548262000d74565b810181811067ffffffffffffffff8211171562000c765762000c7562000d0c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111562000d5d5760046000803e62000d5a60005162000d85565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101562000e915762000f1e565b62000e9b62000a9e565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000ec557505062000f1e565b808201805167ffffffffffffffff81111562000ee5575050505062000f1e565b80602083010160043d03850181111562000f0457505050505062000f1e565b62000f158260200185018662000c49565b82955050505050505b90565b62000f2c8162000b87565b811462000f3857600080fd5b50565b613f1f8062000f4b6000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80637ba0e2e7116100b8578063aa592f251161007c578063aa592f2514610350578063bb10c8291461036e578063de8b51e11461039e578063e985e9c5146103a8578063f242432a146103d8578063f2fde38b146103f457610141565b80637ba0e2e7146102c057806389a89002146102dc5780638da5cb5b146102fa578063a22cb46514610318578063a49a1e7d1461033457610141565b80632eb2c2d61161010a5780632eb2c2d61461021257806332cb6b0c1461022e5780634e1273f41461024c57806368428a1b1461027c5780636c19e7831461029a578063715018a6146102b657610141565b8062fdd58e1461014657806301ffc9a7146101765780630e89341c146101a657806318160ddd146101d6578063238ac933146101f4575b600080fd5b610160600480360381019061015b91906127d5565b610410565b60405161016d919061333c565b60405180910390f35b610190600480360381019061018b919061288d565b6104d9565b60405161019d9190612ffa565b60405180910390f35b6101c060048036038101906101bb9190612979565b6105bb565b6040516101cd919061305a565b60405180910390f35b6101de61064f565b6040516101eb919061333c565b60405180910390f35b6101fc610655565b6040516102099190612ec4565b60405180910390f35b61022c6004803603810190610227919061262f565b61067b565b005b61023661071c565b604051610243919061333c565b60405180910390f35b61026660048036038101906102619190612815565b610721565b6040516102739190612fa1565b60405180910390f35b61028461083a565b6040516102919190612ffa565b60405180910390f35b6102b460048036038101906102af91906125c2565b61084d565b005b6102be61090d565b005b6102da60048036038101906102d591906128e7565b610995565b005b6102e4610c4f565b6040516102f1919061333c565b60405180910390f35b610302610c54565b60405161030f9190612ec4565b60405180910390f35b610332600480360381019061032d9190612795565b610c7e565b005b61034e60048036038101906103499190612930565b610c94565b005b610358610d1c565b604051610365919061333c565b60405180910390f35b610388600480360381019061038391906128e7565b610d21565b6040516103959190612ffa565b60405180910390f35b6103a6610d57565b005b6103c260048036038101906103bd91906125ef565b610dff565b6040516103cf9190612ffa565b60405180910390f35b6103f260048036038101906103ed91906126fe565b610e93565b005b61040e600480360381019061040991906125c2565b610f34565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610478906130fc565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b457506105b382611055565b5b9050919050565b6060600280546105ca90613609565b80601f01602080910402602001604051908101604052809291908181526020018280546105f690613609565b80156106435780601f1061061857610100808354040283529160200191610643565b820191906000526020600020905b81548152906001019060200180831161062657829003601f168201915b50505050509050919050565b60065481565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106836110bf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106c957506106c8856106c36110bf565b610dff565b5b610708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ff9061321c565b60405180910390fd5b61071585858585856110c7565b5050505050565b606481565b60608151835114610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e906132bc565b60405180910390fd5b6000835167ffffffffffffffff8111156107845761078361379f565b5b6040519080825280602002602001820160405280156107b25781602001602082028036833780820191505090505b50905060005b845181101561082f576107ff8582815181106107d7576107d6613770565b5b60200260200101518583815181106107f2576107f1613770565b5b6020026020010151610410565b82828151811061081257610811613770565b5b602002602001018181525050806108289061366c565b90506107b8565b508091505092915050565b600760009054906101000a900460ff1681565b6108556110bf565b73ffffffffffffffffffffffffffffffffffffffff16610873610c54565b73ffffffffffffffffffffffffffffffffffffffff16146108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c09061327c565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109156110bf565b73ffffffffffffffffffffffffffffffffffffffff16610933610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109809061327c565b60405180910390fd5b61099360006113db565b565b600260045414156109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d29061331c565b60405180910390fd5b6002600481905550806005816040516109f49190612e87565b908152602001604051809103902060009054906101000a900460ff1615610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a479061315c565b60405180910390fd5b6000610a91610a8b610a606110bf565b604051602001610a709190612e6c565b604051602081830303815290604052805190602001206114a1565b836114d1565b90508073ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906131bc565b60405180910390fd5b600760009054906101000a900460ff16610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b699061319c565b60405180910390fd5b6064610b8a600160065461102c90919063ffffffff16565b1115610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061313c565b60405180910390fd5b6001600584604051610bdd9190612e87565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610c26610c0d6110bf565b60006001604051806020016040528060008152506114f8565b610c3c600160065461102c90919063ffffffff16565b6006819055505050600160048190555050565b600081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c90610c896110bf565b838361168e565b5050565b610c9c6110bf565b73ffffffffffffffffffffffffffffffffffffffff16610cba610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d079061327c565b60405180910390fd5b610d19816117fb565b50565b600a81565b6005818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610d5f6110bf565b73ffffffffffffffffffffffffffffffffffffffff16610d7d610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061327c565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e9b6110bf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ee15750610ee085610edb6110bf565b610dff565b5b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f179061317c565b60405180910390fd5b610f2d8585858585611815565b5050505050565b610f3c6110bf565b73ffffffffffffffffffffffffffffffffffffffff16610f5a610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa79061327c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611020576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110179061311c565b60405180910390fd5b611029816113db565b50565b6000818361103a91906134e6565b905092915050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b815183511461110b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611102906132dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561117b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611172906131fc565b60405180910390fd5b60006111856110bf565b9050611195818787878787611a97565b60005b84518110156113465760008582815181106111b6576111b5613770565b5b6020026020010151905060008583815181106111d5576111d4613770565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d9061325c565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461132b91906134e6565b925050819055505050508061133f9061366c565b9050611198565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516113bd929190612fc3565b60405180910390a46113d3818787878787611a9f565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816040516020016114b49190612e9e565b604051602081830303815290604052805190602001209050919050565b60008060006114e08585611c86565b915091506114ed81611d09565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f906132fc565b60405180910390fd5b60006115726110bf565b90506115938160008761158488611ede565b61158d88611ede565b87611a97565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115f291906134e6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611670929190613357565b60405180910390a461168781600087878787611f58565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f49061329c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117ee9190612ffa565b60405180910390a3505050565b806002908051906020019061181192919061229a565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c906131fc565b60405180910390fd5b600061188f6110bf565b90506118af8187876118a088611ede565b6118a988611ede565b87611a97565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d9061325c565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119fb91906134e6565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611a78929190613357565b60405180910390a4611a8e828888888888611f58565b50505050505050565b505050505050565b611abe8473ffffffffffffffffffffffffffffffffffffffff16611042565b15611c7e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611b04959493929190612edf565b602060405180830381600087803b158015611b1e57600080fd5b505af1925050508015611b4f57506040513d601f19601f82011682018060405250810190611b4c91906128ba565b60015b611bf557611b5b6137ce565b806308c379a01415611bb85750611b70613df7565b80611b7b5750611bba565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf919061305a565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061309c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c73906130bc565b60405180910390fd5b505b505050505050565b600080604183511415611cc85760008060006020860151925060408601519150606086015160001a9050611cbc8782858561213f565b94509450505050611d02565b604083511415611cf9576000806020850151915060408501519050611cee86838361224c565b935093505050611d02565b60006002915091505b9250929050565b60006004811115611d1d57611d1c613712565b5b816004811115611d3057611d2f613712565b5b1415611d3b57611edb565b60016004811115611d4f57611d4e613712565b5b816004811115611d6257611d61613712565b5b1415611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a9061307c565b60405180910390fd5b60026004811115611db757611db6613712565b5b816004811115611dca57611dc9613712565b5b1415611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906130dc565b60405180910390fd5b60036004811115611e1f57611e1e613712565b5b816004811115611e3257611e31613712565b5b1415611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a906131dc565b60405180910390fd5b600480811115611e8657611e85613712565b5b816004811115611e9957611e98613712565b5b1415611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed19061323c565b60405180910390fd5b5b50565b60606000600167ffffffffffffffff811115611efd57611efc61379f565b5b604051908082528060200260200182016040528015611f2b5781602001602082028036833780820191505090505b5090508281600081518110611f4357611f42613770565b5b60200260200101818152505080915050919050565b611f778473ffffffffffffffffffffffffffffffffffffffff16611042565b15612137578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611fbd959493929190612f47565b602060405180830381600087803b158015611fd757600080fd5b505af192505050801561200857506040513d601f19601f8201168201806040525081019061200591906128ba565b60015b6120ae576120146137ce565b806308c379a014156120715750612029613df7565b806120345750612073565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612068919061305a565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a59061309c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c906130bc565b60405180910390fd5b505b505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217a576000600391509150612243565b601b8560ff16141580156121925750601c8560ff1614155b156121a4576000600491509150612243565b6000600187878787604051600081526020016040526040516121c99493929190613015565b6020604051602081039080840390855afa1580156121eb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223a57600060019250925050612243565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061228c8782888561213f565b935093505050935093915050565b8280546122a690613609565b90600052602060002090601f0160209004810192826122c8576000855561230f565b82601f106122e157805160ff191683800117855561230f565b8280016001018555821561230f579182015b8281111561230e5782518255916020019190600101906122f3565b5b50905061231c9190612320565b5090565b5b80821115612339576000816000905550600101612321565b5090565b600061235061234b846133a5565b613380565b90508083825260208201905082856020860282011115612373576123726137f5565b5b60005b858110156123a3578161238988826124a1565b845260208401935060208301925050600181019050612376565b5050509392505050565b60006123c06123bb846133d1565b613380565b905080838252602082019050828560208602820111156123e3576123e26137f5565b5b60005b8581101561241357816123f988826125ad565b8452602084019350602083019250506001810190506123e6565b5050509392505050565b600061243061242b846133fd565b613380565b90508281526020810184848401111561244c5761244b6137fa565b5b6124578482856135c7565b509392505050565b600061247261246d8461342e565b613380565b90508281526020810184848401111561248e5761248d6137fa565b5b6124998482856135c7565b509392505050565b6000813590506124b081613e8d565b92915050565b600082601f8301126124cb576124ca6137f0565b5b81356124db84826020860161233d565b91505092915050565b600082601f8301126124f9576124f86137f0565b5b81356125098482602086016123ad565b91505092915050565b60008135905061252181613ea4565b92915050565b60008135905061253681613ebb565b92915050565b60008151905061254b81613ebb565b92915050565b600082601f830112612566576125656137f0565b5b813561257684826020860161241d565b91505092915050565b600082601f830112612594576125936137f0565b5b81356125a484826020860161245f565b91505092915050565b6000813590506125bc81613ed2565b92915050565b6000602082840312156125d8576125d7613804565b5b60006125e6848285016124a1565b91505092915050565b6000806040838503121561260657612605613804565b5b6000612614858286016124a1565b9250506020612625858286016124a1565b9150509250929050565b600080600080600060a0868803121561264b5761264a613804565b5b6000612659888289016124a1565b955050602061266a888289016124a1565b945050604086013567ffffffffffffffff81111561268b5761268a6137ff565b5b612697888289016124e4565b935050606086013567ffffffffffffffff8111156126b8576126b76137ff565b5b6126c4888289016124e4565b925050608086013567ffffffffffffffff8111156126e5576126e46137ff565b5b6126f188828901612551565b9150509295509295909350565b600080600080600060a0868803121561271a57612719613804565b5b6000612728888289016124a1565b9550506020612739888289016124a1565b945050604061274a888289016125ad565b935050606061275b888289016125ad565b925050608086013567ffffffffffffffff81111561277c5761277b6137ff565b5b61278888828901612551565b9150509295509295909350565b600080604083850312156127ac576127ab613804565b5b60006127ba858286016124a1565b92505060206127cb85828601612512565b9150509250929050565b600080604083850312156127ec576127eb613804565b5b60006127fa858286016124a1565b925050602061280b858286016125ad565b9150509250929050565b6000806040838503121561282c5761282b613804565b5b600083013567ffffffffffffffff81111561284a576128496137ff565b5b612856858286016124b6565b925050602083013567ffffffffffffffff811115612877576128766137ff565b5b612883858286016124e4565b9150509250929050565b6000602082840312156128a3576128a2613804565b5b60006128b184828501612527565b91505092915050565b6000602082840312156128d0576128cf613804565b5b60006128de8482850161253c565b91505092915050565b6000602082840312156128fd576128fc613804565b5b600082013567ffffffffffffffff81111561291b5761291a6137ff565b5b61292784828501612551565b91505092915050565b60006020828403121561294657612945613804565b5b600082013567ffffffffffffffff811115612964576129636137ff565b5b6129708482850161257f565b91505092915050565b60006020828403121561298f5761298e613804565b5b600061299d848285016125ad565b91505092915050565b60006129b28383612e3f565b60208301905092915050565b6129c78161353c565b82525050565b6129de6129d98261353c565b6136b5565b82525050565b60006129ef8261346f565b6129f9818561349d565b9350612a048361345f565b8060005b83811015612a35578151612a1c88826129a6565b9750612a2783613490565b925050600181019050612a08565b5085935050505092915050565b612a4b8161354e565b82525050565b612a5a8161355a565b82525050565b612a71612a6c8261355a565b6136c7565b82525050565b6000612a828261347a565b612a8c81856134ae565b9350612a9c8185602086016135d6565b612aa581613809565b840191505092915050565b6000612abb8261347a565b612ac581856134bf565b9350612ad58185602086016135d6565b80840191505092915050565b6000612aec82613485565b612af681856134ca565b9350612b068185602086016135d6565b612b0f81613809565b840191505092915050565b6000612b276018836134ca565b9150612b3282613834565b602082019050919050565b6000612b4a6034836134ca565b9150612b558261385d565b604082019050919050565b6000612b6d6028836134ca565b9150612b78826138ac565b604082019050919050565b6000612b90601f836134ca565b9150612b9b826138fb565b602082019050919050565b6000612bb3601c836134db565b9150612bbe82613924565b601c82019050919050565b6000612bd6602b836134ca565b9150612be18261394d565b604082019050919050565b6000612bf96026836134ca565b9150612c048261399c565b604082019050919050565b6000612c1c6020836134ca565b9150612c27826139eb565b602082019050919050565b6000612c3f6016836134ca565b9150612c4a82613a14565b602082019050919050565b6000612c626029836134ca565b9150612c6d82613a3d565b604082019050919050565b6000612c856012836134ca565b9150612c9082613a8c565b602082019050919050565b6000612ca86011836134ca565b9150612cb382613ab5565b602082019050919050565b6000612ccb6022836134ca565b9150612cd682613ade565b604082019050919050565b6000612cee6025836134ca565b9150612cf982613b2d565b604082019050919050565b6000612d116032836134ca565b9150612d1c82613b7c565b604082019050919050565b6000612d346022836134ca565b9150612d3f82613bcb565b604082019050919050565b6000612d57602a836134ca565b9150612d6282613c1a565b604082019050919050565b6000612d7a6020836134ca565b9150612d8582613c69565b602082019050919050565b6000612d9d6029836134ca565b9150612da882613c92565b604082019050919050565b6000612dc06029836134ca565b9150612dcb82613ce1565b604082019050919050565b6000612de36028836134ca565b9150612dee82613d30565b604082019050919050565b6000612e066021836134ca565b9150612e1182613d7f565b604082019050919050565b6000612e29601f836134ca565b9150612e3482613dce565b602082019050919050565b612e48816135b0565b82525050565b612e57816135b0565b82525050565b612e66816135ba565b82525050565b6000612e7882846129cd565b60148201915081905092915050565b6000612e938284612ab0565b915081905092915050565b6000612ea982612ba6565b9150612eb58284612a60565b60208201915081905092915050565b6000602082019050612ed960008301846129be565b92915050565b600060a082019050612ef460008301886129be565b612f0160208301876129be565b8181036040830152612f1381866129e4565b90508181036060830152612f2781856129e4565b90508181036080830152612f3b8184612a77565b90509695505050505050565b600060a082019050612f5c60008301886129be565b612f6960208301876129be565b612f766040830186612e4e565b612f836060830185612e4e565b8181036080830152612f958184612a77565b90509695505050505050565b60006020820190508181036000830152612fbb81846129e4565b905092915050565b60006040820190508181036000830152612fdd81856129e4565b90508181036020830152612ff181846129e4565b90509392505050565b600060208201905061300f6000830184612a42565b92915050565b600060808201905061302a6000830187612a51565b6130376020830186612e5d565b6130446040830185612a51565b6130516060830184612a51565b95945050505050565b600060208201905081810360008301526130748184612ae1565b905092915050565b6000602082019050818103600083015261309581612b1a565b9050919050565b600060208201905081810360008301526130b581612b3d565b9050919050565b600060208201905081810360008301526130d581612b60565b9050919050565b600060208201905081810360008301526130f581612b83565b9050919050565b6000602082019050818103600083015261311581612bc9565b9050919050565b6000602082019050818103600083015261313581612bec565b9050919050565b6000602082019050818103600083015261315581612c0f565b9050919050565b6000602082019050818103600083015261317581612c32565b9050919050565b6000602082019050818103600083015261319581612c55565b9050919050565b600060208201905081810360008301526131b581612c78565b9050919050565b600060208201905081810360008301526131d581612c9b565b9050919050565b600060208201905081810360008301526131f581612cbe565b9050919050565b6000602082019050818103600083015261321581612ce1565b9050919050565b6000602082019050818103600083015261323581612d04565b9050919050565b6000602082019050818103600083015261325581612d27565b9050919050565b6000602082019050818103600083015261327581612d4a565b9050919050565b6000602082019050818103600083015261329581612d6d565b9050919050565b600060208201905081810360008301526132b581612d90565b9050919050565b600060208201905081810360008301526132d581612db3565b9050919050565b600060208201905081810360008301526132f581612dd6565b9050919050565b6000602082019050818103600083015261331581612df9565b9050919050565b6000602082019050818103600083015261333581612e1c565b9050919050565b60006020820190506133516000830184612e4e565b92915050565b600060408201905061336c6000830185612e4e565b6133796020830184612e4e565b9392505050565b600061338a61339b565b9050613396828261363b565b919050565b6000604051905090565b600067ffffffffffffffff8211156133c0576133bf61379f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156133ec576133eb61379f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156134185761341761379f565b5b61342182613809565b9050602081019050919050565b600067ffffffffffffffff8211156134495761344861379f565b5b61345282613809565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134f1826135b0565b91506134fc836135b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613531576135306136e3565b5b828201905092915050565b600061354782613590565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156135f45780820151818401526020810190506135d9565b83811115613603576000848401525b50505050565b6000600282049050600182168061362157607f821691505b6020821081141561363557613634613741565b5b50919050565b61364482613809565b810181811067ffffffffffffffff821117156136635761366261379f565b5b80604052505050565b6000613677826135b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136aa576136a96136e3565b5b600182019050919050565b60006136c0826136d1565b9050919050565b6000819050919050565b60006136dc8261381a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156137ed5760046000803e6137ea600051613827565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e73600082015250565b7f5369676e617475726520616c7265616479207573656400000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015613e0757613e8a565b613e0f61339b565b60043d036004823e80513d602482011167ffffffffffffffff82111715613e37575050613e8a565b808201805167ffffffffffffffff811115613e555750505050613e8a565b80602083010160043d038501811115613e72575050505050613e8a565b613e818260200185018661363b565b82955050505050505b90565b613e968161353c565b8114613ea157600080fd5b50565b613ead8161354e565b8114613eb857600080fd5b50565b613ec481613564565b8114613ecf57600080fd5b50565b613edb816135b0565b8114613ee657600080fd5b5056fea26469706673582212206ba817df0844706a30bfd7684dc893199ea00711b6219ea2e8e6596392b325a564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000114579654f6654686553796e646963617465000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c80637ba0e2e7116100b8578063aa592f251161007c578063aa592f2514610350578063bb10c8291461036e578063de8b51e11461039e578063e985e9c5146103a8578063f242432a146103d8578063f2fde38b146103f457610141565b80637ba0e2e7146102c057806389a89002146102dc5780638da5cb5b146102fa578063a22cb46514610318578063a49a1e7d1461033457610141565b80632eb2c2d61161010a5780632eb2c2d61461021257806332cb6b0c1461022e5780634e1273f41461024c57806368428a1b1461027c5780636c19e7831461029a578063715018a6146102b657610141565b8062fdd58e1461014657806301ffc9a7146101765780630e89341c146101a657806318160ddd146101d6578063238ac933146101f4575b600080fd5b610160600480360381019061015b91906127d5565b610410565b60405161016d919061333c565b60405180910390f35b610190600480360381019061018b919061288d565b6104d9565b60405161019d9190612ffa565b60405180910390f35b6101c060048036038101906101bb9190612979565b6105bb565b6040516101cd919061305a565b60405180910390f35b6101de61064f565b6040516101eb919061333c565b60405180910390f35b6101fc610655565b6040516102099190612ec4565b60405180910390f35b61022c6004803603810190610227919061262f565b61067b565b005b61023661071c565b604051610243919061333c565b60405180910390f35b61026660048036038101906102619190612815565b610721565b6040516102739190612fa1565b60405180910390f35b61028461083a565b6040516102919190612ffa565b60405180910390f35b6102b460048036038101906102af91906125c2565b61084d565b005b6102be61090d565b005b6102da60048036038101906102d591906128e7565b610995565b005b6102e4610c4f565b6040516102f1919061333c565b60405180910390f35b610302610c54565b60405161030f9190612ec4565b60405180910390f35b610332600480360381019061032d9190612795565b610c7e565b005b61034e60048036038101906103499190612930565b610c94565b005b610358610d1c565b604051610365919061333c565b60405180910390f35b610388600480360381019061038391906128e7565b610d21565b6040516103959190612ffa565b60405180910390f35b6103a6610d57565b005b6103c260048036038101906103bd91906125ef565b610dff565b6040516103cf9190612ffa565b60405180910390f35b6103f260048036038101906103ed91906126fe565b610e93565b005b61040e600480360381019061040991906125c2565b610f34565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610481576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610478906130fc565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b457506105b382611055565b5b9050919050565b6060600280546105ca90613609565b80601f01602080910402602001604051908101604052809291908181526020018280546105f690613609565b80156106435780601f1061061857610100808354040283529160200191610643565b820191906000526020600020905b81548152906001019060200180831161062657829003601f168201915b50505050509050919050565b60065481565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106836110bf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106c957506106c8856106c36110bf565b610dff565b5b610708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ff9061321c565b60405180910390fd5b61071585858585856110c7565b5050505050565b606481565b60608151835114610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e906132bc565b60405180910390fd5b6000835167ffffffffffffffff8111156107845761078361379f565b5b6040519080825280602002602001820160405280156107b25781602001602082028036833780820191505090505b50905060005b845181101561082f576107ff8582815181106107d7576107d6613770565b5b60200260200101518583815181106107f2576107f1613770565b5b6020026020010151610410565b82828151811061081257610811613770565b5b602002602001018181525050806108289061366c565b90506107b8565b508091505092915050565b600760009054906101000a900460ff1681565b6108556110bf565b73ffffffffffffffffffffffffffffffffffffffff16610873610c54565b73ffffffffffffffffffffffffffffffffffffffff16146108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c09061327c565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109156110bf565b73ffffffffffffffffffffffffffffffffffffffff16610933610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109809061327c565b60405180910390fd5b61099360006113db565b565b600260045414156109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d29061331c565b60405180910390fd5b6002600481905550806005816040516109f49190612e87565b908152602001604051809103902060009054906101000a900460ff1615610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a479061315c565b60405180910390fd5b6000610a91610a8b610a606110bf565b604051602001610a709190612e6c565b604051602081830303815290604052805190602001206114a1565b836114d1565b90508073ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906131bc565b60405180910390fd5b600760009054906101000a900460ff16610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b699061319c565b60405180910390fd5b6064610b8a600160065461102c90919063ffffffff16565b1115610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061313c565b60405180910390fd5b6001600584604051610bdd9190612e87565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610c26610c0d6110bf565b60006001604051806020016040528060008152506114f8565b610c3c600160065461102c90919063ffffffff16565b6006819055505050600160048190555050565b600081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c90610c896110bf565b838361168e565b5050565b610c9c6110bf565b73ffffffffffffffffffffffffffffffffffffffff16610cba610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d079061327c565b60405180910390fd5b610d19816117fb565b50565b600a81565b6005818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610d5f6110bf565b73ffffffffffffffffffffffffffffffffffffffff16610d7d610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061327c565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e9b6110bf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ee15750610ee085610edb6110bf565b610dff565b5b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f179061317c565b60405180910390fd5b610f2d8585858585611815565b5050505050565b610f3c6110bf565b73ffffffffffffffffffffffffffffffffffffffff16610f5a610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa79061327c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611020576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110179061311c565b60405180910390fd5b611029816113db565b50565b6000818361103a91906134e6565b905092915050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b815183511461110b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611102906132dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561117b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611172906131fc565b60405180910390fd5b60006111856110bf565b9050611195818787878787611a97565b60005b84518110156113465760008582815181106111b6576111b5613770565b5b6020026020010151905060008583815181106111d5576111d4613770565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d9061325c565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461132b91906134e6565b925050819055505050508061133f9061366c565b9050611198565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516113bd929190612fc3565b60405180910390a46113d3818787878787611a9f565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816040516020016114b49190612e9e565b604051602081830303815290604052805190602001209050919050565b60008060006114e08585611c86565b915091506114ed81611d09565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155f906132fc565b60405180910390fd5b60006115726110bf565b90506115938160008761158488611ede565b61158d88611ede565b87611a97565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115f291906134e6565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611670929190613357565b60405180910390a461168781600087878787611f58565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f49061329c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117ee9190612ffa565b60405180910390a3505050565b806002908051906020019061181192919061229a565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187c906131fc565b60405180910390fd5b600061188f6110bf565b90506118af8187876118a088611ede565b6118a988611ede565b87611a97565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d9061325c565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119fb91906134e6565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611a78929190613357565b60405180910390a4611a8e828888888888611f58565b50505050505050565b505050505050565b611abe8473ffffffffffffffffffffffffffffffffffffffff16611042565b15611c7e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611b04959493929190612edf565b602060405180830381600087803b158015611b1e57600080fd5b505af1925050508015611b4f57506040513d601f19601f82011682018060405250810190611b4c91906128ba565b60015b611bf557611b5b6137ce565b806308c379a01415611bb85750611b70613df7565b80611b7b5750611bba565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf919061305a565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec9061309c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c73906130bc565b60405180910390fd5b505b505050505050565b600080604183511415611cc85760008060006020860151925060408601519150606086015160001a9050611cbc8782858561213f565b94509450505050611d02565b604083511415611cf9576000806020850151915060408501519050611cee86838361224c565b935093505050611d02565b60006002915091505b9250929050565b60006004811115611d1d57611d1c613712565b5b816004811115611d3057611d2f613712565b5b1415611d3b57611edb565b60016004811115611d4f57611d4e613712565b5b816004811115611d6257611d61613712565b5b1415611da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9a9061307c565b60405180910390fd5b60026004811115611db757611db6613712565b5b816004811115611dca57611dc9613712565b5b1415611e0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e02906130dc565b60405180910390fd5b60036004811115611e1f57611e1e613712565b5b816004811115611e3257611e31613712565b5b1415611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a906131dc565b60405180910390fd5b600480811115611e8657611e85613712565b5b816004811115611e9957611e98613712565b5b1415611eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed19061323c565b60405180910390fd5b5b50565b60606000600167ffffffffffffffff811115611efd57611efc61379f565b5b604051908082528060200260200182016040528015611f2b5781602001602082028036833780820191505090505b5090508281600081518110611f4357611f42613770565b5b60200260200101818152505080915050919050565b611f778473ffffffffffffffffffffffffffffffffffffffff16611042565b15612137578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611fbd959493929190612f47565b602060405180830381600087803b158015611fd757600080fd5b505af192505050801561200857506040513d601f19601f8201168201806040525081019061200591906128ba565b60015b6120ae576120146137ce565b806308c379a014156120715750612029613df7565b806120345750612073565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612068919061305a565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a59061309c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c906130bc565b60405180910390fd5b505b505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561217a576000600391509150612243565b601b8560ff16141580156121925750601c8560ff1614155b156121a4576000600491509150612243565b6000600187878787604051600081526020016040526040516121c99493929190613015565b6020604051602081039080840390855afa1580156121eb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223a57600060019250925050612243565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061228c8782888561213f565b935093505050935093915050565b8280546122a690613609565b90600052602060002090601f0160209004810192826122c8576000855561230f565b82601f106122e157805160ff191683800117855561230f565b8280016001018555821561230f579182015b8281111561230e5782518255916020019190600101906122f3565b5b50905061231c9190612320565b5090565b5b80821115612339576000816000905550600101612321565b5090565b600061235061234b846133a5565b613380565b90508083825260208201905082856020860282011115612373576123726137f5565b5b60005b858110156123a3578161238988826124a1565b845260208401935060208301925050600181019050612376565b5050509392505050565b60006123c06123bb846133d1565b613380565b905080838252602082019050828560208602820111156123e3576123e26137f5565b5b60005b8581101561241357816123f988826125ad565b8452602084019350602083019250506001810190506123e6565b5050509392505050565b600061243061242b846133fd565b613380565b90508281526020810184848401111561244c5761244b6137fa565b5b6124578482856135c7565b509392505050565b600061247261246d8461342e565b613380565b90508281526020810184848401111561248e5761248d6137fa565b5b6124998482856135c7565b509392505050565b6000813590506124b081613e8d565b92915050565b600082601f8301126124cb576124ca6137f0565b5b81356124db84826020860161233d565b91505092915050565b600082601f8301126124f9576124f86137f0565b5b81356125098482602086016123ad565b91505092915050565b60008135905061252181613ea4565b92915050565b60008135905061253681613ebb565b92915050565b60008151905061254b81613ebb565b92915050565b600082601f830112612566576125656137f0565b5b813561257684826020860161241d565b91505092915050565b600082601f830112612594576125936137f0565b5b81356125a484826020860161245f565b91505092915050565b6000813590506125bc81613ed2565b92915050565b6000602082840312156125d8576125d7613804565b5b60006125e6848285016124a1565b91505092915050565b6000806040838503121561260657612605613804565b5b6000612614858286016124a1565b9250506020612625858286016124a1565b9150509250929050565b600080600080600060a0868803121561264b5761264a613804565b5b6000612659888289016124a1565b955050602061266a888289016124a1565b945050604086013567ffffffffffffffff81111561268b5761268a6137ff565b5b612697888289016124e4565b935050606086013567ffffffffffffffff8111156126b8576126b76137ff565b5b6126c4888289016124e4565b925050608086013567ffffffffffffffff8111156126e5576126e46137ff565b5b6126f188828901612551565b9150509295509295909350565b600080600080600060a0868803121561271a57612719613804565b5b6000612728888289016124a1565b9550506020612739888289016124a1565b945050604061274a888289016125ad565b935050606061275b888289016125ad565b925050608086013567ffffffffffffffff81111561277c5761277b6137ff565b5b61278888828901612551565b9150509295509295909350565b600080604083850312156127ac576127ab613804565b5b60006127ba858286016124a1565b92505060206127cb85828601612512565b9150509250929050565b600080604083850312156127ec576127eb613804565b5b60006127fa858286016124a1565b925050602061280b858286016125ad565b9150509250929050565b6000806040838503121561282c5761282b613804565b5b600083013567ffffffffffffffff81111561284a576128496137ff565b5b612856858286016124b6565b925050602083013567ffffffffffffffff811115612877576128766137ff565b5b612883858286016124e4565b9150509250929050565b6000602082840312156128a3576128a2613804565b5b60006128b184828501612527565b91505092915050565b6000602082840312156128d0576128cf613804565b5b60006128de8482850161253c565b91505092915050565b6000602082840312156128fd576128fc613804565b5b600082013567ffffffffffffffff81111561291b5761291a6137ff565b5b61292784828501612551565b91505092915050565b60006020828403121561294657612945613804565b5b600082013567ffffffffffffffff811115612964576129636137ff565b5b6129708482850161257f565b91505092915050565b60006020828403121561298f5761298e613804565b5b600061299d848285016125ad565b91505092915050565b60006129b28383612e3f565b60208301905092915050565b6129c78161353c565b82525050565b6129de6129d98261353c565b6136b5565b82525050565b60006129ef8261346f565b6129f9818561349d565b9350612a048361345f565b8060005b83811015612a35578151612a1c88826129a6565b9750612a2783613490565b925050600181019050612a08565b5085935050505092915050565b612a4b8161354e565b82525050565b612a5a8161355a565b82525050565b612a71612a6c8261355a565b6136c7565b82525050565b6000612a828261347a565b612a8c81856134ae565b9350612a9c8185602086016135d6565b612aa581613809565b840191505092915050565b6000612abb8261347a565b612ac581856134bf565b9350612ad58185602086016135d6565b80840191505092915050565b6000612aec82613485565b612af681856134ca565b9350612b068185602086016135d6565b612b0f81613809565b840191505092915050565b6000612b276018836134ca565b9150612b3282613834565b602082019050919050565b6000612b4a6034836134ca565b9150612b558261385d565b604082019050919050565b6000612b6d6028836134ca565b9150612b78826138ac565b604082019050919050565b6000612b90601f836134ca565b9150612b9b826138fb565b602082019050919050565b6000612bb3601c836134db565b9150612bbe82613924565b601c82019050919050565b6000612bd6602b836134ca565b9150612be18261394d565b604082019050919050565b6000612bf96026836134ca565b9150612c048261399c565b604082019050919050565b6000612c1c6020836134ca565b9150612c27826139eb565b602082019050919050565b6000612c3f6016836134ca565b9150612c4a82613a14565b602082019050919050565b6000612c626029836134ca565b9150612c6d82613a3d565b604082019050919050565b6000612c856012836134ca565b9150612c9082613a8c565b602082019050919050565b6000612ca86011836134ca565b9150612cb382613ab5565b602082019050919050565b6000612ccb6022836134ca565b9150612cd682613ade565b604082019050919050565b6000612cee6025836134ca565b9150612cf982613b2d565b604082019050919050565b6000612d116032836134ca565b9150612d1c82613b7c565b604082019050919050565b6000612d346022836134ca565b9150612d3f82613bcb565b604082019050919050565b6000612d57602a836134ca565b9150612d6282613c1a565b604082019050919050565b6000612d7a6020836134ca565b9150612d8582613c69565b602082019050919050565b6000612d9d6029836134ca565b9150612da882613c92565b604082019050919050565b6000612dc06029836134ca565b9150612dcb82613ce1565b604082019050919050565b6000612de36028836134ca565b9150612dee82613d30565b604082019050919050565b6000612e066021836134ca565b9150612e1182613d7f565b604082019050919050565b6000612e29601f836134ca565b9150612e3482613dce565b602082019050919050565b612e48816135b0565b82525050565b612e57816135b0565b82525050565b612e66816135ba565b82525050565b6000612e7882846129cd565b60148201915081905092915050565b6000612e938284612ab0565b915081905092915050565b6000612ea982612ba6565b9150612eb58284612a60565b60208201915081905092915050565b6000602082019050612ed960008301846129be565b92915050565b600060a082019050612ef460008301886129be565b612f0160208301876129be565b8181036040830152612f1381866129e4565b90508181036060830152612f2781856129e4565b90508181036080830152612f3b8184612a77565b90509695505050505050565b600060a082019050612f5c60008301886129be565b612f6960208301876129be565b612f766040830186612e4e565b612f836060830185612e4e565b8181036080830152612f958184612a77565b90509695505050505050565b60006020820190508181036000830152612fbb81846129e4565b905092915050565b60006040820190508181036000830152612fdd81856129e4565b90508181036020830152612ff181846129e4565b90509392505050565b600060208201905061300f6000830184612a42565b92915050565b600060808201905061302a6000830187612a51565b6130376020830186612e5d565b6130446040830185612a51565b6130516060830184612a51565b95945050505050565b600060208201905081810360008301526130748184612ae1565b905092915050565b6000602082019050818103600083015261309581612b1a565b9050919050565b600060208201905081810360008301526130b581612b3d565b9050919050565b600060208201905081810360008301526130d581612b60565b9050919050565b600060208201905081810360008301526130f581612b83565b9050919050565b6000602082019050818103600083015261311581612bc9565b9050919050565b6000602082019050818103600083015261313581612bec565b9050919050565b6000602082019050818103600083015261315581612c0f565b9050919050565b6000602082019050818103600083015261317581612c32565b9050919050565b6000602082019050818103600083015261319581612c55565b9050919050565b600060208201905081810360008301526131b581612c78565b9050919050565b600060208201905081810360008301526131d581612c9b565b9050919050565b600060208201905081810360008301526131f581612cbe565b9050919050565b6000602082019050818103600083015261321581612ce1565b9050919050565b6000602082019050818103600083015261323581612d04565b9050919050565b6000602082019050818103600083015261325581612d27565b9050919050565b6000602082019050818103600083015261327581612d4a565b9050919050565b6000602082019050818103600083015261329581612d6d565b9050919050565b600060208201905081810360008301526132b581612d90565b9050919050565b600060208201905081810360008301526132d581612db3565b9050919050565b600060208201905081810360008301526132f581612dd6565b9050919050565b6000602082019050818103600083015261331581612df9565b9050919050565b6000602082019050818103600083015261333581612e1c565b9050919050565b60006020820190506133516000830184612e4e565b92915050565b600060408201905061336c6000830185612e4e565b6133796020830184612e4e565b9392505050565b600061338a61339b565b9050613396828261363b565b919050565b6000604051905090565b600067ffffffffffffffff8211156133c0576133bf61379f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156133ec576133eb61379f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156134185761341761379f565b5b61342182613809565b9050602081019050919050565b600067ffffffffffffffff8211156134495761344861379f565b5b61345282613809565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006134f1826135b0565b91506134fc836135b0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613531576135306136e3565b5b828201905092915050565b600061354782613590565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156135f45780820151818401526020810190506135d9565b83811115613603576000848401525b50505050565b6000600282049050600182168061362157607f821691505b6020821081141561363557613634613741565b5b50919050565b61364482613809565b810181811067ffffffffffffffff821117156136635761366261379f565b5b80604052505050565b6000613677826135b0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136aa576136a96136e3565b5b600182019050919050565b60006136c0826136d1565b9050919050565b6000819050919050565b60006136dc8261381a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156137ed5760046000803e6137ea600051613827565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e73600082015250565b7f5369676e617475726520616c7265616479207573656400000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015613e0757613e8a565b613e0f61339b565b60043d036004823e80513d602482011167ffffffffffffffff82111715613e37575050613e8a565b808201805167ffffffffffffffff811115613e555750505050613e8a565b80602083010160043d038501811115613e72575050505050613e8a565b613e818260200185018661363b565b82955050505050505b90565b613e968161353c565b8114613ea157600080fd5b50565b613ead8161354e565b8114613eb857600080fd5b50565b613ec481613564565b8114613ecf57600080fd5b50565b613edb816135b0565b8114613ee657600080fd5b5056fea26469706673582212206ba817df0844706a30bfd7684dc893199ea00711b6219ea2e8e6596392b325a564736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000114579654f6654686553796e646963617465000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): EyeOfTheSyndicate

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [2] : 4579654f6654686553796e646963617465000000000000000000000000000000


Deployed Bytecode Sourcemap

58072:1558:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41924:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40947:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41668:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58409:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58467:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43863:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58231:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42321:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58440:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58693:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57140:103;;;:::i;:::-;;58957:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58318:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56489:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42918:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58867:84;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58276:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58361:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58781:80;;;:::i;:::-;;43145:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43385:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57398:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41924:231;42010:7;42057:1;42038:21;;:7;:21;;;;42030:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;42125:9;:13;42135:2;42125:13;;;;;;;;;;;:22;42139:7;42125:22;;;;;;;;;;;;;;;;42118:29;;41924:231;;;;:::o;40947:310::-;41049:4;41101:26;41086:41;;;:11;:41;;;;:110;;;;41159:37;41144:52;;;:11;:52;;;;41086:110;:163;;;;41213:36;41237:11;41213:23;:36::i;:::-;41086:163;41066:183;;40947:310;;;:::o;41668:105::-;41728:13;41761:4;41754:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41668:105;;;:::o;58409:26::-;;;;:::o;58467:66::-;;;;;;;;;;;;;:::o;43863:442::-;44104:12;:10;:12::i;:::-;44096:20;;:4;:20;;;:60;;;;44120:36;44137:4;44143:12;:10;:12::i;:::-;44120:16;:36::i;:::-;44096:60;44074:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;44245:52;44268:4;44274:2;44278:3;44283:7;44292:4;44245:22;:52::i;:::-;43863:442;;;;;:::o;58231:40::-;58268:3;58231:40;:::o;42321:524::-;42477:16;42538:3;:10;42519:8;:15;:29;42511:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;42607:30;42654:8;:15;42640:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42607:63;;42688:9;42683:122;42707:8;:15;42703:1;:19;42683:122;;;42763:30;42773:8;42782:1;42773:11;;;;;;;;:::i;:::-;;;;;;;;42786:3;42790:1;42786:6;;;;;;;;:::i;:::-;;;;;;;;42763:9;:30::i;:::-;42744:13;42758:1;42744:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;42724:3;;;;:::i;:::-;;;42683:122;;;;42824:13;42817:20;;;42321:524;;;;:::o;58440:22::-;;;;;;;;;;;;;:::o;58693:82::-;56720:12;:10;:12::i;:::-;56709:23;;:7;:5;:7::i;:::-;:23;;;56701:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58762:7:::1;58753:6;;:16;;;;;;;;;;;;;;;;;;58693:82:::0;:::o;57140:103::-;56720:12;:10;:12::i;:::-;56709:23;;:7;:5;:7::i;:::-;:23;;;56701:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57205:30:::1;57232:1;57205:18;:30::i;:::-;57140:103::o:0;58957:341::-;38030:1;38628:7;;:19;;38620:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38030:1;38761:7;:18;;;;59027:9:::1;59365:13;59379:9;59365:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;59364:25;59356:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59423:15;59441:118;59463:71;59519:12;:10;:12::i;:::-;59502:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;59492:41;;;;;;59463:28;:71::i;:::-;59543:9;59441:13;:118::i;:::-;59423:136;;59584:7;59574:17;;:6;;;;;;;;;;;:17;;;59566:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;59053:10:::2;;;;;;;;;;;59045:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;58268:3;59101:18;59117:1;59101:11;;:15;;:18;;;;:::i;:::-;:32;;59093:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;59206:4;59179:13;59193:9;59179:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;59217:36;59223:12;:10;:12::i;:::-;58353:1;59247;59217:36;;;;;;;;;;;::::0;:5:::2;:36::i;:::-;59274:18;59290:1;59274:11;;:15;;:18;;;;:::i;:::-;59260:11;:32;;;;59349:278:::1;38792:1;37986::::0;38940:7;:22;;;;58957:341;:::o;58318:36::-;58353:1;58318:36;:::o;56489:87::-;56535:7;56562:6;;;;;;;;;;;56555:13;;56489:87;:::o;42918:155::-;43013:52;43032:12;:10;:12::i;:::-;43046:8;43056;43013:18;:52::i;:::-;42918:155;;:::o;58867:84::-;56720:12;:10;:12::i;:::-;56709:23;;:7;:5;:7::i;:::-;:23;;;56701:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58932:13:::1;58940:4;58932:7;:13::i;:::-;58867:84:::0;:::o;58276:37::-;58311:2;58276:37;:::o;58361:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58781:80::-;56720:12;:10;:12::i;:::-;56709:23;;:7;:5;:7::i;:::-;:23;;;56701:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58845:10:::1;;;;;;;;;;;58844:11;58831:10;;:24;;;;;;;;;;;;;;;;;;58781:80::o:0;43145:168::-;43244:4;43268:18;:27;43287:7;43268:27;;;;;;;;;;;;;;;:37;43296:8;43268:37;;;;;;;;;;;;;;;;;;;;;;;;;43261:44;;43145:168;;;;:::o;43385:401::-;43601:12;:10;:12::i;:::-;43593:20;;:4;:20;;;:60;;;;43617:36;43634:4;43640:12;:10;:12::i;:::-;43617:16;:36::i;:::-;43593:60;43571:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;43733:45;43751:4;43757:2;43761;43765:6;43773:4;43733:17;:45::i;:::-;43385:401;;;;;:::o;57398:201::-;56720:12;:10;:12::i;:::-;56709:23;;:7;:5;:7::i;:::-;:23;;;56701:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57507:1:::1;57487:22;;:8;:22;;;;57479:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57563:28;57582:8;57563:18;:28::i;:::-;57398:201:::0;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;19537:387::-;19597:4;19805:12;19872:7;19860:20;19852:28;;19915:1;19908:4;:8;19901:15;;;19537:387;;;:::o;28650:157::-;28735:4;28774:25;28759:40;;;:11;:40;;;;28752:47;;28650:157;;;:::o;39656:98::-;39709:7;39736:10;39729:17;;39656:98;:::o;45947:1074::-;46174:7;:14;46160:3;:10;:28;46152:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46266:1;46252:16;;:2;:16;;;;46244:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46323:16;46342:12;:10;:12::i;:::-;46323:31;;46367:60;46388:8;46398:4;46404:2;46408:3;46413:7;46422:4;46367:20;:60::i;:::-;46445:9;46440:421;46464:3;:10;46460:1;:14;46440:421;;;46496:10;46509:3;46513:1;46509:6;;;;;;;;:::i;:::-;;;;;;;;46496:19;;46530:14;46547:7;46555:1;46547:10;;;;;;;;:::i;:::-;;;;;;;;46530:27;;46574:19;46596:9;:13;46606:2;46596:13;;;;;;;;;;;:19;46610:4;46596:19;;;;;;;;;;;;;;;;46574:41;;46653:6;46638:11;:21;;46630:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46786:6;46772:11;:20;46750:9;:13;46760:2;46750:13;;;;;;;;;;;:19;46764:4;46750:19;;;;;;;;;;;;;;;:42;;;;46843:6;46822:9;:13;46832:2;46822:13;;;;;;;;;;;:17;46836:2;46822:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46481:380;;;46476:3;;;;:::i;:::-;;;46440:421;;;;46908:2;46878:47;;46902:4;46878:47;;46892:8;46878:47;;;46912:3;46917:7;46878:47;;;;;;;:::i;:::-;;;;;;;;46938:75;46974:8;46984:4;46990:2;46994:3;46999:7;47008:4;46938:35;:75::i;:::-;46141:880;45947:1074;;;;;:::o;57759:191::-;57833:16;57852:6;;;;;;;;;;;57833:25;;57878:8;57869:6;;:17;;;;;;;;;;;;;;;;;;57933:8;57902:40;;57923:8;57902:40;;;;;;;;;;;;57822:128;57759:191;:::o;17402:269::-;17471:7;17657:4;17604:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;17594:69;;;;;;17587:76;;17402:269;;;:::o;13553:231::-;13631:7;13652:17;13671:18;13693:27;13704:4;13710:9;13693:10;:27::i;:::-;13651:69;;;;13731:18;13743:5;13731:11;:18::i;:::-;13767:9;13760:16;;;;13553:231;;;;:::o;48339:569::-;48506:1;48492:16;;:2;:16;;;;48484:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48559:16;48578:12;:10;:12::i;:::-;48559:31;;48603:102;48624:8;48642:1;48646:2;48650:21;48668:2;48650:17;:21::i;:::-;48673:25;48691:6;48673:17;:25::i;:::-;48700:4;48603:20;:102::i;:::-;48739:6;48718:9;:13;48728:2;48718:13;;;;;;;;;;;:17;48732:2;48718:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;48798:2;48761:52;;48794:1;48761:52;;48776:8;48761:52;;;48802:2;48806:6;48761:52;;;;;;;:::i;:::-;;;;;;;;48826:74;48857:8;48875:1;48879:2;48883;48887:6;48895:4;48826:30;:74::i;:::-;48473:435;48339:569;;;;:::o;52133:331::-;52288:8;52279:17;;:5;:17;;;;52271:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52391:8;52353:18;:25;52372:5;52353:25;;;;;;;;;;;;;;;:35;52379:8;52353:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52437:8;52415:41;;52430:5;52415:41;;;52447:8;52415:41;;;;;;:::i;:::-;;;;;;;;52133:331;;;:::o;47865:88::-;47939:6;47932:4;:13;;;;;;;;;;;;:::i;:::-;;47865:88;:::o;44769:820::-;44971:1;44957:16;;:2;:16;;;;44949:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45028:16;45047:12;:10;:12::i;:::-;45028:31;;45072:96;45093:8;45103:4;45109:2;45113:21;45131:2;45113:17;:21::i;:::-;45136:25;45154:6;45136:17;:25::i;:::-;45163:4;45072:20;:96::i;:::-;45181:19;45203:9;:13;45213:2;45203:13;;;;;;;;;;;:19;45217:4;45203:19;;;;;;;;;;;;;;;;45181:41;;45256:6;45241:11;:21;;45233:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45381:6;45367:11;:20;45345:9;:13;45355:2;45345:13;;;;;;;;;;;:19;45359:4;45345:19;;;;;;;;;;;;;;;:42;;;;45430:6;45409:9;:13;45419:2;45409:13;;;;;;;;;;;:17;45423:2;45409:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45485:2;45454:46;;45479:4;45454:46;;45469:8;45454:46;;;45489:2;45493:6;45454:46;;;;;;;:::i;:::-;;;;;;;;45513:68;45544:8;45554:4;45560:2;45564;45568:6;45576:4;45513:30;:68::i;:::-;44938:651;;44769:820;;;;;:::o;53420:221::-;;;;;;;:::o;54401:813::-;54641:15;:2;:13;;;:15::i;:::-;54637:570;;;54694:2;54677:43;;;54721:8;54731:4;54737:3;54742:7;54751:4;54677:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54673:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;55069:6;55062:14;;;;;;;;;;;:::i;:::-;;;;;;;;54673:523;;;55118:62;;;;;;;;;;:::i;:::-;;;;;;;;54673:523;54850:48;;;54838:60;;;:8;:60;;;;54834:159;;54923:50;;;;;;;;;;:::i;:::-;;;;;;;;54834:159;54757:251;54637:570;54401:813;;;;;;:::o;11443:1308::-;11524:7;11533:12;11778:2;11758:9;:16;:22;11754:990;;;11797:9;11821;11845:7;12054:4;12043:9;12039:20;12033:27;12028:32;;12104:4;12093:9;12089:20;12083:27;12078:32;;12162:4;12151:9;12147:20;12141:27;12138:1;12133:36;12128:41;;12205:25;12216:4;12222:1;12225;12228;12205:10;:25::i;:::-;12198:32;;;;;;;;;11754:990;12272:2;12252:9;:16;:22;12248:496;;;12291:9;12315:10;12527:4;12516:9;12512:20;12506:27;12501:32;;12578:4;12567:9;12563:20;12557:27;12551:33;;12620:23;12631:4;12637:1;12640:2;12620:10;:23::i;:::-;12613:30;;;;;;;;12248:496;12692:1;12696:35;12676:56;;;;11443:1308;;;;;;:::o;9714:643::-;9792:20;9783:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;9779:571;;;9829:7;;9779:571;9890:29;9881:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;9877:473;;;9936:34;;;;;;;;;;:::i;:::-;;;;;;;;9877:473;10001:35;9992:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;9988:362;;;10053:41;;;;;;;;;;:::i;:::-;;;;;;;;9988:362;10125:30;10116:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10112:238;;;10172:44;;;;;;;;;;:::i;:::-;;;;;;;;10112:238;10247:30;10238:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10234:116;;;10294:44;;;;;;;;;;:::i;:::-;;;;;;;;10234:116;9714:643;;:::o;55222:198::-;55288:16;55317:22;55356:1;55342:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55317:41;;55380:7;55369:5;55375:1;55369:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;55407:5;55400:12;;;55222:198;;;:::o;53649:744::-;53864:15;:2;:13;;;:15::i;:::-;53860:526;;;53917:2;53900:38;;;53939:8;53949:4;53955:2;53959:6;53967:4;53900:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53896:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54248:6;54241:14;;;;;;;;;;;:::i;:::-;;;;;;;;53896:479;;;54297:62;;;;;;;;;;:::i;:::-;;;;;;;;53896:479;54034:43;;;54022:55;;;:8;:55;;;;54018:154;;54102:50;;;;;;;;;;:::i;:::-;;;;;;;;54018:154;53973:214;53860:526;53649:744;;;;;;:::o;15052:1632::-;15183:7;15192:12;16117:66;16112:1;16104:10;;:79;16100:163;;;16216:1;16220:30;16200:51;;;;;;16100:163;16282:2;16277:1;:7;;;;:18;;;;;16293:2;16288:1;:7;;;;16277:18;16273:102;;;16328:1;16332:30;16312:51;;;;;;16273:102;16472:14;16489:24;16499:4;16505:1;16508;16511;16489:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16472:41;;16546:1;16528:20;;:6;:20;;;16524:103;;;16581:1;16585:29;16565:50;;;;;;;16524:103;16647:6;16655:20;16639:37;;;;;15052:1632;;;;;;;;:::o;14047:391::-;14161:7;14170:12;14195:9;14215:7;14270:66;14266:2;14262:75;14257:80;;14374:2;14369;14364:3;14360:12;14356:21;14351:26;;14405:25;14416:4;14422:1;14425;14428;14405:10;:25::i;:::-;14398:32;;;;;;14047:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:1509::-;5522:6;5530;5538;5546;5554;5603:3;5591:9;5582:7;5578:23;5574:33;5571:120;;;5610:79;;:::i;:::-;5571:120;5730:1;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5701:117;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;6013:2;6002:9;5998:18;5985:32;6044:18;6036:6;6033:30;6030:117;;;6066:79;;:::i;:::-;6030:117;6171:78;6241:7;6232:6;6221:9;6217:22;6171:78;:::i;:::-;6161:88;;5956:303;6326:2;6315:9;6311:18;6298:32;6357:18;6349:6;6346:30;6343:117;;;6379:79;;:::i;:::-;6343:117;6484:78;6554:7;6545:6;6534:9;6530:22;6484:78;:::i;:::-;6474:88;;6269:303;6639:3;6628:9;6624:19;6611:33;6671:18;6663:6;6660:30;6657:117;;;6693:79;;:::i;:::-;6657:117;6798:62;6852:7;6843:6;6832:9;6828:22;6798:62;:::i;:::-;6788:72;;6582:288;5368:1509;;;;;;;;:::o;6883:1089::-;6987:6;6995;7003;7011;7019;7068:3;7056:9;7047:7;7043:23;7039:33;7036:120;;;7075:79;;:::i;:::-;7036:120;7195:1;7220:53;7265:7;7256:6;7245:9;7241:22;7220:53;:::i;:::-;7210:63;;7166:117;7322:2;7348:53;7393:7;7384:6;7373:9;7369:22;7348:53;:::i;:::-;7338:63;;7293:118;7450:2;7476:53;7521:7;7512:6;7501:9;7497:22;7476:53;:::i;:::-;7466:63;;7421:118;7578:2;7604:53;7649:7;7640:6;7629:9;7625:22;7604:53;:::i;:::-;7594:63;;7549:118;7734:3;7723:9;7719:19;7706:33;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:62;7947:7;7938:6;7927:9;7923:22;7893:62;:::i;:::-;7883:72;;7677:288;6883:1089;;;;;;;;:::o;7978:468::-;8043:6;8051;8100:2;8088:9;8079:7;8075:23;8071:32;8068:119;;;8106:79;;:::i;:::-;8068:119;8226:1;8251:53;8296:7;8287:6;8276:9;8272:22;8251:53;:::i;:::-;8241:63;;8197:117;8353:2;8379:50;8421:7;8412:6;8401:9;8397:22;8379:50;:::i;:::-;8369:60;;8324:115;7978:468;;;;;:::o;8452:474::-;8520:6;8528;8577:2;8565:9;8556:7;8552:23;8548:32;8545:119;;;8583:79;;:::i;:::-;8545:119;8703:1;8728:53;8773:7;8764:6;8753:9;8749:22;8728:53;:::i;:::-;8718:63;;8674:117;8830:2;8856:53;8901:7;8892:6;8881:9;8877:22;8856:53;:::i;:::-;8846:63;;8801:118;8452:474;;;;;:::o;8932:894::-;9050:6;9058;9107:2;9095:9;9086:7;9082:23;9078:32;9075:119;;;9113:79;;:::i;:::-;9075:119;9261:1;9250:9;9246:17;9233:31;9291:18;9283:6;9280:30;9277:117;;;9313:79;;:::i;:::-;9277:117;9418:78;9488:7;9479:6;9468:9;9464:22;9418:78;:::i;:::-;9408:88;;9204:302;9573:2;9562:9;9558:18;9545:32;9604:18;9596:6;9593:30;9590:117;;;9626:79;;:::i;:::-;9590:117;9731:78;9801:7;9792:6;9781:9;9777:22;9731:78;:::i;:::-;9721:88;;9516:303;8932:894;;;;;:::o;9832:327::-;9890:6;9939:2;9927:9;9918:7;9914:23;9910:32;9907:119;;;9945:79;;:::i;:::-;9907:119;10065:1;10090:52;10134:7;10125:6;10114:9;10110:22;10090:52;:::i;:::-;10080:62;;10036:116;9832:327;;;;:::o;10165:349::-;10234:6;10283:2;10271:9;10262:7;10258:23;10254:32;10251:119;;;10289:79;;:::i;:::-;10251:119;10409:1;10434:63;10489:7;10480:6;10469:9;10465:22;10434:63;:::i;:::-;10424:73;;10380:127;10165:349;;;;:::o;10520:507::-;10588:6;10637:2;10625:9;10616:7;10612:23;10608:32;10605:119;;;10643:79;;:::i;:::-;10605:119;10791:1;10780:9;10776:17;10763:31;10821:18;10813:6;10810:30;10807:117;;;10843:79;;:::i;:::-;10807:117;10948:62;11002:7;10993:6;10982:9;10978:22;10948:62;:::i;:::-;10938:72;;10734:286;10520:507;;;;:::o;11033:509::-;11102:6;11151:2;11139:9;11130:7;11126:23;11122:32;11119:119;;;11157:79;;:::i;:::-;11119:119;11305:1;11294:9;11290:17;11277:31;11335:18;11327:6;11324:30;11321:117;;;11357:79;;:::i;:::-;11321:117;11462:63;11517:7;11508:6;11497:9;11493:22;11462:63;:::i;:::-;11452:73;;11248:287;11033:509;;;;:::o;11548:329::-;11607:6;11656:2;11644:9;11635:7;11631:23;11627:32;11624:119;;;11662:79;;:::i;:::-;11624:119;11782:1;11807:53;11852:7;11843:6;11832:9;11828:22;11807:53;:::i;:::-;11797:63;;11753:117;11548:329;;;;:::o;11883:179::-;11952:10;11973:46;12015:3;12007:6;11973:46;:::i;:::-;12051:4;12046:3;12042:14;12028:28;;11883:179;;;;:::o;12068:118::-;12155:24;12173:5;12155:24;:::i;:::-;12150:3;12143:37;12068:118;;:::o;12192:157::-;12297:45;12317:24;12335:5;12317:24;:::i;:::-;12297:45;:::i;:::-;12292:3;12285:58;12192:157;;:::o;12385:732::-;12504:3;12533:54;12581:5;12533:54;:::i;:::-;12603:86;12682:6;12677:3;12603:86;:::i;:::-;12596:93;;12713:56;12763:5;12713:56;:::i;:::-;12792:7;12823:1;12808:284;12833:6;12830:1;12827:13;12808:284;;;12909:6;12903:13;12936:63;12995:3;12980:13;12936:63;:::i;:::-;12929:70;;13022:60;13075:6;13022:60;:::i;:::-;13012:70;;12868:224;12855:1;12852;12848:9;12843:14;;12808:284;;;12812:14;13108:3;13101:10;;12509:608;;;12385:732;;;;:::o;13123:109::-;13204:21;13219:5;13204:21;:::i;:::-;13199:3;13192:34;13123:109;;:::o;13238:118::-;13325:24;13343:5;13325:24;:::i;:::-;13320:3;13313:37;13238:118;;:::o;13362:157::-;13467:45;13487:24;13505:5;13487:24;:::i;:::-;13467:45;:::i;:::-;13462:3;13455:58;13362:157;;:::o;13525:360::-;13611:3;13639:38;13671:5;13639:38;:::i;:::-;13693:70;13756:6;13751:3;13693:70;:::i;:::-;13686:77;;13772:52;13817:6;13812:3;13805:4;13798:5;13794:16;13772:52;:::i;:::-;13849:29;13871:6;13849:29;:::i;:::-;13844:3;13840:39;13833:46;;13615:270;13525:360;;;;:::o;13891:373::-;13995:3;14023:38;14055:5;14023:38;:::i;:::-;14077:88;14158:6;14153:3;14077:88;:::i;:::-;14070:95;;14174:52;14219:6;14214:3;14207:4;14200:5;14196:16;14174:52;:::i;:::-;14251:6;14246:3;14242:16;14235:23;;13999:265;13891:373;;;;:::o;14270:364::-;14358:3;14386:39;14419:5;14386:39;:::i;:::-;14441:71;14505:6;14500:3;14441:71;:::i;:::-;14434:78;;14521:52;14566:6;14561:3;14554:4;14547:5;14543:16;14521:52;:::i;:::-;14598:29;14620:6;14598:29;:::i;:::-;14593:3;14589:39;14582:46;;14362:272;14270:364;;;;:::o;14640:366::-;14782:3;14803:67;14867:2;14862:3;14803:67;:::i;:::-;14796:74;;14879:93;14968:3;14879:93;:::i;:::-;14997:2;14992:3;14988:12;14981:19;;14640:366;;;:::o;15012:::-;15154:3;15175:67;15239:2;15234:3;15175:67;:::i;:::-;15168:74;;15251:93;15340:3;15251:93;:::i;:::-;15369:2;15364:3;15360:12;15353:19;;15012:366;;;:::o;15384:::-;15526:3;15547:67;15611:2;15606:3;15547:67;:::i;:::-;15540:74;;15623:93;15712:3;15623:93;:::i;:::-;15741:2;15736:3;15732:12;15725:19;;15384:366;;;:::o;15756:::-;15898:3;15919:67;15983:2;15978:3;15919:67;:::i;:::-;15912:74;;15995:93;16084:3;15995:93;:::i;:::-;16113:2;16108:3;16104:12;16097:19;;15756:366;;;:::o;16128:402::-;16288:3;16309:85;16391:2;16386:3;16309:85;:::i;:::-;16302:92;;16403:93;16492:3;16403:93;:::i;:::-;16521:2;16516:3;16512:12;16505:19;;16128:402;;;:::o;16536:366::-;16678:3;16699:67;16763:2;16758:3;16699:67;:::i;:::-;16692:74;;16775:93;16864:3;16775:93;:::i;:::-;16893:2;16888:3;16884:12;16877:19;;16536:366;;;:::o;16908:::-;17050:3;17071:67;17135:2;17130:3;17071:67;:::i;:::-;17064:74;;17147:93;17236:3;17147:93;:::i;:::-;17265:2;17260:3;17256:12;17249:19;;16908:366;;;:::o;17280:::-;17422:3;17443:67;17507:2;17502:3;17443:67;:::i;:::-;17436:74;;17519:93;17608:3;17519:93;:::i;:::-;17637:2;17632:3;17628:12;17621:19;;17280:366;;;:::o;17652:::-;17794:3;17815:67;17879:2;17874:3;17815:67;:::i;:::-;17808:74;;17891:93;17980:3;17891:93;:::i;:::-;18009:2;18004:3;18000:12;17993:19;;17652:366;;;:::o;18024:::-;18166:3;18187:67;18251:2;18246:3;18187:67;:::i;:::-;18180:74;;18263:93;18352:3;18263:93;:::i;:::-;18381:2;18376:3;18372:12;18365:19;;18024:366;;;:::o;18396:::-;18538:3;18559:67;18623:2;18618:3;18559:67;:::i;:::-;18552:74;;18635:93;18724:3;18635:93;:::i;:::-;18753:2;18748:3;18744:12;18737:19;;18396:366;;;:::o;18768:::-;18910:3;18931:67;18995:2;18990:3;18931:67;:::i;:::-;18924:74;;19007:93;19096:3;19007:93;:::i;:::-;19125:2;19120:3;19116:12;19109:19;;18768:366;;;:::o;19140:::-;19282:3;19303:67;19367:2;19362:3;19303:67;:::i;:::-;19296:74;;19379:93;19468:3;19379:93;:::i;:::-;19497:2;19492:3;19488:12;19481:19;;19140:366;;;:::o;19512:::-;19654:3;19675:67;19739:2;19734:3;19675:67;:::i;:::-;19668:74;;19751:93;19840:3;19751:93;:::i;:::-;19869:2;19864:3;19860:12;19853:19;;19512:366;;;:::o;19884:::-;20026:3;20047:67;20111:2;20106:3;20047:67;:::i;:::-;20040:74;;20123:93;20212:3;20123:93;:::i;:::-;20241:2;20236:3;20232:12;20225:19;;19884:366;;;:::o;20256:::-;20398:3;20419:67;20483:2;20478:3;20419:67;:::i;:::-;20412:74;;20495:93;20584:3;20495:93;:::i;:::-;20613:2;20608:3;20604:12;20597:19;;20256:366;;;:::o;20628:::-;20770:3;20791:67;20855:2;20850:3;20791:67;:::i;:::-;20784:74;;20867:93;20956:3;20867:93;:::i;:::-;20985:2;20980:3;20976:12;20969:19;;20628:366;;;:::o;21000:::-;21142:3;21163:67;21227:2;21222:3;21163:67;:::i;:::-;21156:74;;21239:93;21328:3;21239:93;:::i;:::-;21357:2;21352:3;21348:12;21341:19;;21000:366;;;:::o;21372:::-;21514:3;21535:67;21599:2;21594:3;21535:67;:::i;:::-;21528:74;;21611:93;21700:3;21611:93;:::i;:::-;21729:2;21724:3;21720:12;21713:19;;21372:366;;;:::o;21744:::-;21886:3;21907:67;21971:2;21966:3;21907:67;:::i;:::-;21900:74;;21983:93;22072:3;21983:93;:::i;:::-;22101:2;22096:3;22092:12;22085:19;;21744:366;;;:::o;22116:::-;22258:3;22279:67;22343:2;22338:3;22279:67;:::i;:::-;22272:74;;22355:93;22444:3;22355:93;:::i;:::-;22473:2;22468:3;22464:12;22457:19;;22116:366;;;:::o;22488:::-;22630:3;22651:67;22715:2;22710:3;22651:67;:::i;:::-;22644:74;;22727:93;22816:3;22727:93;:::i;:::-;22845:2;22840:3;22836:12;22829:19;;22488:366;;;:::o;22860:::-;23002:3;23023:67;23087:2;23082:3;23023:67;:::i;:::-;23016:74;;23099:93;23188:3;23099:93;:::i;:::-;23217:2;23212:3;23208:12;23201:19;;22860:366;;;:::o;23232:108::-;23309:24;23327:5;23309:24;:::i;:::-;23304:3;23297:37;23232:108;;:::o;23346:118::-;23433:24;23451:5;23433:24;:::i;:::-;23428:3;23421:37;23346:118;;:::o;23470:112::-;23553:22;23569:5;23553:22;:::i;:::-;23548:3;23541:35;23470:112;;:::o;23588:256::-;23700:3;23715:75;23786:3;23777:6;23715:75;:::i;:::-;23815:2;23810:3;23806:12;23799:19;;23835:3;23828:10;;23588:256;;;;:::o;23850:271::-;23980:3;24002:93;24091:3;24082:6;24002:93;:::i;:::-;23995:100;;24112:3;24105:10;;23850:271;;;;:::o;24127:522::-;24340:3;24362:148;24506:3;24362:148;:::i;:::-;24355:155;;24520:75;24591:3;24582:6;24520:75;:::i;:::-;24620:2;24615:3;24611:12;24604:19;;24640:3;24633:10;;24127:522;;;;:::o;24655:222::-;24748:4;24786:2;24775:9;24771:18;24763:26;;24799:71;24867:1;24856:9;24852:17;24843:6;24799:71;:::i;:::-;24655:222;;;;:::o;24883:1053::-;25206:4;25244:3;25233:9;25229:19;25221:27;;25258:71;25326:1;25315:9;25311:17;25302:6;25258:71;:::i;:::-;25339:72;25407:2;25396:9;25392:18;25383:6;25339:72;:::i;:::-;25458:9;25452:4;25448:20;25443:2;25432:9;25428:18;25421:48;25486:108;25589:4;25580:6;25486:108;:::i;:::-;25478:116;;25641:9;25635:4;25631:20;25626:2;25615:9;25611:18;25604:48;25669:108;25772:4;25763:6;25669:108;:::i;:::-;25661:116;;25825:9;25819:4;25815:20;25809:3;25798:9;25794:19;25787:49;25853:76;25924:4;25915:6;25853:76;:::i;:::-;25845:84;;24883:1053;;;;;;;;:::o;25942:751::-;26165:4;26203:3;26192:9;26188:19;26180:27;;26217:71;26285:1;26274:9;26270:17;26261:6;26217:71;:::i;:::-;26298:72;26366:2;26355:9;26351:18;26342:6;26298:72;:::i;:::-;26380;26448:2;26437:9;26433:18;26424:6;26380:72;:::i;:::-;26462;26530:2;26519:9;26515:18;26506:6;26462:72;:::i;:::-;26582:9;26576:4;26572:20;26566:3;26555:9;26551:19;26544:49;26610:76;26681:4;26672:6;26610:76;:::i;:::-;26602:84;;25942:751;;;;;;;;:::o;26699:373::-;26842:4;26880:2;26869:9;26865:18;26857:26;;26929:9;26923:4;26919:20;26915:1;26904:9;26900:17;26893:47;26957:108;27060:4;27051:6;26957:108;:::i;:::-;26949:116;;26699:373;;;;:::o;27078:634::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:108;27517:4;27508:6;27414:108;:::i;:::-;27406:116;;27569:9;27563:4;27559:20;27554:2;27543:9;27539:18;27532:48;27597:108;27700:4;27691:6;27597:108;:::i;:::-;27589:116;;27078:634;;;;;:::o;27718:210::-;27805:4;27843:2;27832:9;27828:18;27820:26;;27856:65;27918:1;27907:9;27903:17;27894:6;27856:65;:::i;:::-;27718:210;;;;:::o;27934:545::-;28107:4;28145:3;28134:9;28130:19;28122:27;;28159:71;28227:1;28216:9;28212:17;28203:6;28159:71;:::i;:::-;28240:68;28304:2;28293:9;28289:18;28280:6;28240:68;:::i;:::-;28318:72;28386:2;28375:9;28371:18;28362:6;28318:72;:::i;:::-;28400;28468:2;28457:9;28453:18;28444:6;28400:72;:::i;:::-;27934:545;;;;;;;:::o;28485:313::-;28598:4;28636:2;28625:9;28621:18;28613:26;;28685:9;28679:4;28675:20;28671:1;28660:9;28656:17;28649:47;28713:78;28786:4;28777:6;28713:78;:::i;:::-;28705:86;;28485:313;;;;:::o;28804:419::-;28970:4;29008:2;28997:9;28993:18;28985:26;;29057:9;29051:4;29047:20;29043:1;29032:9;29028:17;29021:47;29085:131;29211:4;29085:131;:::i;:::-;29077:139;;28804:419;;;:::o;29229:::-;29395:4;29433:2;29422:9;29418:18;29410:26;;29482:9;29476:4;29472:20;29468:1;29457:9;29453:17;29446:47;29510:131;29636:4;29510:131;:::i;:::-;29502:139;;29229:419;;;:::o;29654:::-;29820:4;29858:2;29847:9;29843:18;29835:26;;29907:9;29901:4;29897:20;29893:1;29882:9;29878:17;29871:47;29935:131;30061:4;29935:131;:::i;:::-;29927:139;;29654:419;;;:::o;30079:::-;30245:4;30283:2;30272:9;30268:18;30260:26;;30332:9;30326:4;30322:20;30318:1;30307:9;30303:17;30296:47;30360:131;30486:4;30360:131;:::i;:::-;30352:139;;30079:419;;;:::o;30504:::-;30670:4;30708:2;30697:9;30693:18;30685:26;;30757:9;30751:4;30747:20;30743:1;30732:9;30728:17;30721:47;30785:131;30911:4;30785:131;:::i;:::-;30777:139;;30504:419;;;:::o;30929:::-;31095:4;31133:2;31122:9;31118:18;31110:26;;31182:9;31176:4;31172:20;31168:1;31157:9;31153:17;31146:47;31210:131;31336:4;31210:131;:::i;:::-;31202:139;;30929:419;;;:::o;31354:::-;31520:4;31558:2;31547:9;31543:18;31535:26;;31607:9;31601:4;31597:20;31593:1;31582:9;31578:17;31571:47;31635:131;31761:4;31635:131;:::i;:::-;31627:139;;31354:419;;;:::o;31779:::-;31945:4;31983:2;31972:9;31968:18;31960:26;;32032:9;32026:4;32022:20;32018:1;32007:9;32003:17;31996:47;32060:131;32186:4;32060:131;:::i;:::-;32052:139;;31779:419;;;:::o;32204:::-;32370:4;32408:2;32397:9;32393:18;32385:26;;32457:9;32451:4;32447:20;32443:1;32432:9;32428:17;32421:47;32485:131;32611:4;32485:131;:::i;:::-;32477:139;;32204:419;;;:::o;32629:::-;32795:4;32833:2;32822:9;32818:18;32810:26;;32882:9;32876:4;32872:20;32868:1;32857:9;32853:17;32846:47;32910:131;33036:4;32910:131;:::i;:::-;32902:139;;32629:419;;;:::o;33054:::-;33220:4;33258:2;33247:9;33243:18;33235:26;;33307:9;33301:4;33297:20;33293:1;33282:9;33278:17;33271:47;33335:131;33461:4;33335:131;:::i;:::-;33327:139;;33054:419;;;:::o;33479:::-;33645:4;33683:2;33672:9;33668:18;33660:26;;33732:9;33726:4;33722:20;33718:1;33707:9;33703:17;33696:47;33760:131;33886:4;33760:131;:::i;:::-;33752:139;;33479:419;;;:::o;33904:::-;34070:4;34108:2;34097:9;34093:18;34085:26;;34157:9;34151:4;34147:20;34143:1;34132:9;34128:17;34121:47;34185:131;34311:4;34185:131;:::i;:::-;34177:139;;33904:419;;;:::o;34329:::-;34495:4;34533:2;34522:9;34518:18;34510:26;;34582:9;34576:4;34572:20;34568:1;34557:9;34553:17;34546:47;34610:131;34736:4;34610:131;:::i;:::-;34602:139;;34329:419;;;:::o;34754:::-;34920:4;34958:2;34947:9;34943:18;34935:26;;35007:9;35001:4;34997:20;34993:1;34982:9;34978:17;34971:47;35035:131;35161:4;35035:131;:::i;:::-;35027:139;;34754:419;;;:::o;35179:::-;35345:4;35383:2;35372:9;35368:18;35360:26;;35432:9;35426:4;35422:20;35418:1;35407:9;35403:17;35396:47;35460:131;35586:4;35460:131;:::i;:::-;35452:139;;35179:419;;;:::o;35604:::-;35770:4;35808:2;35797:9;35793:18;35785:26;;35857:9;35851:4;35847:20;35843:1;35832:9;35828:17;35821:47;35885:131;36011:4;35885:131;:::i;:::-;35877:139;;35604:419;;;:::o;36029:::-;36195:4;36233:2;36222:9;36218:18;36210:26;;36282:9;36276:4;36272:20;36268:1;36257:9;36253:17;36246:47;36310:131;36436:4;36310:131;:::i;:::-;36302:139;;36029:419;;;:::o;36454:::-;36620:4;36658:2;36647:9;36643:18;36635:26;;36707:9;36701:4;36697:20;36693:1;36682:9;36678:17;36671:47;36735:131;36861:4;36735:131;:::i;:::-;36727:139;;36454:419;;;:::o;36879:::-;37045:4;37083:2;37072:9;37068:18;37060:26;;37132:9;37126:4;37122:20;37118:1;37107:9;37103:17;37096:47;37160:131;37286:4;37160:131;:::i;:::-;37152:139;;36879:419;;;:::o;37304:::-;37470:4;37508:2;37497:9;37493:18;37485:26;;37557:9;37551:4;37547:20;37543:1;37532:9;37528:17;37521:47;37585:131;37711:4;37585:131;:::i;:::-;37577:139;;37304:419;;;:::o;37729:::-;37895:4;37933:2;37922:9;37918:18;37910:26;;37982:9;37976:4;37972:20;37968:1;37957:9;37953:17;37946:47;38010:131;38136:4;38010:131;:::i;:::-;38002:139;;37729:419;;;:::o;38154:222::-;38247:4;38285:2;38274:9;38270:18;38262:26;;38298:71;38366:1;38355:9;38351:17;38342:6;38298:71;:::i;:::-;38154:222;;;;:::o;38382:332::-;38503:4;38541:2;38530:9;38526:18;38518:26;;38554:71;38622:1;38611:9;38607:17;38598:6;38554:71;:::i;:::-;38635:72;38703:2;38692:9;38688:18;38679:6;38635:72;:::i;:::-;38382:332;;;;;:::o;38720:129::-;38754:6;38781:20;;:::i;:::-;38771:30;;38810:33;38838:4;38830:6;38810:33;:::i;:::-;38720:129;;;:::o;38855:75::-;38888:6;38921:2;38915:9;38905:19;;38855:75;:::o;38936:311::-;39013:4;39103:18;39095:6;39092:30;39089:56;;;39125:18;;:::i;:::-;39089:56;39175:4;39167:6;39163:17;39155:25;;39235:4;39229;39225:15;39217:23;;38936:311;;;:::o;39253:::-;39330:4;39420:18;39412:6;39409:30;39406:56;;;39442:18;;:::i;:::-;39406:56;39492:4;39484:6;39480:17;39472:25;;39552:4;39546;39542:15;39534:23;;39253:311;;;:::o;39570:307::-;39631:4;39721:18;39713:6;39710:30;39707:56;;;39743:18;;:::i;:::-;39707:56;39781:29;39803:6;39781:29;:::i;:::-;39773:37;;39865:4;39859;39855:15;39847:23;;39570:307;;;:::o;39883:308::-;39945:4;40035:18;40027:6;40024:30;40021:56;;;40057:18;;:::i;:::-;40021:56;40095:29;40117:6;40095:29;:::i;:::-;40087:37;;40179:4;40173;40169:15;40161:23;;39883:308;;;:::o;40197:132::-;40264:4;40287:3;40279:11;;40317:4;40312:3;40308:14;40300:22;;40197:132;;;:::o;40335:114::-;40402:6;40436:5;40430:12;40420:22;;40335:114;;;:::o;40455:98::-;40506:6;40540:5;40534:12;40524:22;;40455:98;;;:::o;40559:99::-;40611:6;40645:5;40639:12;40629:22;;40559:99;;;:::o;40664:113::-;40734:4;40766;40761:3;40757:14;40749:22;;40664:113;;;:::o;40783:184::-;40882:11;40916:6;40911:3;40904:19;40956:4;40951:3;40947:14;40932:29;;40783:184;;;;:::o;40973:168::-;41056:11;41090:6;41085:3;41078:19;41130:4;41125:3;41121:14;41106:29;;40973:168;;;;:::o;41147:147::-;41248:11;41285:3;41270:18;;41147:147;;;;:::o;41300:169::-;41384:11;41418:6;41413:3;41406:19;41458:4;41453:3;41449:14;41434:29;;41300:169;;;;:::o;41475:148::-;41577:11;41614:3;41599:18;;41475:148;;;;:::o;41629:305::-;41669:3;41688:20;41706:1;41688:20;:::i;:::-;41683:25;;41722:20;41740:1;41722:20;:::i;:::-;41717:25;;41876:1;41808:66;41804:74;41801:1;41798:81;41795:107;;;41882:18;;:::i;:::-;41795:107;41926:1;41923;41919:9;41912:16;;41629:305;;;;:::o;41940:96::-;41977:7;42006:24;42024:5;42006:24;:::i;:::-;41995:35;;41940:96;;;:::o;42042:90::-;42076:7;42119:5;42112:13;42105:21;42094:32;;42042:90;;;:::o;42138:77::-;42175:7;42204:5;42193:16;;42138:77;;;:::o;42221:149::-;42257:7;42297:66;42290:5;42286:78;42275:89;;42221:149;;;:::o;42376:126::-;42413:7;42453:42;42446:5;42442:54;42431:65;;42376:126;;;:::o;42508:77::-;42545:7;42574:5;42563:16;;42508:77;;;:::o;42591:86::-;42626:7;42666:4;42659:5;42655:16;42644:27;;42591:86;;;:::o;42683:154::-;42767:6;42762:3;42757;42744:30;42829:1;42820:6;42815:3;42811:16;42804:27;42683:154;;;:::o;42843:307::-;42911:1;42921:113;42935:6;42932:1;42929:13;42921:113;;;43020:1;43015:3;43011:11;43005:18;43001:1;42996:3;42992:11;42985:39;42957:2;42954:1;42950:10;42945:15;;42921:113;;;43052:6;43049:1;43046:13;43043:101;;;43132:1;43123:6;43118:3;43114:16;43107:27;43043:101;42892:258;42843:307;;;:::o;43156:320::-;43200:6;43237:1;43231:4;43227:12;43217:22;;43284:1;43278:4;43274:12;43305:18;43295:81;;43361:4;43353:6;43349:17;43339:27;;43295:81;43423:2;43415:6;43412:14;43392:18;43389:38;43386:84;;;43442:18;;:::i;:::-;43386:84;43207:269;43156:320;;;:::o;43482:281::-;43565:27;43587:4;43565:27;:::i;:::-;43557:6;43553:40;43695:6;43683:10;43680:22;43659:18;43647:10;43644:34;43641:62;43638:88;;;43706:18;;:::i;:::-;43638:88;43746:10;43742:2;43735:22;43525:238;43482:281;;:::o;43769:233::-;43808:3;43831:24;43849:5;43831:24;:::i;:::-;43822:33;;43877:66;43870:5;43867:77;43864:103;;;43947:18;;:::i;:::-;43864:103;43994:1;43987:5;43983:13;43976:20;;43769:233;;;:::o;44008:100::-;44047:7;44076:26;44096:5;44076:26;:::i;:::-;44065:37;;44008:100;;;:::o;44114:79::-;44153:7;44182:5;44171:16;;44114:79;;;:::o;44199:94::-;44238:7;44267:20;44281:5;44267:20;:::i;:::-;44256:31;;44199:94;;;:::o;44299:180::-;44347:77;44344:1;44337:88;44444:4;44441:1;44434:15;44468:4;44465:1;44458:15;44485:180;44533:77;44530:1;44523:88;44630:4;44627:1;44620:15;44654:4;44651:1;44644:15;44671:180;44719:77;44716:1;44709:88;44816:4;44813:1;44806:15;44840:4;44837:1;44830:15;44857:180;44905:77;44902:1;44895:88;45002:4;44999:1;44992:15;45026:4;45023:1;45016:15;45043:180;45091:77;45088:1;45081:88;45188:4;45185:1;45178:15;45212:4;45209:1;45202:15;45229:183;45264:3;45302:1;45284:16;45281:23;45278:128;;;45340:1;45337;45334;45319:23;45362:34;45393:1;45387:8;45362:34;:::i;:::-;45355:41;;45278:128;45229:183;:::o;45418:117::-;45527:1;45524;45517:12;45541:117;45650:1;45647;45640:12;45664:117;45773:1;45770;45763:12;45787:117;45896:1;45893;45886:12;45910:117;46019:1;46016;46009:12;46033:102;46074:6;46125:2;46121:7;46116:2;46109:5;46105:14;46101:28;46091:38;;46033:102;;;:::o;46141:94::-;46174:8;46222:5;46218:2;46214:14;46193:35;;46141:94;;;:::o;46241:106::-;46285:8;46334:5;46329:3;46325:15;46304:36;;46241:106;;;:::o;46353:174::-;46493:26;46489:1;46481:6;46477:14;46470:50;46353:174;:::o;46533:239::-;46673:34;46669:1;46661:6;46657:14;46650:58;46742:22;46737:2;46729:6;46725:15;46718:47;46533:239;:::o;46778:227::-;46918:34;46914:1;46906:6;46902:14;46895:58;46987:10;46982:2;46974:6;46970:15;46963:35;46778:227;:::o;47011:181::-;47151:33;47147:1;47139:6;47135:14;47128:57;47011:181;:::o;47198:214::-;47338:66;47334:1;47326:6;47322:14;47315:90;47198:214;:::o;47418:230::-;47558:34;47554:1;47546:6;47542:14;47535:58;47627:13;47622:2;47614:6;47610:15;47603:38;47418:230;:::o;47654:225::-;47794:34;47790:1;47782:6;47778:14;47771:58;47863:8;47858:2;47850:6;47846:15;47839:33;47654:225;:::o;47885:182::-;48025:34;48021:1;48013:6;48009:14;48002:58;47885:182;:::o;48073:172::-;48213:24;48209:1;48201:6;48197:14;48190:48;48073:172;:::o;48251:228::-;48391:34;48387:1;48379:6;48375:14;48368:58;48460:11;48455:2;48447:6;48443:15;48436:36;48251:228;:::o;48485:168::-;48625:20;48621:1;48613:6;48609:14;48602:44;48485:168;:::o;48659:167::-;48799:19;48795:1;48787:6;48783:14;48776:43;48659:167;:::o;48832:221::-;48972:34;48968:1;48960:6;48956:14;48949:58;49041:4;49036:2;49028:6;49024:15;49017:29;48832:221;:::o;49059:224::-;49199:34;49195:1;49187:6;49183:14;49176:58;49268:7;49263:2;49255:6;49251:15;49244:32;49059:224;:::o;49289:237::-;49429:34;49425:1;49417:6;49413:14;49406:58;49498:20;49493:2;49485:6;49481:15;49474:45;49289:237;:::o;49532:221::-;49672:34;49668:1;49660:6;49656:14;49649:58;49741:4;49736:2;49728:6;49724:15;49717:29;49532:221;:::o;49759:229::-;49899:34;49895:1;49887:6;49883:14;49876:58;49968:12;49963:2;49955:6;49951:15;49944:37;49759:229;:::o;49994:182::-;50134:34;50130:1;50122:6;50118:14;50111:58;49994:182;:::o;50182:228::-;50322:34;50318:1;50310:6;50306:14;50299:58;50391:11;50386:2;50378:6;50374:15;50367:36;50182:228;:::o;50416:::-;50556:34;50552:1;50544:6;50540:14;50533:58;50625:11;50620:2;50612:6;50608:15;50601:36;50416:228;:::o;50650:227::-;50790:34;50786:1;50778:6;50774:14;50767:58;50859:10;50854:2;50846:6;50842:15;50835:35;50650:227;:::o;50883:220::-;51023:34;51019:1;51011:6;51007:14;51000:58;51092:3;51087:2;51079:6;51075:15;51068:28;50883:220;:::o;51109:181::-;51249:33;51245:1;51237:6;51233:14;51226:57;51109:181;:::o;51296:711::-;51335:3;51373:4;51355:16;51352:26;51349:39;;;51381:5;;51349:39;51410:20;;:::i;:::-;51485:1;51467:16;51463:24;51460:1;51454:4;51439:49;51518:4;51512:11;51617:16;51610:4;51602:6;51598:17;51595:39;51562:18;51554:6;51551:30;51535:113;51532:146;;;51663:5;;;;51532:146;51709:6;51703:4;51699:17;51745:3;51739:10;51772:18;51764:6;51761:30;51758:43;;;51794:5;;;;;;51758:43;51842:6;51835:4;51830:3;51826:14;51822:27;51901:1;51883:16;51879:24;51873:4;51869:35;51864:3;51861:44;51858:57;;;51908:5;;;;;;;51858:57;51925;51973:6;51967:4;51963:17;51955:6;51951:30;51945:4;51925:57;:::i;:::-;51998:3;51991:10;;51339:668;;;;;51296:711;;:::o;52013:122::-;52086:24;52104:5;52086:24;:::i;:::-;52079:5;52076:35;52066:63;;52125:1;52122;52115:12;52066:63;52013:122;:::o;52141:116::-;52211:21;52226:5;52211:21;:::i;:::-;52204:5;52201:32;52191:60;;52247:1;52244;52237:12;52191:60;52141:116;:::o;52263:120::-;52335:23;52352:5;52335:23;:::i;:::-;52328:5;52325:34;52315:62;;52373:1;52370;52363:12;52315:62;52263:120;:::o;52389:122::-;52462:24;52480:5;52462:24;:::i;:::-;52455:5;52452:35;52442:63;;52501:1;52498;52491:12;52442:63;52389:122;:::o

Swarm Source

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