ETH Price: $3,019.03 (+2.02%)
Gas: 2 Gwei

Token

Crypto Squid Game (CSG)
 

Overview

Max Total Supply

47 CSG

Holders

15

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 CSG
0x2cc39b5d1458e0991fb826bd518cc279597758ec
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoSquidGame

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-18
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

    return (signer, RecoverError.NoError);
  }

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

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

  /**
   * @dev Returns an Ethereum Signed 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/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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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

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() {
    _setOwner(_msgSender());
  }

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

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

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    _setOwner(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");
    _setOwner(newOwner);
  }

  function _setOwner(address newOwner) private {
    address oldOwner = _owner;
    _owner = newOwner;
    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
  using Address for address;
  using Strings for uint256;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to owner address
  mapping(uint256 => address) private _owners;

  // Mapping owner address to token count
  mapping(address => uint256) private _balances;

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

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

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

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

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

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

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

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

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json"))
        : "";
  }

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

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

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

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

    _transfer(from, to, tokenId);
  }

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

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

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

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

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

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

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

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

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

    _balances[to] += 1;
    _owners[tokenId] = to;

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

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

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

    // Clear approvals
    _approve(address(0), tokenId);

    _balances[owner] -= 1;
    delete _owners[tokenId];

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

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

    _beforeTokenTransfer(from, to, tokenId);

    // Clear approvals from the previous owner
    _approve(address(0), tokenId);

    _balances[from] -= 1;
    _balances[to] += 1;
    _owners[tokenId] = to;

    emit Transfer(from, to, tokenId);
  }

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

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

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

// File: contracts/CryptoSquidGame.sol

pragma solidity ^0.8.0;

contract CryptoSquidGame is ERC721, Ownable {
  using Address for address;
  using Counters for Counters.Counter;

  Counters.Counter private _tokenCount;

  string public baseURI = "https://api.cryptosquidgame.io/metadata/";
  uint256 public constant price = 60000000000000000; // 0.06 ETH
  uint256 public constant maxTokens = 6666;
  uint256 public maxWallet = 20;
  bool public saleIsActive = true;
  bool public hasReserved = false;

  mapping(address => uint256) public minted; // To check how many tokens an address has minted

  constructor() ERC721("Crypto Squid Game", "CSG") {}

  // reserve (100 tokens)
  function reserve() external onlyOwner {
    require(!hasReserved, "Tokens have already been reserved.");

    for (uint256 i; i < 66; i++) {
      _tokenCount.increment();
      _safeMint(msg.sender, _tokenCount.current());
    }
    hasReserved = true;
  }

  function mint(uint256 _amount) external payable {
    require(saleIsActive, "Sale must be active");
    require(
      minted[msg.sender] + _amount <= maxWallet,
      "Purchase would exceed max tokens per wallet"
    );
    require(
      _tokenCount.current() + _amount <= maxTokens,
      "Purchase would exceed max supply of tokens"
    );
    require(msg.value >= price * _amount, "Ether value sent is not correct");

    for (uint256 i; i < _amount; i++) {
      _tokenCount.increment();
      _safeMint(msg.sender, _tokenCount.current());
    }

    minted[msg.sender] += _amount;
  }

  function totalSupply() public view returns (uint256) {
    return _tokenCount.current();
  }

  function setBaseURI(string memory __baseURI) external onlyOwner {
    baseURI = __baseURI;
  }

  function _baseURI() internal view override returns (string memory) {
    return baseURI;
  }

  function flipSaleState() public onlyOwner {
    saleIsActive = !saleIsActive;
  }

  function setMaxWallet(uint256 _newMaxWallet) external onlyOwner {
    maxWallet = _newMaxWallet;
  }

  function withdrawAll() external onlyOwner {
    uint256 balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180606001604052806028815260200162003c8f60289139600890805190602001906200003592919062000213565b5060146009556001600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055503480156200007e57600080fd5b506040518060400160405280601181526020017f43727970746f2053717569642047616d650000000000000000000000000000008152506040518060400160405280600381526020017f435347000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010392919062000213565b5080600190805190602001906200011c92919062000213565b5050506200013f620001336200014560201b60201c565b6200014d60201b60201c565b62000328565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022190620002c3565b90600052602060002090601f01602090048101928262000245576000855562000291565b82601f106200026057805160ff191683800117855562000291565b8280016001018555821562000291579182015b828111156200029057825182559160200191906001019062000273565b5b509050620002a09190620002a4565b5090565b5b80821115620002bf576000816000905550600101620002a5565b5090565b60006002820490506001821680620002dc57607f821691505b60208210811415620002f357620002f2620002f9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61395780620003386000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461062f578063eb8d24441461066c578063f2fde38b14610697578063f8b45b05146106c0576101cd565b8063b88d4fde14610587578063c87b56dd146105b0578063cd3293de146105ed578063e831574214610604576101cd565b806395d89b41116100d157806395d89b41146104ec578063a035b1fe14610517578063a0712d6814610542578063a22cb4651461055e576101cd565b8063715018a614610493578063853828b6146104aa5780638da5cb5b146104c1576101cd565b806334918dfd1161016f57806361eb605d1161013e57806361eb605d146103c35780636352211e146103ee5780636c0360eb1461042b57806370a0823114610456576101cd565b806334918dfd1461033157806342842e0e1461034857806355f804b3146103715780635d0044ca1461039a576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a05780631e7269c5146102cb57806323b872dd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906127d9565b6106eb565b60405161020691906131b5565b60405180910390f35b34801561021b57600080fd5b506102246107cd565b60405161023191906131d0565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061286c565b61085f565b60405161026e919061314e565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061279d565b6108e4565b005b3480156102ac57600080fd5b506102b56109fc565b6040516102c29190613492565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612632565b610a0d565b6040516102ff9190613492565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190612697565b610a25565b005b34801561033d57600080fd5b50610346610a85565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612697565b610b2d565b005b34801561037d57600080fd5b506103986004803603810190610393919061282b565b610b4d565b005b3480156103a657600080fd5b506103c160048036038101906103bc919061286c565b610be3565b005b3480156103cf57600080fd5b506103d8610c69565b6040516103e591906131b5565b60405180910390f35b3480156103fa57600080fd5b506104156004803603810190610410919061286c565b610c7c565b604051610422919061314e565b60405180910390f35b34801561043757600080fd5b50610440610d2e565b60405161044d91906131d0565b60405180910390f35b34801561046257600080fd5b5061047d60048036038101906104789190612632565b610dbc565b60405161048a9190613492565b60405180910390f35b34801561049f57600080fd5b506104a8610e74565b005b3480156104b657600080fd5b506104bf610efc565b005b3480156104cd57600080fd5b506104d6610fc7565b6040516104e3919061314e565b60405180910390f35b3480156104f857600080fd5b50610501610ff1565b60405161050e91906131d0565b60405180910390f35b34801561052357600080fd5b5061052c611083565b6040516105399190613492565b60405180910390f35b61055c6004803603810190610557919061286c565b61108e565b005b34801561056a57600080fd5b5061058560048036038101906105809190612761565b6112af565b005b34801561059357600080fd5b506105ae60048036038101906105a991906126e6565b611430565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061286c565b611492565b6040516105e491906131d0565b60405180910390f35b3480156105f957600080fd5b50610602611539565b005b34801561061057600080fd5b5061061961165f565b6040516106269190613492565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061265b565b611665565b60405161066391906131b5565b60405180910390f35b34801561067857600080fd5b506106816116f9565b60405161068e91906131b5565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612632565b61170c565b005b3480156106cc57600080fd5b506106d5611804565b6040516106e29190613492565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c657506107c58261180a565b5b9050919050565b6060600080546107dc9061374c565b80601f01602080910402602001604051908101604052809291908181526020018280546108089061374c565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050905090565b600061086a82611874565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a0906133b2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ef82610c7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613432565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097f6118e0565b73ffffffffffffffffffffffffffffffffffffffff1614806109ae57506109ad816109a86118e0565b611665565b5b6109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490613312565b60405180910390fd5b6109f783836118e8565b505050565b6000610a0860076119a1565b905090565b600b6020528060005260406000206000915090505481565b610a36610a306118e0565b826119af565b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90613452565b60405180910390fd5b610a80838383611a8d565b505050565b610a8d6118e0565b73ffffffffffffffffffffffffffffffffffffffff16610aab610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af8906133d2565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b610b4883838360405180602001604052806000815250611430565b505050565b610b556118e0565b73ffffffffffffffffffffffffffffffffffffffff16610b73610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc0906133d2565b60405180910390fd5b8060089080519060200190610bdf929190612456565b5050565b610beb6118e0565b73ffffffffffffffffffffffffffffffffffffffff16610c09610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c56906133d2565b60405180910390fd5b8060098190555050565b600a60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90613352565b60405180910390fd5b80915050919050565b60088054610d3b9061374c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d679061374c565b8015610db45780601f10610d8957610100808354040283529160200191610db4565b820191906000526020600020905b815481529060010190602001808311610d9757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490613332565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e7c6118e0565b73ffffffffffffffffffffffffffffffffffffffff16610e9a610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906133d2565b60405180910390fd5b610efa6000611ce9565b565b610f046118e0565b73ffffffffffffffffffffffffffffffffffffffff16610f22610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906133d2565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fc3573d6000803e3d6000fd5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110009061374c565b80601f016020809104026020016040519081016040528092919081815260200182805461102c9061374c565b80156110795780601f1061104e57610100808354040283529160200191611079565b820191906000526020600020905b81548152906001019060200180831161105c57829003601f168201915b5050505050905090565b66d529ae9e86000081565b600a60009054906101000a900460ff166110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906131f2565b60405180910390fd5b60095481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461112b9190613581565b111561116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390613212565b60405180910390fd5b611a0a8161117a60076119a1565b6111849190613581565b11156111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90613372565b60405180910390fd5b8066d529ae9e8600006111d89190613608565b34101561121a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611211906132d2565b60405180910390fd5b60005b818110156112555761122f6007611daf565b6112423361123d60076119a1565b611dc5565b808061124d9061377e565b91505061121d565b5080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112a59190613581565b9250508190555050565b6112b76118e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c906132b2565b60405180910390fd5b80600560006113326118e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113df6118e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161142491906131b5565b60405180910390a35050565b61144161143b6118e0565b836119af565b611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790613452565b60405180910390fd5b61148c84848484611de3565b50505050565b606061149d82611874565b6114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390613412565b60405180910390fd5b60006114e6611e3f565b905060008151116115065760405180602001604052806000815250611531565b8061151084611ed1565b60405160200161152192919061311f565b6040516020818303038152906040525b915050919050565b6115416118e0565b73ffffffffffffffffffffffffffffffffffffffff1661155f610fc7565b73ffffffffffffffffffffffffffffffffffffffff16146115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac906133d2565b60405180910390fd5b600a60019054906101000a900460ff1615611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90613472565b60405180910390fd5b60005b60428110156116415761161b6007611daf565b61162e3361162960076119a1565b611dc5565b80806116399061377e565b915050611608565b506001600a60016101000a81548160ff021916908315150217905550565b611a0a81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60009054906101000a900460ff1681565b6117146118e0565b73ffffffffffffffffffffffffffffffffffffffff16611732610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906133d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef90613252565b60405180910390fd5b61180181611ce9565b50565b60095481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661195b83610c7c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006119ba82611874565b6119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906132f2565b60405180910390fd5b6000611a0483610c7c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a7357508373ffffffffffffffffffffffffffffffffffffffff16611a5b8461085f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a845750611a838185611665565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611aad82610c7c565b73ffffffffffffffffffffffffffffffffffffffff1614611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa906133f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a90613292565b60405180910390fd5b611b7e83838361207e565b611b896000826118e8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd99190613662565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c309190613581565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b611ddf828260405180602001604052806000815250612083565b5050565b611dee848484611a8d565b611dfa848484846120de565b611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090613232565b60405180910390fd5b50505050565b606060088054611e4e9061374c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7a9061374c565b8015611ec75780601f10611e9c57610100808354040283529160200191611ec7565b820191906000526020600020905b815481529060010190602001808311611eaa57829003601f168201915b5050505050905090565b60606000821415611f19576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612079565b600082905060005b60008214611f4b578080611f349061377e565b915050600a82611f4491906135d7565b9150611f21565b60008167ffffffffffffffff811115611f8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fbf5781602001600182028036833780820191505090505b5090505b6000851461207257600182611fd89190613662565b9150600a85611fe791906137c7565b6030611ff39190613581565b60f81b81838151811061202f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561206b91906135d7565b9450611fc3565b8093505050505b919050565b505050565b61208d8383612275565b61209a60008484846120de565b6120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d090613232565b60405180910390fd5b505050565b60006120ff8473ffffffffffffffffffffffffffffffffffffffff16612443565b15612268578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121286118e0565b8786866040518563ffffffff1660e01b815260040161214a9493929190613169565b602060405180830381600087803b15801561216457600080fd5b505af192505050801561219557506040513d601f19601f820116820180604052508101906121929190612802565b60015b612218573d80600081146121c5576040519150601f19603f3d011682016040523d82523d6000602084013e6121ca565b606091505b50600081511415612210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220790613232565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061226d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90613392565b60405180910390fd5b6122ee81611874565b1561232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590613272565b60405180910390fd5b61233a6000838361207e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238a9190613581565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546124629061374c565b90600052602060002090601f01602090048101928261248457600085556124cb565b82601f1061249d57805160ff19168380011785556124cb565b828001600101855582156124cb579182015b828111156124ca5782518255916020019190600101906124af565b5b5090506124d891906124dc565b5090565b5b808211156124f55760008160009055506001016124dd565b5090565b600061250c612507846134de565b6134ad565b90508281526020810184848401111561252457600080fd5b61252f84828561370a565b509392505050565b600061254a6125458461350e565b6134ad565b90508281526020810184848401111561256257600080fd5b61256d84828561370a565b509392505050565b600081359050612584816138c5565b92915050565b600081359050612599816138dc565b92915050565b6000813590506125ae816138f3565b92915050565b6000815190506125c3816138f3565b92915050565b600082601f8301126125da57600080fd5b81356125ea8482602086016124f9565b91505092915050565b600082601f83011261260457600080fd5b8135612614848260208601612537565b91505092915050565b60008135905061262c8161390a565b92915050565b60006020828403121561264457600080fd5b600061265284828501612575565b91505092915050565b6000806040838503121561266e57600080fd5b600061267c85828601612575565b925050602061268d85828601612575565b9150509250929050565b6000806000606084860312156126ac57600080fd5b60006126ba86828701612575565b93505060206126cb86828701612575565b92505060406126dc8682870161261d565b9150509250925092565b600080600080608085870312156126fc57600080fd5b600061270a87828801612575565b945050602061271b87828801612575565b935050604061272c8782880161261d565b925050606085013567ffffffffffffffff81111561274957600080fd5b612755878288016125c9565b91505092959194509250565b6000806040838503121561277457600080fd5b600061278285828601612575565b92505060206127938582860161258a565b9150509250929050565b600080604083850312156127b057600080fd5b60006127be85828601612575565b92505060206127cf8582860161261d565b9150509250929050565b6000602082840312156127eb57600080fd5b60006127f98482850161259f565b91505092915050565b60006020828403121561281457600080fd5b6000612822848285016125b4565b91505092915050565b60006020828403121561283d57600080fd5b600082013567ffffffffffffffff81111561285757600080fd5b612863848285016125f3565b91505092915050565b60006020828403121561287e57600080fd5b600061288c8482850161261d565b91505092915050565b61289e81613696565b82525050565b6128ad816136a8565b82525050565b60006128be8261353e565b6128c88185613554565b93506128d8818560208601613719565b6128e1816138b4565b840191505092915050565b60006128f782613549565b6129018185613565565b9350612911818560208601613719565b61291a816138b4565b840191505092915050565b600061293082613549565b61293a8185613576565b935061294a818560208601613719565b80840191505092915050565b6000612963601383613565565b91507f53616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b60006129a3602b83613565565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008301527f207065722077616c6c65740000000000000000000000000000000000000000006020830152604082019050919050565b6000612a09603283613565565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612a6f602683613565565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ad5601c83613565565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612b15602483613565565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b7b601983613565565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612bbb601f83613565565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000612bfb602c83613565565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612c61603883613565565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612cc7602a83613565565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d2d602983613565565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d93602a83613565565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000612df9602083613565565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612e39602c83613565565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612e9f600583613576565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000612edf602083613565565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612f1f602983613565565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f85602f83613565565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000612feb602183613565565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613051603183613565565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006130b7602283613565565b91507f546f6b656e73206861766520616c7265616479206265656e207265736572766560008301527f642e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61311981613700565b82525050565b600061312b8285612925565b91506131378284612925565b915061314282612e92565b91508190509392505050565b60006020820190506131636000830184612895565b92915050565b600060808201905061317e6000830187612895565b61318b6020830186612895565b6131986040830185613110565b81810360608301526131aa81846128b3565b905095945050505050565b60006020820190506131ca60008301846128a4565b92915050565b600060208201905081810360008301526131ea81846128ec565b905092915050565b6000602082019050818103600083015261320b81612956565b9050919050565b6000602082019050818103600083015261322b81612996565b9050919050565b6000602082019050818103600083015261324b816129fc565b9050919050565b6000602082019050818103600083015261326b81612a62565b9050919050565b6000602082019050818103600083015261328b81612ac8565b9050919050565b600060208201905081810360008301526132ab81612b08565b9050919050565b600060208201905081810360008301526132cb81612b6e565b9050919050565b600060208201905081810360008301526132eb81612bae565b9050919050565b6000602082019050818103600083015261330b81612bee565b9050919050565b6000602082019050818103600083015261332b81612c54565b9050919050565b6000602082019050818103600083015261334b81612cba565b9050919050565b6000602082019050818103600083015261336b81612d20565b9050919050565b6000602082019050818103600083015261338b81612d86565b9050919050565b600060208201905081810360008301526133ab81612dec565b9050919050565b600060208201905081810360008301526133cb81612e2c565b9050919050565b600060208201905081810360008301526133eb81612ed2565b9050919050565b6000602082019050818103600083015261340b81612f12565b9050919050565b6000602082019050818103600083015261342b81612f78565b9050919050565b6000602082019050818103600083015261344b81612fde565b9050919050565b6000602082019050818103600083015261346b81613044565b9050919050565b6000602082019050818103600083015261348b816130aa565b9050919050565b60006020820190506134a76000830184613110565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134d4576134d3613885565b5b8060405250919050565b600067ffffffffffffffff8211156134f9576134f8613885565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561352957613528613885565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061358c82613700565b915061359783613700565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135cc576135cb6137f8565b5b828201905092915050565b60006135e282613700565b91506135ed83613700565b9250826135fd576135fc613827565b5b828204905092915050565b600061361382613700565b915061361e83613700565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613657576136566137f8565b5b828202905092915050565b600061366d82613700565b915061367883613700565b92508282101561368b5761368a6137f8565b5b828203905092915050565b60006136a1826136e0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561373757808201518184015260208101905061371c565b83811115613746576000848401525b50505050565b6000600282049050600182168061376457607f821691505b6020821081141561377857613777613856565b5b50919050565b600061378982613700565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137bc576137bb6137f8565b5b600182019050919050565b60006137d282613700565b91506137dd83613700565b9250826137ed576137ec613827565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6138ce81613696565b81146138d957600080fd5b50565b6138e5816136a8565b81146138f057600080fd5b50565b6138fc816136b4565b811461390757600080fd5b50565b61391381613700565b811461391e57600080fd5b5056fea264697066735822122032a9ce565270d35646f17e5a513d1b93aaea80de0961d1c91d8c0e820bb4c56364736f6c6343000800003368747470733a2f2f6170692e63727970746f737175696467616d652e696f2f6d657461646174612f

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461062f578063eb8d24441461066c578063f2fde38b14610697578063f8b45b05146106c0576101cd565b8063b88d4fde14610587578063c87b56dd146105b0578063cd3293de146105ed578063e831574214610604576101cd565b806395d89b41116100d157806395d89b41146104ec578063a035b1fe14610517578063a0712d6814610542578063a22cb4651461055e576101cd565b8063715018a614610493578063853828b6146104aa5780638da5cb5b146104c1576101cd565b806334918dfd1161016f57806361eb605d1161013e57806361eb605d146103c35780636352211e146103ee5780636c0360eb1461042b57806370a0823114610456576101cd565b806334918dfd1461033157806342842e0e1461034857806355f804b3146103715780635d0044ca1461039a576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a05780631e7269c5146102cb57806323b872dd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906127d9565b6106eb565b60405161020691906131b5565b60405180910390f35b34801561021b57600080fd5b506102246107cd565b60405161023191906131d0565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061286c565b61085f565b60405161026e919061314e565b60405180910390f35b34801561028357600080fd5b5061029e6004803603810190610299919061279d565b6108e4565b005b3480156102ac57600080fd5b506102b56109fc565b6040516102c29190613492565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed9190612632565b610a0d565b6040516102ff9190613492565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190612697565b610a25565b005b34801561033d57600080fd5b50610346610a85565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612697565b610b2d565b005b34801561037d57600080fd5b506103986004803603810190610393919061282b565b610b4d565b005b3480156103a657600080fd5b506103c160048036038101906103bc919061286c565b610be3565b005b3480156103cf57600080fd5b506103d8610c69565b6040516103e591906131b5565b60405180910390f35b3480156103fa57600080fd5b506104156004803603810190610410919061286c565b610c7c565b604051610422919061314e565b60405180910390f35b34801561043757600080fd5b50610440610d2e565b60405161044d91906131d0565b60405180910390f35b34801561046257600080fd5b5061047d60048036038101906104789190612632565b610dbc565b60405161048a9190613492565b60405180910390f35b34801561049f57600080fd5b506104a8610e74565b005b3480156104b657600080fd5b506104bf610efc565b005b3480156104cd57600080fd5b506104d6610fc7565b6040516104e3919061314e565b60405180910390f35b3480156104f857600080fd5b50610501610ff1565b60405161050e91906131d0565b60405180910390f35b34801561052357600080fd5b5061052c611083565b6040516105399190613492565b60405180910390f35b61055c6004803603810190610557919061286c565b61108e565b005b34801561056a57600080fd5b5061058560048036038101906105809190612761565b6112af565b005b34801561059357600080fd5b506105ae60048036038101906105a991906126e6565b611430565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061286c565b611492565b6040516105e491906131d0565b60405180910390f35b3480156105f957600080fd5b50610602611539565b005b34801561061057600080fd5b5061061961165f565b6040516106269190613492565b60405180910390f35b34801561063b57600080fd5b506106566004803603810190610651919061265b565b611665565b60405161066391906131b5565b60405180910390f35b34801561067857600080fd5b506106816116f9565b60405161068e91906131b5565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b99190612632565b61170c565b005b3480156106cc57600080fd5b506106d5611804565b6040516106e29190613492565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c657506107c58261180a565b5b9050919050565b6060600080546107dc9061374c565b80601f01602080910402602001604051908101604052809291908181526020018280546108089061374c565b80156108555780601f1061082a57610100808354040283529160200191610855565b820191906000526020600020905b81548152906001019060200180831161083857829003601f168201915b5050505050905090565b600061086a82611874565b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a0906133b2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ef82610c7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613432565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661097f6118e0565b73ffffffffffffffffffffffffffffffffffffffff1614806109ae57506109ad816109a86118e0565b611665565b5b6109ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e490613312565b60405180910390fd5b6109f783836118e8565b505050565b6000610a0860076119a1565b905090565b600b6020528060005260406000206000915090505481565b610a36610a306118e0565b826119af565b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90613452565b60405180910390fd5b610a80838383611a8d565b505050565b610a8d6118e0565b73ffffffffffffffffffffffffffffffffffffffff16610aab610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af8906133d2565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b610b4883838360405180602001604052806000815250611430565b505050565b610b556118e0565b73ffffffffffffffffffffffffffffffffffffffff16610b73610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc0906133d2565b60405180910390fd5b8060089080519060200190610bdf929190612456565b5050565b610beb6118e0565b73ffffffffffffffffffffffffffffffffffffffff16610c09610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c56906133d2565b60405180910390fd5b8060098190555050565b600a60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90613352565b60405180910390fd5b80915050919050565b60088054610d3b9061374c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d679061374c565b8015610db45780601f10610d8957610100808354040283529160200191610db4565b820191906000526020600020905b815481529060010190602001808311610d9757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2490613332565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e7c6118e0565b73ffffffffffffffffffffffffffffffffffffffff16610e9a610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee7906133d2565b60405180910390fd5b610efa6000611ce9565b565b610f046118e0565b73ffffffffffffffffffffffffffffffffffffffff16610f22610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f906133d2565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fc3573d6000803e3d6000fd5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110009061374c565b80601f016020809104026020016040519081016040528092919081815260200182805461102c9061374c565b80156110795780601f1061104e57610100808354040283529160200191611079565b820191906000526020600020905b81548152906001019060200180831161105c57829003601f168201915b5050505050905090565b66d529ae9e86000081565b600a60009054906101000a900460ff166110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d4906131f2565b60405180910390fd5b60095481600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461112b9190613581565b111561116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116390613212565b60405180910390fd5b611a0a8161117a60076119a1565b6111849190613581565b11156111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc90613372565b60405180910390fd5b8066d529ae9e8600006111d89190613608565b34101561121a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611211906132d2565b60405180910390fd5b60005b818110156112555761122f6007611daf565b6112423361123d60076119a1565b611dc5565b808061124d9061377e565b91505061121d565b5080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112a59190613581565b9250508190555050565b6112b76118e0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c906132b2565b60405180910390fd5b80600560006113326118e0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113df6118e0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161142491906131b5565b60405180910390a35050565b61144161143b6118e0565b836119af565b611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147790613452565b60405180910390fd5b61148c84848484611de3565b50505050565b606061149d82611874565b6114dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d390613412565b60405180910390fd5b60006114e6611e3f565b905060008151116115065760405180602001604052806000815250611531565b8061151084611ed1565b60405160200161152192919061311f565b6040516020818303038152906040525b915050919050565b6115416118e0565b73ffffffffffffffffffffffffffffffffffffffff1661155f610fc7565b73ffffffffffffffffffffffffffffffffffffffff16146115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac906133d2565b60405180910390fd5b600a60019054906101000a900460ff1615611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90613472565b60405180910390fd5b60005b60428110156116415761161b6007611daf565b61162e3361162960076119a1565b611dc5565b80806116399061377e565b915050611608565b506001600a60016101000a81548160ff021916908315150217905550565b611a0a81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60009054906101000a900460ff1681565b6117146118e0565b73ffffffffffffffffffffffffffffffffffffffff16611732610fc7565b73ffffffffffffffffffffffffffffffffffffffff1614611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906133d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef90613252565b60405180910390fd5b61180181611ce9565b50565b60095481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661195b83610c7c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006119ba82611874565b6119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906132f2565b60405180910390fd5b6000611a0483610c7c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a7357508373ffffffffffffffffffffffffffffffffffffffff16611a5b8461085f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a845750611a838185611665565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611aad82610c7c565b73ffffffffffffffffffffffffffffffffffffffff1614611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa906133f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a90613292565b60405180910390fd5b611b7e83838361207e565b611b896000826118e8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd99190613662565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c309190613581565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b611ddf828260405180602001604052806000815250612083565b5050565b611dee848484611a8d565b611dfa848484846120de565b611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090613232565b60405180910390fd5b50505050565b606060088054611e4e9061374c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7a9061374c565b8015611ec75780601f10611e9c57610100808354040283529160200191611ec7565b820191906000526020600020905b815481529060010190602001808311611eaa57829003601f168201915b5050505050905090565b60606000821415611f19576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612079565b600082905060005b60008214611f4b578080611f349061377e565b915050600a82611f4491906135d7565b9150611f21565b60008167ffffffffffffffff811115611f8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fbf5781602001600182028036833780820191505090505b5090505b6000851461207257600182611fd89190613662565b9150600a85611fe791906137c7565b6030611ff39190613581565b60f81b81838151811061202f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561206b91906135d7565b9450611fc3565b8093505050505b919050565b505050565b61208d8383612275565b61209a60008484846120de565b6120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d090613232565b60405180910390fd5b505050565b60006120ff8473ffffffffffffffffffffffffffffffffffffffff16612443565b15612268578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121286118e0565b8786866040518563ffffffff1660e01b815260040161214a9493929190613169565b602060405180830381600087803b15801561216457600080fd5b505af192505050801561219557506040513d601f19601f820116820180604052508101906121929190612802565b60015b612218573d80600081146121c5576040519150601f19603f3d011682016040523d82523d6000602084013e6121ca565b606091505b50600081511415612210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220790613232565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061226d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dc90613392565b60405180910390fd5b6122ee81611874565b1561232e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232590613272565b60405180910390fd5b61233a6000838361207e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461238a9190613581565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546124629061374c565b90600052602060002090601f01602090048101928261248457600085556124cb565b82601f1061249d57805160ff19168380011785556124cb565b828001600101855582156124cb579182015b828111156124ca5782518255916020019190600101906124af565b5b5090506124d891906124dc565b5090565b5b808211156124f55760008160009055506001016124dd565b5090565b600061250c612507846134de565b6134ad565b90508281526020810184848401111561252457600080fd5b61252f84828561370a565b509392505050565b600061254a6125458461350e565b6134ad565b90508281526020810184848401111561256257600080fd5b61256d84828561370a565b509392505050565b600081359050612584816138c5565b92915050565b600081359050612599816138dc565b92915050565b6000813590506125ae816138f3565b92915050565b6000815190506125c3816138f3565b92915050565b600082601f8301126125da57600080fd5b81356125ea8482602086016124f9565b91505092915050565b600082601f83011261260457600080fd5b8135612614848260208601612537565b91505092915050565b60008135905061262c8161390a565b92915050565b60006020828403121561264457600080fd5b600061265284828501612575565b91505092915050565b6000806040838503121561266e57600080fd5b600061267c85828601612575565b925050602061268d85828601612575565b9150509250929050565b6000806000606084860312156126ac57600080fd5b60006126ba86828701612575565b93505060206126cb86828701612575565b92505060406126dc8682870161261d565b9150509250925092565b600080600080608085870312156126fc57600080fd5b600061270a87828801612575565b945050602061271b87828801612575565b935050604061272c8782880161261d565b925050606085013567ffffffffffffffff81111561274957600080fd5b612755878288016125c9565b91505092959194509250565b6000806040838503121561277457600080fd5b600061278285828601612575565b92505060206127938582860161258a565b9150509250929050565b600080604083850312156127b057600080fd5b60006127be85828601612575565b92505060206127cf8582860161261d565b9150509250929050565b6000602082840312156127eb57600080fd5b60006127f98482850161259f565b91505092915050565b60006020828403121561281457600080fd5b6000612822848285016125b4565b91505092915050565b60006020828403121561283d57600080fd5b600082013567ffffffffffffffff81111561285757600080fd5b612863848285016125f3565b91505092915050565b60006020828403121561287e57600080fd5b600061288c8482850161261d565b91505092915050565b61289e81613696565b82525050565b6128ad816136a8565b82525050565b60006128be8261353e565b6128c88185613554565b93506128d8818560208601613719565b6128e1816138b4565b840191505092915050565b60006128f782613549565b6129018185613565565b9350612911818560208601613719565b61291a816138b4565b840191505092915050565b600061293082613549565b61293a8185613576565b935061294a818560208601613719565b80840191505092915050565b6000612963601383613565565b91507f53616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b60006129a3602b83613565565b91507f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008301527f207065722077616c6c65740000000000000000000000000000000000000000006020830152604082019050919050565b6000612a09603283613565565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612a6f602683613565565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ad5601c83613565565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612b15602483613565565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b7b601983613565565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612bbb601f83613565565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000612bfb602c83613565565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612c61603883613565565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612cc7602a83613565565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d2d602983613565565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d93602a83613565565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f6620746f6b656e73000000000000000000000000000000000000000000006020830152604082019050919050565b6000612df9602083613565565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000612e39602c83613565565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612e9f600583613576565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000612edf602083613565565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000612f1f602983613565565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f85602f83613565565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000612feb602183613565565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613051603183613565565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006130b7602283613565565b91507f546f6b656e73206861766520616c7265616479206265656e207265736572766560008301527f642e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61311981613700565b82525050565b600061312b8285612925565b91506131378284612925565b915061314282612e92565b91508190509392505050565b60006020820190506131636000830184612895565b92915050565b600060808201905061317e6000830187612895565b61318b6020830186612895565b6131986040830185613110565b81810360608301526131aa81846128b3565b905095945050505050565b60006020820190506131ca60008301846128a4565b92915050565b600060208201905081810360008301526131ea81846128ec565b905092915050565b6000602082019050818103600083015261320b81612956565b9050919050565b6000602082019050818103600083015261322b81612996565b9050919050565b6000602082019050818103600083015261324b816129fc565b9050919050565b6000602082019050818103600083015261326b81612a62565b9050919050565b6000602082019050818103600083015261328b81612ac8565b9050919050565b600060208201905081810360008301526132ab81612b08565b9050919050565b600060208201905081810360008301526132cb81612b6e565b9050919050565b600060208201905081810360008301526132eb81612bae565b9050919050565b6000602082019050818103600083015261330b81612bee565b9050919050565b6000602082019050818103600083015261332b81612c54565b9050919050565b6000602082019050818103600083015261334b81612cba565b9050919050565b6000602082019050818103600083015261336b81612d20565b9050919050565b6000602082019050818103600083015261338b81612d86565b9050919050565b600060208201905081810360008301526133ab81612dec565b9050919050565b600060208201905081810360008301526133cb81612e2c565b9050919050565b600060208201905081810360008301526133eb81612ed2565b9050919050565b6000602082019050818103600083015261340b81612f12565b9050919050565b6000602082019050818103600083015261342b81612f78565b9050919050565b6000602082019050818103600083015261344b81612fde565b9050919050565b6000602082019050818103600083015261346b81613044565b9050919050565b6000602082019050818103600083015261348b816130aa565b9050919050565b60006020820190506134a76000830184613110565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134d4576134d3613885565b5b8060405250919050565b600067ffffffffffffffff8211156134f9576134f8613885565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561352957613528613885565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061358c82613700565b915061359783613700565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135cc576135cb6137f8565b5b828201905092915050565b60006135e282613700565b91506135ed83613700565b9250826135fd576135fc613827565b5b828204905092915050565b600061361382613700565b915061361e83613700565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613657576136566137f8565b5b828202905092915050565b600061366d82613700565b915061367883613700565b92508282101561368b5761368a6137f8565b5b828203905092915050565b60006136a1826136e0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561373757808201518184015260208101905061371c565b83811115613746576000848401525b50505050565b6000600282049050600182168061376457607f821691505b6020821081141561377857613777613856565b5b50919050565b600061378982613700565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137bc576137bb6137f8565b5b600182019050919050565b60006137d282613700565b91506137dd83613700565b9250826137ed576137ec613827565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6138ce81613696565b81146138d957600080fd5b50565b6138e5816136a8565b81146138f057600080fd5b50565b6138fc816136b4565b811461390757600080fd5b50565b61391381613700565b811461391e57600080fd5b5056fea264697066735822122032a9ce565270d35646f17e5a513d1b93aaea80de0961d1c91d8c0e820bb4c56364736f6c63430008000033

Deployed Bytecode Sourcemap

43404:2162:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31758:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32715:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34247:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33812:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44926:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43858:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35157:332;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45228:83;;;;;;;;;;;;;:::i;:::-;;35552:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45026:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45317:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43820:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32403:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43568:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32123:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14121:88;;;;;;;;;;;;;:::i;:::-;;45425:138;;;;;;;;;;;;;:::i;:::-;;13510:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32870:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43639:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44311:609;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34550:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35780:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33031:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44040:265;;;;;;;;;;;;;:::i;:::-;;43705:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34912:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43784:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14354:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43750:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31758:309;31885:4;31930:25;31915:40;;;:11;:40;;;;:99;;;;31981:33;31966:48;;;:11;:48;;;;31915:99;:146;;;;32025:36;32049:11;32025:23;:36::i;:::-;31915:146;31901:160;;31758:309;;;:::o;32715:94::-;32769:13;32798:5;32791:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32715:94;:::o;34247:239::-;34348:7;34375:16;34383:7;34375;:16::i;:::-;34367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34456:15;:24;34472:7;34456:24;;;;;;;;;;;;;;;;;;;;;34449:31;;34247:239;;;:::o;33812:377::-;33889:13;33905:23;33920:7;33905:14;:23::i;:::-;33889:39;;33949:5;33943:11;;:2;:11;;;;33935:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34033:5;34017:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34042:37;34059:5;34066:12;:10;:12::i;:::-;34042:16;:37::i;:::-;34017:62;34001:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;34162:21;34171:2;34175:7;34162:8;:21::i;:::-;33812:377;;;:::o;44926:94::-;44970:7;44993:21;:11;:19;:21::i;:::-;44986:28;;44926:94;:::o;43858:41::-;;;;;;;;;;;;;;;;;:::o;35157:332::-;35338:41;35357:12;:10;:12::i;:::-;35371:7;35338:18;:41::i;:::-;35322:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;35455:28;35465:4;35471:2;35475:7;35455:9;:28::i;:::-;35157:332;;;:::o;45228:83::-;13723:12;:10;:12::i;:::-;13712:23;;:7;:5;:7::i;:::-;:23;;;13704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45293:12:::1;;;;;;;;;;;45292:13;45277:12;;:28;;;;;;;;;;;;;;;;;;45228:83::o:0;35552:165::-;35672:39;35689:4;35695:2;35699:7;35672:39;;;;;;;;;;;;:16;:39::i;:::-;35552:165;;;:::o;45026:96::-;13723:12;:10;:12::i;:::-;13712:23;;:7;:5;:7::i;:::-;:23;;;13704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45107:9:::1;45097:7;:19;;;;;;;;;;;;:::i;:::-;;45026:96:::0;:::o;45317:102::-;13723:12;:10;:12::i;:::-;13712:23;;:7;:5;:7::i;:::-;:23;;;13704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45400:13:::1;45388:9;:25;;;;45317:102:::0;:::o;43820:31::-;;;;;;;;;;;;;:::o;32403:253::-;32500:7;32519:13;32535:7;:16;32543:7;32535:16;;;;;;;;;;;;;;;;;;;;;32519:32;;32583:1;32566:19;;:5;:19;;;;32558:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32645:5;32638:12;;;32403:253;;;:::o;43568:66::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32123:226::-;32220:7;32264:1;32247:19;;:5;:19;;;;32239:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32327:9;:16;32337:5;32327:16;;;;;;;;;;;;;;;;32320:23;;32123:226;;;:::o;14121:88::-;13723:12;:10;:12::i;:::-;13712:23;;:7;:5;:7::i;:::-;:23;;;13704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14182:21:::1;14200:1;14182:9;:21::i;:::-;14121:88::o:0;45425:138::-;13723:12;:10;:12::i;:::-;13712:23;;:7;:5;:7::i;:::-;:23;;;13704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45474:15:::1;45492:21;45474:39;;45528:10;45520:28;;:37;45549:7;45520:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;13779:1;45425:138::o:0;13510:81::-;13556:7;13579:6;;;;;;;;;;;13572:13;;13510:81;:::o;32870:98::-;32926:13;32955:7;32948:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32870:98;:::o;43639:49::-;43671:17;43639:49;:::o;44311:609::-;44374:12;;;;;;;;;;;44366:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;44465:9;;44454:7;44433:6;:18;44440:10;44433:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:41;;44417:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;43741:4;44582:7;44558:21;:11;:19;:21::i;:::-;:31;;;;:::i;:::-;:44;;44542:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;44698:7;43671:17;44690:15;;;;:::i;:::-;44677:9;:28;;44669:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;44755:9;44750:127;44770:7;44766:1;:11;44750:127;;;44793:23;:11;:21;:23::i;:::-;44825:44;44835:10;44847:21;:11;:19;:21::i;:::-;44825:9;:44::i;:::-;44779:3;;;;;:::i;:::-;;;;44750:127;;;;44907:7;44885:6;:18;44892:10;44885:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;44311:609;:::o;34550:299::-;34679:12;:10;:12::i;:::-;34667:24;;:8;:24;;;;34659:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34775:8;34730:18;:32;34749:12;:10;:12::i;:::-;34730:32;;;;;;;;;;;;;;;:42;34763:8;34730:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34824:8;34795:48;;34810:12;:10;:12::i;:::-;34795:48;;;34834:8;34795:48;;;;;;:::i;:::-;;;;;;;;34550:299;;:::o;35780:321::-;35941:41;35960:12;:10;:12::i;:::-;35974:7;35941:18;:41::i;:::-;35925:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;36056:39;36070:4;36076:2;36080:7;36089:5;36056:13;:39::i;:::-;35780:321;;;;:::o;33031:403::-;33129:13;33170:16;33178:7;33170;:16::i;:::-;33154:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;33260:21;33284:10;:8;:10::i;:::-;33260:34;;33339:1;33321:7;33315:21;:25;:113;;;;;;;;;;;;;;;;;33376:7;33385:18;:7;:16;:18::i;:::-;33359:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33315:113;33301:127;;;33031:403;;;:::o;44040:265::-;13723:12;:10;:12::i;:::-;13712:23;;:7;:5;:7::i;:::-;:23;;;13704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44094:11:::1;;;;;;;;;;;44093:12;44085:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;44158:9;44153:122;44173:2;44169:1;:6;44153:122;;;44191:23;:11;:21;:23::i;:::-;44223:44;44233:10;44245:21;:11;:19;:21::i;:::-;44223:9;:44::i;:::-;44177:3;;;;;:::i;:::-;;;;44153:122;;;;44295:4;44281:11;;:18;;;;;;;;;;;;;;;;;;44040:265::o:0;43705:40::-;43741:4;43705:40;:::o;34912:186::-;35034:4;35057:18;:25;35076:5;35057:25;;;;;;;;;;;;;;;:35;35083:8;35057:35;;;;;;;;;;;;;;;;;;;;;;;;;35050:42;;34912:186;;;;:::o;43784:31::-;;;;;;;;;;;;;:::o;14354:182::-;13723:12;:10;:12::i;:::-;13712:23;;:7;:5;:7::i;:::-;:23;;;13704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14459:1:::1;14439:22;;:8;:22;;;;14431:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14511:19;14521:8;14511:9;:19::i;:::-;14354:182:::0;:::o;43750:29::-;;;;:::o;24984:179::-;25094:4;25132:25;25117:40;;;:11;:40;;;;25110:47;;24984:179;;;:::o;37548:121::-;37613:4;37661:1;37633:30;;:7;:16;37641:7;37633:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37626:37;;37548:121;;;:::o;12329:92::-;12382:7;12405:10;12398:17;;12329:92;:::o;41282:164::-;41380:2;41353:15;:24;41369:7;41353:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41432:7;41428:2;41394:46;;41403:23;41418:7;41403:14;:23::i;:::-;41394:46;;;;;;;;;;;;41282:164;;:::o;9293:108::-;9358:7;9381;:14;;;9374:21;;9293:108;;;:::o;37820:371::-;37933:4;37957:16;37965:7;37957;:16::i;:::-;37949:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38029:13;38045:23;38060:7;38045:14;:23::i;:::-;38029:39;;38094:5;38083:16;;:7;:16;;;:58;;;;38134:7;38110:31;;:20;38122:7;38110:11;:20::i;:::-;:31;;;38083:58;:101;;;;38152:32;38169:5;38176:7;38152:16;:32::i;:::-;38083:101;38075:110;;;37820:371;;;;:::o;40629:547::-;40778:4;40751:31;;:23;40766:7;40751:14;:23::i;:::-;:31;;;40735:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;40870:1;40856:16;;:2;:16;;;;40848:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40922:39;40943:4;40949:2;40953:7;40922:20;:39::i;:::-;41018:29;41035:1;41039:7;41018:8;:29::i;:::-;41075:1;41056:9;:15;41066:4;41056:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41100:1;41083:9;:13;41093:2;41083:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41127:2;41108:7;:16;41116:7;41108:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41162:7;41158:2;41143:27;;41152:4;41143:27;;;;;;;;;;;;40629:547;;;:::o;14542:159::-;14594:16;14613:6;;;;;;;;;;;14594:25;;14635:8;14626:6;;:17;;;;;;;;;;;;;;;;;;14686:8;14655:40;;14676:8;14655:40;;;;;;;;;;;;14542:159;;:::o;9407:111::-;9504:1;9486:7;:14;;;:19;;;;;;;;;;;9407:111;:::o;38511:104::-;38583:26;38593:2;38597:7;38583:26;;;;;;;;;;;;:9;:26::i;:::-;38511:104;;:::o;36945:308::-;37080:28;37090:4;37096:2;37100:7;37080:9;:28::i;:::-;37131:48;37154:4;37160:2;37164:7;37173:5;37131:22;:48::i;:::-;37115:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;36945:308;;;;:::o;45128:94::-;45180:13;45209:7;45202:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45128:94;:::o;10125:637::-;10181:13;10399:1;10390:5;:10;10386:43;;;10411:10;;;;;;;;;;;;;;;;;;;;;10386:43;10435:12;10450:5;10435:20;;10462:14;10483:62;10498:1;10490:4;:9;10483:62;;10510:8;;;;;:::i;:::-;;;;10535:2;10527:10;;;;;:::i;:::-;;;10483:62;;;10551:19;10583:6;10573:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10551:39;;10597:132;10613:1;10604:5;:10;10597:132;;10635:1;10625:11;;;;;:::i;:::-;;;10696:2;10688:5;:10;;;;:::i;:::-;10675:2;:24;;;;:::i;:::-;10662:39;;10645:6;10652;10645:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;10719:2;10710:11;;;;;:::i;:::-;;;10597:132;;;10749:6;10735:21;;;;;10125:637;;;;:::o;43216:112::-;;;;:::o;38832:281::-;38944:18;38950:2;38954:7;38944:5;:18::i;:::-;38985:54;39016:1;39020:2;39024:7;39033:5;38985:22;:54::i;:::-;38969:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;38832:281;;;:::o;41989:685::-;42126:4;42143:15;:2;:13;;;:15::i;:::-;42139:530;;;42198:2;42182:36;;;42219:12;:10;:12::i;:::-;42233:4;42239:7;42248:5;42182:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42169:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42426:1;42409:6;:13;:18;42405:214;;;42442:60;;;;;;;;;;:::i;:::-;;;;;;;;42405:214;42587:6;42581:13;42572:6;42568:2;42564:15;42557:38;42169:459;42314:41;;;42304:51;;;:6;:51;;;;42297:58;;;;;42139:530;42657:4;42650:11;;41989:685;;;;;;;:::o;39423:356::-;39513:1;39499:16;;:2;:16;;;;39491:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39568:16;39576:7;39568;:16::i;:::-;39567:17;39559:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39626:45;39655:1;39659:2;39663:7;39626:20;:45::i;:::-;39697:1;39680:9;:13;39690:2;39680:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39724:2;39705:7;:16;39713:7;39705:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39765:7;39761:2;39740:33;;39757:1;39740:33;;;;;;;;;;;;39423:356;;:::o;15434:351::-;15494:4;15686:12;15743:7;15731:20;15723:28;;15778:1;15771:4;:8;15764:15;;;15434:351;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:317::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:21;7698:1;7693:3;7689:11;7682:42;7750:2;7745:3;7741:12;7734:19;;7588:171;;;:::o;7765:375::-;;7928:67;7992:2;7987:3;7928:67;:::i;:::-;7921:74;;8025:34;8021:1;8016:3;8012:11;8005:55;8091:13;8086:2;8081:3;8077:12;8070:35;8131:2;8126:3;8122:12;8115:19;;7911:229;;;:::o;8146:382::-;;8309:67;8373:2;8368:3;8309:67;:::i;:::-;8302:74;;8406:34;8402:1;8397:3;8393:11;8386:55;8472:20;8467:2;8462:3;8458:12;8451:42;8519:2;8514:3;8510:12;8503:19;;8292:236;;;:::o;8534:370::-;;8697:67;8761:2;8756:3;8697:67;:::i;:::-;8690:74;;8794:34;8790:1;8785:3;8781:11;8774:55;8860:8;8855:2;8850:3;8846:12;8839:30;8895:2;8890:3;8886:12;8879:19;;8680:224;;;:::o;8910:326::-;;9073:67;9137:2;9132:3;9073:67;:::i;:::-;9066:74;;9170:30;9166:1;9161:3;9157:11;9150:51;9227:2;9222:3;9218:12;9211:19;;9056:180;;;:::o;9242:368::-;;9405:67;9469:2;9464:3;9405:67;:::i;:::-;9398:74;;9502:34;9498:1;9493:3;9489:11;9482:55;9568:6;9563:2;9558:3;9554:12;9547:28;9601:2;9596:3;9592:12;9585:19;;9388:222;;;:::o;9616:323::-;;9779:67;9843:2;9838:3;9779:67;:::i;:::-;9772:74;;9876:27;9872:1;9867:3;9863:11;9856:48;9930:2;9925:3;9921:12;9914:19;;9762:177;;;:::o;9945:329::-;;10108:67;10172:2;10167:3;10108:67;:::i;:::-;10101:74;;10205:33;10201:1;10196:3;10192:11;10185:54;10265:2;10260:3;10256:12;10249:19;;10091:183;;;:::o;10280:376::-;;10443:67;10507:2;10502:3;10443:67;:::i;:::-;10436:74;;10540:34;10536:1;10531:3;10527:11;10520:55;10606:14;10601:2;10596:3;10592:12;10585:36;10647:2;10642:3;10638:12;10631:19;;10426:230;;;:::o;10662:388::-;;10825:67;10889:2;10884:3;10825:67;:::i;:::-;10818:74;;10922:34;10918:1;10913:3;10909:11;10902:55;10988:26;10983:2;10978:3;10974:12;10967:48;11041:2;11036:3;11032:12;11025:19;;10808:242;;;:::o;11056:374::-;;11219:67;11283:2;11278:3;11219:67;:::i;:::-;11212:74;;11316:34;11312:1;11307:3;11303:11;11296:55;11382:12;11377:2;11372:3;11368:12;11361:34;11421:2;11416:3;11412:12;11405:19;;11202:228;;;:::o;11436:373::-;;11599:67;11663:2;11658:3;11599:67;:::i;:::-;11592:74;;11696:34;11692:1;11687:3;11683:11;11676:55;11762:11;11757:2;11752:3;11748:12;11741:33;11800:2;11795:3;11791:12;11784:19;;11582:227;;;:::o;11815:374::-;;11978:67;12042:2;12037:3;11978:67;:::i;:::-;11971:74;;12075:34;12071:1;12066:3;12062:11;12055:55;12141:12;12136:2;12131:3;12127:12;12120:34;12180:2;12175:3;12171:12;12164:19;;11961:228;;;:::o;12195:330::-;;12358:67;12422:2;12417:3;12358:67;:::i;:::-;12351:74;;12455:34;12451:1;12446:3;12442:11;12435:55;12516:2;12511:3;12507:12;12500:19;;12341:184;;;:::o;12531:376::-;;12694:67;12758:2;12753:3;12694:67;:::i;:::-;12687:74;;12791:34;12787:1;12782:3;12778:11;12771:55;12857:14;12852:2;12847:3;12843:12;12836:36;12898:2;12893:3;12889:12;12882:19;;12677:230;;;:::o;12913:337::-;;13094:84;13176:1;13171:3;13094:84;:::i;:::-;13087:91;;13208:7;13204:1;13199:3;13195:11;13188:28;13242:1;13237:3;13233:11;13226:18;;13077:173;;;:::o;13256:330::-;;13419:67;13483:2;13478:3;13419:67;:::i;:::-;13412:74;;13516:34;13512:1;13507:3;13503:11;13496:55;13577:2;13572:3;13568:12;13561:19;;13402:184;;;:::o;13592:373::-;;13755:67;13819:2;13814:3;13755:67;:::i;:::-;13748:74;;13852:34;13848:1;13843:3;13839:11;13832:55;13918:11;13913:2;13908:3;13904:12;13897:33;13956:2;13951:3;13947:12;13940:19;;13738:227;;;:::o;13971:379::-;;14134:67;14198:2;14193:3;14134:67;:::i;:::-;14127:74;;14231:34;14227:1;14222:3;14218:11;14211:55;14297:17;14292:2;14287:3;14283:12;14276:39;14341:2;14336:3;14332:12;14325:19;;14117:233;;;:::o;14356:365::-;;14519:67;14583:2;14578:3;14519:67;:::i;:::-;14512:74;;14616:34;14612:1;14607:3;14603:11;14596:55;14682:3;14677:2;14672:3;14668:12;14661:25;14712:2;14707:3;14703:12;14696:19;;14502:219;;;:::o;14727:381::-;;14890:67;14954:2;14949:3;14890:67;:::i;:::-;14883:74;;14987:34;14983:1;14978:3;14974:11;14967:55;15053:19;15048:2;15043:3;15039:12;15032:41;15099:2;15094:3;15090:12;15083:19;;14873:235;;;:::o;15114:366::-;;15277:67;15341:2;15336:3;15277:67;:::i;:::-;15270:74;;15374:34;15370:1;15365:3;15361:11;15354:55;15440:4;15435:2;15430:3;15426:12;15419:26;15471:2;15466:3;15462:12;15455:19;;15260:220;;;:::o;15486:118::-;15573:24;15591:5;15573:24;:::i;:::-;15568:3;15561:37;15551:53;;:::o;15610:701::-;;15913:95;16004:3;15995:6;15913:95;:::i;:::-;15906:102;;16025:95;16116:3;16107:6;16025:95;:::i;:::-;16018:102;;16137:148;16281:3;16137:148;:::i;:::-;16130:155;;16302:3;16295:10;;15895:416;;;;;:::o;16317:222::-;;16448:2;16437:9;16433:18;16425:26;;16461:71;16529:1;16518:9;16514:17;16505:6;16461:71;:::i;:::-;16415:124;;;;:::o;16545:640::-;;16778:3;16767:9;16763:19;16755:27;;16792:71;16860:1;16849:9;16845:17;16836:6;16792:71;:::i;:::-;16873:72;16941:2;16930:9;16926:18;16917:6;16873:72;:::i;:::-;16955;17023:2;17012:9;17008:18;16999:6;16955:72;:::i;:::-;17074:9;17068:4;17064:20;17059:2;17048:9;17044:18;17037:48;17102:76;17173:4;17164:6;17102:76;:::i;:::-;17094:84;;16745:440;;;;;;;:::o;17191:210::-;;17316:2;17305:9;17301:18;17293:26;;17329:65;17391:1;17380:9;17376:17;17367:6;17329:65;:::i;:::-;17283:118;;;;:::o;17407:313::-;;17558:2;17547:9;17543:18;17535:26;;17607:9;17601:4;17597:20;17593:1;17582:9;17578:17;17571:47;17635:78;17708:4;17699:6;17635:78;:::i;:::-;17627:86;;17525:195;;;;:::o;17726:419::-;;17930:2;17919:9;17915:18;17907:26;;17979:9;17973:4;17969:20;17965:1;17954:9;17950:17;17943:47;18007:131;18133:4;18007:131;:::i;:::-;17999:139;;17897:248;;;:::o;18151:419::-;;18355:2;18344:9;18340:18;18332:26;;18404:9;18398:4;18394:20;18390:1;18379:9;18375:17;18368:47;18432:131;18558:4;18432:131;:::i;:::-;18424:139;;18322:248;;;:::o;18576:419::-;;18780:2;18769:9;18765:18;18757:26;;18829:9;18823:4;18819:20;18815:1;18804:9;18800:17;18793:47;18857:131;18983:4;18857:131;:::i;:::-;18849:139;;18747:248;;;:::o;19001:419::-;;19205:2;19194:9;19190:18;19182:26;;19254:9;19248:4;19244:20;19240:1;19229:9;19225:17;19218:47;19282:131;19408:4;19282:131;:::i;:::-;19274:139;;19172:248;;;:::o;19426:419::-;;19630:2;19619:9;19615:18;19607:26;;19679:9;19673:4;19669:20;19665:1;19654:9;19650:17;19643:47;19707:131;19833:4;19707:131;:::i;:::-;19699:139;;19597:248;;;:::o;19851:419::-;;20055:2;20044:9;20040:18;20032:26;;20104:9;20098:4;20094:20;20090:1;20079:9;20075:17;20068:47;20132:131;20258:4;20132:131;:::i;:::-;20124:139;;20022:248;;;:::o;20276:419::-;;20480:2;20469:9;20465:18;20457:26;;20529:9;20523:4;20519:20;20515:1;20504:9;20500:17;20493:47;20557:131;20683:4;20557:131;:::i;:::-;20549:139;;20447:248;;;:::o;20701:419::-;;20905:2;20894:9;20890:18;20882:26;;20954:9;20948:4;20944:20;20940:1;20929:9;20925:17;20918:47;20982:131;21108:4;20982:131;:::i;:::-;20974:139;;20872:248;;;:::o;21126:419::-;;21330:2;21319:9;21315:18;21307:26;;21379:9;21373:4;21369:20;21365:1;21354:9;21350:17;21343:47;21407:131;21533:4;21407:131;:::i;:::-;21399:139;;21297:248;;;:::o;21551:419::-;;21755:2;21744:9;21740:18;21732:26;;21804:9;21798:4;21794:20;21790:1;21779:9;21775:17;21768:47;21832:131;21958:4;21832:131;:::i;:::-;21824:139;;21722:248;;;:::o;21976:419::-;;22180:2;22169:9;22165:18;22157:26;;22229:9;22223:4;22219:20;22215:1;22204:9;22200:17;22193:47;22257:131;22383:4;22257:131;:::i;:::-;22249:139;;22147:248;;;:::o;22401:419::-;;22605:2;22594:9;22590:18;22582:26;;22654:9;22648:4;22644:20;22640:1;22629:9;22625:17;22618:47;22682:131;22808:4;22682:131;:::i;:::-;22674:139;;22572:248;;;:::o;22826:419::-;;23030:2;23019:9;23015:18;23007:26;;23079:9;23073:4;23069:20;23065:1;23054:9;23050:17;23043:47;23107:131;23233:4;23107:131;:::i;:::-;23099:139;;22997:248;;;:::o;23251:419::-;;23455:2;23444:9;23440:18;23432:26;;23504:9;23498:4;23494:20;23490:1;23479:9;23475:17;23468:47;23532:131;23658:4;23532:131;:::i;:::-;23524:139;;23422:248;;;:::o;23676:419::-;;23880:2;23869:9;23865:18;23857:26;;23929:9;23923:4;23919:20;23915:1;23904:9;23900:17;23893:47;23957:131;24083:4;23957:131;:::i;:::-;23949:139;;23847:248;;;:::o;24101:419::-;;24305:2;24294:9;24290:18;24282:26;;24354:9;24348:4;24344:20;24340:1;24329:9;24325:17;24318:47;24382:131;24508:4;24382:131;:::i;:::-;24374:139;;24272:248;;;:::o;24526:419::-;;24730:2;24719:9;24715:18;24707:26;;24779:9;24773:4;24769:20;24765:1;24754:9;24750:17;24743:47;24807:131;24933:4;24807:131;:::i;:::-;24799:139;;24697:248;;;:::o;24951:419::-;;25155:2;25144:9;25140:18;25132:26;;25204:9;25198:4;25194:20;25190:1;25179:9;25175:17;25168:47;25232:131;25358:4;25232:131;:::i;:::-;25224:139;;25122:248;;;:::o;25376:419::-;;25580:2;25569:9;25565:18;25557:26;;25629:9;25623:4;25619:20;25615:1;25604:9;25600:17;25593:47;25657:131;25783:4;25657:131;:::i;:::-;25649:139;;25547:248;;;:::o;25801:419::-;;26005:2;25994:9;25990:18;25982:26;;26054:9;26048:4;26044:20;26040:1;26029:9;26025:17;26018:47;26082:131;26208:4;26082:131;:::i;:::-;26074:139;;25972:248;;;:::o;26226:419::-;;26430:2;26419:9;26415:18;26407:26;;26479:9;26473:4;26469:20;26465:1;26454:9;26450:17;26443:47;26507:131;26633:4;26507:131;:::i;:::-;26499:139;;26397:248;;;:::o;26651:222::-;;26782:2;26771:9;26767:18;26759:26;;26795:71;26863:1;26852:9;26848:17;26839:6;26795:71;:::i;:::-;26749:124;;;;:::o;26879:283::-;;26945:2;26939:9;26929:19;;26987:4;26979:6;26975:17;27094:6;27082:10;27079:22;27058:18;27046:10;27043:34;27040:62;27037:2;;;27105:18;;:::i;:::-;27037:2;27145:10;27141:2;27134:22;26919:243;;;;:::o;27168:331::-;;27319:18;27311:6;27308:30;27305:2;;;27341:18;;:::i;:::-;27305:2;27426:4;27422:9;27415:4;27407:6;27403:17;27399:33;27391:41;;27487:4;27481;27477:15;27469:23;;27234:265;;;:::o;27505:332::-;;27657:18;27649:6;27646:30;27643:2;;;27679:18;;:::i;:::-;27643:2;27764:4;27760:9;27753:4;27745:6;27741:17;27737:33;27729:41;;27825:4;27819;27815:15;27807:23;;27572:265;;;:::o;27843:98::-;;27928:5;27922:12;27912:22;;27901:40;;;:::o;27947:99::-;;28033:5;28027:12;28017:22;;28006:40;;;:::o;28052:168::-;;28169:6;28164:3;28157:19;28209:4;28204:3;28200:14;28185:29;;28147:73;;;;:::o;28226:169::-;;28344:6;28339:3;28332:19;28384:4;28379:3;28375:14;28360:29;;28322:73;;;;:::o;28401:148::-;;28540:3;28525:18;;28515:34;;;;:::o;28555:305::-;;28614:20;28632:1;28614:20;:::i;:::-;28609:25;;28648:20;28666:1;28648:20;:::i;:::-;28643:25;;28802:1;28734:66;28730:74;28727:1;28724:81;28721:2;;;28808:18;;:::i;:::-;28721:2;28852:1;28849;28845:9;28838:16;;28599:261;;;;:::o;28866:185::-;;28923:20;28941:1;28923:20;:::i;:::-;28918:25;;28957:20;28975:1;28957:20;:::i;:::-;28952:25;;28996:1;28986:2;;29001:18;;:::i;:::-;28986:2;29043:1;29040;29036:9;29031:14;;28908:143;;;;:::o;29057:348::-;;29120:20;29138:1;29120:20;:::i;:::-;29115:25;;29154:20;29172:1;29154:20;:::i;:::-;29149:25;;29342:1;29274:66;29270:74;29267:1;29264:81;29259:1;29252:9;29245:17;29241:105;29238:2;;;29349:18;;:::i;:::-;29238:2;29397:1;29394;29390:9;29379:20;;29105:300;;;;:::o;29411:191::-;;29471:20;29489:1;29471:20;:::i;:::-;29466:25;;29505:20;29523:1;29505:20;:::i;:::-;29500:25;;29544:1;29541;29538:8;29535:2;;;29549:18;;:::i;:::-;29535:2;29594:1;29591;29587:9;29579:17;;29456:146;;;;:::o;29608:96::-;;29674:24;29692:5;29674:24;:::i;:::-;29663:35;;29653:51;;;:::o;29710:90::-;;29787:5;29780:13;29773:21;29762:32;;29752:48;;;:::o;29806:149::-;;29882:66;29875:5;29871:78;29860:89;;29850:105;;;:::o;29961:126::-;;30038:42;30031:5;30027:54;30016:65;;30006:81;;;:::o;30093:77::-;;30159:5;30148:16;;30138:32;;;:::o;30176:154::-;30260:6;30255:3;30250;30237:30;30322:1;30313:6;30308:3;30304:16;30297:27;30227:103;;;:::o;30336:307::-;30404:1;30414:113;30428:6;30425:1;30422:13;30414:113;;;30513:1;30508:3;30504:11;30498:18;30494:1;30489:3;30485:11;30478:39;30450:2;30447:1;30443:10;30438:15;;30414:113;;;30545:6;30542:1;30539:13;30536:2;;;30625:1;30616:6;30611:3;30607:16;30600:27;30536:2;30385:258;;;;:::o;30649:320::-;;30730:1;30724:4;30720:12;30710:22;;30777:1;30771:4;30767:12;30798:18;30788:2;;30854:4;30846:6;30842:17;30832:27;;30788:2;30916;30908:6;30905:14;30885:18;30882:38;30879:2;;;30935:18;;:::i;:::-;30879:2;30700:269;;;;:::o;30975:233::-;;31037:24;31055:5;31037:24;:::i;:::-;31028:33;;31083:66;31076:5;31073:77;31070:2;;;31153:18;;:::i;:::-;31070:2;31200:1;31193:5;31189:13;31182:20;;31018:190;;;:::o;31214:176::-;;31263:20;31281:1;31263:20;:::i;:::-;31258:25;;31297:20;31315:1;31297:20;:::i;:::-;31292:25;;31336:1;31326:2;;31341:18;;:::i;:::-;31326:2;31382:1;31379;31375:9;31370:14;;31248:142;;;;:::o;31396:180::-;31444:77;31441:1;31434:88;31541:4;31538:1;31531:15;31565:4;31562:1;31555:15;31582:180;31630:77;31627:1;31620:88;31727:4;31724:1;31717:15;31751:4;31748:1;31741:15;31768:180;31816:77;31813:1;31806:88;31913:4;31910:1;31903:15;31937:4;31934:1;31927:15;31954:180;32002:77;31999:1;31992:88;32099:4;32096:1;32089:15;32123:4;32120:1;32113:15;32140:102;;32232:2;32228:7;32223:2;32216:5;32212:14;32208:28;32198:38;;32188:54;;;:::o;32248:122::-;32321:24;32339:5;32321:24;:::i;:::-;32314:5;32311:35;32301:2;;32360:1;32357;32350:12;32301:2;32291:79;:::o;32376:116::-;32446:21;32461:5;32446:21;:::i;:::-;32439:5;32436:32;32426:2;;32482:1;32479;32472:12;32426:2;32416:76;:::o;32498:120::-;32570:23;32587:5;32570:23;:::i;:::-;32563:5;32560:34;32550:2;;32608:1;32605;32598:12;32550:2;32540:78;:::o;32624:122::-;32697:24;32715:5;32697:24;:::i;:::-;32690:5;32687:35;32677:2;;32736:1;32733;32726:12;32677:2;32667:79;:::o

Swarm Source

ipfs://32a9ce565270d35646f17e5a513d1b93aaea80de0961d1c91d8c0e820bb4c563
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.