Token MorphsMemo

Overview CRC20

Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
100,000 MeMo

Holders:
131 addresses
Contract:
0x69c332ba218d76d9877fcd4a633907bd050ece210x69c332bA218D76D9877FCd4a633907bD050ece21

Decimals:
18

Social Profiles:
Not Available, Update ?

Balance
2 MeMo

Value
$0.00
0x634a5dc4cda63ea8d0699d9387cdcfffc6408b84
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MorphsMemo

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 cronoscan.com on 2022-10-16
*/

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.3) (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) {
        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.
            /// @solidity memory-safe-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 {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    /**
     * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
     * However, to ensure consistency with the upgradeable transpiler, we will continue
     * to reserve a slot.
     * @custom:oz-renamed-from _PERMIT_TYPEHASH
     */
    // solhint-disable-next-line var-name-mixedcase
    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/MeMo.sol


pragma solidity ^0.8.4;





contract MorphsMemo is ERC20, ERC20Burnable, Ownable, ERC20Permit {
    constructor() ERC20("MorphsMemo", "MeMo") ERC20Permit("MorphsMemo") {
        _mint(msg.sender, 100000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b506040518060400160405280600a81526020017f4d6f727068734d656d6f00000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4d6f727068734d656d6f000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d654d6f00000000000000000000000000000000000000000000000000000000815250816003908051906020019062000104929190620004d1565b5080600490805190602001906200011d929190620004d1565b50505062000140620001346200023b60201b60201c565b6200024360201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001a98184846200030960201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080610120818152505050505050505062000235336200020b6200034560201b60201c565b600a62000219919062000740565b620186a06200022991906200087d565b6200034e60201b60201c565b620009fd565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000838383463060405160200162000326959493929190620005db565b6040516020818303038152906040528051906020012090509392505050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b89062000638565b60405180910390fd5b620003d560008383620004c760201b60201c565b8060026000828254620003e9919062000688565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000440919062000688565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620004a791906200065a565b60405180910390a3620004c360008383620004cc60201b60201c565b5050565b505050565b505050565b828054620004df9062000933565b90600052602060002090601f0160209004810192826200050357600085556200054f565b82601f106200051e57805160ff19168380011785556200054f565b828001600101855582156200054f579182015b828111156200054e57825182559160200191906001019062000531565b5b5090506200055e919062000562565b5090565b5b808211156200057d57600081600090555060010162000563565b5090565b6200058c81620008de565b82525050565b6200059d81620008f2565b82525050565b6000620005b2601f8362000677565b9150620005bf82620009d4565b602082019050919050565b620005d5816200091c565b82525050565b600060a082019050620005f2600083018862000592565b62000601602083018762000592565b62000610604083018662000592565b6200061f6060830185620005ca565b6200062e608083018462000581565b9695505050505050565b600060208201905081810360008301526200065381620005a3565b9050919050565b6000602082019050620006716000830184620005ca565b92915050565b600082825260208201905092915050565b600062000695826200091c565b9150620006a2836200091c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620006da57620006d962000969565b5b828201905092915050565b6000808291508390505b600185111562000737578086048111156200070f576200070e62000969565b5b60018516156200071f5780820291505b80810290506200072f85620009c7565b9450620006ef565b94509492505050565b60006200074d826200091c565b91506200075a8362000926565b9250620007897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000791565b905092915050565b600082620007a3576001905062000876565b81620007b3576000905062000876565b8160018114620007cc5760028114620007d7576200080d565b600191505062000876565b60ff841115620007ec57620007eb62000969565b5b8360020a91508482111562000806576200080562000969565b5b5062000876565b5060208310610133831016604e8410600b8410161715620008475782820a90508381111562000841576200084062000969565b5b62000876565b620008568484846001620006e5565b9250905081840481111562000870576200086f62000969565b5b81810290505b9392505050565b60006200088a826200091c565b915062000897836200091c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620008d357620008d262000969565b5b828202905092915050565b6000620008eb82620008fc565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200094c57607f821691505b6020821081141562000963576200096262000998565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60805160a05160c05160601c60e051610100516101205161293762000a506000396000610f5f01526000610fa101526000610f8001526000610eb501526000610f0b01526000610f3401526129376000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063a457c2d711610071578063a457c2d714610333578063a9059cbb14610363578063d505accf14610393578063dd62ed3e146103af578063f2fde38b146103df5761012c565b8063715018a6146102a157806379cc6790146102ab5780637ecebe00146102c75780638da5cb5b146102f757806395d89b41146103155761012c565b80633644e515116100f45780633644e515146101eb578063395093511461020957806340c10f191461023957806342966c681461025557806370a08231146102715761012c565b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017f57806323b872dd1461019d578063313ce567146101cd575b600080fd5b6101396103fb565b6040516101469190611f3e565b60405180910390f35b61016960048036038101906101649190611a1c565b61048d565b6040516101769190611e0f565b60405180910390f35b6101876104b0565b60405161019491906121a0565b60405180910390f35b6101b760048036038101906101b29190611927565b6104ba565b6040516101c49190611e0f565b60405180910390f35b6101d56104e9565b6040516101e291906121bb565b60405180910390f35b6101f36104f2565b6040516102009190611e2a565b60405180910390f35b610223600480360381019061021e9190611a1c565b610501565b6040516102309190611e0f565b60405180910390f35b610253600480360381019061024e9190611a1c565b610538565b005b61026f600480360381019061026a9190611a5c565b61054e565b005b61028b600480360381019061028691906118ba565b610562565b60405161029891906121a0565b60405180910390f35b6102a96105aa565b005b6102c560048036038101906102c09190611a1c565b6105be565b005b6102e160048036038101906102dc91906118ba565b6105de565b6040516102ee91906121a0565b60405180910390f35b6102ff61062e565b60405161030c9190611df4565b60405180910390f35b61031d610658565b60405161032a9190611f3e565b60405180910390f35b61034d60048036038101906103489190611a1c565b6106ea565b60405161035a9190611e0f565b60405180910390f35b61037d60048036038101906103789190611a1c565b610761565b60405161038a9190611e0f565b60405180910390f35b6103ad60048036038101906103a8919061197a565b610784565b005b6103c960048036038101906103c491906118e7565b6108c6565b6040516103d691906121a0565b60405180910390f35b6103f960048036038101906103f491906118ba565b61094d565b005b60606003805461040a90612319565b80601f016020809104026020016040519081016040528092919081815260200182805461043690612319565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b6000806104986109d1565b90506104a58185856109d9565b600191505092915050565b6000600254905090565b6000806104c56109d1565b90506104d2858285610ba4565b6104dd858585610c30565b60019150509392505050565b60006012905090565b60006104fc610eb1565b905090565b60008061050c6109d1565b905061052d81858561051e85896108c6565b61052891906121fd565b6109d9565b600191505092915050565b610540610fcb565b61054a8282611049565b5050565b61055f6105596109d1565b826111a9565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6105b2610fcb565b6105bc6000611380565b565b6105d0826105ca6109d1565b83610ba4565b6105da82826111a9565b5050565b6000610627600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611446565b9050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461066790612319565b80601f016020809104026020016040519081016040528092919081815260200182805461069390612319565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b6000806106f56109d1565b9050600061070382866108c6565b905083811015610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90612160565b60405180910390fd5b61075582868684036109d9565b60019250505092915050565b60008061076c6109d1565b9050610779818585610c30565b600191505092915050565b834211156107c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107be90612040565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886107f68c611454565b8960405160200161080c96959493929190611e45565b604051602081830303815290604052805190602001209050600061082f826114b2565b9050600061083f828787876114cc565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a6906120c0565b60405180910390fd5b6108ba8a8a8a6109d9565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610955610fcb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90611fe0565b60405180910390fd5b6109ce81611380565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4090612140565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090612000565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610b9791906121a0565b60405180910390a3505050565b6000610bb084846108c6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c2a5781811015610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390612020565b60405180910390fd5b610c2984848484036109d9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790612120565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0790611f80565b60405180910390fd5b610d1b8383836114f7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890612060565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e3491906121fd565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9891906121a0565b60405180910390a3610eab8484846114fc565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610f2d57507f000000000000000000000000000000000000000000000000000000000000000046145b15610f5a577f00000000000000000000000000000000000000000000000000000000000000009050610fc8565b610fc57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611501565b90505b90565b610fd36109d1565b73ffffffffffffffffffffffffffffffffffffffff16610ff161062e565b73ffffffffffffffffffffffffffffffffffffffff1614611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906120e0565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612180565b60405180910390fd5b6110c5600083836114f7565b80600260008282546110d791906121fd565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461112c91906121fd565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161119191906121a0565b60405180910390a36111a5600083836114fc565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090612100565b60405180910390fd5b611225826000836114f7565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290611fa0565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546113029190612253565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161136791906121a0565b60405180910390a361137b836000846114fc565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506114a181611446565b91506114ac8161153b565b50919050565b60006114c56114bf610eb1565b83611551565b9050919050565b60008060006114dd87878787611584565b915091506114ea81611691565b8192505050949350505050565b505050565b505050565b6000838383463060405160200161151c959493929190611ea6565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001611566929190611dbd565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156115bf576000600391509150611688565b601b8560ff16141580156115d75750601c8560ff1614155b156115e9576000600491509150611688565b60006001878787876040516000815260200160405260405161160e9493929190611ef9565b6020604051602081039080840390855afa158015611630573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561167f57600060019250925050611688565b80600092509250505b94509492505050565b600060048111156116a5576116a4612384565b5b8160048111156116b8576116b7612384565b5b14156116c357611863565b600160048111156116d7576116d6612384565b5b8160048111156116ea576116e9612384565b5b141561172b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172290611f60565b60405180910390fd5b6002600481111561173f5761173e612384565b5b81600481111561175257611751612384565b5b1415611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a90611fc0565b60405180910390fd5b600360048111156117a7576117a6612384565b5b8160048111156117ba576117b9612384565b5b14156117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290612080565b60405180910390fd5b60048081111561180e5761180d612384565b5b81600481111561182157611820612384565b5b1415611862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611859906120a0565b60405180910390fd5b5b50565b600081359050611875816128a5565b92915050565b60008135905061188a816128bc565b92915050565b60008135905061189f816128d3565b92915050565b6000813590506118b4816128ea565b92915050565b6000602082840312156118d0576118cf6123e2565b5b60006118de84828501611866565b91505092915050565b600080604083850312156118fe576118fd6123e2565b5b600061190c85828601611866565b925050602061191d85828601611866565b9150509250929050565b6000806000606084860312156119405761193f6123e2565b5b600061194e86828701611866565b935050602061195f86828701611866565b925050604061197086828701611890565b9150509250925092565b600080600080600080600060e0888a031215611999576119986123e2565b5b60006119a78a828b01611866565b97505060206119b88a828b01611866565b96505060406119c98a828b01611890565b95505060606119da8a828b01611890565b94505060806119eb8a828b016118a5565b93505060a06119fc8a828b0161187b565b92505060c0611a0d8a828b0161187b565b91505092959891949750929550565b60008060408385031215611a3357611a326123e2565b5b6000611a4185828601611866565b9250506020611a5285828601611890565b9150509250929050565b600060208284031215611a7257611a716123e2565b5b6000611a8084828501611890565b91505092915050565b611a9281612287565b82525050565b611aa181612299565b82525050565b611ab0816122a5565b82525050565b611ac7611ac2826122a5565b61234b565b82525050565b6000611ad8826121d6565b611ae281856121e1565b9350611af28185602086016122e6565b611afb816123e7565b840191505092915050565b6000611b136018836121e1565b9150611b1e826123f8565b602082019050919050565b6000611b366023836121e1565b9150611b4182612421565b604082019050919050565b6000611b596022836121e1565b9150611b6482612470565b604082019050919050565b6000611b7c601f836121e1565b9150611b87826124bf565b602082019050919050565b6000611b9f6026836121e1565b9150611baa826124e8565b604082019050919050565b6000611bc26022836121e1565b9150611bcd82612537565b604082019050919050565b6000611be56002836121f2565b9150611bf082612586565b600282019050919050565b6000611c08601d836121e1565b9150611c13826125af565b602082019050919050565b6000611c2b601d836121e1565b9150611c36826125d8565b602082019050919050565b6000611c4e6026836121e1565b9150611c5982612601565b604082019050919050565b6000611c716022836121e1565b9150611c7c82612650565b604082019050919050565b6000611c946022836121e1565b9150611c9f8261269f565b604082019050919050565b6000611cb7601e836121e1565b9150611cc2826126ee565b602082019050919050565b6000611cda6020836121e1565b9150611ce582612717565b602082019050919050565b6000611cfd6021836121e1565b9150611d0882612740565b604082019050919050565b6000611d206025836121e1565b9150611d2b8261278f565b604082019050919050565b6000611d436024836121e1565b9150611d4e826127de565b604082019050919050565b6000611d666025836121e1565b9150611d718261282d565b604082019050919050565b6000611d89601f836121e1565b9150611d948261287c565b602082019050919050565b611da8816122cf565b82525050565b611db7816122d9565b82525050565b6000611dc882611bd8565b9150611dd48285611ab6565b602082019150611de48284611ab6565b6020820191508190509392505050565b6000602082019050611e096000830184611a89565b92915050565b6000602082019050611e246000830184611a98565b92915050565b6000602082019050611e3f6000830184611aa7565b92915050565b600060c082019050611e5a6000830189611aa7565b611e676020830188611a89565b611e746040830187611a89565b611e816060830186611d9f565b611e8e6080830185611d9f565b611e9b60a0830184611d9f565b979650505050505050565b600060a082019050611ebb6000830188611aa7565b611ec86020830187611aa7565b611ed56040830186611aa7565b611ee26060830185611d9f565b611eef6080830184611a89565b9695505050505050565b6000608082019050611f0e6000830187611aa7565b611f1b6020830186611dae565b611f286040830185611aa7565b611f356060830184611aa7565b95945050505050565b60006020820190508181036000830152611f588184611acd565b905092915050565b60006020820190508181036000830152611f7981611b06565b9050919050565b60006020820190508181036000830152611f9981611b29565b9050919050565b60006020820190508181036000830152611fb981611b4c565b9050919050565b60006020820190508181036000830152611fd981611b6f565b9050919050565b60006020820190508181036000830152611ff981611b92565b9050919050565b6000602082019050818103600083015261201981611bb5565b9050919050565b6000602082019050818103600083015261203981611bfb565b9050919050565b6000602082019050818103600083015261205981611c1e565b9050919050565b6000602082019050818103600083015261207981611c41565b9050919050565b6000602082019050818103600083015261209981611c64565b9050919050565b600060208201905081810360008301526120b981611c87565b9050919050565b600060208201905081810360008301526120d981611caa565b9050919050565b600060208201905081810360008301526120f981611ccd565b9050919050565b6000602082019050818103600083015261211981611cf0565b9050919050565b6000602082019050818103600083015261213981611d13565b9050919050565b6000602082019050818103600083015261215981611d36565b9050919050565b6000602082019050818103600083015261217981611d59565b9050919050565b6000602082019050818103600083015261219981611d7c565b9050919050565b60006020820190506121b56000830184611d9f565b92915050565b60006020820190506121d06000830184611dae565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000612208826122cf565b9150612213836122cf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561224857612247612355565b5b828201905092915050565b600061225e826122cf565b9150612269836122cf565b92508282101561227c5761227b612355565b5b828203905092915050565b6000612292826122af565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156123045780820151818401526020810190506122e9565b83811115612313576000848401525b50505050565b6000600282049050600182168061233157607f821691505b60208210811415612345576123446123b3565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6128ae81612287565b81146128b957600080fd5b50565b6128c5816122a5565b81146128d057600080fd5b50565b6128dc816122cf565b81146128e757600080fd5b50565b6128f3816122d9565b81146128fe57600080fd5b5056fea26469706673582212206085d20e22de1b521c5019ab13d659443162df28dd64331231b85054e0259ba564736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c8063715018a6116100ad578063a457c2d711610071578063a457c2d714610333578063a9059cbb14610363578063d505accf14610393578063dd62ed3e146103af578063f2fde38b146103df5761012c565b8063715018a6146102a157806379cc6790146102ab5780637ecebe00146102c75780638da5cb5b146102f757806395d89b41146103155761012c565b80633644e515116100f45780633644e515146101eb578063395093511461020957806340c10f191461023957806342966c681461025557806370a08231146102715761012c565b806306fdde0314610131578063095ea7b31461014f57806318160ddd1461017f57806323b872dd1461019d578063313ce567146101cd575b600080fd5b6101396103fb565b6040516101469190611f3e565b60405180910390f35b61016960048036038101906101649190611a1c565b61048d565b6040516101769190611e0f565b60405180910390f35b6101876104b0565b60405161019491906121a0565b60405180910390f35b6101b760048036038101906101b29190611927565b6104ba565b6040516101c49190611e0f565b60405180910390f35b6101d56104e9565b6040516101e291906121bb565b60405180910390f35b6101f36104f2565b6040516102009190611e2a565b60405180910390f35b610223600480360381019061021e9190611a1c565b610501565b6040516102309190611e0f565b60405180910390f35b610253600480360381019061024e9190611a1c565b610538565b005b61026f600480360381019061026a9190611a5c565b61054e565b005b61028b600480360381019061028691906118ba565b610562565b60405161029891906121a0565b60405180910390f35b6102a96105aa565b005b6102c560048036038101906102c09190611a1c565b6105be565b005b6102e160048036038101906102dc91906118ba565b6105de565b6040516102ee91906121a0565b60405180910390f35b6102ff61062e565b60405161030c9190611df4565b60405180910390f35b61031d610658565b60405161032a9190611f3e565b60405180910390f35b61034d60048036038101906103489190611a1c565b6106ea565b60405161035a9190611e0f565b60405180910390f35b61037d60048036038101906103789190611a1c565b610761565b60405161038a9190611e0f565b60405180910390f35b6103ad60048036038101906103a8919061197a565b610784565b005b6103c960048036038101906103c491906118e7565b6108c6565b6040516103d691906121a0565b60405180910390f35b6103f960048036038101906103f491906118ba565b61094d565b005b60606003805461040a90612319565b80601f016020809104026020016040519081016040528092919081815260200182805461043690612319565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b6000806104986109d1565b90506104a58185856109d9565b600191505092915050565b6000600254905090565b6000806104c56109d1565b90506104d2858285610ba4565b6104dd858585610c30565b60019150509392505050565b60006012905090565b60006104fc610eb1565b905090565b60008061050c6109d1565b905061052d81858561051e85896108c6565b61052891906121fd565b6109d9565b600191505092915050565b610540610fcb565b61054a8282611049565b5050565b61055f6105596109d1565b826111a9565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6105b2610fcb565b6105bc6000611380565b565b6105d0826105ca6109d1565b83610ba4565b6105da82826111a9565b5050565b6000610627600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611446565b9050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461066790612319565b80601f016020809104026020016040519081016040528092919081815260200182805461069390612319565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b6000806106f56109d1565b9050600061070382866108c6565b905083811015610748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073f90612160565b60405180910390fd5b61075582868684036109d9565b60019250505092915050565b60008061076c6109d1565b9050610779818585610c30565b600191505092915050565b834211156107c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107be90612040565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886107f68c611454565b8960405160200161080c96959493929190611e45565b604051602081830303815290604052805190602001209050600061082f826114b2565b9050600061083f828787876114cc565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a6906120c0565b60405180910390fd5b6108ba8a8a8a6109d9565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610955610fcb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90611fe0565b60405180910390fd5b6109ce81611380565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4090612140565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090612000565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610b9791906121a0565b60405180910390a3505050565b6000610bb084846108c6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c2a5781811015610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390612020565b60405180910390fd5b610c2984848484036109d9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790612120565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0790611f80565b60405180910390fd5b610d1b8383836114f7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9890612060565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e3491906121fd565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e9891906121a0565b60405180910390a3610eab8484846114fc565b50505050565b60007f00000000000000000000000069c332ba218d76d9877fcd4a633907bd050ece2173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610f2d57507f000000000000000000000000000000000000000000000000000000000000001946145b15610f5a577f0f79613caec8d0d6d0ecbd88ab59e1b5e5134109c8359809c80339db3553265a9050610fc8565b610fc57f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f699e0e8cb23e0433204ff2978040f8f0ea622515e7b2ce1bd2914f430a2558267fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611501565b90505b90565b610fd36109d1565b73ffffffffffffffffffffffffffffffffffffffff16610ff161062e565b73ffffffffffffffffffffffffffffffffffffffff1614611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906120e0565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612180565b60405180910390fd5b6110c5600083836114f7565b80600260008282546110d791906121fd565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461112c91906121fd565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161119191906121a0565b60405180910390a36111a5600083836114fc565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090612100565b60405180910390fd5b611225826000836114f7565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290611fa0565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546113029190612253565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161136791906121a0565b60405180910390a361137b836000846114fc565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506114a181611446565b91506114ac8161153b565b50919050565b60006114c56114bf610eb1565b83611551565b9050919050565b60008060006114dd87878787611584565b915091506114ea81611691565b8192505050949350505050565b505050565b505050565b6000838383463060405160200161151c959493929190611ea6565b6040516020818303038152906040528051906020012090509392505050565b6001816000016000828254019250508190555050565b60008282604051602001611566929190611dbd565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156115bf576000600391509150611688565b601b8560ff16141580156115d75750601c8560ff1614155b156115e9576000600491509150611688565b60006001878787876040516000815260200160405260405161160e9493929190611ef9565b6020604051602081039080840390855afa158015611630573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561167f57600060019250925050611688565b80600092509250505b94509492505050565b600060048111156116a5576116a4612384565b5b8160048111156116b8576116b7612384565b5b14156116c357611863565b600160048111156116d7576116d6612384565b5b8160048111156116ea576116e9612384565b5b141561172b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172290611f60565b60405180910390fd5b6002600481111561173f5761173e612384565b5b81600481111561175257611751612384565b5b1415611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a90611fc0565b60405180910390fd5b600360048111156117a7576117a6612384565b5b8160048111156117ba576117b9612384565b5b14156117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290612080565b60405180910390fd5b60048081111561180e5761180d612384565b5b81600481111561182157611820612384565b5b1415611862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611859906120a0565b60405180910390fd5b5b50565b600081359050611875816128a5565b92915050565b60008135905061188a816128bc565b92915050565b60008135905061189f816128d3565b92915050565b6000813590506118b4816128ea565b92915050565b6000602082840312156118d0576118cf6123e2565b5b60006118de84828501611866565b91505092915050565b600080604083850312156118fe576118fd6123e2565b5b600061190c85828601611866565b925050602061191d85828601611866565b9150509250929050565b6000806000606084860312156119405761193f6123e2565b5b600061194e86828701611866565b935050602061195f86828701611866565b925050604061197086828701611890565b9150509250925092565b600080600080600080600060e0888a031215611999576119986123e2565b5b60006119a78a828b01611866565b97505060206119b88a828b01611866565b96505060406119c98a828b01611890565b95505060606119da8a828b01611890565b94505060806119eb8a828b016118a5565b93505060a06119fc8a828b0161187b565b92505060c0611a0d8a828b0161187b565b91505092959891949750929550565b60008060408385031215611a3357611a326123e2565b5b6000611a4185828601611866565b9250506020611a5285828601611890565b9150509250929050565b600060208284031215611a7257611a716123e2565b5b6000611a8084828501611890565b91505092915050565b611a9281612287565b82525050565b611aa181612299565b82525050565b611ab0816122a5565b82525050565b611ac7611ac2826122a5565b61234b565b82525050565b6000611ad8826121d6565b611ae281856121e1565b9350611af28185602086016122e6565b611afb816123e7565b840191505092915050565b6000611b136018836121e1565b9150611b1e826123f8565b602082019050919050565b6000611b366023836121e1565b9150611b4182612421565b604082019050919050565b6000611b596022836121e1565b9150611b6482612470565b604082019050919050565b6000611b7c601f836121e1565b9150611b87826124bf565b602082019050919050565b6000611b9f6026836121e1565b9150611baa826124e8565b604082019050919050565b6000611bc26022836121e1565b9150611bcd82612537565b604082019050919050565b6000611be56002836121f2565b9150611bf082612586565b600282019050919050565b6000611c08601d836121e1565b9150611c13826125af565b602082019050919050565b6000611c2b601d836121e1565b9150611c36826125d8565b602082019050919050565b6000611c4e6026836121e1565b9150611c5982612601565b604082019050919050565b6000611c716022836121e1565b9150611c7c82612650565b604082019050919050565b6000611c946022836121e1565b9150611c9f8261269f565b604082019050919050565b6000611cb7601e836121e1565b9150611cc2826126ee565b602082019050919050565b6000611cda6020836121e1565b9150611ce582612717565b602082019050919050565b6000611cfd6021836121e1565b9150611d0882612740565b604082019050919050565b6000611d206025836121e1565b9150611d2b8261278f565b604082019050919050565b6000611d436024836121e1565b9150611d4e826127de565b604082019050919050565b6000611d666025836121e1565b9150611d718261282d565b604082019050919050565b6000611d89601f836121e1565b9150611d948261287c565b602082019050919050565b611da8816122cf565b82525050565b611db7816122d9565b82525050565b6000611dc882611bd8565b9150611dd48285611ab6565b602082019150611de48284611ab6565b6020820191508190509392505050565b6000602082019050611e096000830184611a89565b92915050565b6000602082019050611e246000830184611a98565b92915050565b6000602082019050611e3f6000830184611aa7565b92915050565b600060c082019050611e5a6000830189611aa7565b611e676020830188611a89565b611e746040830187611a89565b611e816060830186611d9f565b611e8e6080830185611d9f565b611e9b60a0830184611d9f565b979650505050505050565b600060a082019050611ebb6000830188611aa7565b611ec86020830187611aa7565b611ed56040830186611aa7565b611ee26060830185611d9f565b611eef6080830184611a89565b9695505050505050565b6000608082019050611f0e6000830187611aa7565b611f1b6020830186611dae565b611f286040830185611aa7565b611f356060830184611aa7565b95945050505050565b60006020820190508181036000830152611f588184611acd565b905092915050565b60006020820190508181036000830152611f7981611b06565b9050919050565b60006020820190508181036000830152611f9981611b29565b9050919050565b60006020820190508181036000830152611fb981611b4c565b9050919050565b60006020820190508181036000830152611fd981611b6f565b9050919050565b60006020820190508181036000830152611ff981611b92565b9050919050565b6000602082019050818103600083015261201981611bb5565b9050919050565b6000602082019050818103600083015261203981611bfb565b9050919050565b6000602082019050818103600083015261205981611c1e565b9050919050565b6000602082019050818103600083015261207981611c41565b9050919050565b6000602082019050818103600083015261209981611c64565b9050919050565b600060208201905081810360008301526120b981611c87565b9050919050565b600060208201905081810360008301526120d981611caa565b9050919050565b600060208201905081810360008301526120f981611ccd565b9050919050565b6000602082019050818103600083015261211981611cf0565b9050919050565b6000602082019050818103600083015261213981611d13565b9050919050565b6000602082019050818103600083015261215981611d36565b9050919050565b6000602082019050818103600083015261217981611d59565b9050919050565b6000602082019050818103600083015261219981611d7c565b9050919050565b60006020820190506121b56000830184611d9f565b92915050565b60006020820190506121d06000830184611dae565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000612208826122cf565b9150612213836122cf565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561224857612247612355565b5b828201905092915050565b600061225e826122cf565b9150612269836122cf565b92508282101561227c5761227b612355565b5b828203905092915050565b6000612292826122af565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156123045780820151818401526020810190506122e9565b83811115612313576000848401525b50505050565b6000600282049050600182168061233157607f821691505b60208210811415612345576123446123b3565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6128ae81612287565b81146128b957600080fd5b50565b6128c5816122a5565b81146128d057600080fd5b50565b6128dc816122cf565b81146128e757600080fd5b50565b6128f3816122d9565b81146128fe57600080fd5b5056fea26469706673582212206085d20e22de1b521c5019ab13d659443162df28dd64331231b85054e0259ba564736f6c63430008070033

Deployed ByteCode Sourcemap

44621:310:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29317:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31668:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30437:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32449:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30279:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42922:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33153:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44833:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43972:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30608:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22740:103;;;:::i;:::-;;44382:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42664:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22092:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29536:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33894:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30941:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41953:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31197:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22998:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29317:100;29371:13;29404:5;29397:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29317:100;:::o;31668:201::-;31751:4;31768:13;31784:12;:10;:12::i;:::-;31768:28;;31807:32;31816:5;31823:7;31832:6;31807:8;:32::i;:::-;31857:4;31850:11;;;31668:201;;;;:::o;30437:108::-;30498:7;30525:12;;30518:19;;30437:108;:::o;32449:295::-;32580:4;32597:15;32615:12;:10;:12::i;:::-;32597:30;;32638:38;32654:4;32660:7;32669:6;32638:15;:38::i;:::-;32687:27;32697:4;32703:2;32707:6;32687:9;:27::i;:::-;32732:4;32725:11;;;32449:295;;;;;:::o;30279:93::-;30337:5;30362:2;30355:9;;30279:93;:::o;42922:115::-;42982:7;43009:20;:18;:20::i;:::-;43002:27;;42922:115;:::o;33153:238::-;33241:4;33258:13;33274:12;:10;:12::i;:::-;33258:28;;33297:64;33306:5;33313:7;33350:10;33322:25;33332:5;33339:7;33322:9;:25::i;:::-;:38;;;;:::i;:::-;33297:8;:64::i;:::-;33379:4;33372:11;;;33153:238;;;;:::o;44833:95::-;21978:13;:11;:13::i;:::-;44903:17:::1;44909:2;44913:6;44903:5;:17::i;:::-;44833:95:::0;;:::o;43972:91::-;44028:27;44034:12;:10;:12::i;:::-;44048:6;44028:5;:27::i;:::-;43972:91;:::o;30608:127::-;30682:7;30709:9;:18;30719:7;30709:18;;;;;;;;;;;;;;;;30702:25;;30608:127;;;:::o;22740:103::-;21978:13;:11;:13::i;:::-;22805:30:::1;22832:1;22805:18;:30::i;:::-;22740:103::o:0;44382:164::-;44459:46;44475:7;44484:12;:10;:12::i;:::-;44498:6;44459:15;:46::i;:::-;44516:22;44522:7;44531:6;44516:5;:22::i;:::-;44382:164;;:::o;42664:128::-;42733:7;42760:24;:7;:14;42768:5;42760:14;;;;;;;;;;;;;;;:22;:24::i;:::-;42753:31;;42664:128;;;:::o;22092:87::-;22138:7;22165:6;;;;;;;;;;;22158:13;;22092:87;:::o;29536:104::-;29592:13;29625:7;29618:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29536:104;:::o;33894:436::-;33987:4;34004:13;34020:12;:10;:12::i;:::-;34004:28;;34043:24;34070:25;34080:5;34087:7;34070:9;:25::i;:::-;34043:52;;34134:15;34114:16;:35;;34106:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34227:60;34236:5;34243:7;34271:15;34252:16;:34;34227:8;:60::i;:::-;34318:4;34311:11;;;;33894:436;;;;:::o;30941:193::-;31020:4;31037:13;31053:12;:10;:12::i;:::-;31037:28;;31076;31086:5;31093:2;31097:6;31076:9;:28::i;:::-;31122:4;31115:11;;;30941:193;;;;:::o;41953:645::-;42197:8;42178:15;:27;;42170:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42252:18;41128:95;42312:5;42319:7;42328:5;42335:16;42345:5;42335:9;:16::i;:::-;42353:8;42283:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42273:90;;;;;;42252:111;;42376:12;42391:28;42408:10;42391:16;:28::i;:::-;42376:43;;42432:14;42449:28;42463:4;42469:1;42472;42475;42449:13;:28::i;:::-;42432:45;;42506:5;42496:15;;:6;:15;;;42488:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42559:31;42568:5;42575:7;42584:5;42559:8;:31::i;:::-;42159:439;;;41953:645;;;;;;;:::o;31197:151::-;31286:7;31313:11;:18;31325:5;31313:18;;;;;;;;;;;;;;;:27;31332:7;31313:27;;;;;;;;;;;;;;;;31306:34;;31197:151;;;;:::o;22998:201::-;21978:13;:11;:13::i;:::-;23107:1:::1;23087:22;;:8;:22;;;;23079:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23163:28;23182:8;23163:18;:28::i;:::-;22998:201:::0;:::o;20643:98::-;20696:7;20723:10;20716:17;;20643:98;:::o;37519:380::-;37672:1;37655:19;;:5;:19;;;;37647:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37753:1;37734:21;;:7;:21;;;;37726:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37837:6;37807:11;:18;37819:5;37807:18;;;;;;;;;;;;;;;:27;37826:7;37807:27;;;;;;;;;;;;;;;:36;;;;37875:7;37859:32;;37868:5;37859:32;;;37884:6;37859:32;;;;;;:::i;:::-;;;;;;;;37519:380;;;:::o;38190:453::-;38325:24;38352:25;38362:5;38369:7;38352:9;:25::i;:::-;38325:52;;38412:17;38392:16;:37;38388:248;;38474:6;38454:16;:26;;38446:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38558:51;38567:5;38574:7;38602:6;38583:16;:25;38558:8;:51::i;:::-;38388:248;38314:329;38190:453;;;:::o;34800:671::-;34947:1;34931:18;;:4;:18;;;;34923:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35024:1;35010:16;;:2;:16;;;;35002:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35079:38;35100:4;35106:2;35110:6;35079:20;:38::i;:::-;35130:19;35152:9;:15;35162:4;35152:15;;;;;;;;;;;;;;;;35130:37;;35201:6;35186:11;:21;;35178:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35318:6;35304:11;:20;35286:9;:15;35296:4;35286:15;;;;;;;;;;;;;;;:38;;;;35363:6;35346:9;:13;35356:2;35346:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;35402:2;35387:26;;35396:4;35387:26;;;35406:6;35387:26;;;;;;:::i;:::-;;;;;;;;35426:37;35446:4;35452:2;35456:6;35426:19;:37::i;:::-;34912:559;34800:671;;;:::o;16198:314::-;16251:7;16292:12;16275:29;;16283:4;16275:29;;;:66;;;;;16325:16;16308:13;:33;16275:66;16271:234;;;16365:24;16358:31;;;;16271:234;16429:64;16451:10;16463:12;16477:15;16429:21;:64::i;:::-;16422:71;;16198:314;;:::o;22257:132::-;22332:12;:10;:12::i;:::-;22321:23;;:7;:5;:7::i;:::-;:23;;;22313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22257:132::o;35758:399::-;35861:1;35842:21;;:7;:21;;;;35834:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35912:49;35941:1;35945:7;35954:6;35912:20;:49::i;:::-;35990:6;35974:12;;:22;;;;;;;:::i;:::-;;;;;;;;36029:6;36007:9;:18;36017:7;36007:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;36072:7;36051:37;;36068:1;36051:37;;;36081:6;36051:37;;;;;;:::i;:::-;;;;;;;;36101:48;36129:1;36133:7;36142:6;36101:19;:48::i;:::-;35758:399;;:::o;36490:591::-;36593:1;36574:21;;:7;:21;;;;36566:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36646:49;36667:7;36684:1;36688:6;36646:20;:49::i;:::-;36708:22;36733:9;:18;36743:7;36733:18;;;;;;;;;;;;;;;;36708:43;;36788:6;36770:14;:24;;36762:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36907:6;36890:14;:23;36869:9;:18;36879:7;36869:18;;;;;;;;;;;;;;;:44;;;;36951:6;36935:12;;:22;;;;;;;:::i;:::-;;;;;;;;37001:1;36975:37;;36984:7;36975:37;;;37005:6;36975:37;;;;;;:::i;:::-;;;;;;;;37025:48;37045:7;37062:1;37066:6;37025:19;:48::i;:::-;36555:526;36490:591;;:::o;23359:191::-;23433:16;23452:6;;;;;;;;;;;23433:25;;23478:8;23469:6;;:17;;;;;;;;;;;;;;;;;;23533:8;23502:40;;23523:8;23502:40;;;;;;;;;;;;23422:128;23359:191;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;43175:207::-;43235:15;43263:30;43296:7;:14;43304:5;43296:14;;;;;;;;;;;;;;;43263:47;;43331:15;:5;:13;:15::i;:::-;43321:25;;43357:17;:5;:15;:17::i;:::-;43252:130;43175:207;;;:::o;17425:167::-;17502:7;17529:55;17551:20;:18;:20::i;:::-;17573:10;17529:21;:55::i;:::-;17522:62;;17425:167;;;:::o;11074:279::-;11202:7;11223:17;11242:18;11264:25;11275:4;11281:1;11284;11287;11264:10;:25::i;:::-;11222:67;;;;11300:18;11312:5;11300:11;:18::i;:::-;11336:9;11329:16;;;;11074:279;;;;;;:::o;39243:125::-;;;;:::o;39972:124::-;;;;:::o;16520:263::-;16664:7;16712:8;16722;16732:11;16745:13;16768:4;16701:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16691:84;;;;;;16684:91;;16520:263;;;;;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;12765:196::-;12858:7;12924:15;12941:10;12895:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12885:68;;;;;;12878:75;;12765:196;;;;:::o;9303:1632::-;9434:7;9443:12;10368:66;10363:1;10355:10;;:79;10351:163;;;10467:1;10471:30;10451:51;;;;;;10351:163;10533:2;10528:1;:7;;;;:18;;;;;10544:2;10539:1;:7;;;;10528:18;10524:102;;;10579:1;10583:30;10563:51;;;;;;10524:102;10723:14;10740:24;10750:4;10756:1;10759;10762;10740:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10723:41;;10797:1;10779:20;;:6;:20;;;10775:103;;;10832:1;10836:29;10816:50;;;;;;;10775:103;10898:6;10906:20;10890:37;;;;;9303:1632;;;;;;;;:::o;4573:643::-;4651:20;4642:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;4638:571;;;4688:7;;4638:571;4749:29;4740:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;4736:473;;;4795:34;;;;;;;;;;:::i;:::-;;;;;;;;4736:473;4860:35;4851:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;4847:362;;;4912:41;;;;;;;;;;:::i;:::-;;;;;;;;4847:362;4984:30;4975:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;4971:238;;;5031:44;;;;;;;;;;:::i;:::-;;;;;;;;4971:238;5106:30;5097:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;5093:116;;;5153:44;;;;;;;;;;:::i;:::-;;;;;;;;5093:116;4573:643;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;297:139;;;;:::o;442:135::-;486:5;524:6;511:20;502:29;;540:31;565:5;540:31;:::i;:::-;442:135;;;;:::o;583:329::-;642:6;691:2;679:9;670:7;666:23;662:32;659:119;;;697:79;;:::i;:::-;659:119;817:1;842:53;887:7;878:6;867:9;863:22;842:53;:::i;:::-;832:63;;788:117;583:329;;;;:::o;918:474::-;986:6;994;1043:2;1031:9;1022:7;1018:23;1014:32;1011:119;;;1049:79;;:::i;:::-;1011:119;1169:1;1194:53;1239:7;1230:6;1219:9;1215:22;1194:53;:::i;:::-;1184:63;;1140:117;1296:2;1322:53;1367:7;1358:6;1347:9;1343:22;1322:53;:::i;:::-;1312:63;;1267:118;918:474;;;;;:::o;1398:619::-;1475:6;1483;1491;1540:2;1528:9;1519:7;1515:23;1511:32;1508:119;;;1546:79;;:::i;:::-;1508:119;1666:1;1691:53;1736:7;1727:6;1716:9;1712:22;1691:53;:::i;:::-;1681:63;;1637:117;1793:2;1819:53;1864:7;1855:6;1844:9;1840:22;1819:53;:::i;:::-;1809:63;;1764:118;1921:2;1947:53;1992:7;1983:6;1972:9;1968:22;1947:53;:::i;:::-;1937:63;;1892:118;1398:619;;;;;:::o;2023:1199::-;2134:6;2142;2150;2158;2166;2174;2182;2231:3;2219:9;2210:7;2206:23;2202:33;2199:120;;;2238:79;;:::i;:::-;2199:120;2358:1;2383:53;2428:7;2419:6;2408:9;2404:22;2383:53;:::i;:::-;2373:63;;2329:117;2485:2;2511:53;2556:7;2547:6;2536:9;2532:22;2511:53;:::i;:::-;2501:63;;2456:118;2613:2;2639:53;2684:7;2675:6;2664:9;2660:22;2639:53;:::i;:::-;2629:63;;2584:118;2741:2;2767:53;2812:7;2803:6;2792:9;2788:22;2767:53;:::i;:::-;2757:63;;2712:118;2869:3;2896:51;2939:7;2930:6;2919:9;2915:22;2896:51;:::i;:::-;2886:61;;2840:117;2996:3;3023:53;3068:7;3059:6;3048:9;3044:22;3023:53;:::i;:::-;3013:63;;2967:119;3125:3;3152:53;3197:7;3188:6;3177:9;3173:22;3152:53;:::i;:::-;3142:63;;3096:119;2023:1199;;;;;;;;;;:::o;3228:474::-;3296:6;3304;3353:2;3341:9;3332:7;3328:23;3324:32;3321:119;;;3359:79;;:::i;:::-;3321:119;3479:1;3504:53;3549:7;3540:6;3529:9;3525:22;3504:53;:::i;:::-;3494:63;;3450:117;3606:2;3632:53;3677:7;3668:6;3657:9;3653:22;3632:53;:::i;:::-;3622:63;;3577:118;3228:474;;;;;:::o;3708:329::-;3767:6;3816:2;3804:9;3795:7;3791:23;3787:32;3784:119;;;3822:79;;:::i;:::-;3784:119;3942:1;3967:53;4012:7;4003:6;3992:9;3988:22;3967:53;:::i;:::-;3957:63;;3913:117;3708:329;;;;:::o;4043:118::-;4130:24;4148:5;4130:24;:::i;:::-;4125:3;4118:37;4043:118;;:::o;4167:109::-;4248:21;4263:5;4248:21;:::i;:::-;4243:3;4236:34;4167:109;;:::o;4282:118::-;4369:24;4387:5;4369:24;:::i;:::-;4364:3;4357:37;4282:118;;:::o;4406:157::-;4511:45;4531:24;4549:5;4531:24;:::i;:::-;4511:45;:::i;:::-;4506:3;4499:58;4406:157;;:::o;4569:364::-;4657:3;4685:39;4718:5;4685:39;:::i;:::-;4740:71;4804:6;4799:3;4740:71;:::i;:::-;4733:78;;4820:52;4865:6;4860:3;4853:4;4846:5;4842:16;4820:52;:::i;:::-;4897:29;4919:6;4897:29;:::i;:::-;4892:3;4888:39;4881:46;;4661:272;4569:364;;;;:::o;4939:366::-;5081:3;5102:67;5166:2;5161:3;5102:67;:::i;:::-;5095:74;;5178:93;5267:3;5178:93;:::i;:::-;5296:2;5291:3;5287:12;5280:19;;4939:366;;;:::o;5311:::-;5453:3;5474:67;5538:2;5533:3;5474:67;:::i;:::-;5467:74;;5550:93;5639:3;5550:93;:::i;:::-;5668:2;5663:3;5659:12;5652:19;;5311:366;;;:::o;5683:::-;5825:3;5846:67;5910:2;5905:3;5846:67;:::i;:::-;5839:74;;5922:93;6011:3;5922:93;:::i;:::-;6040:2;6035:3;6031:12;6024:19;;5683:366;;;:::o;6055:::-;6197:3;6218:67;6282:2;6277:3;6218:67;:::i;:::-;6211:74;;6294:93;6383:3;6294:93;:::i;:::-;6412:2;6407:3;6403:12;6396:19;;6055:366;;;:::o;6427:::-;6569:3;6590:67;6654:2;6649:3;6590:67;:::i;:::-;6583:74;;6666:93;6755:3;6666:93;:::i;:::-;6784:2;6779:3;6775:12;6768:19;;6427:366;;;:::o;6799:::-;6941:3;6962:67;7026:2;7021:3;6962:67;:::i;:::-;6955:74;;7038:93;7127:3;7038:93;:::i;:::-;7156:2;7151:3;7147:12;7140:19;;6799:366;;;:::o;7171:400::-;7331:3;7352:84;7434:1;7429:3;7352:84;:::i;:::-;7345:91;;7445:93;7534:3;7445:93;:::i;:::-;7563:1;7558:3;7554:11;7547:18;;7171:400;;;:::o;7577:366::-;7719:3;7740:67;7804:2;7799:3;7740:67;:::i;:::-;7733:74;;7816:93;7905:3;7816:93;:::i;:::-;7934:2;7929:3;7925:12;7918:19;;7577:366;;;:::o;7949:::-;8091:3;8112:67;8176:2;8171:3;8112:67;:::i;:::-;8105:74;;8188:93;8277:3;8188:93;:::i;:::-;8306:2;8301:3;8297:12;8290:19;;7949:366;;;:::o;8321:::-;8463:3;8484:67;8548:2;8543:3;8484:67;:::i;:::-;8477:74;;8560:93;8649:3;8560:93;:::i;:::-;8678:2;8673:3;8669:12;8662:19;;8321:366;;;:::o;8693:::-;8835:3;8856:67;8920:2;8915:3;8856:67;:::i;:::-;8849:74;;8932:93;9021:3;8932:93;:::i;:::-;9050:2;9045:3;9041:12;9034:19;;8693:366;;;:::o;9065:::-;9207:3;9228:67;9292:2;9287:3;9228:67;:::i;:::-;9221:74;;9304:93;9393:3;9304:93;:::i;:::-;9422:2;9417:3;9413:12;9406:19;;9065:366;;;:::o;9437:::-;9579:3;9600:67;9664:2;9659:3;9600:67;:::i;:::-;9593:74;;9676:93;9765:3;9676:93;:::i;:::-;9794:2;9789:3;9785:12;9778:19;;9437:366;;;:::o;9809:::-;9951:3;9972:67;10036:2;10031:3;9972:67;:::i;:::-;9965:74;;10048:93;10137:3;10048:93;:::i;:::-;10166:2;10161:3;10157:12;10150:19;;9809:366;;;:::o;10181:::-;10323:3;10344:67;10408:2;10403:3;10344:67;:::i;:::-;10337:74;;10420:93;10509:3;10420:93;:::i;:::-;10538:2;10533:3;10529:12;10522:19;;10181:366;;;:::o;10553:::-;10695:3;10716:67;10780:2;10775:3;10716:67;:::i;:::-;10709:74;;10792:93;10881:3;10792:93;:::i;:::-;10910:2;10905:3;10901:12;10894:19;;10553:366;;;:::o;10925:::-;11067:3;11088:67;11152:2;11147:3;11088:67;:::i;:::-;11081:74;;11164:93;11253:3;11164:93;:::i;:::-;11282:2;11277:3;11273:12;11266:19;;10925:366;;;:::o;11297:::-;11439:3;11460:67;11524:2;11519:3;11460:67;:::i;:::-;11453:74;;11536:93;11625:3;11536:93;:::i;:::-;11654:2;11649:3;11645:12;11638:19;;11297:366;;;:::o;11669:::-;11811:3;11832:67;11896:2;11891:3;11832:67;:::i;:::-;11825:74;;11908:93;11997:3;11908:93;:::i;:::-;12026:2;12021:3;12017:12;12010:19;;11669:366;;;:::o;12041:118::-;12128:24;12146:5;12128:24;:::i;:::-;12123:3;12116:37;12041:118;;:::o;12165:112::-;12248:22;12264:5;12248:22;:::i;:::-;12243:3;12236:35;12165:112;;:::o;12283:663::-;12524:3;12546:148;12690:3;12546:148;:::i;:::-;12539:155;;12704:75;12775:3;12766:6;12704:75;:::i;:::-;12804:2;12799:3;12795:12;12788:19;;12817:75;12888:3;12879:6;12817:75;:::i;:::-;12917:2;12912:3;12908:12;12901:19;;12937:3;12930:10;;12283:663;;;;;:::o;12952:222::-;13045:4;13083:2;13072:9;13068:18;13060:26;;13096:71;13164:1;13153:9;13149:17;13140:6;13096:71;:::i;:::-;12952:222;;;;:::o;13180:210::-;13267:4;13305:2;13294:9;13290:18;13282:26;;13318:65;13380:1;13369:9;13365:17;13356:6;13318:65;:::i;:::-;13180:210;;;;:::o;13396:222::-;13489:4;13527:2;13516:9;13512:18;13504:26;;13540:71;13608:1;13597:9;13593:17;13584:6;13540:71;:::i;:::-;13396:222;;;;:::o;13624:775::-;13857:4;13895:3;13884:9;13880:19;13872:27;;13909:71;13977:1;13966:9;13962:17;13953:6;13909:71;:::i;:::-;13990:72;14058:2;14047:9;14043:18;14034:6;13990:72;:::i;:::-;14072;14140:2;14129:9;14125:18;14116:6;14072:72;:::i;:::-;14154;14222:2;14211:9;14207:18;14198:6;14154:72;:::i;:::-;14236:73;14304:3;14293:9;14289:19;14280:6;14236:73;:::i;:::-;14319;14387:3;14376:9;14372:19;14363:6;14319:73;:::i;:::-;13624:775;;;;;;;;;:::o;14405:664::-;14610:4;14648:3;14637:9;14633:19;14625:27;;14662:71;14730:1;14719:9;14715:17;14706:6;14662:71;:::i;:::-;14743:72;14811:2;14800:9;14796:18;14787:6;14743:72;:::i;:::-;14825;14893:2;14882:9;14878:18;14869:6;14825:72;:::i;:::-;14907;14975:2;14964:9;14960:18;14951:6;14907:72;:::i;:::-;14989:73;15057:3;15046:9;15042:19;15033:6;14989:73;:::i;:::-;14405:664;;;;;;;;:::o;15075:545::-;15248:4;15286:3;15275:9;15271:19;15263:27;;15300:71;15368:1;15357:9;15353:17;15344:6;15300:71;:::i;:::-;15381:68;15445:2;15434:9;15430:18;15421:6;15381:68;:::i;:::-;15459:72;15527:2;15516:9;15512:18;15503:6;15459:72;:::i;:::-;15541;15609:2;15598:9;15594:18;15585:6;15541:72;:::i;:::-;15075:545;;;;;;;:::o;15626:313::-;15739:4;15777:2;15766:9;15762:18;15754:26;;15826:9;15820:4;15816:20;15812:1;15801:9;15797:17;15790:47;15854:78;15927:4;15918:6;15854:78;:::i;:::-;15846:86;;15626:313;;;;:::o;15945:419::-;16111:4;16149:2;16138:9;16134:18;16126:26;;16198:9;16192:4;16188:20;16184:1;16173:9;16169:17;16162:47;16226:131;16352:4;16226:131;:::i;:::-;16218:139;;15945:419;;;:::o;16370:::-;16536:4;16574:2;16563:9;16559:18;16551:26;;16623:9;16617:4;16613:20;16609:1;16598:9;16594:17;16587:47;16651:131;16777:4;16651:131;:::i;:::-;16643:139;;16370:419;;;:::o;16795:::-;16961:4;16999:2;16988:9;16984:18;16976:26;;17048:9;17042:4;17038:20;17034:1;17023:9;17019:17;17012:47;17076:131;17202:4;17076:131;:::i;:::-;17068:139;;16795:419;;;:::o;17220:::-;17386:4;17424:2;17413:9;17409:18;17401:26;;17473:9;17467:4;17463:20;17459:1;17448:9;17444:17;17437:47;17501:131;17627:4;17501:131;:::i;:::-;17493:139;;17220:419;;;:::o;17645:::-;17811:4;17849:2;17838:9;17834:18;17826:26;;17898:9;17892:4;17888:20;17884:1;17873:9;17869:17;17862:47;17926:131;18052:4;17926:131;:::i;:::-;17918:139;;17645:419;;;:::o;18070:::-;18236:4;18274:2;18263:9;18259:18;18251:26;;18323:9;18317:4;18313:20;18309:1;18298:9;18294:17;18287:47;18351:131;18477:4;18351:131;:::i;:::-;18343:139;;18070:419;;;:::o;18495:::-;18661:4;18699:2;18688:9;18684:18;18676:26;;18748:9;18742:4;18738:20;18734:1;18723:9;18719:17;18712:47;18776:131;18902:4;18776:131;:::i;:::-;18768:139;;18495:419;;;:::o;18920:::-;19086:4;19124:2;19113:9;19109:18;19101:26;;19173:9;19167:4;19163:20;19159:1;19148:9;19144:17;19137:47;19201:131;19327:4;19201:131;:::i;:::-;19193:139;;18920:419;;;:::o;19345:::-;19511:4;19549:2;19538:9;19534:18;19526:26;;19598:9;19592:4;19588:20;19584:1;19573:9;19569:17;19562:47;19626:131;19752:4;19626:131;:::i;:::-;19618:139;;19345:419;;;:::o;19770:::-;19936:4;19974:2;19963:9;19959:18;19951:26;;20023:9;20017:4;20013:20;20009:1;19998:9;19994:17;19987:47;20051:131;20177:4;20051:131;:::i;:::-;20043:139;;19770:419;;;:::o;20195:::-;20361:4;20399:2;20388:9;20384:18;20376:26;;20448:9;20442:4;20438:20;20434:1;20423:9;20419:17;20412:47;20476:131;20602:4;20476:131;:::i;:::-;20468:139;;20195:419;;;:::o;20620:::-;20786:4;20824:2;20813:9;20809:18;20801:26;;20873:9;20867:4;20863:20;20859:1;20848:9;20844:17;20837:47;20901:131;21027:4;20901:131;:::i;:::-;20893:139;;20620:419;;;:::o;21045:::-;21211:4;21249:2;21238:9;21234:18;21226:26;;21298:9;21292:4;21288:20;21284:1;21273:9;21269:17;21262:47;21326:131;21452:4;21326:131;:::i;:::-;21318:139;;21045:419;;;:::o;21470:::-;21636:4;21674:2;21663:9;21659:18;21651:26;;21723:9;21717:4;21713:20;21709:1;21698:9;21694:17;21687:47;21751:131;21877:4;21751:131;:::i;:::-;21743:139;;21470:419;;;:::o;21895:::-;22061:4;22099:2;22088:9;22084:18;22076:26;;22148:9;22142:4;22138:20;22134:1;22123:9;22119:17;22112:47;22176:131;22302:4;22176:131;:::i;:::-;22168:139;;21895:419;;;:::o;22320:::-;22486:4;22524:2;22513:9;22509:18;22501:26;;22573:9;22567:4;22563:20;22559:1;22548:9;22544:17;22537:47;22601:131;22727:4;22601:131;:::i;:::-;22593:139;;22320:419;;;:::o;22745:::-;22911:4;22949:2;22938:9;22934:18;22926:26;;22998:9;22992:4;22988:20;22984:1;22973:9;22969:17;22962:47;23026:131;23152:4;23026:131;:::i;:::-;23018:139;;22745:419;;;:::o;23170:::-;23336:4;23374:2;23363:9;23359:18;23351:26;;23423:9;23417:4;23413:20;23409:1;23398:9;23394:17;23387:47;23451:131;23577:4;23451:131;:::i;:::-;23443:139;;23170:419;;;:::o;23595:222::-;23688:4;23726:2;23715:9;23711:18;23703:26;;23739:71;23807:1;23796:9;23792:17;23783:6;23739:71;:::i;:::-;23595:222;;;;:::o;23823:214::-;23912:4;23950:2;23939:9;23935:18;23927:26;;23963:67;24027:1;24016:9;24012:17;24003:6;23963:67;:::i;:::-;23823:214;;;;:::o;24124:99::-;24176:6;24210:5;24204:12;24194:22;;24124:99;;;:::o;24229:169::-;24313:11;24347:6;24342:3;24335:19;24387:4;24382:3;24378:14;24363:29;;24229:169;;;;:::o;24404:148::-;24506:11;24543:3;24528:18;;24404:148;;;;:::o;24558:305::-;24598:3;24617:20;24635:1;24617:20;:::i;:::-;24612:25;;24651:20;24669:1;24651:20;:::i;:::-;24646:25;;24805:1;24737:66;24733:74;24730:1;24727:81;24724:107;;;24811:18;;:::i;:::-;24724:107;24855:1;24852;24848:9;24841:16;;24558:305;;;;:::o;24869:191::-;24909:4;24929:20;24947:1;24929:20;:::i;:::-;24924:25;;24963:20;24981:1;24963:20;:::i;:::-;24958:25;;25002:1;24999;24996:8;24993:34;;;25007:18;;:::i;:::-;24993:34;25052:1;25049;25045:9;25037:17;;24869:191;;;;:::o;25066:96::-;25103:7;25132:24;25150:5;25132:24;:::i;:::-;25121:35;;25066:96;;;:::o;25168:90::-;25202:7;25245:5;25238:13;25231:21;25220:32;;25168:90;;;:::o;25264:77::-;25301:7;25330:5;25319:16;;25264:77;;;:::o;25347:126::-;25384:7;25424:42;25417:5;25413:54;25402:65;;25347:126;;;:::o;25479:77::-;25516:7;25545:5;25534:16;;25479:77;;;:::o;25562:86::-;25597:7;25637:4;25630:5;25626:16;25615:27;;25562:86;;;:::o;25654:307::-;25722:1;25732:113;25746:6;25743:1;25740:13;25732:113;;;25831:1;25826:3;25822:11;25816:18;25812:1;25807:3;25803:11;25796:39;25768:2;25765:1;25761:10;25756:15;;25732:113;;;25863:6;25860:1;25857:13;25854:101;;;25943:1;25934:6;25929:3;25925:16;25918:27;25854:101;25703:258;25654:307;;;:::o;25967:320::-;26011:6;26048:1;26042:4;26038:12;26028:22;;26095:1;26089:4;26085:12;26116:18;26106:81;;26172:4;26164:6;26160:17;26150:27;;26106:81;26234:2;26226:6;26223:14;26203:18;26200:38;26197:84;;;26253:18;;:::i;:::-;26197:84;26018:269;25967:320;;;:::o;26293:79::-;26332:7;26361:5;26350:16;;26293:79;;;:::o;26378:180::-;26426:77;26423:1;26416:88;26523:4;26520:1;26513:15;26547:4;26544:1;26537:15;26564:180;26612:77;26609:1;26602:88;26709:4;26706:1;26699:15;26733:4;26730:1;26723:15;26750:180;26798:77;26795:1;26788:88;26895:4;26892:1;26885:15;26919:4;26916:1;26909:15;27059:117;27168:1;27165;27158:12;27182:102;27223:6;27274:2;27270:7;27265:2;27258:5;27254:14;27250:28;27240:38;;27182:102;;;:::o;27290:174::-;27430:26;27426:1;27418:6;27414:14;27407:50;27290:174;:::o;27470:222::-;27610:34;27606:1;27598:6;27594:14;27587:58;27679:5;27674:2;27666:6;27662:15;27655:30;27470:222;:::o;27698:221::-;27838:34;27834:1;27826:6;27822:14;27815:58;27907:4;27902:2;27894:6;27890:15;27883:29;27698:221;:::o;27925:181::-;28065:33;28061:1;28053:6;28049:14;28042:57;27925:181;:::o;28112:225::-;28252:34;28248:1;28240:6;28236:14;28229:58;28321:8;28316:2;28308:6;28304:15;28297:33;28112:225;:::o;28343:221::-;28483:34;28479:1;28471:6;28467:14;28460:58;28552:4;28547:2;28539:6;28535:15;28528:29;28343:221;:::o;28570:214::-;28710:66;28706:1;28698:6;28694:14;28687:90;28570:214;:::o;28790:179::-;28930:31;28926:1;28918:6;28914:14;28907:55;28790:179;:::o;28975:::-;29115:31;29111:1;29103:6;29099:14;29092:55;28975:179;:::o;29160:225::-;29300:34;29296:1;29288:6;29284:14;29277:58;29369:8;29364:2;29356:6;29352:15;29345:33;29160:225;:::o;29391:221::-;29531:34;29527:1;29519:6;29515:14;29508:58;29600:4;29595:2;29587:6;29583:15;29576:29;29391:221;:::o;29618:::-;29758:34;29754:1;29746:6;29742:14;29735:58;29827:4;29822:2;29814:6;29810:15;29803:29;29618:221;:::o;29845:180::-;29985:32;29981:1;29973:6;29969:14;29962:56;29845:180;:::o;30031:182::-;30171:34;30167:1;30159:6;30155:14;30148:58;30031:182;:::o;30219:220::-;30359:34;30355:1;30347:6;30343:14;30336:58;30428:3;30423:2;30415:6;30411:15;30404:28;30219:220;:::o;30445:224::-;30585:34;30581:1;30573:6;30569:14;30562:58;30654:7;30649:2;30641:6;30637:15;30630:32;30445:224;:::o;30675:223::-;30815:34;30811:1;30803:6;30799:14;30792:58;30884:6;30879:2;30871:6;30867:15;30860:31;30675:223;:::o;30904:224::-;31044:34;31040:1;31032:6;31028:14;31021:58;31113:7;31108:2;31100:6;31096:15;31089:32;30904:224;:::o;31134:181::-;31274:33;31270:1;31262:6;31258:14;31251:57;31134:181;:::o;31321:122::-;31394:24;31412:5;31394:24;:::i;:::-;31387:5;31384:35;31374:63;;31433:1;31430;31423:12;31374:63;31321:122;:::o;31449:::-;31522:24;31540:5;31522:24;:::i;:::-;31515:5;31512:35;31502:63;;31561:1;31558;31551:12;31502:63;31449:122;:::o;31577:::-;31650:24;31668:5;31650:24;:::i;:::-;31643:5;31640:35;31630:63;;31689:1;31686;31679:12;31630:63;31577:122;:::o;31705:118::-;31776:22;31792:5;31776:22;:::i;:::-;31769:5;31766:33;31756:61;;31813:1;31810;31803:12;31756:61;31705:118;:::o

Swarm Source

ipfs://6085d20e22de1b521c5019ab13d659443162df28dd64331231b85054e0259ba5
Loading