ETH Price: $3,330.37 (+2.70%)

Swim.skin (SSK)
 

Overview

TokenID

3000

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

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:
swimskin

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// SPDX-License-Identifier: MIT

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 GSN 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 payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/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/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/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/IERC721Enumerable.sol

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "e6");
        _supportedInterfaces[interfaceId] = true;
    }
}


// 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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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, "e7");
    }

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

    /**
     * @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, "e10");
        require(isContract(target), "e11");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }


    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    //using EnumerableSet for EnumerableSet.UintSet;
    //using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    //mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    //EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;

    mapping (address => uint256) private tokenBalance;
    mapping (uint256 => address) private tokenOwner;
    mapping (uint256 => bool) private tokenExists;
    mapping (address => uint8) public mintedQty;

    uint256 public tokensMinted = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    uint256 public MAX_SSK;

    // Optional mapping for token URIs
    //mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI = "QmXXbUQLsL7iDjTdmqKVWAMzx6C9Sds4na2kvr8BFJCyLr";

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "e12");
        //return _holderTokens[owner].length();
        return tokenBalance[owner];
    }

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

    /**
     * @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), "e14");

        //string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        /*if (bytes(base).length == 0) {
            return _tokenURI;
        }*/
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        /*if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }*/
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked("ipfs://", base, "/", tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    /*function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }*/

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        //return _tokenOwners.length();
        //return tokenBalance[];
        return tokensMinted;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    /*function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }*/

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

        require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()),
            "e16"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "e17");

        return _tokenApprovals[tokenId];
    }

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

        _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), "e19");

        _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), "e20");
        _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), "e21");
    }

    /**
     * @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 _tokenOwners.contains(tokenId);
        return tokenExists[tokenId];
    }

    /**
     * @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), "e22");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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), "e23");
    }

    /**
     * @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 random() private view returns (uint) {
        uint randomHash = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
        return randomHash % 1000;
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "e24");
        require(!_exists(tokenId), "e25");

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

        tokenOwner[tokenId] = to;
        tokenExists[tokenId] = true;

        tokenBalance[to] = tokenBalance[to] + 1;
        tokensMinted = tokensMinted + 1;
        

        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.
     */

    /**
     * @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, "e26"); // internal owner
        require(to != address(0), "e27");

        _beforeTokenTransfer(from, to, tokenId);

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

        tokenBalance[from]--;
        tokenOwner[tokenId] = to;
        tokenBalance[to]++;


        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    /*function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }*/

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "e28");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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: @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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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(), "e29");
        _;
    }

    /**
     * @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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }*/
}



pragma solidity ^0.8.0;

/*
 * @title SSK contract
 */
contract swimskin is Ownable, ERC721 {

    uint256 public tokenPrice = 20000000000000000; //0.02 ETH
    
    uint256 public constant maxSSKPurchase = 5;

    uint256 public preMaxPerWallet = 5;


    uint256 public mintContrib = 0;
    
    mapping (address => bool) public withdrawn;

    mapping (address => bool) public freeMint;

    bool public saleIsActive = false;

    uint256 public ownerWithdrawals = 0;

    uint256 public deposited = 0;

    uint256[] public firstWinners;
    uint256[] public secondWinners;

    mapping (address => bool) public firstWinningsWithdrawn;
    mapping (address => bool) public secondWinningsWithdrawn;

    constructor(string memory name, string memory symbol, uint256 maxNftSupply) ERC721(name, symbol) {
        MAX_SSK = maxNftSupply;
    }


    function withdraw(uint256 amount) public onlyOwner {
        payable(msg.sender).transfer(amount);
    }

    function changeWalletLimit(uint256 amount) public onlyOwner {
        preMaxPerWallet = amount; 
    }

    function addFree(address userAddy) public onlyOwner {
        freeMint[userAddy] = true;
    }

    function removeFree(address userAddy) public onlyOwner {
        freeMint[userAddy] = false;
    }

    function emergencyDeposit() public payable {
        require(msg.value > 0, "e1");
        deposited = deposited + msg.value;
    }


    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }

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

    function reserveSSK(uint8 numberOfTokens) public onlyOwner {
        uint256 supply = totalSupply();
        require(numberOfTokens <= maxSSKPurchase, "e2");
        require((supply + numberOfTokens) <= MAX_SSK, "e3");
        require(saleIsActive, "e4");

        //require((balanceOf(msg.sender) + numberOfTokens) <= preMaxPerWallet, "e5");

        //require((tokenPrice * numberOfTokens) <= msg.value, "E15");

        for(uint256 i = 1; i <= numberOfTokens; i++) {
            if (supply < MAX_SSK) {
                _safeMint(msg.sender, supply + i);
            }
        }
    }

    function setFirstWinners(uint256[] memory winningTokens) public onlyOwner{
        require(winningTokens.length == 5, "E30");
        firstWinners = winningTokens;
    }

    function setSecondWinners(uint256[] memory winningTokens) public onlyOwner{
        require(winningTokens.length == 10, "E31");
        secondWinners = winningTokens;
    }

    function firstWithdraw() public {
        for (uint256 counter = 0; counter < firstWinners.length; counter++) {
            if (ownerOf(firstWinners[counter]) == msg.sender && firstWinningsWithdrawn[msg.sender] != true) {
                firstWinningsWithdrawn[msg.sender] = true;
                payable(msg.sender).transfer(2000000000000000000);
                break;
            }
        }
    }

    function secondWithdraw() public {
        for (uint256 counter = 0; counter < secondWinners.length; counter++) {
            if (ownerOf(secondWinners[counter]) == msg.sender && secondWinningsWithdrawn[msg.sender] != true) {
                secondWinningsWithdrawn[msg.sender] = true;
                payable(msg.sender).transfer(2000000000000000000);
                break;
            }
        }
    }

    function priceUpdate(uint256 amount) public onlyOwner {
        tokenPrice = amount;
    }

    function mintSSK(uint8 numberOfTokens) public payable {
        uint256 supply = totalSupply();
        require(numberOfTokens <= maxSSKPurchase, "e2");
        require((supply + numberOfTokens) <= MAX_SSK, "e3");
        require(saleIsActive, "e4");

        require((balanceOf(msg.sender) + numberOfTokens) <= preMaxPerWallet, "e5");

        if (freeMint[msg.sender] != true) {
            require((tokenPrice * numberOfTokens) <= msg.value, "E15");
        }

        for(uint256 i = 1; i <= numberOfTokens; i++) {
            if (supply < MAX_SSK) {
                _safeMint(msg.sender, supply + i);
            }
        }
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxNftSupply","type":"uint256"}],"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":[],"name":"MAX_SSK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddy","type":"address"}],"name":"addFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstWinners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstWinningsWithdrawn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"maxSSKPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintContrib","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintSSK","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedQty","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"ownerWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"priceUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddy","type":"address"}],"name":"removeFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"reserveSSK","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":"uint256","name":"","type":"uint256"}],"name":"secondWinners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"secondWinningsWithdrawn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"winningTokens","type":"uint256[]"}],"name":"setFirstWinners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"winningTokens","type":"uint256[]"}],"name":"setSecondWinners","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":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

600060085560e0604052602e6080818152906200298f60a03980516200002e91600c91602090910190620001c4565b5066470de4df820000600d556005600e556000600f8190556012805460ff1916905560138190556014553480156200006557600080fd5b50604051620029bd380380620029bd833981016040819052620000889162000315565b828260006200009662000162565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000f26301ffc9a760e01b62000166565b815162000107906009906020850190620001c4565b5080516200011d90600a906020840190620001c4565b50620001306380ac58cd60e01b62000166565b62000142635b5e139f60e01b62000166565b6200015463780e9d6360e01b62000166565b5050600b5550620003f49050565b3390565b6001600160e01b031980821614156200019c5760405162461bcd60e51b8152600401620001939062000385565b60405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b828054620001d290620003a1565b90600052602060002090601f016020900481019282620001f6576000855562000241565b82601f106200021157805160ff191683800117855562000241565b8280016001018555821562000241579182015b828111156200024157825182559160200191906001019062000224565b506200024f92915062000253565b5090565b5b808211156200024f576000815560010162000254565b600082601f8301126200027b578081fd5b81516001600160401b0380821115620002985762000298620003de565b6040516020601f8401601f1916820181018381118382101715620002c057620002c0620003de565b6040528382528584018101871015620002d7578485fd5b8492505b83831015620002fa5785830181015182840182015291820191620002db565b838311156200030b57848185840101525b5095945050505050565b6000806000606084860312156200032a578283fd5b83516001600160401b038082111562000341578485fd5b6200034f878388016200026a565b9450602086015191508082111562000365578384fd5b5062000374868287016200026a565b925050604084015190509250925092565b602080825260029082015261329b60f11b604082015260600190565b600281046001821680620003b657607f821691505b60208210811415620003d857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61258b80620004046000396000f3fe6080604052600436106102885760003560e01c8063735263561161015a578063bb7471fe116100c1578063d885a21e1161007a578063d885a21e14610747578063e985e9c51461074f578063e9b5a2f71461076f578063eb8d244414610784578063eef49ee314610799578063fa07ce1d146107ae57610288565b8063bb7471fe14610685578063c2e1debf146106a5578063c44644d0146106ba578063c87b56dd146106da578063cfb15ef0146106fa578063d8795f5c1461072757610288565b80638da5cb5b116101135780638da5cb5b146105e65780638e920351146105fb57806395d89b4114610610578063a22cb46514610625578063a930aa6814610645578063b88d4fde1461066557610288565b806373526356146105545780637db1342c146105745780637ff9b59614610594578063807f54f6146105a9578063861d47b4146105be57806388dba7fd146105d357610288565b80634a2eeebb116101fe578063686e1079116101b7578063686e1079146104c05780636c0360eb146104d55780636de9f32b146104ea5780636ef61092146104ff57806370a082311461051f578063715018a61461053f57610288565b80634a2eeebb1461040b5780634a6b07af1461042057806354e05b871461044057806355f804b3146104605780636352211e1461048057806366ebc7d3146104a057610288565b80631c2f8211116102505780631c2f82111461035657806323b872dd146103765780632e1a7d4d146103965780633d363f15146103b657806342842e0e146103cb57806345e13a0c146103eb57610288565b806301ffc9a71461028d57806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031257806318160ddd14610334575b600080fd5b34801561029957600080fd5b506102ad6102a8366004611ee6565b6107ce565b6040516102ba9190612085565b60405180910390f35b3480156102cf57600080fd5b506102d86107f1565b6040516102ba9190612090565b3480156102f157600080fd5b50610305610300366004611f64565b610883565b6040516102ba9190612034565b34801561031e57600080fd5b5061033261032d366004611e16565b6108cf565b005b34801561034057600080fd5b50610349610967565b6040516102ba91906123ad565b34801561036257600080fd5b50610349610371366004611f64565b61096d565b34801561038257600080fd5b50610332610391366004611d28565b61098e565b3480156103a257600080fd5b506103326103b1366004611f64565b6109c6565b3480156103c257600080fd5b50610332610a36565b3480156103d757600080fd5b506103326103e6366004611d28565b610b10565b3480156103f757600080fd5b50610332610406366004611f64565b610b2b565b34801561041757600080fd5b50610349610b6f565b34801561042c57600080fd5b506102ad61043b366004611cdc565b610b75565b34801561044c57600080fd5b506102ad61045b366004611cdc565b610b8a565b34801561046c57600080fd5b5061033261047b366004611f1e565b610b9f565b34801561048c57600080fd5b5061030561049b366004611f64565b610be7565b3480156104ac57600080fd5b506103496104bb366004611f64565b610c24565b3480156104cc57600080fd5b50610349610c34565b3480156104e157600080fd5b506102d8610c3a565b3480156104f657600080fd5b50610349610c49565b34801561050b57600080fd5b506102ad61051a366004611cdc565b610c4f565b34801561052b57600080fd5b5061034961053a366004611cdc565b610c64565b34801561054b57600080fd5b50610332610ca8565b34801561056057600080fd5b5061033261056f366004611f7c565b610d31565b34801561058057600080fd5b5061033261058f366004611f64565b610e2c565b3480156105a057600080fd5b50610349610e70565b3480156105b557600080fd5b50610349610e76565b3480156105ca57600080fd5b50610349610e7c565b6103326105e1366004611f7c565b610e82565b3480156105f257600080fd5b50610305610fbd565b34801561060757600080fd5b50610332610fcc565b34801561061c57600080fd5b506102d861101f565b34801561063157600080fd5b50610332610640366004611ddc565b61102e565b34801561065157600080fd5b50610332610660366004611cdc565b6110fc565b34801561067157600080fd5b50610332610680366004611d63565b61115c565b34801561069157600080fd5b506103326106a0366004611e3f565b61119b565b3480156106b157600080fd5b5061034961120e565b3480156106c657600080fd5b506103326106d5366004611cdc565b611213565b3480156106e657600080fd5b506102d86106f5366004611f64565b611276565b34801561070657600080fd5b5061071a610715366004611cdc565b6112db565b6040516102ba91906123b6565b34801561073357600080fd5b50610332610742366004611e3f565b6112f0565b610332611363565b34801561075b57600080fd5b506102ad61076a366004611cf6565b611396565b34801561077b57600080fd5b506103326113c4565b34801561079057600080fd5b506102ad611485565b3480156107a557600080fd5b5061034961148e565b3480156107ba57600080fd5b506102ad6107c9366004611cdc565b611494565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b60606009805461080090612493565b80601f016020809104026020016040519081016040528092919081815260200182805461082c90612493565b80156108795780601f1061084e57610100808354040283529160200191610879565b820191906000526020600020905b81548152906001019060200180831161085c57829003601f168201915b5050505050905090565b600061088e826114a9565b6108b35760405162461bcd60e51b81526004016108aa90612357565b60405180910390fd5b506000908152600260205260409020546001600160a01b031690565b60006108da82610be7565b9050806001600160a01b0316836001600160a01b0316141561090e5760405162461bcd60e51b81526004016108aa90612253565b806001600160a01b03166109206114be565b6001600160a01b0316148061093c575061093c8161076a6114be565b6109585760405162461bcd60e51b81526004016108aa9061228d565b61096283836114c2565b505050565b60085490565b6016818154811061097d57600080fd5b600091825260209091200154905081565b61099f6109996114be565b82611530565b6109bb5760405162461bcd60e51b81526004016108aa906121a6565b6109628383836115b5565b6109ce6114be565b6001600160a01b03166109df610fbd565b6001600160a01b031614610a055760405162461bcd60e51b81526004016108aa9061216c565b604051339082156108fc029083906000818181858888f19350505050158015610a32573d6000803e3d6000fd5b5050565b60005b601654811015610b0d57336001600160a01b0316610a8160168381548110610a7157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154610be7565b6001600160a01b0316148015610aac57503360009081526018602052604090205460ff161515600114155b15610afb5733600081815260186020526040808220805460ff1916600117905551671bc16d674ec800009082818181858883f19350505050158015610af5573d6000803e3d6000fd5b50610b0d565b80610b05816124ce565b915050610a39565b50565b6109628383836040518060200160405280600081525061115c565b610b336114be565b6001600160a01b0316610b44610fbd565b6001600160a01b031614610b6a5760405162461bcd60e51b81526004016108aa9061216c565b600d55565b60135481565b60186020526000908152604090205460ff1681565b60176020526000908152604090205460ff1681565b610ba76114be565b6001600160a01b0316610bb8610fbd565b6001600160a01b031614610bde5760405162461bcd60e51b81526004016108aa9061216c565b610b0d816116e0565b6000808211610c085760405162461bcd60e51b81526004016108aa90612132565b506000908152600560205260409020546001600160a01b031690565b6015818154811061097d57600080fd5b600b5481565b6060600c805461080090612493565b60085481565b60106020526000908152604090205460ff1681565b60006001600160a01b038216610c8c5760405162461bcd60e51b81526004016108aa9061231d565b506001600160a01b031660009081526004602052604090205490565b610cb06114be565b6001600160a01b0316610cc1610fbd565b6001600160a01b031614610ce75760405162461bcd60e51b81526004016108aa9061216c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610d396114be565b6001600160a01b0316610d4a610fbd565b6001600160a01b031614610d705760405162461bcd60e51b81526004016108aa9061216c565b6000610d7a610967565b905060058260ff161115610da05760405162461bcd60e51b81526004016108aa90612374565b600b54610db060ff8416836123ee565b1115610dce5760405162461bcd60e51b81526004016108aa906120dc565b60125460ff16610df05760405162461bcd60e51b81526004016108aa906122c7565b60015b8260ff16811161096257600b54821015610e1a57610e1a33610e1583856123ee565b6116f3565b80610e24816124ce565b915050610df3565b610e346114be565b6001600160a01b0316610e45610fbd565b6001600160a01b031614610e6b5760405162461bcd60e51b81526004016108aa9061216c565b600e55565b600d5481565b600f5481565b600e5481565b6000610e8c610967565b905060058260ff161115610eb25760405162461bcd60e51b81526004016108aa90612374565b600b54610ec260ff8416836123ee565b1115610ee05760405162461bcd60e51b81526004016108aa906120dc565b60125460ff16610f025760405162461bcd60e51b81526004016108aa906122c7565b600e548260ff16610f1233610c64565b610f1c91906123ee565b1115610f3a5760405162461bcd60e51b81526004016108aa906121fd565b3360009081526011602052604090205460ff161515600114610f8657348260ff16600d54610f68919061241a565b1115610f865760405162461bcd60e51b81526004016108aa906122e3565b60015b8260ff16811161096257600b54821015610fab57610fab33610e1583856123ee565b80610fb5816124ce565b915050610f89565b6000546001600160a01b031690565b610fd46114be565b6001600160a01b0316610fe5610fbd565b6001600160a01b03161461100b5760405162461bcd60e51b81526004016108aa9061216c565b6012805460ff19811660ff90911615179055565b6060600a805461080090612493565b6110366114be565b6001600160a01b0316826001600160a01b031614156110675760405162461bcd60e51b81526004016108aa906121c3565b80600360006110746114be565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110b86114be565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f09190612085565b60405180910390a35050565b6111046114be565b6001600160a01b0316611115610fbd565b6001600160a01b03161461113b5760405162461bcd60e51b81526004016108aa9061216c565b6001600160a01b03166000908152601160205260409020805460ff19169055565b61116d6111676114be565b83611530565b6111895760405162461bcd60e51b81526004016108aa90612300565b6111958484848461170d565b50505050565b6111a36114be565b6001600160a01b03166111b4610fbd565b6001600160a01b0316146111da5760405162461bcd60e51b81526004016108aa9061216c565b8051600a146111fb5760405162461bcd60e51b81526004016108aa906121e0565b8051610a32906016906020840190611b9a565b600581565b61121b6114be565b6001600160a01b031661122c610fbd565b6001600160a01b0316146112525760405162461bcd60e51b81526004016108aa9061216c565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b6060611281826114a9565b61129d5760405162461bcd60e51b81526004016108aa90612236565b60006112a7610c3a565b9050806112b384611740565b6040516020016112c4929190611fe5565b604051602081830303815290604052915050919050565b60076020526000908152604090205460ff1681565b6112f86114be565b6001600160a01b0316611309610fbd565b6001600160a01b03161461132f5760405162461bcd60e51b81526004016108aa9061216c565b80516005146113505760405162461bcd60e51b81526004016108aa90612115565b8051610a32906015906020840190611b9a565b600034116113835760405162461bcd60e51b81526004016108aa906120c0565b3460145461139191906123ee565b601455565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b60005b601554811015610b0d57336001600160a01b03166113ff60158381548110610a7157634e487b7160e01b600052603260045260246000fd5b6001600160a01b031614801561142a57503360009081526017602052604090205460ff161515600114155b156114735733600081815260176020526040808220805460ff1916600117905551671bc16d674ec800009082818181858883f19350505050158015610af5573d6000803e3d6000fd5b8061147d816124ce565b9150506113c7565b60125460ff1681565b60145481565b60116020526000908152604090205460ff1681565b60009081526006602052604090205460ff1690565b3390565b600081815260026020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114f782610be7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061153b826114a9565b6115575760405162461bcd60e51b81526004016108aa9061214f565b600061156283610be7565b9050806001600160a01b0316846001600160a01b0316148061159d5750836001600160a01b031661159284610883565b6001600160a01b0316145b806115ad57506115ad8185611396565b949350505050565b826001600160a01b03166115c882610be7565b6001600160a01b0316146115ee5760405162461bcd60e51b81526004016108aa90612189565b6001600160a01b0382166116145760405162461bcd60e51b81526004016108aa9061233a565b61161f838383610962565b61162a6000826114c2565b6001600160a01b038316600090815260046020526040812080549161164e8361247c565b9091555050600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260049091528120805491611695836124ce565b919050555080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8051610a3290600c906020840190611be5565b610a3282826040518060200160405280600081525061185b565b6117188484846115b5565b6117248484848461188e565b6111955760405162461bcd60e51b81526004016108aa906122aa565b60608161176557506040805180820190915260018152600360fc1b60208201526107ec565b8160005b811561178f5780611779816124ce565b91506117889050600a83612406565b9150611769565b60008167ffffffffffffffff8111156117b857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156117e2576020820181803683370190505b5090505b84156115ad576117f7600183612439565b9150611804600a866124e9565b61180f9060306123ee565b60f81b81838151811061183257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611854600a86612406565b94506117e6565b611865838361196d565b611872600084848461188e565b6109625760405162461bcd60e51b81526004016108aa906120f8565b60006118a2846001600160a01b0316611a82565b6118ae575060016115ad565b6000611936630a85bd0160e11b6118c36114be565b8887876040516024016118d99493929190612048565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352805180820190915260038152620ca64760eb1b928101929092526001600160a01b03881691611a88565b905060008180602001905181019061194e9190611f02565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6001600160a01b0382166119935760405162461bcd60e51b81526004016108aa90612270565b61199c816114a9565b156119b95760405162461bcd60e51b81526004016108aa90612390565b6119c560008383610962565b600081815260056020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560068352818420805460ff19166001908117909155908452600490925290912054611a1c916123ee565b6001600160a01b038316600090815260046020526040902055600854611a439060016123ee565b60085560405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6060611a978484600085611aa1565b90505b9392505050565b606082471015611ac35760405162461bcd60e51b81526004016108aa90612219565b611acc85611a82565b611ae85760405162461bcd60e51b81526004016108aa906120a3565b600080866001600160a01b03168587604051611b049190611fc9565b60006040518083038185875af1925050503d8060008114611b41576040519150601f19603f3d011682016040523d82523d6000602084013e611b46565b606091505b5091509150611b56828286611b61565b979650505050505050565b60608315611b70575081611a9a565b825115611b805782518084602001fd5b8160405162461bcd60e51b81526004016108aa9190612090565b828054828255906000526020600020908101928215611bd5579160200282015b82811115611bd5578251825591602001919060010190611bba565b50611be1929150611c58565b5090565b828054611bf190612493565b90600052602060002090601f016020900481019282611c135760008555611bd5565b82601f10611c2c57805160ff1916838001178555611bd5565b82800160010185558215611bd55791820182811115611bd5578251825591602001919060010190611bba565b5b80821115611be15760008155600101611c59565b600067ffffffffffffffff831115611c8757611c87612529565b611c9a601f8401601f19166020016123c4565b9050828152838383011115611cae57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146107ec57600080fd5b600060208284031215611ced578081fd5b611a9a82611cc5565b60008060408385031215611d08578081fd5b611d1183611cc5565b9150611d1f60208401611cc5565b90509250929050565b600080600060608486031215611d3c578081fd5b611d4584611cc5565b9250611d5360208501611cc5565b9150604084013590509250925092565b60008060008060808587031215611d78578081fd5b611d8185611cc5565b9350611d8f60208601611cc5565b925060408501359150606085013567ffffffffffffffff811115611db1578182fd5b8501601f81018713611dc1578182fd5b611dd087823560208401611c6d565b91505092959194509250565b60008060408385031215611dee578182fd5b611df783611cc5565b915060208301358015158114611e0b578182fd5b809150509250929050565b60008060408385031215611e28578182fd5b611e3183611cc5565b946020939093013593505050565b60006020808385031215611e51578182fd5b823567ffffffffffffffff80821115611e68578384fd5b818501915085601f830112611e7b578384fd5b813581811115611e8d57611e8d612529565b8381029150611e9d8483016123c4565b8181528481019084860184860187018a1015611eb7578788fd5b8795505b83861015611ed9578035835260019590950194918601918601611ebb565b5098975050505050505050565b600060208284031215611ef7578081fd5b8135611a9a8161253f565b600060208284031215611f13578081fd5b8151611a9a8161253f565b600060208284031215611f2f578081fd5b813567ffffffffffffffff811115611f45578182fd5b8201601f81018413611f55578182fd5b6115ad84823560208401611c6d565b600060208284031215611f75578081fd5b5035919050565b600060208284031215611f8d578081fd5b813560ff81168114611a9a578182fd5b60008151808452611fb5816020860160208601612450565b601f01601f19169290920160200192915050565b60008251611fdb818460208701612450565b9190910192915050565b600066697066733a2f2f60c81b82528351612007816007850160208801612450565b602f60f81b6007918401918201528351612028816008840160208801612450565b01600801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207b90830184611f9d565b9695505050505050565b901515815260200190565b600060208252611a9a6020830184611f9d565b60208082526003908201526265313160e81b604082015260600190565b602080825260029082015261653160f01b604082015260600190565b602080825260029082015261653360f01b604082015260600190565b60208082526003908201526265323360e81b604082015260600190565b60208082526003908201526204533360ec1b604082015260600190565b60208082526003908201526265313360e81b604082015260600190565b60208082526003908201526232991960e91b604082015260600190565b60208082526003908201526265323960e81b604082015260600190565b60208082526003908201526232991b60e91b604082015260600190565b60208082526003908201526265313960e81b604082015260600190565b6020808252600390820152620ca62760eb1b604082015260600190565b60208082526003908201526245333160e81b604082015260600190565b602080825260029082015261653560f01b604082015260600190565b60208082526003908201526206531360ec1b604082015260600190565b602080825260039082015262194c4d60ea1b604082015260600190565b60208082526003908201526265313560e81b604082015260600190565b602080825260039082015262194c8d60ea1b604082015260600190565b60208082526003908201526232989b60e91b604082015260600190565b60208082526003908201526265323160e81b604082015260600190565b602080825260029082015261194d60f21b604082015260600190565b60208082526003908201526245313560e81b604082015260600190565b60208082526003908201526206532360ec1b604082015260600190565b60208082526003908201526232989960e91b604082015260600190565b60208082526003908201526265323760e81b604082015260600190565b60208082526003908201526265313760e81b604082015260600190565b602080825260029082015261329960f11b604082015260600190565b60208082526003908201526265323560e81b604082015260600190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156123e6576123e6612529565b604052919050565b60008219821115612401576124016124fd565b500190565b60008261241557612415612513565b500490565b6000816000190483118215151615612434576124346124fd565b500290565b60008282101561244b5761244b6124fd565b500390565b60005b8381101561246b578181015183820152602001612453565b838111156111955750506000910152565b60008161248b5761248b6124fd565b506000190190565b6002810460018216806124a757607f821691505b602082108114156124c857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124e2576124e26124fd565b5060010190565b6000826124f8576124f8612513565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b0d57600080fdfea264697066735822122041732cc10dbcf6268fa726ee1c8d701425a493f6d11f28c2952816f504f6e45c64736f6c63430008000033516d58586255514c734c3769446a54646d714b5657414d7a78364339536473346e61326b76723842464a43794c72000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e6100000000000000000000000000000000000000000000000000000000000000095377696d2e736b696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353534b0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063735263561161015a578063bb7471fe116100c1578063d885a21e1161007a578063d885a21e14610747578063e985e9c51461074f578063e9b5a2f71461076f578063eb8d244414610784578063eef49ee314610799578063fa07ce1d146107ae57610288565b8063bb7471fe14610685578063c2e1debf146106a5578063c44644d0146106ba578063c87b56dd146106da578063cfb15ef0146106fa578063d8795f5c1461072757610288565b80638da5cb5b116101135780638da5cb5b146105e65780638e920351146105fb57806395d89b4114610610578063a22cb46514610625578063a930aa6814610645578063b88d4fde1461066557610288565b806373526356146105545780637db1342c146105745780637ff9b59614610594578063807f54f6146105a9578063861d47b4146105be57806388dba7fd146105d357610288565b80634a2eeebb116101fe578063686e1079116101b7578063686e1079146104c05780636c0360eb146104d55780636de9f32b146104ea5780636ef61092146104ff57806370a082311461051f578063715018a61461053f57610288565b80634a2eeebb1461040b5780634a6b07af1461042057806354e05b871461044057806355f804b3146104605780636352211e1461048057806366ebc7d3146104a057610288565b80631c2f8211116102505780631c2f82111461035657806323b872dd146103765780632e1a7d4d146103965780633d363f15146103b657806342842e0e146103cb57806345e13a0c146103eb57610288565b806301ffc9a71461028d57806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031257806318160ddd14610334575b600080fd5b34801561029957600080fd5b506102ad6102a8366004611ee6565b6107ce565b6040516102ba9190612085565b60405180910390f35b3480156102cf57600080fd5b506102d86107f1565b6040516102ba9190612090565b3480156102f157600080fd5b50610305610300366004611f64565b610883565b6040516102ba9190612034565b34801561031e57600080fd5b5061033261032d366004611e16565b6108cf565b005b34801561034057600080fd5b50610349610967565b6040516102ba91906123ad565b34801561036257600080fd5b50610349610371366004611f64565b61096d565b34801561038257600080fd5b50610332610391366004611d28565b61098e565b3480156103a257600080fd5b506103326103b1366004611f64565b6109c6565b3480156103c257600080fd5b50610332610a36565b3480156103d757600080fd5b506103326103e6366004611d28565b610b10565b3480156103f757600080fd5b50610332610406366004611f64565b610b2b565b34801561041757600080fd5b50610349610b6f565b34801561042c57600080fd5b506102ad61043b366004611cdc565b610b75565b34801561044c57600080fd5b506102ad61045b366004611cdc565b610b8a565b34801561046c57600080fd5b5061033261047b366004611f1e565b610b9f565b34801561048c57600080fd5b5061030561049b366004611f64565b610be7565b3480156104ac57600080fd5b506103496104bb366004611f64565b610c24565b3480156104cc57600080fd5b50610349610c34565b3480156104e157600080fd5b506102d8610c3a565b3480156104f657600080fd5b50610349610c49565b34801561050b57600080fd5b506102ad61051a366004611cdc565b610c4f565b34801561052b57600080fd5b5061034961053a366004611cdc565b610c64565b34801561054b57600080fd5b50610332610ca8565b34801561056057600080fd5b5061033261056f366004611f7c565b610d31565b34801561058057600080fd5b5061033261058f366004611f64565b610e2c565b3480156105a057600080fd5b50610349610e70565b3480156105b557600080fd5b50610349610e76565b3480156105ca57600080fd5b50610349610e7c565b6103326105e1366004611f7c565b610e82565b3480156105f257600080fd5b50610305610fbd565b34801561060757600080fd5b50610332610fcc565b34801561061c57600080fd5b506102d861101f565b34801561063157600080fd5b50610332610640366004611ddc565b61102e565b34801561065157600080fd5b50610332610660366004611cdc565b6110fc565b34801561067157600080fd5b50610332610680366004611d63565b61115c565b34801561069157600080fd5b506103326106a0366004611e3f565b61119b565b3480156106b157600080fd5b5061034961120e565b3480156106c657600080fd5b506103326106d5366004611cdc565b611213565b3480156106e657600080fd5b506102d86106f5366004611f64565b611276565b34801561070657600080fd5b5061071a610715366004611cdc565b6112db565b6040516102ba91906123b6565b34801561073357600080fd5b50610332610742366004611e3f565b6112f0565b610332611363565b34801561075b57600080fd5b506102ad61076a366004611cf6565b611396565b34801561077b57600080fd5b506103326113c4565b34801561079057600080fd5b506102ad611485565b3480156107a557600080fd5b5061034961148e565b3480156107ba57600080fd5b506102ad6107c9366004611cdc565b611494565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b60606009805461080090612493565b80601f016020809104026020016040519081016040528092919081815260200182805461082c90612493565b80156108795780601f1061084e57610100808354040283529160200191610879565b820191906000526020600020905b81548152906001019060200180831161085c57829003601f168201915b5050505050905090565b600061088e826114a9565b6108b35760405162461bcd60e51b81526004016108aa90612357565b60405180910390fd5b506000908152600260205260409020546001600160a01b031690565b60006108da82610be7565b9050806001600160a01b0316836001600160a01b0316141561090e5760405162461bcd60e51b81526004016108aa90612253565b806001600160a01b03166109206114be565b6001600160a01b0316148061093c575061093c8161076a6114be565b6109585760405162461bcd60e51b81526004016108aa9061228d565b61096283836114c2565b505050565b60085490565b6016818154811061097d57600080fd5b600091825260209091200154905081565b61099f6109996114be565b82611530565b6109bb5760405162461bcd60e51b81526004016108aa906121a6565b6109628383836115b5565b6109ce6114be565b6001600160a01b03166109df610fbd565b6001600160a01b031614610a055760405162461bcd60e51b81526004016108aa9061216c565b604051339082156108fc029083906000818181858888f19350505050158015610a32573d6000803e3d6000fd5b5050565b60005b601654811015610b0d57336001600160a01b0316610a8160168381548110610a7157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154610be7565b6001600160a01b0316148015610aac57503360009081526018602052604090205460ff161515600114155b15610afb5733600081815260186020526040808220805460ff1916600117905551671bc16d674ec800009082818181858883f19350505050158015610af5573d6000803e3d6000fd5b50610b0d565b80610b05816124ce565b915050610a39565b50565b6109628383836040518060200160405280600081525061115c565b610b336114be565b6001600160a01b0316610b44610fbd565b6001600160a01b031614610b6a5760405162461bcd60e51b81526004016108aa9061216c565b600d55565b60135481565b60186020526000908152604090205460ff1681565b60176020526000908152604090205460ff1681565b610ba76114be565b6001600160a01b0316610bb8610fbd565b6001600160a01b031614610bde5760405162461bcd60e51b81526004016108aa9061216c565b610b0d816116e0565b6000808211610c085760405162461bcd60e51b81526004016108aa90612132565b506000908152600560205260409020546001600160a01b031690565b6015818154811061097d57600080fd5b600b5481565b6060600c805461080090612493565b60085481565b60106020526000908152604090205460ff1681565b60006001600160a01b038216610c8c5760405162461bcd60e51b81526004016108aa9061231d565b506001600160a01b031660009081526004602052604090205490565b610cb06114be565b6001600160a01b0316610cc1610fbd565b6001600160a01b031614610ce75760405162461bcd60e51b81526004016108aa9061216c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610d396114be565b6001600160a01b0316610d4a610fbd565b6001600160a01b031614610d705760405162461bcd60e51b81526004016108aa9061216c565b6000610d7a610967565b905060058260ff161115610da05760405162461bcd60e51b81526004016108aa90612374565b600b54610db060ff8416836123ee565b1115610dce5760405162461bcd60e51b81526004016108aa906120dc565b60125460ff16610df05760405162461bcd60e51b81526004016108aa906122c7565b60015b8260ff16811161096257600b54821015610e1a57610e1a33610e1583856123ee565b6116f3565b80610e24816124ce565b915050610df3565b610e346114be565b6001600160a01b0316610e45610fbd565b6001600160a01b031614610e6b5760405162461bcd60e51b81526004016108aa9061216c565b600e55565b600d5481565b600f5481565b600e5481565b6000610e8c610967565b905060058260ff161115610eb25760405162461bcd60e51b81526004016108aa90612374565b600b54610ec260ff8416836123ee565b1115610ee05760405162461bcd60e51b81526004016108aa906120dc565b60125460ff16610f025760405162461bcd60e51b81526004016108aa906122c7565b600e548260ff16610f1233610c64565b610f1c91906123ee565b1115610f3a5760405162461bcd60e51b81526004016108aa906121fd565b3360009081526011602052604090205460ff161515600114610f8657348260ff16600d54610f68919061241a565b1115610f865760405162461bcd60e51b81526004016108aa906122e3565b60015b8260ff16811161096257600b54821015610fab57610fab33610e1583856123ee565b80610fb5816124ce565b915050610f89565b6000546001600160a01b031690565b610fd46114be565b6001600160a01b0316610fe5610fbd565b6001600160a01b03161461100b5760405162461bcd60e51b81526004016108aa9061216c565b6012805460ff19811660ff90911615179055565b6060600a805461080090612493565b6110366114be565b6001600160a01b0316826001600160a01b031614156110675760405162461bcd60e51b81526004016108aa906121c3565b80600360006110746114be565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110b86114be565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f09190612085565b60405180910390a35050565b6111046114be565b6001600160a01b0316611115610fbd565b6001600160a01b03161461113b5760405162461bcd60e51b81526004016108aa9061216c565b6001600160a01b03166000908152601160205260409020805460ff19169055565b61116d6111676114be565b83611530565b6111895760405162461bcd60e51b81526004016108aa90612300565b6111958484848461170d565b50505050565b6111a36114be565b6001600160a01b03166111b4610fbd565b6001600160a01b0316146111da5760405162461bcd60e51b81526004016108aa9061216c565b8051600a146111fb5760405162461bcd60e51b81526004016108aa906121e0565b8051610a32906016906020840190611b9a565b600581565b61121b6114be565b6001600160a01b031661122c610fbd565b6001600160a01b0316146112525760405162461bcd60e51b81526004016108aa9061216c565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b6060611281826114a9565b61129d5760405162461bcd60e51b81526004016108aa90612236565b60006112a7610c3a565b9050806112b384611740565b6040516020016112c4929190611fe5565b604051602081830303815290604052915050919050565b60076020526000908152604090205460ff1681565b6112f86114be565b6001600160a01b0316611309610fbd565b6001600160a01b03161461132f5760405162461bcd60e51b81526004016108aa9061216c565b80516005146113505760405162461bcd60e51b81526004016108aa90612115565b8051610a32906015906020840190611b9a565b600034116113835760405162461bcd60e51b81526004016108aa906120c0565b3460145461139191906123ee565b601455565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b60005b601554811015610b0d57336001600160a01b03166113ff60158381548110610a7157634e487b7160e01b600052603260045260246000fd5b6001600160a01b031614801561142a57503360009081526017602052604090205460ff161515600114155b156114735733600081815260176020526040808220805460ff1916600117905551671bc16d674ec800009082818181858883f19350505050158015610af5573d6000803e3d6000fd5b8061147d816124ce565b9150506113c7565b60125460ff1681565b60145481565b60116020526000908152604090205460ff1681565b60009081526006602052604090205460ff1690565b3390565b600081815260026020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114f782610be7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061153b826114a9565b6115575760405162461bcd60e51b81526004016108aa9061214f565b600061156283610be7565b9050806001600160a01b0316846001600160a01b0316148061159d5750836001600160a01b031661159284610883565b6001600160a01b0316145b806115ad57506115ad8185611396565b949350505050565b826001600160a01b03166115c882610be7565b6001600160a01b0316146115ee5760405162461bcd60e51b81526004016108aa90612189565b6001600160a01b0382166116145760405162461bcd60e51b81526004016108aa9061233a565b61161f838383610962565b61162a6000826114c2565b6001600160a01b038316600090815260046020526040812080549161164e8361247c565b9091555050600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260049091528120805491611695836124ce565b919050555080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b8051610a3290600c906020840190611be5565b610a3282826040518060200160405280600081525061185b565b6117188484846115b5565b6117248484848461188e565b6111955760405162461bcd60e51b81526004016108aa906122aa565b60608161176557506040805180820190915260018152600360fc1b60208201526107ec565b8160005b811561178f5780611779816124ce565b91506117889050600a83612406565b9150611769565b60008167ffffffffffffffff8111156117b857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156117e2576020820181803683370190505b5090505b84156115ad576117f7600183612439565b9150611804600a866124e9565b61180f9060306123ee565b60f81b81838151811061183257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611854600a86612406565b94506117e6565b611865838361196d565b611872600084848461188e565b6109625760405162461bcd60e51b81526004016108aa906120f8565b60006118a2846001600160a01b0316611a82565b6118ae575060016115ad565b6000611936630a85bd0160e11b6118c36114be565b8887876040516024016118d99493929190612048565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417909352805180820190915260038152620ca64760eb1b928101929092526001600160a01b03881691611a88565b905060008180602001905181019061194e9190611f02565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6001600160a01b0382166119935760405162461bcd60e51b81526004016108aa90612270565b61199c816114a9565b156119b95760405162461bcd60e51b81526004016108aa90612390565b6119c560008383610962565b600081815260056020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560068352818420805460ff19166001908117909155908452600490925290912054611a1c916123ee565b6001600160a01b038316600090815260046020526040902055600854611a439060016123ee565b60085560405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6060611a978484600085611aa1565b90505b9392505050565b606082471015611ac35760405162461bcd60e51b81526004016108aa90612219565b611acc85611a82565b611ae85760405162461bcd60e51b81526004016108aa906120a3565b600080866001600160a01b03168587604051611b049190611fc9565b60006040518083038185875af1925050503d8060008114611b41576040519150601f19603f3d011682016040523d82523d6000602084013e611b46565b606091505b5091509150611b56828286611b61565b979650505050505050565b60608315611b70575081611a9a565b825115611b805782518084602001fd5b8160405162461bcd60e51b81526004016108aa9190612090565b828054828255906000526020600020908101928215611bd5579160200282015b82811115611bd5578251825591602001919060010190611bba565b50611be1929150611c58565b5090565b828054611bf190612493565b90600052602060002090601f016020900481019282611c135760008555611bd5565b82601f10611c2c57805160ff1916838001178555611bd5565b82800160010185558215611bd55791820182811115611bd5578251825591602001919060010190611bba565b5b80821115611be15760008155600101611c59565b600067ffffffffffffffff831115611c8757611c87612529565b611c9a601f8401601f19166020016123c4565b9050828152838383011115611cae57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146107ec57600080fd5b600060208284031215611ced578081fd5b611a9a82611cc5565b60008060408385031215611d08578081fd5b611d1183611cc5565b9150611d1f60208401611cc5565b90509250929050565b600080600060608486031215611d3c578081fd5b611d4584611cc5565b9250611d5360208501611cc5565b9150604084013590509250925092565b60008060008060808587031215611d78578081fd5b611d8185611cc5565b9350611d8f60208601611cc5565b925060408501359150606085013567ffffffffffffffff811115611db1578182fd5b8501601f81018713611dc1578182fd5b611dd087823560208401611c6d565b91505092959194509250565b60008060408385031215611dee578182fd5b611df783611cc5565b915060208301358015158114611e0b578182fd5b809150509250929050565b60008060408385031215611e28578182fd5b611e3183611cc5565b946020939093013593505050565b60006020808385031215611e51578182fd5b823567ffffffffffffffff80821115611e68578384fd5b818501915085601f830112611e7b578384fd5b813581811115611e8d57611e8d612529565b8381029150611e9d8483016123c4565b8181528481019084860184860187018a1015611eb7578788fd5b8795505b83861015611ed9578035835260019590950194918601918601611ebb565b5098975050505050505050565b600060208284031215611ef7578081fd5b8135611a9a8161253f565b600060208284031215611f13578081fd5b8151611a9a8161253f565b600060208284031215611f2f578081fd5b813567ffffffffffffffff811115611f45578182fd5b8201601f81018413611f55578182fd5b6115ad84823560208401611c6d565b600060208284031215611f75578081fd5b5035919050565b600060208284031215611f8d578081fd5b813560ff81168114611a9a578182fd5b60008151808452611fb5816020860160208601612450565b601f01601f19169290920160200192915050565b60008251611fdb818460208701612450565b9190910192915050565b600066697066733a2f2f60c81b82528351612007816007850160208801612450565b602f60f81b6007918401918201528351612028816008840160208801612450565b01600801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207b90830184611f9d565b9695505050505050565b901515815260200190565b600060208252611a9a6020830184611f9d565b60208082526003908201526265313160e81b604082015260600190565b602080825260029082015261653160f01b604082015260600190565b602080825260029082015261653360f01b604082015260600190565b60208082526003908201526265323360e81b604082015260600190565b60208082526003908201526204533360ec1b604082015260600190565b60208082526003908201526265313360e81b604082015260600190565b60208082526003908201526232991960e91b604082015260600190565b60208082526003908201526265323960e81b604082015260600190565b60208082526003908201526232991b60e91b604082015260600190565b60208082526003908201526265313960e81b604082015260600190565b6020808252600390820152620ca62760eb1b604082015260600190565b60208082526003908201526245333160e81b604082015260600190565b602080825260029082015261653560f01b604082015260600190565b60208082526003908201526206531360ec1b604082015260600190565b602080825260039082015262194c4d60ea1b604082015260600190565b60208082526003908201526265313560e81b604082015260600190565b602080825260039082015262194c8d60ea1b604082015260600190565b60208082526003908201526232989b60e91b604082015260600190565b60208082526003908201526265323160e81b604082015260600190565b602080825260029082015261194d60f21b604082015260600190565b60208082526003908201526245313560e81b604082015260600190565b60208082526003908201526206532360ec1b604082015260600190565b60208082526003908201526232989960e91b604082015260600190565b60208082526003908201526265323760e81b604082015260600190565b60208082526003908201526265313760e81b604082015260600190565b602080825260029082015261329960f11b604082015260600190565b60208082526003908201526265323560e81b604082015260600190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156123e6576123e6612529565b604052919050565b60008219821115612401576124016124fd565b500190565b60008261241557612415612513565b500490565b6000816000190483118215151615612434576124346124fd565b500290565b60008282101561244b5761244b6124fd565b500390565b60005b8381101561246b578181015183820152602001612453565b838111156111955750506000910152565b60008161248b5761248b6124fd565b506000190190565b6002810460018216806124a757607f821691505b602082108114156124c857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124e2576124e26124fd565b5060010190565b6000826124f8576124f8612513565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b0d57600080fdfea264697066735822122041732cc10dbcf6268fa726ee1c8d701425a493f6d11f28c2952816f504f6e45c64736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e6100000000000000000000000000000000000000000000000000000000000000095377696d2e736b696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000353534b0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Swim.skin
Arg [1] : symbol (string): SSK
Arg [2] : maxNftSupply (uint256): 7777

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001e61
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 5377696d2e736b696e0000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 53534b0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38123:4179:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10229:150;;;;;;;;;;-1:-1:-1;10229:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23574:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26324:180::-;;;;;;;;;;-1:-1:-1;26324:180:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25937:321::-;;;;;;;;;;-1:-1:-1;25937:321:0;;;;;:::i;:::-;;:::i;:::-;;25354:268;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38636:30::-;;;;;;;;;;-1:-1:-1;38636:30:0;;;;;:::i;:::-;;:::i;27151:259::-;;;;;;;;;;-1:-1:-1;27151:259:0;;;;;:::i;:::-;;:::i;38950:106::-;;;;;;;;;;-1:-1:-1;38950:106:0;;;;;:::i;:::-;;:::i;41120:413::-;;;;;;;;;;;;;:::i;27481:151::-;;;;;;;;;;-1:-1:-1;27481:151:0;;;;;:::i;:::-;;:::i;41541:92::-;;;;;;;;;;-1:-1:-1;41541:92:0;;;;;:::i;:::-;;:::i;38519:35::-;;;;;;;;;;;;;:::i;38737:56::-;;;;;;;;;;-1:-1:-1;38737:56:0;;;;;:::i;:::-;;:::i;38675:55::-;;;;;;;;;;-1:-1:-1;38675:55:0;;;;;:::i;:::-;;:::i;39532:99::-;;;;;;;;;;-1:-1:-1;39532:99:0;;;;;:::i;:::-;;:::i;23253:254::-;;;;;;;;;;-1:-1:-1;23253:254:0;;;;;:::i;:::-;;:::i;38600:29::-;;;;;;;;;;-1:-1:-1;38600:29:0;;;;;:::i;:::-;;:::i;20513:22::-;;;;;;;;;;;;;:::i;24931:97::-;;;;;;;;;;;;;:::i;20373:31::-;;;;;;;;;;;;;:::i;38377:42::-;;;;;;;;;;-1:-1:-1;38377:42:0;;;;;:::i;:::-;;:::i;22970:221::-;;;;;;;;;;-1:-1:-1;22970:221:0;;;;;:::i;:::-;;:::i;37501:148::-;;;;;;;;;;;;;:::i;39732:601::-;;;;;;;;;;-1:-1:-1;39732:601:0;;;;;:::i;:::-;;:::i;39064:104::-;;;;;;;;;;-1:-1:-1;39064:104:0;;;;;:::i;:::-;;:::i;38169:45::-;;;;;;;;;;;;;:::i;38334:30::-;;;;;;;;;;;;;:::i;38289:34::-;;;;;;;;;;;;;:::i;41641:652::-;;;;;;:::i;:::-;;:::i;36879:87::-;;;;;;;;;;;;;:::i;39639:85::-;;;;;;;;;;;;;:::i;23743:104::-;;;;;;;;;;;;;:::i;26576:273::-;;;;;;;;;;-1:-1:-1;26576:273:0;;;;;:::i;:::-;;:::i;39280:100::-;;;;;;;;;;-1:-1:-1;39280:100:0;;;;;:::i;:::-;;:::i;27703:239::-;;;;;;;;;;-1:-1:-1;27703:239:0;;;;;:::i;:::-;;:::i;40521:175::-;;;;;;;;;;-1:-1:-1;40521:175:0;;;;;:::i;:::-;;:::i;38238:42::-;;;;;;;;;;;;;:::i;39176:96::-;;;;;;;;;;-1:-1:-1;39176:96:0;;;;;:::i;:::-;;:::i;23918:774::-;;;;;;;;;;-1:-1:-1;23918:774:0;;;;;:::i;:::-;;:::i;20321:43::-;;;;;;;;;;-1:-1:-1;20321:43:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40341:172::-;;;;;;;;;;-1:-1:-1;40341:172:0;;;;;:::i;:::-;;:::i;39388:134::-;;;:::i;26920:164::-;;;;;;;;;;-1:-1:-1;26920:164:0;;;;;:::i;:::-;;:::i;40704:408::-;;;;;;;;;;;;;:::i;38478:32::-;;;;;;;;;;;;;:::i;38563:28::-;;;;;;;;;;;;;:::i;38428:41::-;;;;;;;;;;-1:-1:-1;38428:41:0;;;;;:::i;:::-;;:::i;10229:150::-;-1:-1:-1;;;;;;10338:33:0;;10314:4;10338:33;;;:20;:33;;;;;;;;10229:150;;;;:::o;23574:100::-;23628:13;23661:5;23654:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23574:100;:::o;26324:180::-;26400:7;26428:16;26436:7;26428;:16::i;:::-;26420:32;;;;-1:-1:-1;;;26420:32:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;26472:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26472:24:0;;26324:180::o;25937:321::-;26018:13;26034:23;26049:7;26034:14;:23::i;:::-;26018:39;;26082:5;-1:-1:-1;;;;;26076:11:0;:2;-1:-1:-1;;;;;26076:11:0;;;26068:27;;;;-1:-1:-1;;;26068:27:0;;;;;;;:::i;:::-;26132:5;-1:-1:-1;;;;;26116:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;26116:21:0;;:69;;;;26141:44;26165:5;26172:12;:10;:12::i;26141:44::-;26108:108;;;;-1:-1:-1;;;26108:108:0;;;;;;;:::i;:::-;26229:21;26238:2;26242:7;26229:8;:21::i;:::-;25937:321;;;:::o;25354:268::-;25602:12;;25354:268;:::o;38636:30::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38636:30:0;:::o;27151:259::-;27312:41;27331:12;:10;:12::i;:::-;27345:7;27312:18;:41::i;:::-;27304:57;;;;-1:-1:-1;;;27304:57:0;;;;;;;:::i;:::-;27374:28;27384:4;27390:2;27394:7;27374:9;:28::i;38950:106::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;39012:36:::1;::::0;39020:10:::1;::::0;39012:36;::::1;;;::::0;39041:6;;39012:36:::1;::::0;;;39041:6;39020:10;39012:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;38950:106:::0;:::o;41120:413::-;41169:15;41164:362;41200:13;:20;41190:30;;41164:362;;;41287:10;-1:-1:-1;;;;;41252:45:0;:31;41260:13;41274:7;41260:22;;;;;;-1:-1:-1;;;41260:22:0;;;;;;;;;;;;;;;;;41252:7;:31::i;:::-;-1:-1:-1;;;;;41252:45:0;;:92;;;;-1:-1:-1;41325:10:0;41301:35;;;;:23;:35;;;;;;;;:43;;:35;:43;;41252:92;41248:267;;;41389:10;41365:35;;;;:23;:35;;;;;;:42;;-1:-1:-1;;41365:42:0;41403:4;41365:42;;;41426:49;41455:19;;41365:35;41426:49;41365:35;41426:49;41455:19;41389:10;41365:35;41426:49;;;;;;;;;;;;;;;;;;;;41494:5;;41248:267;41222:9;;;;:::i;:::-;;;;41164:362;;;;41120:413::o;27481:151::-;27585:39;27602:4;27608:2;27612:7;27585:39;;;;;;;;;;;;:16;:39::i;41541:92::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;41606:10:::1;:19:::0;41541:92::o;38519:35::-;;;;:::o;38737:56::-;;;;;;;;;;;;;;;:::o;38675:55::-;;;;;;;;;;;;;;;:::o;39532:99::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;39603:20:::1;39615:7;39603:11;:20::i;23253:254::-:0;23325:7;23453:1;23443:7;:11;23435:27;;;;-1:-1:-1;;;23435:27:0;;;;;;;:::i;:::-;-1:-1:-1;23480:19:0;;;;:10;:19;;;;;;-1:-1:-1;;;;;23480:19:0;;23253:254::o;38600:29::-;;;;;;;;;;;;20513:22;;;;:::o;24931:97::-;24979:13;25012:8;25005:15;;;;;:::i;20373:31::-;;;;:::o;38377:42::-;;;;;;;;;;;;;;;:::o;22970:221::-;23042:7;-1:-1:-1;;;;;23070:19:0;;23062:35;;;;-1:-1:-1;;;23062:35:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23164:19:0;;;;;:12;:19;;;;;;;22970:221::o;37501:148::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;37608:1:::1;37592:6:::0;;37571:40:::1;::::0;-1:-1:-1;;;;;37592:6:0;;::::1;::::0;37571:40:::1;::::0;37608:1;;37571:40:::1;37639:1;37622:19:::0;;-1:-1:-1;;;;;;37622:19:0::1;::::0;;37501:148::o;39732:601::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;39802:14:::1;39819:13;:11;:13::i;:::-;39802:30;;38279:1;39851:14;:32;;;;39843:47;;;;-1:-1:-1::0;;;39843:47:0::1;;;;;;;:::i;:::-;39938:7;::::0;39910:23:::1;;::::0;::::1;:6:::0;:23:::1;:::i;:::-;39909:36;;39901:51;;;;-1:-1:-1::0;;;39901:51:0::1;;;;;;;:::i;:::-;39971:12;::::0;::::1;;39963:27;;;;-1:-1:-1::0;;;39963:27:0::1;;;;;;;:::i;:::-;40181:1;40165:161;40189:14;40184:19;;:1;:19;40165:161;;40238:7;;40229:6;:16;40225:90;;;40266:33;40276:10;40288;40297:1:::0;40288:6;:10:::1;:::i;:::-;40266:9;:33::i;:::-;40205:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40165:161;;39064:104:::0;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;39135:15:::1;:24:::0;39064:104::o;38169:45::-;;;;:::o;38334:30::-;;;;:::o;38289:34::-;;;;:::o;41641:652::-;41706:14;41723:13;:11;:13::i;:::-;41706:30;;38279:1;41755:14;:32;;;;41747:47;;;;-1:-1:-1;;;41747:47:0;;;;;;;:::i;:::-;41842:7;;41814:23;;;;:6;:23;:::i;:::-;41813:36;;41805:51;;;;-1:-1:-1;;;41805:51:0;;;;;;;:::i;:::-;41875:12;;;;41867:27;;;;-1:-1:-1;;;41867:27:0;;;;;;;:::i;:::-;41959:15;;41940:14;41916:38;;:21;41926:10;41916:9;:21::i;:::-;:38;;;;:::i;:::-;41915:59;;41907:74;;;;-1:-1:-1;;;41907:74:0;;;;;;;:::i;:::-;42007:10;41998:20;;;;:8;:20;;;;;;;;:28;;:20;:28;41994:119;;42084:9;42065:14;42052:27;;:10;;:27;;;;:::i;:::-;42051:42;;42043:58;;;;-1:-1:-1;;;42043:58:0;;;;;;;:::i;:::-;42141:1;42125:161;42149:14;42144:19;;:1;:19;42125:161;;42198:7;;42189:6;:16;42185:90;;;42226:33;42236:10;42248;42257:1;42248:6;:10;:::i;42226:33::-;42165:3;;;;:::i;:::-;;;;42125:161;;36879:87;36925:7;36952:6;-1:-1:-1;;;;;36952:6:0;36879:87;:::o;39639:85::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;39704:12:::1;::::0;;-1:-1:-1;;39688:28:0;::::1;39704:12;::::0;;::::1;39703:13;39688:28;::::0;;39639:85::o;23743:104::-;23799:13;23832:7;23825:14;;;;;:::i;26576:273::-;26691:12;:10;:12::i;:::-;-1:-1:-1;;;;;26679:24:0;:8;-1:-1:-1;;;;;26679:24:0;;;26671:40;;;;-1:-1:-1;;;26671:40:0;;;;;;;:::i;:::-;26769:8;26724:18;:32;26743:12;:10;:12::i;:::-;-1:-1:-1;;;;;26724:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;26724:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;26724:53:0;;;;;;;;;;;26808:12;:10;:12::i;:::-;-1:-1:-1;;;;;26793:48:0;;26832:8;26793:48;;;;;;:::i;:::-;;;;;;;;26576:273;;:::o;39280:100::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39346:18:0::1;39367:5;39346:18:::0;;;:8:::1;:18;::::0;;;;:26;;-1:-1:-1;;39346:26:0::1;::::0;;39280:100::o;27703:239::-;27835:41;27854:12;:10;:12::i;:::-;27868:7;27835:18;:41::i;:::-;27827:57;;;;-1:-1:-1;;;27827:57:0;;;;;;;:::i;:::-;27895:39;27909:4;27915:2;27919:7;27928:5;27895:13;:39::i;:::-;27703:239;;;;:::o;40521:175::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;40614:13:::1;:20;40638:2;40614:26;40606:42;;;;-1:-1:-1::0;;;40606:42:0::1;;;;;;;:::i;:::-;40659:29:::0;;::::1;::::0;:13:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;38238:42::-:0;38279:1;38238:42;:::o;39176:96::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39239:18:0::1;;::::0;;;:8:::1;:18;::::0;;;;:25;;-1:-1:-1;;39239:25:0::1;39260:4;39239:25;::::0;;39176:96::o;23918:774::-;23991:13;24025:16;24033:7;24025;:16::i;:::-;24017:32;;;;-1:-1:-1;;;24017:32:0;;;;;;;:::i;:::-;24120:18;24141:9;:7;:9::i;:::-;24120:30;;24653:4;24664:18;:7;:16;:18::i;:::-;24625:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24611:73;;;23918:774;;;:::o;20321:43::-;;;;;;;;;;;;;;;:::o;40341:172::-;37110:12;:10;:12::i;:::-;-1:-1:-1;;;;;37099:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;37099:23:0;;37091:39;;;;-1:-1:-1;;;37091:39:0;;;;;;;:::i;:::-;40433:13:::1;:20;40457:1;40433:25;40425:41;;;;-1:-1:-1::0;;;40425:41:0::1;;;;;;;:::i;:::-;40477:28:::0;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;39388:134::-:0;39462:1;39450:9;:13;39442:28;;;;-1:-1:-1;;;39442:28:0;;;;;;;:::i;:::-;39505:9;39493;;:21;;;;:::i;:::-;39481:9;:33;39388:134::o;26920:164::-;-1:-1:-1;;;;;27041:25:0;;;27017:4;27041:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26920:164::o;40704:408::-;40752:15;40747:358;40783:12;:19;40773:29;;40747:358;;;40868:10;-1:-1:-1;;;;;40834:44:0;:30;40842:12;40855:7;40842:21;;;;;;-1:-1:-1;;;40842:21:0;;;;;;;;40834:30;-1:-1:-1;;;;;40834:44:0;;:90;;;;-1:-1:-1;40905:10:0;40882:34;;;;:22;:34;;;;;;;;:42;;:34;:42;;40834:90;40830:264;;;40968:10;40945:34;;;;:22;:34;;;;;;:41;;-1:-1:-1;;40945:41:0;40982:4;40945:41;;;41005:49;41034:19;;40945:34;41005:49;40945:34;41005:49;41034:19;40968:10;40945:34;41005:49;;;;;;;;;;;;;;;;;;40830:264;40804:9;;;;:::i;:::-;;;;40747:358;;38478:32;;;;;;:::o;38563:28::-;;;;:::o;38428:41::-;;;;;;;;;;;;;;;:::o;29362:167::-;29427:4;29501:20;;;:11;:20;;;;;;;;;29362:167::o;730:115::-;826:10;730:115;:::o;34871:192::-;34946:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34946:29:0;-1:-1:-1;;;;;34946:29:0;;;;;;;;:24;;35000:23;34946:24;35000:14;:23::i;:::-;-1:-1:-1;;;;;34991:46:0;;;;;;;;;;;34871:192;;:::o;29696:314::-;29789:4;29814:16;29822:7;29814;:16::i;:::-;29806:32;;;;-1:-1:-1;;;29806:32:0;;;;;;;:::i;:::-;29849:13;29865:23;29880:7;29865:14;:23::i;:::-;29849:39;;29918:5;-1:-1:-1;;;;;29907:16:0;:7;-1:-1:-1;;;;;29907:16:0;;:51;;;;29951:7;-1:-1:-1;;;;;29927:31:0;:20;29939:7;29927:11;:20::i;:::-;-1:-1:-1;;;;;29927:31:0;;29907:51;:94;;;;29962:39;29986:5;29993:7;29962:23;:39::i;:::-;29899:103;29696:314;-1:-1:-1;;;;29696:314:0:o;32429:496::-;32554:4;-1:-1:-1;;;;;32527:31:0;:23;32542:7;32527:14;:23::i;:::-;-1:-1:-1;;;;;32527:31:0;;32519:47;;;;-1:-1:-1;;;32519:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32603:16:0;;32595:32;;;;-1:-1:-1;;;32595:32:0;;;;;;;:::i;:::-;32640:39;32661:4;32667:2;32671:7;32640:20;:39::i;:::-;32744:29;32761:1;32765:7;32744:8;:29::i;:::-;-1:-1:-1;;;;;32786:18:0;;;;;;:12;:18;;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;32817:19:0;;;;:10;:19;;;;;;;;:24;;-1:-1:-1;;;;;;32817:24:0;-1:-1:-1;;;;;32817:24:0;;;;;;;;32852:16;;:12;:16;;;;;:18;;;;;;:::i;:::-;;;;;;32909:7;32905:2;-1:-1:-1;;;;;32890:27:0;32899:4;-1:-1:-1;;;;;32890:27:0;;;;;;;;;;;32429:496;;;:::o;33530:100::-;33603:19;;;;:8;;:19;;;;;:::i;30353:110::-;30429:26;30439:2;30443:7;30429:26;;;;;;;;;;;;:9;:26::i;28824:225::-;28938:28;28948:4;28954:2;28958:7;28938:9;:28::i;:::-;28985:48;29008:4;29014:2;29018:7;29027:5;28985:22;:48::i;:::-;28977:64;;;;-1:-1:-1;;;28977:64:0;;;;;;;:::i;17174:723::-;17230:13;17451:10;17447:53;;-1:-1:-1;17478:10:0;;;;;;;;;;;;-1:-1:-1;;;17478:10:0;;;;;;17447:53;17525:5;17510:12;17566:78;17573:9;;17566:78;;17599:8;;;;:::i;:::-;;-1:-1:-1;17622:10:0;;-1:-1:-1;17630:2:0;17622:10;;:::i;:::-;;;17566:78;;;17654:19;17686:6;17676:17;;;;;;-1:-1:-1;;;17676:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17676:17:0;;17654:39;;17704:154;17711:10;;17704:154;;17738:11;17748:1;17738:11;;:::i;:::-;;-1:-1:-1;17807:10:0;17815:2;17807:5;:10;:::i;:::-;17794:24;;:2;:24;:::i;:::-;17781:39;;17764:6;17771;17764:14;;;;;;-1:-1:-1;;;17764:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17764:56:0;;;;;;;;-1:-1:-1;17835:11:0;17844:2;17835:11;;:::i;:::-;;;17704:154;;30690:203;30786:18;30792:2;30796:7;30786:5;:18::i;:::-;30823:54;30854:1;30858:2;30862:7;30871:5;30823:22;:54::i;:::-;30815:70;;;;-1:-1:-1;;;30815:70:0;;;;;;;:::i;34195:557::-;34316:4;34343:15;:2;-1:-1:-1;;;;;34343:13:0;;:15::i;:::-;34338:60;;-1:-1:-1;34382:4:0;34375:11;;34338:60;34408:23;34434:205;-1:-1:-1;;;34547:12:0;:10;:12::i;:::-;34574:4;34593:7;34615:5;34450:181;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;34450:181:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34450:181:0;-1:-1:-1;;;;;;34450:181:0;;;;;;;;;;34434:205;;;;;;;;;;;-1:-1:-1;;;34434:205:0;;;;;;;-1:-1:-1;;;;;34434:15:0;;;;:205::i;:::-;34408:231;;34650:13;34677:10;34666:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;34717:26:0;-1:-1:-1;;;34717:26:0;;-1:-1:-1;;;34195:557:0;;;;;;:::o;31425:444::-;-1:-1:-1;;;;;31505:16:0;;31497:32;;;;-1:-1:-1;;;31497:32:0;;;;;;;:::i;:::-;31549:16;31557:7;31549;:16::i;:::-;31548:17;31540:33;;;;-1:-1:-1;;;31540:33:0;;;;;;;:::i;:::-;31586:45;31615:1;31619:2;31623:7;31586:20;:45::i;:::-;31644:19;;;;:10;:19;;;;;;;;:24;;-1:-1:-1;;;;;;31644:24:0;-1:-1:-1;;;;;31644:24:0;;;;;;;;31679:11;:20;;;;;:27;;-1:-1:-1;;31679:27:0;-1:-1:-1;31679:27:0;;;;;;31738:16;;;:12;:16;;;;;;;:20;;;:::i;:::-;-1:-1:-1;;;;;31719:16:0;;;;;;:12;:16;;;;;:39;31784:12;;:16;;31799:1;31784:16;:::i;:::-;31769:12;:31;31828:33;;31853:7;;-1:-1:-1;;;;;31828:33:0;;;31845:1;;31828:33;;31845:1;;31828:33;31425:444;;:::o;11732:422::-;12099:20;12138:8;;;11732:422::o;14626:195::-;14729:12;14761:52;14783:6;14791:4;14797:1;14800:12;14761:21;:52::i;:::-;14754:59;;14626:195;;;;;;:::o;15639:469::-;15766:12;15824:5;15799:21;:30;;15791:46;;;;-1:-1:-1;;;15791:46:0;;;;;;;:::i;:::-;15856:18;15867:6;15856:10;:18::i;:::-;15848:34;;;;-1:-1:-1;;;15848:34:0;;;;;;;:::i;:::-;15956:12;15970:23;15997:6;-1:-1:-1;;;;;15997:11:0;16017:5;16025:4;15997:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15955:75;;;;16048:52;16066:7;16075:10;16087:12;16048:17;:52::i;:::-;16041:59;15639:469;-1:-1:-1;;;;;;;15639:469:0:o;16118:742::-;16233:12;16262:7;16258:595;;;-1:-1:-1;16293:10:0;16286:17;;16258:595;16407:17;;:21;16403:439;;16670:10;16664:17;16731:15;16718:10;16714:2;16710:19;16703:44;16618:148;16813:12;16806:20;;-1:-1:-1;;;16806:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:198;;720:2;708:9;699:7;695:23;691:32;688:2;;;741:6;733;726:22;688:2;769:31;790:9;769:31;:::i;811:274::-;;;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:31;1010:9;989:31;:::i;:::-;979:41;;1039:40;1075:2;1064:9;1060:18;1039:40;:::i;:::-;1029:50;;898:187;;;;;:::o;1090:342::-;;;;1236:2;1224:9;1215:7;1211:23;1207:32;1204:2;;;1257:6;1249;1242:22;1204:2;1285:31;1306:9;1285:31;:::i;:::-;1275:41;;1335:40;1371:2;1360:9;1356:18;1335:40;:::i;:::-;1325:50;;1422:2;1411:9;1407:18;1394:32;1384:42;;1194:238;;;;;:::o;1437:702::-;;;;;1609:3;1597:9;1588:7;1584:23;1580:33;1577:2;;;1631:6;1623;1616:22;1577:2;1659:31;1680:9;1659:31;:::i;:::-;1649:41;;1709:40;1745:2;1734:9;1730:18;1709:40;:::i;:::-;1699:50;;1796:2;1785:9;1781:18;1768:32;1758:42;;1851:2;1840:9;1836:18;1823:32;1878:18;1870:6;1867:30;1864:2;;;1915:6;1907;1900:22;1864:2;1943:22;;1996:4;1988:13;;1984:27;-1:-1:-1;1974:2:1;;2030:6;2022;2015:22;1974:2;2058:75;2125:7;2120:2;2107:16;2102:2;2098;2094:11;2058:75;:::i;:::-;2048:85;;;1567:572;;;;;;;:::o;2144:369::-;;;2270:2;2258:9;2249:7;2245:23;2241:32;2238:2;;;2291:6;2283;2276:22;2238:2;2319:31;2340:9;2319:31;:::i;:::-;2309:41;;2400:2;2389:9;2385:18;2372:32;2447:5;2440:13;2433:21;2426:5;2423:32;2413:2;;2474:6;2466;2459:22;2413:2;2502:5;2492:15;;;2228:285;;;;;:::o;2518:266::-;;;2647:2;2635:9;2626:7;2622:23;2618:32;2615:2;;;2668:6;2660;2653:22;2615:2;2696:31;2717:9;2696:31;:::i;:::-;2686:41;2774:2;2759:18;;;;2746:32;;-1:-1:-1;;;2605:179:1:o;2789:1002::-;;2904:2;2947;2935:9;2926:7;2922:23;2918:32;2915:2;;;2968:6;2960;2953:22;2915:2;3013:9;3000:23;3042:18;3083:2;3075:6;3072:14;3069:2;;;3104:6;3096;3089:22;3069:2;3147:6;3136:9;3132:22;3122:32;;3192:7;3185:4;3181:2;3177:13;3173:27;3163:2;;3219:6;3211;3204:22;3163:2;3260;3247:16;3282:2;3278;3275:10;3272:2;;;3288:18;;:::i;:::-;3335:2;3331;3327:11;3317:21;;3358:27;3381:2;3377;3373:11;3358:27;:::i;:::-;3419:15;;;3450:12;;;;3482:11;;;3512;;;3508:20;;3505:33;-1:-1:-1;3502:2:1;;;3556:6;3548;3541:22;3502:2;3583:6;3574:15;;3598:163;3612:2;3609:1;3606:9;3598:163;;;3669:17;;3657:30;;3630:1;3623:9;;;;;3707:12;;;;3739;;3598:163;;;-1:-1:-1;3780:5:1;2884:907;-1:-1:-1;;;;;;;;2884:907:1:o;3796:257::-;;3907:2;3895:9;3886:7;3882:23;3878:32;3875:2;;;3928:6;3920;3913:22;3875:2;3972:9;3959:23;3991:32;4017:5;3991:32;:::i;4058:261::-;;4180:2;4168:9;4159:7;4155:23;4151:32;4148:2;;;4201:6;4193;4186:22;4148:2;4238:9;4232:16;4257:32;4283:5;4257:32;:::i;4324:482::-;;4446:2;4434:9;4425:7;4421:23;4417:32;4414:2;;;4467:6;4459;4452:22;4414:2;4512:9;4499:23;4545:18;4537:6;4534:30;4531:2;;;4582:6;4574;4567:22;4531:2;4610:22;;4663:4;4655:13;;4651:27;-1:-1:-1;4641:2:1;;4697:6;4689;4682:22;4641:2;4725:75;4792:7;4787:2;4774:16;4769:2;4765;4761:11;4725:75;:::i;4811:190::-;;4923:2;4911:9;4902:7;4898:23;4894:32;4891:2;;;4944:6;4936;4929:22;4891:2;-1:-1:-1;4972:23:1;;4881:120;-1:-1:-1;4881:120:1:o;5006:289::-;;5116:2;5104:9;5095:7;5091:23;5087:32;5084:2;;;5137:6;5129;5122:22;5084:2;5181:9;5168:23;5231:4;5224:5;5220:16;5213:5;5210:27;5200:2;;5256:6;5248;5241:22;5300:259;;5381:5;5375:12;5408:6;5403:3;5396:19;5424:63;5480:6;5473:4;5468:3;5464:14;5457:4;5450:5;5446:16;5424:63;:::i;:::-;5541:2;5520:15;-1:-1:-1;;5516:29:1;5507:39;;;;5548:4;5503:50;;5351:208;-1:-1:-1;;5351:208:1:o;5564:274::-;;5731:6;5725:13;5747:53;5793:6;5788:3;5781:4;5773:6;5769:17;5747:53;:::i;:::-;5816:16;;;;;5701:137;-1:-1:-1;;5701:137:1:o;5843:750::-;;-1:-1:-1;;;6249:3:1;6242:22;6293:6;6287:13;6309:61;6363:6;6359:1;6354:3;6350:11;6343:4;6335:6;6331:17;6309:61;:::i;:::-;-1:-1:-1;;;6429:1:1;6389:16;;;6421:10;;;6414:23;6462:13;;6484:62;6462:13;6533:1;6525:10;;6518:4;6506:17;;6484:62;:::i;:::-;6566:17;6585:1;6562:25;;6232:361;-1:-1:-1;;;;6232:361:1:o;6598:203::-;-1:-1:-1;;;;;6762:32:1;;;;6744:51;;6732:2;6717:18;;6699:102::o;6806:506::-;-1:-1:-1;;;;;7091:15:1;;;7073:34;;7143:15;;7138:2;7123:18;;7116:43;7190:2;7175:18;;7168:34;;;7238:3;7233:2;7218:18;;7211:31;;;6806:506;;7259:47;;7286:19;;7278:6;7259:47;:::i;:::-;7251:55;7025:287;-1:-1:-1;;;;;;7025:287:1:o;7317:187::-;7482:14;;7475:22;7457:41;;7445:2;7430:18;;7412:92::o;7509:221::-;;7658:2;7647:9;7640:21;7678:46;7720:2;7709:9;7705:18;7697:6;7678:46;:::i;7735:326::-;7937:2;7919:21;;;7976:1;7956:18;;;7949:29;-1:-1:-1;;;8009:2:1;7994:18;;7987:33;8052:2;8037:18;;7909:152::o;8066:325::-;8268:2;8250:21;;;8307:1;8287:18;;;8280:29;-1:-1:-1;;;8340:2:1;8325:18;;8318:32;8382:2;8367:18;;8240:151::o;8396:325::-;8598:2;8580:21;;;8637:1;8617:18;;;8610:29;-1:-1:-1;;;8670:2:1;8655:18;;8648:32;8712:2;8697:18;;8570:151::o;8726:326::-;8928:2;8910:21;;;8967:1;8947:18;;;8940:29;-1:-1:-1;;;9000:2:1;8985:18;;8978:33;9043:2;9028:18;;8900:152::o;9057:326::-;9259:2;9241:21;;;9298:1;9278:18;;;9271:29;-1:-1:-1;;;9331:2:1;9316:18;;9309:33;9374:2;9359:18;;9231:152::o;9388:326::-;9590:2;9572:21;;;9629:1;9609:18;;;9602:29;-1:-1:-1;;;9662:2:1;9647:18;;9640:33;9705:2;9690:18;;9562:152::o;9719:326::-;9921:2;9903:21;;;9960:1;9940:18;;;9933:29;-1:-1:-1;;;9993:2:1;9978:18;;9971:33;10036:2;10021:18;;9893:152::o;10050:326::-;10252:2;10234:21;;;10291:1;10271:18;;;10264:29;-1:-1:-1;;;10324:2:1;10309:18;;10302:33;10367:2;10352:18;;10224:152::o;10381:326::-;10583:2;10565:21;;;10622:1;10602:18;;;10595:29;-1:-1:-1;;;10655:2:1;10640:18;;10633:33;10698:2;10683:18;;10555:152::o;10712:326::-;10914:2;10896:21;;;10953:1;10933:18;;;10926:29;-1:-1:-1;;;10986:2:1;10971:18;;10964:33;11029:2;11014:18;;10886:152::o;11043:326::-;11245:2;11227:21;;;11284:1;11264:18;;;11257:29;-1:-1:-1;;;11317:2:1;11302:18;;11295:33;11360:2;11345:18;;11217:152::o;11374:326::-;11576:2;11558:21;;;11615:1;11595:18;;;11588:29;-1:-1:-1;;;11648:2:1;11633:18;;11626:33;11691:2;11676:18;;11548:152::o;11705:325::-;11907:2;11889:21;;;11946:1;11926:18;;;11919:29;-1:-1:-1;;;11979:2:1;11964:18;;11957:32;12021:2;12006:18;;11879:151::o;12035:326::-;12237:2;12219:21;;;12276:1;12256:18;;;12249:29;-1:-1:-1;;;12309:2:1;12294:18;;12287:33;12352:2;12337:18;;12209:152::o;12366:326::-;12568:2;12550:21;;;12607:1;12587:18;;;12580:29;-1:-1:-1;;;12640:2:1;12625:18;;12618:33;12683:2;12668:18;;12540:152::o;12697:326::-;12899:2;12881:21;;;12938:1;12918:18;;;12911:29;-1:-1:-1;;;12971:2:1;12956:18;;12949:33;13014:2;12999:18;;12871:152::o;13028:326::-;13230:2;13212:21;;;13269:1;13249:18;;;13242:29;-1:-1:-1;;;13302:2:1;13287:18;;13280:33;13345:2;13330:18;;13202:152::o;13359:326::-;13561:2;13543:21;;;13600:1;13580:18;;;13573:29;-1:-1:-1;;;13633:2:1;13618:18;;13611:33;13676:2;13661:18;;13533:152::o;13690:326::-;13892:2;13874:21;;;13931:1;13911:18;;;13904:29;-1:-1:-1;;;13964:2:1;13949:18;;13942:33;14007:2;13992:18;;13864:152::o;14021:325::-;14223:2;14205:21;;;14262:1;14242:18;;;14235:29;-1:-1:-1;;;14295:2:1;14280:18;;14273:32;14337:2;14322:18;;14195:151::o;14351:326::-;14553:2;14535:21;;;14592:1;14572:18;;;14565:29;-1:-1:-1;;;14625:2:1;14610:18;;14603:33;14668:2;14653:18;;14525:152::o;14682:326::-;14884:2;14866:21;;;14923:1;14903:18;;;14896:29;-1:-1:-1;;;14956:2:1;14941:18;;14934:33;14999:2;14984:18;;14856:152::o;15013:326::-;15215:2;15197:21;;;15254:1;15234:18;;;15227:29;-1:-1:-1;;;15287:2:1;15272:18;;15265:33;15330:2;15315:18;;15187:152::o;15344:326::-;15546:2;15528:21;;;15585:1;15565:18;;;15558:29;-1:-1:-1;;;15618:2:1;15603:18;;15596:33;15661:2;15646:18;;15518:152::o;15675:326::-;15877:2;15859:21;;;15916:1;15896:18;;;15889:29;-1:-1:-1;;;15949:2:1;15934:18;;15927:33;15992:2;15977:18;;15849:152::o;16006:325::-;16208:2;16190:21;;;16247:1;16227:18;;;16220:29;-1:-1:-1;;;16280:2:1;16265:18;;16258:32;16322:2;16307:18;;16180:151::o;16336:326::-;16538:2;16520:21;;;16577:1;16557:18;;;16550:29;-1:-1:-1;;;16610:2:1;16595:18;;16588:33;16653:2;16638:18;;16510:152::o;16667:177::-;16813:25;;;16801:2;16786:18;;16768:76::o;16849:184::-;17021:4;17009:17;;;;16991:36;;16979:2;16964:18;;16946:87::o;17038:251::-;17108:2;17102:9;17138:17;;;17185:18;17170:34;;17206:22;;;17167:62;17164:2;;;17232:18;;:::i;:::-;17268:2;17261:22;17082:207;;-1:-1:-1;17082:207:1:o;17294:128::-;;17365:1;17361:6;17358:1;17355:13;17352:2;;;17371:18;;:::i;:::-;-1:-1:-1;17407:9:1;;17342:80::o;17427:120::-;;17493:1;17483:2;;17498:18;;:::i;:::-;-1:-1:-1;17532:9:1;;17473:74::o;17552:168::-;;17658:1;17654;17650:6;17646:14;17643:1;17640:21;17635:1;17628:9;17621:17;17617:45;17614:2;;;17665:18;;:::i;:::-;-1:-1:-1;17705:9:1;;17604:116::o;17725:125::-;;17793:1;17790;17787:8;17784:2;;;17798:18;;:::i;:::-;-1:-1:-1;17835:9:1;;17774:76::o;17855:258::-;17927:1;17937:113;17951:6;17948:1;17945:13;17937:113;;;18027:11;;;18021:18;18008:11;;;18001:39;17973:2;17966:10;17937:113;;;18068:6;18065:1;18062:13;18059:2;;;-1:-1:-1;;18103:1:1;18085:16;;18078:27;17908:205::o;18118:136::-;;18185:5;18175:2;;18194:18;;:::i;:::-;-1:-1:-1;;;18230:18:1;;18165:89::o;18259:380::-;18344:1;18334:12;;18391:1;18381:12;;;18402:2;;18456:4;18448:6;18444:17;18434:27;;18402:2;18509;18501:6;18498:14;18478:18;18475:38;18472:2;;;18555:10;18550:3;18546:20;18543:1;18536:31;18590:4;18587:1;18580:15;18618:4;18615:1;18608:15;18472:2;;18314:325;;;:::o;18644:135::-;;-1:-1:-1;;18704:17:1;;18701:2;;;18724:18;;:::i;:::-;-1:-1:-1;18771:1:1;18760:13;;18691:88::o;18784:112::-;;18842:1;18832:2;;18847:18;;:::i;:::-;-1:-1:-1;18881:9:1;;18822:74::o;18901:127::-;18962:10;18957:3;18953:20;18950:1;18943:31;18993:4;18990:1;18983:15;19017:4;19014:1;19007:15;19033:127;19094:10;19089:3;19085:20;19082:1;19075:31;19125:4;19122:1;19115:15;19149:4;19146:1;19139:15;19165:127;19226:10;19221:3;19217:20;19214:1;19207:31;19257:4;19254:1;19247:15;19281:4;19278:1;19271:15;19297:133;-1:-1:-1;;;;;;19373:32:1;;19363:43;;19353:2;;19420:1;19417;19410:12

Swarm Source

ipfs://41732cc10dbcf6268fa726ee1c8d701425a493f6d11f28c2952816f504f6e45c
Loading...
Loading
Loading...
Loading
[ 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.