ETH Price: $3,501.65 (+2.99%)
Gas: 12 Gwei

Token

The Money Frog NFTs (Froggys)
 

Overview

Max Total Supply

8 Froggys

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 Froggys
0x69348ea5145daf9c6713f95a88810a26a9d1887b
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:
TMF_NFT

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity Multiple files format)

File 18 of 18: TMF_NFT.sol
//SPDX-License-Identifier: Copyright The Money Frog
pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./ERC721Pausable.sol";
import "./ERC721URIStorage.sol";
import "./Context.sol";
import "./Strings.sol";
import "./Counters.sol";

interface INFTContract {
    function getMaxSupply() external view returns (uint max);
    function getMinted() external view returns (uint minted);
    function getMintPrice() external view returns (uint mintPrice);
    function recoverETH () external;
    function mintMany(uint256 quantity) external payable;
    function setMintingEnabled(bool Allowed) external;

}


abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

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


/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - token ID and URI autogenerationA
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract TMF_NFT is Context, Ownable, ERC721Enumerable, ERC721URIStorage, INFTContract {
  using Counters for Counters.Counter;
  
  Counters.Counter public _tokenIdTracker;

  string private _baseTokenURI = "https://bafybeiaeownr6kwelf7tu2gdc6jqsge364kemanszulbgoa6kdhf3ceyny.ipfs.nftstorage.link/";
  string public _contractMeta = "https://bafkreidaz36rqnwhejcs5hpyzmjovuytdb4zdwjjqjt264mkkd5q5ilwqq.ipfs.nftstorage.link/";
 
  uint private _tokenPrice = 33000000000000000; // 0.033 ETH
  uint public maxSupply = 333;

  bool public canMint = false;

  address public marketingWallet = 0xC2bc6Ec9f8F81319AB82Cc9DB016E490b683335d;

  mapping (uint256 => address ) public creator;

  constructor() ERC721("The Money Frog NFTs", "Froggys") { }

  receive () external payable {
     payable(marketingWallet).transfer(msg.value);
     
  }

  function setMarketingWallet(address _marketingWallet) public onlyOwner {
    marketingWallet = _marketingWallet;
  }

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

  function SetcontractURI(string calldata URI) external onlyOwner {
        _contractMeta = URI;
  }

  function SetMintPrice(uint256 _mintPrice) external  onlyOwner {
        _tokenPrice = _mintPrice;
  }

  function getMinted() external view override returns (uint minted){
    return _tokenIdTracker.current()-1;
  }

  function getMaxSupply() external view override returns (uint max){
    return maxSupply;
  }

  function getMintPrice() external view override returns (uint mintPrice){
    return _tokenPrice;
  }

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

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

  function setTokenURI(uint256 tokenId, string memory _tokenURI) external onlyOwner {
    _setTokenURI(tokenId, _tokenURI);
  }

  function setMintingEnabled(bool Allowed) external override onlyOwner {
    canMint = Allowed;
  }
 
   function mint() external payable {
    require(canMint, "TMF: minting currently disabled");
    require(msg.value >= (_tokenPrice), "TMF: must send correct price");
    require((_tokenIdTracker.current()) <= maxSupply, "TMF: all NFTs have been minted");

    _mint(msg.sender, _tokenIdTracker.current());
    creator[_tokenIdTracker.current()] = msg.sender;
          _setTokenURI(_tokenIdTracker.current(), string(abi.encodePacked(Strings.toString(_tokenIdTracker.current()), ".json")));
    _tokenIdTracker.increment();
    splitBalance(1);
  }

  function mintMany(uint256 quantity) external payable override {
    require(canMint, "TMF: minting currently disabled");
    require(msg.value >= (quantity * _tokenPrice), "TMF: must send correct price");
    require((_tokenIdTracker.current() + quantity) <= maxSupply, "TMF: all NFTs have been minted");

    for(uint i = 0; i < quantity; i++){
      _mint(msg.sender, _tokenIdTracker.current());
      creator[_tokenIdTracker.current()] = msg.sender;
      _setTokenURI(_tokenIdTracker.current(), string(abi.encodePacked(Strings.toString(_tokenIdTracker.current()), ".json")));
      _tokenIdTracker.increment();
    }
    splitBalance(quantity);
  }
  
  function mintMultiples(address[] calldata recipients) public onlyOwner {

    for (uint256 i = 0; i < recipients.length; i++){
      _mint(recipients[i], _tokenIdTracker.current());
      creator[_tokenIdTracker.current()] = recipients[i];
      _setTokenURI(_tokenIdTracker.current(), string(abi.encodePacked(Strings.toString(_tokenIdTracker.current()), ".json")));
      _tokenIdTracker.increment();
    }
  }

  function NftCreator(uint256 tokenId) public view returns(address){
    return creator[tokenId];
  }

  function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) {
    return ERC721URIStorage._burn(tokenId);
  }

  function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
    return ERC721URIStorage.tokenURI(tokenId);
  }
  
  function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) {
  
    super._beforeTokenTransfer(from, to, tokenId);
  }

  /**
    * @dev See {IERC165-supportsInterface}.
    */
  function supportsInterface(bytes4 interfaceId) public view virtual override( ERC721, ERC721Enumerable) returns (bool) {
    return super.supportsInterface(interfaceId);
  }

  function recoverETH () external override onlyOwner {
    // make sure we capture all ETH that may or may not be sent to this contract
    payable(msg.sender).transfer(address(this).balance);
  }

  function splitBalance(uint256 amount) private {
      uint totalETH = amount * _tokenPrice; // get the total token price to sell for reflection purchases

      payable(marketingWallet).transfer(totalETH);

  }


}

File 1 of 18: Address.sol
// SPDX-License-Identifier: MIT

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, "Address: low-level call failed");
    }

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

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

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

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

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

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(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 2 of 18: 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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 3 of 18: Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

File 4 of 18: EnumerableSet.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

File 5 of 18: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";


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

File 6 of 18: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` 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 7 of 18: ERC721Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

File 8 of 18: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 9 of 18: ERC721Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Pausable.sol";

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

File 10 of 18: ERC721URIStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";

/**
 * @dev ERC721 token with storage based token uri management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

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

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

        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));
        }

        return super.tokenURI(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), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

File 11 of 18: IERC165.sol
// SPDX-License-Identifier: MIT

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 12 of 18: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 13 of 18: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 14 of 18: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 15 of 18: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 16 of 18: Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 17 of 18: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NftCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"SetMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"SetcontractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_contractMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","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":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinted","outputs":[{"internalType":"uint256","name":"minted","type":"uint256"}],"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":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"mintMultiples","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":[{"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":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"Allowed","type":"bool"}],"name":"setMintingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610100604052605960808181529062002d9b60a039600d9062000023908262000223565b5060405180608001604052806059815260200162002df460599139600e906200004d908262000223565b5066753d533d968000600f5561014d601055601180546001600160a81b03191674c2bc6ec9f8f81319ab82cc9db016e490b683335d001790553480156200009357600080fd5b506040518060400160405280601381526020017f546865204d6f6e65792046726f67204e465473000000000000000000000000008152506040518060400160405280600781526020016646726f6767797360c81b81525062000104620000fe6200012a60201b60201c565b6200012e565b600162000112838262000223565b50600262000121828262000223565b505050620002ef565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001a957607f821691505b602082108103620001ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021e57600081815260208120601f850160051c81016020861015620001f95750805b601f850160051c820191505b818110156200021a5782815560010162000205565b5050505b505050565b81516001600160401b038111156200023f576200023f6200017e565b620002578162000250845462000194565b84620001d0565b602080601f8311600181146200028f5760008415620002765750858301515b600019600386901b1c1916600185901b1785556200021a565b600085815260208120601f198616915b82811015620002c0578886015182559484019460019091019084016200029f565b5085821015620002df5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612a9c80620002ff6000396000f3fe60806040526004361061023f5760003560e01c80635d098b381161012e578063a7f93ebd116100ab578063c87b56dd1161006f578063c87b56dd146106c7578063d5abeb01146106e7578063e8a3d485146106fd578063e985e9c514610712578063f2fde38b1461075b57600080fd5b8063a7f93ebd1461062d578063ac72200d14610642578063b753081914610657578063b88d4fde1461068d578063beb9716d146106ad57600080fd5b806375f0a874116100f257806375f0a8741461059e5780638da5cb5b146105c357806395d89b41146105e157806398bcede9146105f6578063a22cb4651461060d57600080fd5b80635d098b38146105095780636352211e14610529578063653088cf1461054957806370a0823114610569578063715018a61461058957600080fd5b80631e1a1e76116101bc5780634c0f38c2116101805780634c0f38c21461045e5780634ea3871a146104735780634f6ccce714610493578063510b5158146104b357806355f804b3146104e957600080fd5b80631e1a1e76146103c957806323b872dd146103e95780632f745c591461040957806342842e0e1461042957806343e61a411461044957600080fd5b8063081812fc11610203578063081812fc1461032a578063095ea7b3146103625780631249c58b14610382578063162094c41461038a57806318160ddd146103aa57600080fd5b806301ffc9a71461028b57806302ebcb79146102c0578063059513a6146102e05780630614117a146102f357806306fdde031461030857600080fd5b36610286576011546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f19350505050158015610284573d6000803e3d6000fd5b005b600080fd5b34801561029757600080fd5b506102ab6102a63660046121c6565b61077b565b60405190151581526020015b60405180910390f35b3480156102cc57600080fd5b506102846102db3660046121e3565b61078c565b6102846102ee3660046121e3565b6107c4565b3480156102ff57600080fd5b506102846109a7565b34801561031457600080fd5b5061031d6109fd565b6040516102b7919061224c565b34801561033657600080fd5b5061034a6103453660046121e3565b610a8f565b6040516001600160a01b0390911681526020016102b7565b34801561036e57600080fd5b5061028461037d36600461227b565b610b17565b610284610c2c565b34801561039657600080fd5b506102846103a5366004612351565b610da1565b3480156103b657600080fd5b506009545b6040519081526020016102b7565b3480156103d557600080fd5b506102846103e4366004612398565b610dd9565b3480156103f557600080fd5b5061028461040436600461240d565b610ed6565b34801561041557600080fd5b506103bb61042436600461227b565b610f07565b34801561043557600080fd5b5061028461044436600461240d565b610f9d565b34801561045557600080fd5b5061031d610fb8565b34801561046a57600080fd5b506010546103bb565b34801561047f57600080fd5b5061028461048e366004612459565b611046565b34801561049f57600080fd5b506103bb6104ae3660046121e3565b611083565b3480156104bf57600080fd5b5061034a6104ce3660046121e3565b6012602052600090815260409020546001600160a01b031681565b3480156104f557600080fd5b50610284610504366004612474565b611116565b34801561051557600080fd5b506102846105243660046124a9565b61114c565b34801561053557600080fd5b5061034a6105443660046121e3565b61119e565b34801561055557600080fd5b506102846105643660046124c4565b611215565b34801561057557600080fd5b506103bb6105843660046124a9565b61124c565b34801561059557600080fd5b506102846112d3565b3480156105aa57600080fd5b5060115461034a9061010090046001600160a01b031681565b3480156105cf57600080fd5b506000546001600160a01b031661034a565b3480156105ed57600080fd5b5061031d611307565b34801561060257600080fd5b50600c546103bb9081565b34801561061957600080fd5b50610284610628366004612524565b611316565b34801561063957600080fd5b50600f546103bb565b34801561064e57600080fd5b506103bb6113da565b34801561066357600080fd5b5061034a6106723660046121e3565b6000908152601260205260409020546001600160a01b031690565b34801561069957600080fd5b506102846106a8366004612557565b6113f7565b3480156106b957600080fd5b506011546102ab9060ff1681565b3480156106d357600080fd5b5061031d6106e23660046121e3565b61142f565b3480156106f357600080fd5b506103bb60105481565b34801561070957600080fd5b5061031d61143a565b34801561071e57600080fd5b506102ab61072d3660046125d3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561076757600080fd5b506102846107763660046124a9565b611449565b6000610786826114e1565b92915050565b6000546001600160a01b031633146107bf5760405162461bcd60e51b81526004016107b6906125fd565b60405180910390fd5b600f55565b60115460ff166108165760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f546108239082612648565b3410156108725760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b60105481610880600c611506565b61088a919061265f565b11156108d85760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b60005b8181101561099a576108f6336108f1600c611506565b611516565b3360126000610905600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061097a610944600c611506565b610956610951600c611506565b611655565b6040516020016109669190612672565b60405160208183030381529060405261175e565b610988600c80546001019055565b806109928161269b565b9150506108db565b506109a4816117e2565b50565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526004016107b6906125fd565b60405133904780156108fc02916000818181858888f193505050501580156109a4573d6000803e3d6000fd5b606060018054610a0c906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a38906126b4565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b5050505050905090565b6000610a9a82611832565b610afb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b506000908152600560205260409020546001600160a01b031690565b6000610b228261119e565b9050806001600160a01b0316836001600160a01b031603610b8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b6565b336001600160a01b0382161480610bab5750610bab813361072d565b610c1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b6565b610c27838361184f565b505050565b60115460ff16610c7e5760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f54341015610cd05760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b601054610cdd600c611506565b1115610d2b5760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b610d39336108f1600c611506565b3360126000610d48600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610d87610944600c611506565b610d95600c80546001019055565b610d9f60016117e2565b565b6000546001600160a01b03163314610dcb5760405162461bcd60e51b81526004016107b6906125fd565b610dd5828261175e565b5050565b6000546001600160a01b03163314610e035760405162461bcd60e51b81526004016107b6906125fd565b60005b81811015610c2757610e42838383818110610e2357610e236126ee565b9050602002016020810190610e3891906124a9565b6108f1600c611506565b828282818110610e5457610e546126ee565b9050602002016020810190610e6991906124a9565b60126000610e77600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610eb6610944600c611506565b610ec4600c80546001019055565b80610ece8161269b565b915050610e06565b610ee033826118bd565b610efc5760405162461bcd60e51b81526004016107b690612704565b610c278383836119a3565b6000610f128361124c565b8210610f745760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b6565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b610c27838383604051806020016040528060008152506113f7565b600e8054610fc5906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff1906126b4565b801561103e5780601f106110135761010080835404028352916020019161103e565b820191906000526020600020905b81548152906001019060200180831161102157829003601f168201915b505050505081565b6000546001600160a01b031633146110705760405162461bcd60e51b81526004016107b6906125fd565b6011805460ff1916911515919091179055565b600061108e60095490565b82106110f15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b6565b60098281548110611104576111046126ee565b90600052602060002001549050919050565b6000546001600160a01b031633146111405760405162461bcd60e51b81526004016107b6906125fd565b600d610dd582826127a3565b6000546001600160a01b031633146111765760405162461bcd60e51b81526004016107b6906125fd565b601180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600360205260408120546001600160a01b0316806107865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b6565b6000546001600160a01b0316331461123f5760405162461bcd60e51b81526004016107b6906125fd565b600e610c27828483612863565b60006001600160a01b0382166112b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b6565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146112fd5760405162461bcd60e51b81526004016107b6906125fd565b610d9f6000611b4e565b606060028054610a0c906126b4565b336001600160a01b0383160361136e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600060016113e8600c611506565b6113f29190612924565b905090565b61140133836118bd565b61141d5760405162461bcd60e51b81526004016107b690612704565b61142984848484611b9e565b50505050565b606061078682611bd1565b6060600e8054610a0c906126b4565b6000546001600160a01b031633146114735760405162461bcd60e51b81526004016107b6906125fd565b6001600160a01b0381166114d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b6565b6109a481611b4e565b60006001600160e01b0319821663780e9d6360e01b1480610786575061078682611d32565b805460009061078690600161265f565b6001600160a01b03821661156c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b6565b61157581611832565b156115c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b6565b6115ce60008383611d82565b6001600160a01b03821660009081526004602052604081208054600192906115f790849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608160000361167c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116a657806116908161269b565b915061169f9050600a8361294d565b9150611680565b60008167ffffffffffffffff8111156116c1576116c16122a5565b6040519080825280601f01601f1916602001820160405280156116eb576020820181803683370190505b5090505b841561175657611700600183612924565b915061170d600a86612961565b61171890603061265f565b60f81b81838151811061172d5761172d6126ee565b60200101906001600160f81b031916908160001a90535061174f600a8661294d565b94506116ef565b949350505050565b61176782611832565b6117ca5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016107b6565b6000828152600b60205260409020610c2782826127a3565b6000600f54826117f29190612648565b60115460405191925061010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015610c27573d6000803e3d6000fd5b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118848261119e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118c882611832565b6119295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b60006119348361119e565b9050806001600160a01b0316846001600160a01b0316148061196f5750836001600160a01b031661196484610a8f565b6001600160a01b0316145b8061175657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16611756565b826001600160a01b03166119b68261119e565b6001600160a01b031614611a1e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b6565b6001600160a01b038216611a805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b6565b611a8b838383611d82565b611a9660008261184f565b6001600160a01b0383166000908152600460205260408120805460019290611abf908490612924565b90915550506001600160a01b0382166000908152600460205260408120805460019290611aed90849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ba98484846119a3565b611bb584848484611d8d565b6114295760405162461bcd60e51b81526004016107b690612975565b6060611bdc82611832565b611c425760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107b6565b6000828152600b602052604081208054611c5b906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c87906126b4565b8015611cd45780601f10611ca957610100808354040283529160200191611cd4565b820191906000526020600020905b815481529060010190602001808311611cb757829003601f168201915b505050505090506000611ce5611e8e565b90508051600003611cf7575092915050565b815115611d29578082604051602001611d119291906129c7565b60405160208183030381529060405292505050919050565b61175684611e9d565b60006001600160e01b031982166380ac58cd60e01b1480611d6357506001600160e01b03198216635b5e139f60e01b145b8061078657506301ffc9a760e01b6001600160e01b0319831614610786565b610c27838383611f68565b60006001600160a01b0384163b15611e8357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dd19033908990889088906004016129f6565b6020604051808303816000875af1925050508015611e0c575060408051601f3d908101601f19168201909252611e0991810190612a33565b60015b611e69573d808015611e3a576040519150601f19603f3d011682016040523d82523d6000602084013e611e3f565b606091505b508051600003611e615760405162461bcd60e51b81526004016107b690612975565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611756565b506001949350505050565b6060600d8054610a0c906126b4565b6060611ea882611832565b611f0c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b6565b6000611f16611e8e565b90506000815111611f365760405180602001604052806000815250611f61565b80611f4084611655565b604051602001611f519291906129c7565b6040516020818303038152906040525b9392505050565b6001600160a01b038316611fc357611fbe81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611fe6565b816001600160a01b0316836001600160a01b031614611fe657611fe68382612020565b6001600160a01b038216611ffd57610c27816120bd565b826001600160a01b0316826001600160a01b031614610c2757610c27828261216c565b6000600161202d8461124c565b6120379190612924565b60008381526008602052604090205490915080821461208a576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906120cf90600190612924565b6000838152600a6020526040812054600980549394509092849081106120f7576120f76126ee565b906000526020600020015490508060098381548110612118576121186126ee565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061215057612150612a50565b6001900381819060005260206000200160009055905550505050565b60006121778361124c565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160e01b0319811681146109a457600080fd5b6000602082840312156121d857600080fd5b8135611f61816121b0565b6000602082840312156121f557600080fd5b5035919050565b60005b838110156122175781810151838201526020016121ff565b50506000910152565b600081518084526122388160208601602086016121fc565b601f01601f19169290920160200192915050565b602081526000611f616020830184612220565b80356001600160a01b038116811461227657600080fd5b919050565b6000806040838503121561228e57600080fd5b6122978361225f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122d6576122d66122a5565b604051601f8501601f19908116603f011681019082821181831017156122fe576122fe6122a5565b8160405280935085815286868601111561231757600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261234257600080fd5b611f61838335602085016122bb565b6000806040838503121561236457600080fd5b82359150602083013567ffffffffffffffff81111561238257600080fd5b61238e85828601612331565b9150509250929050565b600080602083850312156123ab57600080fd5b823567ffffffffffffffff808211156123c357600080fd5b818501915085601f8301126123d757600080fd5b8135818111156123e657600080fd5b8660208260051b85010111156123fb57600080fd5b60209290920196919550909350505050565b60008060006060848603121561242257600080fd5b61242b8461225f565b92506124396020850161225f565b9150604084013590509250925092565b8035801515811461227657600080fd5b60006020828403121561246b57600080fd5b611f6182612449565b60006020828403121561248657600080fd5b813567ffffffffffffffff81111561249d57600080fd5b61175684828501612331565b6000602082840312156124bb57600080fd5b611f618261225f565b600080602083850312156124d757600080fd5b823567ffffffffffffffff808211156124ef57600080fd5b818501915085601f83011261250357600080fd5b81358181111561251257600080fd5b8660208285010111156123fb57600080fd5b6000806040838503121561253757600080fd5b6125408361225f565b915061254e60208401612449565b90509250929050565b6000806000806080858703121561256d57600080fd5b6125768561225f565b93506125846020860161225f565b925060408501359150606085013567ffffffffffffffff8111156125a757600080fd5b8501601f810187136125b857600080fd5b6125c7878235602084016122bb565b91505092959194509250565b600080604083850312156125e657600080fd5b6125ef8361225f565b915061254e6020840161225f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761078657610786612632565b8082018082111561078657610786612632565b600082516126848184602087016121fc565b64173539b7b760d91b920191825250600501919050565b6000600182016126ad576126ad612632565b5060010190565b600181811c908216806126c857607f821691505b6020821081036126e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b601f821115610c2757600081815260208120601f850160051c8101602086101561277c5750805b601f850160051c820191505b8181101561279b57828155600101612788565b505050505050565b815167ffffffffffffffff8111156127bd576127bd6122a5565b6127d1816127cb84546126b4565b84612755565b602080601f83116001811461280657600084156127ee5750858301515b600019600386901b1c1916600185901b17855561279b565b600085815260208120601f198616915b8281101561283557888601518255948401946001909101908401612816565b50858210156128535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83111561287b5761287b6122a5565b61288f8361288983546126b4565b83612755565b6000601f8411600181146128c357600085156128ab5750838201355b600019600387901b1c1916600186901b17835561291d565b600083815260209020601f19861690835b828110156128f457868501358255602094850194600190920191016128d4565b50868210156129115760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561078657610786612632565b634e487b7160e01b600052601260045260246000fd5b60008261295c5761295c612937565b500490565b60008261297057612970612937565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516129d98184602088016121fc565b8351908301906129ed8183602088016121fc565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a2990830184612220565b9695505050505050565b600060208284031215612a4557600080fd5b8151611f61816121b0565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e32021caf502e6944cf068ce8ab0d80d818c0197caa44128989193b98babb6ba64736f6c6343000813003368747470733a2f2f6261667962656961656f776e72366b77656c6637747532676463366a717367653336346b656d616e737a756c62676f61366b646866336365796e792e697066732e6e667473746f726167652e6c696e6b2f68747470733a2f2f6261666b72656964617a333672716e7768656a6373356870797a6d6a6f767579746462347a64776a6a716a743236346d6b6b64357135696c7771712e697066732e6e667473746f726167652e6c696e6b2f

Deployed Bytecode

0x60806040526004361061023f5760003560e01c80635d098b381161012e578063a7f93ebd116100ab578063c87b56dd1161006f578063c87b56dd146106c7578063d5abeb01146106e7578063e8a3d485146106fd578063e985e9c514610712578063f2fde38b1461075b57600080fd5b8063a7f93ebd1461062d578063ac72200d14610642578063b753081914610657578063b88d4fde1461068d578063beb9716d146106ad57600080fd5b806375f0a874116100f257806375f0a8741461059e5780638da5cb5b146105c357806395d89b41146105e157806398bcede9146105f6578063a22cb4651461060d57600080fd5b80635d098b38146105095780636352211e14610529578063653088cf1461054957806370a0823114610569578063715018a61461058957600080fd5b80631e1a1e76116101bc5780634c0f38c2116101805780634c0f38c21461045e5780634ea3871a146104735780634f6ccce714610493578063510b5158146104b357806355f804b3146104e957600080fd5b80631e1a1e76146103c957806323b872dd146103e95780632f745c591461040957806342842e0e1461042957806343e61a411461044957600080fd5b8063081812fc11610203578063081812fc1461032a578063095ea7b3146103625780631249c58b14610382578063162094c41461038a57806318160ddd146103aa57600080fd5b806301ffc9a71461028b57806302ebcb79146102c0578063059513a6146102e05780630614117a146102f357806306fdde031461030857600080fd5b36610286576011546040516001600160a01b0361010090920491909116903480156108fc02916000818181858888f19350505050158015610284573d6000803e3d6000fd5b005b600080fd5b34801561029757600080fd5b506102ab6102a63660046121c6565b61077b565b60405190151581526020015b60405180910390f35b3480156102cc57600080fd5b506102846102db3660046121e3565b61078c565b6102846102ee3660046121e3565b6107c4565b3480156102ff57600080fd5b506102846109a7565b34801561031457600080fd5b5061031d6109fd565b6040516102b7919061224c565b34801561033657600080fd5b5061034a6103453660046121e3565b610a8f565b6040516001600160a01b0390911681526020016102b7565b34801561036e57600080fd5b5061028461037d36600461227b565b610b17565b610284610c2c565b34801561039657600080fd5b506102846103a5366004612351565b610da1565b3480156103b657600080fd5b506009545b6040519081526020016102b7565b3480156103d557600080fd5b506102846103e4366004612398565b610dd9565b3480156103f557600080fd5b5061028461040436600461240d565b610ed6565b34801561041557600080fd5b506103bb61042436600461227b565b610f07565b34801561043557600080fd5b5061028461044436600461240d565b610f9d565b34801561045557600080fd5b5061031d610fb8565b34801561046a57600080fd5b506010546103bb565b34801561047f57600080fd5b5061028461048e366004612459565b611046565b34801561049f57600080fd5b506103bb6104ae3660046121e3565b611083565b3480156104bf57600080fd5b5061034a6104ce3660046121e3565b6012602052600090815260409020546001600160a01b031681565b3480156104f557600080fd5b50610284610504366004612474565b611116565b34801561051557600080fd5b506102846105243660046124a9565b61114c565b34801561053557600080fd5b5061034a6105443660046121e3565b61119e565b34801561055557600080fd5b506102846105643660046124c4565b611215565b34801561057557600080fd5b506103bb6105843660046124a9565b61124c565b34801561059557600080fd5b506102846112d3565b3480156105aa57600080fd5b5060115461034a9061010090046001600160a01b031681565b3480156105cf57600080fd5b506000546001600160a01b031661034a565b3480156105ed57600080fd5b5061031d611307565b34801561060257600080fd5b50600c546103bb9081565b34801561061957600080fd5b50610284610628366004612524565b611316565b34801561063957600080fd5b50600f546103bb565b34801561064e57600080fd5b506103bb6113da565b34801561066357600080fd5b5061034a6106723660046121e3565b6000908152601260205260409020546001600160a01b031690565b34801561069957600080fd5b506102846106a8366004612557565b6113f7565b3480156106b957600080fd5b506011546102ab9060ff1681565b3480156106d357600080fd5b5061031d6106e23660046121e3565b61142f565b3480156106f357600080fd5b506103bb60105481565b34801561070957600080fd5b5061031d61143a565b34801561071e57600080fd5b506102ab61072d3660046125d3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561076757600080fd5b506102846107763660046124a9565b611449565b6000610786826114e1565b92915050565b6000546001600160a01b031633146107bf5760405162461bcd60e51b81526004016107b6906125fd565b60405180910390fd5b600f55565b60115460ff166108165760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f546108239082612648565b3410156108725760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b60105481610880600c611506565b61088a919061265f565b11156108d85760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b60005b8181101561099a576108f6336108f1600c611506565b611516565b3360126000610905600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061097a610944600c611506565b610956610951600c611506565b611655565b6040516020016109669190612672565b60405160208183030381529060405261175e565b610988600c80546001019055565b806109928161269b565b9150506108db565b506109a4816117e2565b50565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526004016107b6906125fd565b60405133904780156108fc02916000818181858888f193505050501580156109a4573d6000803e3d6000fd5b606060018054610a0c906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a38906126b4565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b5050505050905090565b6000610a9a82611832565b610afb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b506000908152600560205260409020546001600160a01b031690565b6000610b228261119e565b9050806001600160a01b0316836001600160a01b031603610b8f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b6565b336001600160a01b0382161480610bab5750610bab813361072d565b610c1d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b6565b610c27838361184f565b505050565b60115460ff16610c7e5760405162461bcd60e51b815260206004820152601f60248201527f544d463a206d696e74696e672063757272656e746c792064697361626c65640060448201526064016107b6565b600f54341015610cd05760405162461bcd60e51b815260206004820152601c60248201527f544d463a206d7573742073656e6420636f72726563742070726963650000000060448201526064016107b6565b601054610cdd600c611506565b1115610d2b5760405162461bcd60e51b815260206004820152601e60248201527f544d463a20616c6c204e4654732068617665206265656e206d696e746564000060448201526064016107b6565b610d39336108f1600c611506565b3360126000610d48600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610d87610944600c611506565b610d95600c80546001019055565b610d9f60016117e2565b565b6000546001600160a01b03163314610dcb5760405162461bcd60e51b81526004016107b6906125fd565b610dd5828261175e565b5050565b6000546001600160a01b03163314610e035760405162461bcd60e51b81526004016107b6906125fd565b60005b81811015610c2757610e42838383818110610e2357610e236126ee565b9050602002016020810190610e3891906124a9565b6108f1600c611506565b828282818110610e5457610e546126ee565b9050602002016020810190610e6991906124a9565b60126000610e77600c611506565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550610eb6610944600c611506565b610ec4600c80546001019055565b80610ece8161269b565b915050610e06565b610ee033826118bd565b610efc5760405162461bcd60e51b81526004016107b690612704565b610c278383836119a3565b6000610f128361124c565b8210610f745760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b6565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b610c27838383604051806020016040528060008152506113f7565b600e8054610fc5906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff1906126b4565b801561103e5780601f106110135761010080835404028352916020019161103e565b820191906000526020600020905b81548152906001019060200180831161102157829003601f168201915b505050505081565b6000546001600160a01b031633146110705760405162461bcd60e51b81526004016107b6906125fd565b6011805460ff1916911515919091179055565b600061108e60095490565b82106110f15760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b6565b60098281548110611104576111046126ee565b90600052602060002001549050919050565b6000546001600160a01b031633146111405760405162461bcd60e51b81526004016107b6906125fd565b600d610dd582826127a3565b6000546001600160a01b031633146111765760405162461bcd60e51b81526004016107b6906125fd565b601180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600360205260408120546001600160a01b0316806107865760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b6565b6000546001600160a01b0316331461123f5760405162461bcd60e51b81526004016107b6906125fd565b600e610c27828483612863565b60006001600160a01b0382166112b75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b6565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146112fd5760405162461bcd60e51b81526004016107b6906125fd565b610d9f6000611b4e565b606060028054610a0c906126b4565b336001600160a01b0383160361136e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600060016113e8600c611506565b6113f29190612924565b905090565b61140133836118bd565b61141d5760405162461bcd60e51b81526004016107b690612704565b61142984848484611b9e565b50505050565b606061078682611bd1565b6060600e8054610a0c906126b4565b6000546001600160a01b031633146114735760405162461bcd60e51b81526004016107b6906125fd565b6001600160a01b0381166114d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b6565b6109a481611b4e565b60006001600160e01b0319821663780e9d6360e01b1480610786575061078682611d32565b805460009061078690600161265f565b6001600160a01b03821661156c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b6565b61157581611832565b156115c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b6565b6115ce60008383611d82565b6001600160a01b03821660009081526004602052604081208054600192906115f790849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608160000361167c5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156116a657806116908161269b565b915061169f9050600a8361294d565b9150611680565b60008167ffffffffffffffff8111156116c1576116c16122a5565b6040519080825280601f01601f1916602001820160405280156116eb576020820181803683370190505b5090505b841561175657611700600183612924565b915061170d600a86612961565b61171890603061265f565b60f81b81838151811061172d5761172d6126ee565b60200101906001600160f81b031916908160001a90535061174f600a8661294d565b94506116ef565b949350505050565b61176782611832565b6117ca5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016107b6565b6000828152600b60205260409020610c2782826127a3565b6000600f54826117f29190612648565b60115460405191925061010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015610c27573d6000803e3d6000fd5b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118848261119e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118c882611832565b6119295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b6565b60006119348361119e565b9050806001600160a01b0316846001600160a01b0316148061196f5750836001600160a01b031661196484610a8f565b6001600160a01b0316145b8061175657506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16611756565b826001600160a01b03166119b68261119e565b6001600160a01b031614611a1e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b6565b6001600160a01b038216611a805760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b6565b611a8b838383611d82565b611a9660008261184f565b6001600160a01b0383166000908152600460205260408120805460019290611abf908490612924565b90915550506001600160a01b0382166000908152600460205260408120805460019290611aed90849061265f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611ba98484846119a3565b611bb584848484611d8d565b6114295760405162461bcd60e51b81526004016107b690612975565b6060611bdc82611832565b611c425760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016107b6565b6000828152600b602052604081208054611c5b906126b4565b80601f0160208091040260200160405190810160405280929190818152602001828054611c87906126b4565b8015611cd45780601f10611ca957610100808354040283529160200191611cd4565b820191906000526020600020905b815481529060010190602001808311611cb757829003601f168201915b505050505090506000611ce5611e8e565b90508051600003611cf7575092915050565b815115611d29578082604051602001611d119291906129c7565b60405160208183030381529060405292505050919050565b61175684611e9d565b60006001600160e01b031982166380ac58cd60e01b1480611d6357506001600160e01b03198216635b5e139f60e01b145b8061078657506301ffc9a760e01b6001600160e01b0319831614610786565b610c27838383611f68565b60006001600160a01b0384163b15611e8357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dd19033908990889088906004016129f6565b6020604051808303816000875af1925050508015611e0c575060408051601f3d908101601f19168201909252611e0991810190612a33565b60015b611e69573d808015611e3a576040519150601f19603f3d011682016040523d82523d6000602084013e611e3f565b606091505b508051600003611e615760405162461bcd60e51b81526004016107b690612975565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611756565b506001949350505050565b6060600d8054610a0c906126b4565b6060611ea882611832565b611f0c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b6565b6000611f16611e8e565b90506000815111611f365760405180602001604052806000815250611f61565b80611f4084611655565b604051602001611f519291906129c7565b6040516020818303038152906040525b9392505050565b6001600160a01b038316611fc357611fbe81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b611fe6565b816001600160a01b0316836001600160a01b031614611fe657611fe68382612020565b6001600160a01b038216611ffd57610c27816120bd565b826001600160a01b0316826001600160a01b031614610c2757610c27828261216c565b6000600161202d8461124c565b6120379190612924565b60008381526008602052604090205490915080821461208a576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b6009546000906120cf90600190612924565b6000838152600a6020526040812054600980549394509092849081106120f7576120f76126ee565b906000526020600020015490508060098381548110612118576121186126ee565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061215057612150612a50565b6001900381819060005260206000200160009055905550505050565b60006121778361124c565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6001600160e01b0319811681146109a457600080fd5b6000602082840312156121d857600080fd5b8135611f61816121b0565b6000602082840312156121f557600080fd5b5035919050565b60005b838110156122175781810151838201526020016121ff565b50506000910152565b600081518084526122388160208601602086016121fc565b601f01601f19169290920160200192915050565b602081526000611f616020830184612220565b80356001600160a01b038116811461227657600080fd5b919050565b6000806040838503121561228e57600080fd5b6122978361225f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122d6576122d66122a5565b604051601f8501601f19908116603f011681019082821181831017156122fe576122fe6122a5565b8160405280935085815286868601111561231757600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261234257600080fd5b611f61838335602085016122bb565b6000806040838503121561236457600080fd5b82359150602083013567ffffffffffffffff81111561238257600080fd5b61238e85828601612331565b9150509250929050565b600080602083850312156123ab57600080fd5b823567ffffffffffffffff808211156123c357600080fd5b818501915085601f8301126123d757600080fd5b8135818111156123e657600080fd5b8660208260051b85010111156123fb57600080fd5b60209290920196919550909350505050565b60008060006060848603121561242257600080fd5b61242b8461225f565b92506124396020850161225f565b9150604084013590509250925092565b8035801515811461227657600080fd5b60006020828403121561246b57600080fd5b611f6182612449565b60006020828403121561248657600080fd5b813567ffffffffffffffff81111561249d57600080fd5b61175684828501612331565b6000602082840312156124bb57600080fd5b611f618261225f565b600080602083850312156124d757600080fd5b823567ffffffffffffffff808211156124ef57600080fd5b818501915085601f83011261250357600080fd5b81358181111561251257600080fd5b8660208285010111156123fb57600080fd5b6000806040838503121561253757600080fd5b6125408361225f565b915061254e60208401612449565b90509250929050565b6000806000806080858703121561256d57600080fd5b6125768561225f565b93506125846020860161225f565b925060408501359150606085013567ffffffffffffffff8111156125a757600080fd5b8501601f810187136125b857600080fd5b6125c7878235602084016122bb565b91505092959194509250565b600080604083850312156125e657600080fd5b6125ef8361225f565b915061254e6020840161225f565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761078657610786612632565b8082018082111561078657610786612632565b600082516126848184602087016121fc565b64173539b7b760d91b920191825250600501919050565b6000600182016126ad576126ad612632565b5060010190565b600181811c908216806126c857607f821691505b6020821081036126e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b601f821115610c2757600081815260208120601f850160051c8101602086101561277c5750805b601f850160051c820191505b8181101561279b57828155600101612788565b505050505050565b815167ffffffffffffffff8111156127bd576127bd6122a5565b6127d1816127cb84546126b4565b84612755565b602080601f83116001811461280657600084156127ee5750858301515b600019600386901b1c1916600185901b17855561279b565b600085815260208120601f198616915b8281101561283557888601518255948401946001909101908401612816565b50858210156128535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83111561287b5761287b6122a5565b61288f8361288983546126b4565b83612755565b6000601f8411600181146128c357600085156128ab5750838201355b600019600387901b1c1916600186901b17835561291d565b600083815260209020601f19861690835b828110156128f457868501358255602094850194600190920191016128d4565b50868210156129115760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8181038181111561078657610786612632565b634e487b7160e01b600052601260045260246000fd5b60008261295c5761295c612937565b500490565b60008261297057612970612937565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600083516129d98184602088016121fc565b8351908301906129ed8183602088016121fc565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a2990830184612220565b9695505050505050565b600060208284031215612a4557600080fd5b8151611f61816121b0565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e32021caf502e6944cf068ce8ab0d80d818c0197caa44128989193b98babb6ba64736f6c63430008130033

Deployed Bytecode Sourcemap

2196:5024:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3005:15;;2997:44;;-1:-1:-1;;;;;3005:15:17;;;;;;;;;3031:9;2997:44;;;;;;;;;3031:9;3005:15;2997:44;;;;;;;;;;;;;;;;;;;;;2196:5024;;;;6615:174;;;;;;;;;;-1:-1:-1;6615:174:17;;;;;:::i;:::-;;:::i;:::-;;;565:14:18;;558:22;540:41;;528:2;513:18;6615:174:17;;;;;;;;3392:103;;;;;;;;;;-1:-1:-1;3392:103:17;;;;;:::i;:::-;;:::i;4849:664::-;;;;;;:::i;:::-;;:::i;6795:197::-;;;;;;;;;;;;;:::i;2456:100:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3923:221::-;;;;;;;;;;-1:-1:-1;3923:221:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:18;;;1679:51;;1667:2;1652:18;3923:221:4;1533:203:18;3453:404:4;;;;;;;;;;-1:-1:-1;3453:404:4;;;;;:::i;:::-;;:::i;4287:556:17:-;;;:::i;4047:127::-;;;;;;;;;;-1:-1:-1;4047:127:17;;;;;:::i;:::-;;:::i;1590:113:6:-;;;;;;;;;;-1:-1:-1;1678:10:6;:17;1590:113;;;3715:25:18;;;3703:2;3688:18;1590:113:6;3569:177:18;5521:419:17;;;;;;;;;;-1:-1:-1;5521:419:17;;;;;:::i;:::-;;:::i;4813:305:4:-;;;;;;;;;;-1:-1:-1;4813:305:4;;;;;:::i;:::-;;:::i;1258:256:6:-;;;;;;;;;;-1:-1:-1;1258:256:6;;;;;:::i;:::-;;:::i;5189:151:4:-;;;;;;;;;;-1:-1:-1;5189:151:4;;;;;:::i;:::-;;:::i;2505:121:17:-;;;;;;;;;;;;;:::i;3619:94::-;;;;;;;;;;-1:-1:-1;3698:9:17;;3619:94;;4180:99;;;;;;;;;;-1:-1:-1;4180:99:17;;;;;:::i;:::-;;:::i;1780:233:6:-;;;;;;;;;;-1:-1:-1;1780:233:6;;;;;:::i;:::-;;:::i;2846:44:17:-;;;;;;;;;;-1:-1:-1;2846:44:17;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2846:44:17;;;3943:98;;;;;;;;;;-1:-1:-1;3943:98:17;;;;;:::i;:::-;;:::i;3060:118::-;;;;;;;;;;-1:-1:-1;3060:118:17;;;;;:::i;:::-;;:::i;2150:239:4:-;;;;;;;;;;-1:-1:-1;2150:239:4;;;;;:::i;:::-;;:::i;3286:100:17:-;;;;;;;;;;-1:-1:-1;3286:100:17;;;;;:::i;:::-;;:::i;1880:208:4:-;;;;;;;;;;-1:-1:-1;1880:208:4;;;;;:::i;:::-;;:::i;1151:94:17:-;;;;;;;;;;;;;:::i;2764:75::-;;;;;;;;;;-1:-1:-1;2764:75:17;;;;;;;-1:-1:-1;;;;;2764:75:17;;;928:87;;;;;;;;;;-1:-1:-1;974:7:17;1001:6;-1:-1:-1;;;;;1001:6:17;928:87;;2625:104:4;;;;;;;;;;;;;:::i;2332:39:17:-;;;;;;;;;;-1:-1:-1;2332:39:17;;;;;;4216:295:4;;;;;;;;;;-1:-1:-1;4216:295:4;;;;;:::i;:::-;;:::i;3719:102:17:-;;;;;;;;;;-1:-1:-1;3804:11:17;;3719:102;;3501:112;;;;;;;;;;;;;:::i;5946:101::-;;;;;;;;;;-1:-1:-1;5946:101:17;;;;;:::i;:::-;6003:7;6025:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6025:16:17;;5946:101;5411:285:4;;;;;;;;;;-1:-1:-1;5411:285:4;;;;;:::i;:::-;;:::i;2730:27:17:-;;;;;;;;;;-1:-1:-1;2730:27:17;;;;;;;;6194:160;;;;;;;;;;-1:-1:-1;6194:160:17;;;;;:::i;:::-;;:::i;2696:27::-;;;;;;;;;;;;;;;;3184:96;;;;;;;;;;;;;:::i;4582:164:4:-;;;;;;;;;;-1:-1:-1;4582:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;4703:25:4;;;4679:4;4703:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4582:164;1253:192:17;;;;;;;;;;-1:-1:-1;1253:192:17;;;;;:::i;:::-;;:::i;6615:174::-;6727:4;6747:36;6771:11;6747:23;:36::i;:::-;6740:43;6615:174;-1:-1:-1;;6615:174:17:o;3392:103::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;;;;;;;;;3465:11:::1;:24:::0;3392:103::o;4849:664::-;4926:7;;;;4918:51;;;;-1:-1:-1;;;4918:51:17;;7928:2:18;4918:51:17;;;7910:21:18;7967:2;7947:18;;;7940:30;8006:33;7986:18;;;7979:61;8057:18;;4918:51:17;7726:355:18;4918:51:17;5009:11;;4998:22;;:8;:22;:::i;:::-;4984:9;:37;;4976:78;;;;-1:-1:-1;;;4976:78:17;;8593:2:18;4976:78:17;;;8575:21:18;8632:2;8612:18;;;8605:30;8671;8651:18;;;8644:58;8719:18;;4976:78:17;8391:352:18;4976:78:17;5111:9;;5098:8;5070:25;:15;:23;:25::i;:::-;:36;;;;:::i;:::-;5069:51;;5061:94;;;;-1:-1:-1;;;5061:94:17;;9080:2:18;5061:94:17;;;9062:21:18;9119:2;9099:18;;;9092:30;9158:32;9138:18;;;9131:60;9208:18;;5061:94:17;8878:354:18;5061:94:17;5168:6;5164:315;5184:8;5180:1;:12;5164:315;;;5207:44;5213:10;5225:25;:15;:23;:25::i;:::-;5207:5;:44::i;:::-;5297:10;5260:7;:34;5268:25;:15;:23;:25::i;:::-;5260:34;;;;;;;;;;;;:47;;;;;-1:-1:-1;;;;;5260:47:17;;;;;-1:-1:-1;;;;;5260:47:17;;;;;;5316:119;5329:25;:15;:23;:25::i;:::-;5380:43;5397:25;:15;:23;:25::i;:::-;5380:16;:43::i;:::-;5363:70;;;;;;;;:::i;:::-;;;;;;;;;;;;;5316:12;:119::i;:::-;5444:27;:15;1006:19:2;;1024:1;1006:19;;;917:127;5444:27:17;5194:3;;;;:::i;:::-;;;;5164:315;;;;5485:22;5498:8;5485:12;:22::i;:::-;4849:664;:::o;6795:197::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;6935:51:::1;::::0;6943:10:::1;::::0;6964:21:::1;6935:51:::0;::::1;;;::::0;::::1;::::0;;;6964:21;6943:10;6935:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;2456:100:4::0;2510:13;2543:5;2536:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2456:100;:::o;3923:221::-;3999:7;4027:16;4035:7;4027;:16::i;:::-;4019:73;;;;-1:-1:-1;;;4019:73:4;;10425:2:18;4019:73:4;;;10407:21:18;10464:2;10444:18;;;10437:30;10503:34;10483:18;;;10476:62;-1:-1:-1;;;10554:18:18;;;10547:42;10606:19;;4019:73:4;10223:408:18;4019:73:4;-1:-1:-1;4112:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4112:24:4;;3923:221::o;3453:404::-;3534:13;3550:23;3565:7;3550:14;:23::i;:::-;3534:39;;3598:5;-1:-1:-1;;;;;3592:11:4;:2;-1:-1:-1;;;;;3592:11:4;;3584:57;;;;-1:-1:-1;;;3584:57:4;;10838:2:18;3584:57:4;;;10820:21:18;10877:2;10857:18;;;10850:30;10916:34;10896:18;;;10889:62;-1:-1:-1;;;10967:18:18;;;10960:31;11008:19;;3584:57:4;10636:397:18;3584:57:4;681:10:1;-1:-1:-1;;;;;3662:21:4;;;;:69;;-1:-1:-1;3687:44:4;3711:5;681:10:1;4582:164:4;:::i;3687:44::-;3654:161;;;;-1:-1:-1;;;3654:161:4;;11240:2:18;3654:161:4;;;11222:21:18;11279:2;11259:18;;;11252:30;11318:34;11298:18;;;11291:62;11389:26;11369:18;;;11362:54;11433:19;;3654:161:4;11038:420:18;3654:161:4;3828:21;3837:2;3841:7;3828:8;:21::i;:::-;3523:334;3453:404;;:::o;4287:556:17:-;4335:7;;;;4327:51;;;;-1:-1:-1;;;4327:51:17;;7928:2:18;4327:51:17;;;7910:21:18;7967:2;7947:18;;;7940:30;8006:33;7986:18;;;7979:61;8057:18;;4327:51:17;7726:355:18;4327:51:17;4407:11;;4393:9;:26;;4385:67;;;;-1:-1:-1;;;4385:67:17;;8593:2:18;4385:67:17;;;8575:21:18;8632:2;8612:18;;;8605:30;8671;8651:18;;;8644:58;8719:18;;4385:67:17;8391:352:18;4385:67:17;4498:9;;4468:25;:15;:23;:25::i;:::-;4467:40;;4459:83;;;;-1:-1:-1;;;4459:83:17;;9080:2:18;4459:83:17;;;9062:21:18;9119:2;9099:18;;;9092:30;9158:32;9138:18;;;9131:60;9208:18;;4459:83:17;8878:354:18;4459:83:17;4551:44;4557:10;4569:25;:15;:23;:25::i;4551:44::-;4639:10;4602:7;:34;4610:25;:15;:23;:25::i;:::-;4602:34;;;;;;;;;;;;:47;;;;;-1:-1:-1;;;;;4602:47:17;;;;;-1:-1:-1;;;;;4602:47:17;;;;;;4662:119;4675:25;:15;:23;:25::i;4662:119::-;4788:27;:15;1006:19:2;;1024:1;1006:19;;;917:127;4788:27:17;4822:15;4835:1;4822:12;:15::i;:::-;4287:556::o;4047:127::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;4136:32:::1;4149:7;4158:9;4136:12;:32::i;:::-;4047:127:::0;;:::o;5521:419::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;5606:9:::1;5601:334;5621:21:::0;;::::1;5601:334;;;5657:47;5663:10;;5674:1;5663:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5678:25;:15;:23;:25::i;5657:47::-;5750:10;;5761:1;5750:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5713:7;:34;5721:25;:15;:23;:25::i;:::-;5713:34;;;;;;;;;;;;:50;;;;;-1:-1:-1::0;;;;;5713:50:17::1;;;;;-1:-1:-1::0;;;;;5713:50:17::1;;;;;;5772:119;5785:25;:15;:23;:25::i;5772:119::-;5900:27;:15;1006:19:2::0;;1024:1;1006:19;;;917:127;5900:27:17::1;5644:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5601:334;;4813:305:4::0;4974:41;681:10:1;5007:7:4;4974:18;:41::i;:::-;4966:103;;;;-1:-1:-1;;;4966:103:4;;;;;;;:::i;:::-;5082:28;5092:4;5098:2;5102:7;5082:9;:28::i;1258:256:6:-;1355:7;1391:23;1408:5;1391:16;:23::i;:::-;1383:5;:31;1375:87;;;;-1:-1:-1;;;1375:87:6;;12215:2:18;1375:87:6;;;12197:21:18;12254:2;12234:18;;;12227:30;12293:34;12273:18;;;12266:62;-1:-1:-1;;;12344:18:18;;;12337:41;12395:19;;1375:87:6;12013:407:18;1375:87:6;-1:-1:-1;;;;;;1480:19:6;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1258:256::o;5189:151:4:-;5293:39;5310:4;5316:2;5320:7;5293:39;;;;;;;;;;;;:16;:39::i;2505:121:17:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4180:99::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;4256:7:::1;:17:::0;;-1:-1:-1;;4256:17:17::1;::::0;::::1;;::::0;;;::::1;::::0;;4180:99::o;1780:233:6:-;1855:7;1891:30;1678:10;:17;;1590:113;1891:30;1883:5;:38;1875:95;;;;-1:-1:-1;;;1875:95:6;;12627:2:18;1875:95:6;;;12609:21:18;12666:2;12646:18;;;12639:30;12705:34;12685:18;;;12678:62;-1:-1:-1;;;12756:18:18;;;12749:42;12808:19;;1875:95:6;12425:408:18;1875:95:6;1988:10;1999:5;1988:17;;;;;;;;:::i;:::-;;;;;;;;;1981:24;;1780:233;;;:::o;3943:98:17:-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;4012:13:::1;:23;4028:7:::0;4012:13;:23:::1;:::i;3060:118::-:0;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;3138:15:::1;:34:::0;;-1:-1:-1;;;;;3138:34:17;;::::1;;;-1:-1:-1::0;;;;;;3138:34:17;;::::1;::::0;;;::::1;::::0;;3060:118::o;2150:239:4:-;2222:7;2258:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2258:16:4;;2285:73;;;;-1:-1:-1;;;2285:73:4;;15244:2:18;2285:73:4;;;15226:21:18;15283:2;15263:18;;;15256:30;15322:34;15302:18;;;15295:62;-1:-1:-1;;;15373:18:18;;;15366:39;15422:19;;2285:73:4;15042:405:18;3286:100:17;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;3361:13:::1;:19;3377:3:::0;;3361:13;:19:::1;:::i;1880:208:4:-:0;1952:7;-1:-1:-1;;;;;1980:19:4;;1972:74;;;;-1:-1:-1;;;1972:74:4;;16865:2:18;1972:74:4;;;16847:21:18;16904:2;16884:18;;;16877:30;16943:34;16923:18;;;16916:62;-1:-1:-1;;;16994:18:18;;;16987:40;17044:19;;1972:74:4;16663:406:18;1972:74:4;-1:-1:-1;;;;;;2064:16:4;;;;;:9;:16;;;;;;;1880:208::o;1151:94:17:-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;1216:21:::1;1234:1;1216:9;:21::i;2625:104:4:-:0;2681:13;2714:7;2707:14;;;;;:::i;4216:295::-;681:10:1;-1:-1:-1;;;;;4319:24:4;;;4311:62;;;;-1:-1:-1;;;4311:62:4;;17276:2:18;4311:62:4;;;17258:21:18;17315:2;17295:18;;;17288:30;17354:27;17334:18;;;17327:55;17399:18;;4311:62:4;17074:349:18;4311:62:4;681:10:1;4386:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4386:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;4386:53:4;;;;;;;;;;4455:48;;540:41:18;;;4386:42:4;;681:10:1;4455:48:4;;513:18:18;4455:48:4;;;;;;;4216:295;;:::o;3501:112:17:-;3554:11;3606:1;3580:25;:15;:23;:25::i;:::-;:27;;;;:::i;:::-;3573:34;;3501:112;:::o;5411:285:4:-;5543:41;681:10:1;5576:7:4;5543:18;:41::i;:::-;5535:103;;;;-1:-1:-1;;;5535:103:4;;;;;;;:::i;:::-;5649:39;5663:4;5669:2;5673:7;5682:5;5649:13;:39::i;:::-;5411:285;;;;:::o;6194:160:17:-;6285:13;6314:34;6340:7;6314:25;:34::i;3184:96::-;3228:13;3261;3254:20;;;;;:::i;1253:192::-;974:7;1001:6;-1:-1:-1;;;;;1001:6:17;681:10:1;1063:23:17;1055:68;;;;-1:-1:-1;;;1055:68:17;;;;;;;:::i;:::-;-1:-1:-1;;;;;1342:22:17;::::1;1334:73;;;::::0;-1:-1:-1;;;1334:73:17;;17763:2:18;1334:73:17::1;::::0;::::1;17745:21:18::0;17802:2;17782:18;;;17775:30;17841:34;17821:18;;;17814:62;-1:-1:-1;;;17892:18:18;;;17885:36;17938:19;;1334:73:17::1;17561:402:18::0;1334:73:17::1;1418:19;1428:8;1418:9;:19::i;937:237:6:-:0;1039:4;-1:-1:-1;;;;;;1063:50:6;;-1:-1:-1;;;1063:50:6;;:103;;;1130:36;1154:11;1130:23;:36::i;793:116:2:-;885:14;;858:7;;885:16;;900:1;885:16;:::i;9077:382:4:-;-1:-1:-1;;;;;9157:16:4;;9149:61;;;;-1:-1:-1;;;9149:61:4;;18170:2:18;9149:61:4;;;18152:21:18;;;18189:18;;;18182:30;18248:34;18228:18;;;18221:62;18300:18;;9149:61:4;17968:356:18;9149:61:4;9230:16;9238:7;9230;:16::i;:::-;9229:17;9221:58;;;;-1:-1:-1;;;9221:58:4;;18531:2:18;9221:58:4;;;18513:21:18;18570:2;18550:18;;;18543:30;18609;18589:18;;;18582:58;18657:18;;9221:58:4;18329:352:18;9221:58:4;9292:45;9321:1;9325:2;9329:7;9292:20;:45::i;:::-;-1:-1:-1;;;;;9350:13:4;;;;;;:9;:13;;;;;:18;;9367:1;;9350:13;:18;;9367:1;;9350:18;:::i;:::-;;;;-1:-1:-1;;9379:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9379:21:4;-1:-1:-1;;;;;9379:21:4;;;;;;;;9418:33;;9379:16;;;9418:33;;9379:16;;9418:33;9077:382;;:::o;284:723:16:-;340:13;561:5;570:1;561:10;557:53;;-1:-1:-1;;588:10:16;;;;;;;;;;;;-1:-1:-1;;;588:10:16;;;;;284:723::o;557:53::-;635:5;620:12;676:78;683:9;;676:78;;709:8;;;;:::i;:::-;;-1:-1:-1;732:10:16;;-1:-1:-1;740:2:16;732:10;;:::i;:::-;;;676:78;;;764:19;796:6;786:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;786:17:16;;764:39;;814:154;821:10;;814:154;;848:11;858:1;848:11;;:::i;:::-;;-1:-1:-1;917:10:16;925:2;917:5;:10;:::i;:::-;904:24;;:2;:24;:::i;:::-;891:39;;874:6;881;874:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;874:56:16;;;;;;;;-1:-1:-1;945:11:16;954:2;945:11;;:::i;:::-;;;814:154;;;992:6;284:723;-1:-1:-1;;;;284:723:16:o;1240:217:8:-;1340:16;1348:7;1340;:16::i;:::-;1332:75;;;;-1:-1:-1;;;1332:75:8;;19262:2:18;1332:75:8;;;19244:21:18;19301:2;19281:18;;;19274:30;19340:34;19320:18;;;19313:62;-1:-1:-1;;;19391:18:18;;;19384:44;19445:19;;1332:75:8;19060:410:18;1332:75:8;1418:19;;;;:10;:19;;;;;:31;1440:9;1418:19;:31;:::i;6998:215:17:-;7053:13;7078:11;;7069:6;:20;;;;:::i;:::-;7170:15;;7162:43;;7053:36;;-1:-1:-1;7170:15:17;;;-1:-1:-1;;;;;7170:15:17;;7162:43;;;;;7053:36;;7162:43;;;;7053:36;7170:15;7162:43;;;;;;;;;;;;;;;;;;;7163:127:4;7228:4;7252:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7252:16:4;:30;;;7163:127::o;11047:174::-;11122:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11122:29:4;-1:-1:-1;;;;;11122:29:4;;;;;;;;:24;;11176:23;11122:24;11176:14;:23::i;:::-;-1:-1:-1;;;;;11167:46:4;;;;;;;;;;;11047:174;;:::o;7457:355::-;7550:4;7575:16;7583:7;7575;:16::i;:::-;7567:73;;;;-1:-1:-1;;;7567:73:4;;19677:2:18;7567:73:4;;;19659:21:18;19716:2;19696:18;;;19689:30;19755:34;19735:18;;;19728:62;-1:-1:-1;;;19806:18:18;;;19799:42;19858:19;;7567:73:4;19475:408:18;7567:73:4;7651:13;7667:23;7682:7;7667:14;:23::i;:::-;7651:39;;7720:5;-1:-1:-1;;;;;7709:16:4;:7;-1:-1:-1;;;;;7709:16:4;;:51;;;;7753:7;-1:-1:-1;;;;;7729:31:4;:20;7741:7;7729:11;:20::i;:::-;-1:-1:-1;;;;;7729:31:4;;7709:51;:94;;;-1:-1:-1;;;;;;4703:25:4;;;4679:4;4703:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7764:39;4582:164;10385:544;10510:4;-1:-1:-1;;;;;10483:31:4;:23;10498:7;10483:14;:23::i;:::-;-1:-1:-1;;;;;10483:31:4;;10475:85;;;;-1:-1:-1;;;10475:85:4;;20090:2:18;10475:85:4;;;20072:21:18;20129:2;20109:18;;;20102:30;20168:34;20148:18;;;20141:62;-1:-1:-1;;;20219:18:18;;;20212:39;20268:19;;10475:85:4;19888:405:18;10475:85:4;-1:-1:-1;;;;;10579:16:4;;10571:65;;;;-1:-1:-1;;;10571:65:4;;20500:2:18;10571:65:4;;;20482:21:18;20539:2;20519:18;;;20512:30;20578:34;20558:18;;;20551:62;-1:-1:-1;;;20629:18:18;;;20622:34;20673:19;;10571:65:4;20298:400:18;10571:65:4;10649:39;10670:4;10676:2;10680:7;10649:20;:39::i;:::-;10753:29;10770:1;10774:7;10753:8;:29::i;:::-;-1:-1:-1;;;;;10795:15:4;;;;;;:9;:15;;;;;:20;;10814:1;;10795:15;:20;;10814:1;;10795:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10826:13:4;;;;;;:9;:13;;;;;:18;;10843:1;;10826:13;:18;;10843:1;;10826:18;:::i;:::-;;;;-1:-1:-1;;10855:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10855:21:4;-1:-1:-1;;;;;10855:21:4;;;;;;;;;10894:27;;10855:16;;10894:27;;;;;;;10385:544;;;:::o;1453:173:17:-;1509:16;1528:6;;-1:-1:-1;;;;;1545:17:17;;;-1:-1:-1;;;;;;1545:17:17;;;;;;1578:40;;1528:6;;;;;;;1578:40;;1509:16;1578:40;1498:128;1453:173;:::o;6578:272:4:-;6692:28;6702:4;6708:2;6712:7;6692:9;:28::i;:::-;6739:48;6762:4;6768:2;6772:7;6781:5;6739:22;:48::i;:::-;6731:111;;;;-1:-1:-1;;;6731:111:4;;;;;;;:::i;405:679:8:-;478:13;512:16;520:7;512;:16::i;:::-;504:78;;;;-1:-1:-1;;;504:78:8;;21324:2:18;504:78:8;;;21306:21:18;21363:2;21343:18;;;21336:30;21402:34;21382:18;;;21375:62;-1:-1:-1;;;21453:18:18;;;21446:47;21510:19;;504:78:8;21122:413:18;504:78:8;595:23;621:19;;;:10;:19;;;;;595:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;651:18;672:10;:8;:10::i;:::-;651:31;;764:4;758:18;780:1;758:23;754:72;;-1:-1:-1;805:9:8;405:679;-1:-1:-1;;405:679:8:o;754:72::-;930:23;;:27;926:108;;1005:4;1011:9;988:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;974:48;;;;405:679;;;:::o;926:108::-;1053:23;1068:7;1053:14;:23::i;1524:292:4:-;1626:4;-1:-1:-1;;;;;;1650:40:4;;-1:-1:-1;;;1650:40:4;;:105;;-1:-1:-1;;;;;;;1707:48:4;;-1:-1:-1;;;1707:48:4;1650:105;:158;;;-1:-1:-1;;;;;;;;;;898:40:3;;;1772:36:4;789:157:3;6362:187:17;6498:45;6525:4;6531:2;6535:7;6498:26;:45::i;11786:843:4:-;11907:4;-1:-1:-1;;;;;11933:13:4;;1110:20:0;1149:8;11929:693:4;;11969:72;;-1:-1:-1;;;11969:72:4;;-1:-1:-1;;;;;11969:36:4;;;;;:72;;681:10:1;;12020:4:4;;12026:7;;12035:5;;11969:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11969:72:4;;;;;;;;-1:-1:-1;;11969:72:4;;;;;;;;;;;;:::i;:::-;;;11965:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12215:6;:13;12232:1;12215:18;12211:341;;12258:60;;-1:-1:-1;;;12258:60:4;;;;;;;:::i;12211:341::-;12502:6;12496:13;12487:6;12483:2;12479:15;12472:38;11965:602;-1:-1:-1;;;;;;12092:55:4;-1:-1:-1;;;12092:55:4;;-1:-1:-1;12085:62:4;;11929:693;-1:-1:-1;12606:4:4;11786:843;;;;;;:::o;3827:110:17:-;3887:13;3918;3911:20;;;;;:::i;2800:360:4:-;2873:13;2907:16;2915:7;2907;:16::i;:::-;2899:76;;;;-1:-1:-1;;;2899:76:4;;22991:2:18;2899:76:4;;;22973:21:18;23030:2;23010:18;;;23003:30;23069:34;23049:18;;;23042:62;-1:-1:-1;;;23120:18:18;;;23113:45;23175:19;;2899:76:4;22789:411:18;2899:76:4;2988:21;3012:10;:8;:10::i;:::-;2988:34;;3064:1;3046:7;3040:21;:25;:112;;;;;;;;;;;;;;;;;3105:7;3114:18;:7;:16;:18::i;:::-;3088:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3040:112;3033:119;2800:360;-1:-1:-1;;;2800:360:4:o;2626:555:6:-;-1:-1:-1;;;;;2798:18:6;;2794:187;;2833:40;2865:7;4008:10;:17;;3981:24;;;;:15;:24;;;;;:44;;;4036:24;;;;;;;;;;;;3904:164;2833:40;2794:187;;;2903:2;-1:-1:-1;;;;;2895:10:6;:4;-1:-1:-1;;;;;2895:10:6;;2891:90;;2922:47;2955:4;2961:7;2922:32;:47::i;:::-;-1:-1:-1;;;;;2995:16:6;;2991:183;;3028:45;3065:7;3028:36;:45::i;2991:183::-;3101:4;-1:-1:-1;;;;;3095:10:6;:2;-1:-1:-1;;;;;3095:10:6;;3091:83;;3122:40;3150:2;3154:7;3122:27;:40::i;4695:988::-;4961:22;5011:1;4986:22;5003:4;4986:16;:22::i;:::-;:26;;;;:::i;:::-;5023:18;5044:26;;;:17;:26;;;;;;4961:51;;-1:-1:-1;5177:28:6;;;5173:328;;-1:-1:-1;;;;;5244:18:6;;5222:19;5244:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5295:30;;;;;;:44;;;5412:30;;:17;:30;;;;;:43;;;5173:328;-1:-1:-1;5597:26:6;;;;:17;:26;;;;;;;;5590:33;;;-1:-1:-1;;;;;5641:18:6;;;;;:12;:18;;;;;:34;;;;;;;5634:41;4695:988::o;5978:1079::-;6256:10;:17;6231:22;;6256:21;;6276:1;;6256:21;:::i;:::-;6288:18;6309:24;;;:15;:24;;;;;;6682:10;:26;;6231:46;;-1:-1:-1;6309:24:6;;6231:46;;6682:26;;;;;;:::i;:::-;;;;;;;;;6660:48;;6746:11;6721:10;6732;6721:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6826:28;;;:15;:28;;;;;;;:41;;;6998:24;;;;;6991:31;7033:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6049:1008;;;5978:1079;:::o;3482:221::-;3567:14;3584:20;3601:2;3584:16;:20::i;:::-;-1:-1:-1;;;;;3615:16:6;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3660:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3482:221:6:o;14:131:18:-;-1:-1:-1;;;;;;88:32:18;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:18;;592:180;-1:-1:-1;592:180:18:o;777:250::-;862:1;872:113;886:6;883:1;880:13;872:113;;;962:11;;;956:18;943:11;;;936:39;908:2;901:10;872:113;;;-1:-1:-1;;1019:1:18;1001:16;;994:27;777:250::o;1032:271::-;1074:3;1112:5;1106:12;1139:6;1134:3;1127:19;1155:76;1224:6;1217:4;1212:3;1208:14;1201:4;1194:5;1190:16;1155:76;:::i;:::-;1285:2;1264:15;-1:-1:-1;;1260:29:18;1251:39;;;;1292:4;1247:50;;1032:271;-1:-1:-1;;1032:271:18:o;1308:220::-;1457:2;1446:9;1439:21;1420:4;1477:45;1518:2;1507:9;1503:18;1495:6;1477:45;:::i;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:18;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:18:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:632;2375:5;2405:18;2446:2;2438:6;2435:14;2432:40;;;2452:18;;:::i;:::-;2527:2;2521:9;2495:2;2581:15;;-1:-1:-1;;2577:24:18;;;2603:2;2573:33;2569:42;2557:55;;;2627:18;;;2647:22;;;2624:46;2621:72;;;2673:18;;:::i;:::-;2713:10;2709:2;2702:22;2742:6;2733:15;;2772:6;2764;2757:22;2812:3;2803:6;2798:3;2794:16;2791:25;2788:45;;;2829:1;2826;2819:12;2788:45;2879:6;2874:3;2867:4;2859:6;2855:17;2842:44;2934:1;2927:4;2918:6;2910;2906:19;2902:30;2895:41;;;;2310:632;;;;;:::o;2947:222::-;2990:5;3043:3;3036:4;3028:6;3024:17;3020:27;3010:55;;3061:1;3058;3051:12;3010:55;3083:80;3159:3;3150:6;3137:20;3130:4;3122:6;3118:17;3083:80;:::i;3174:390::-;3252:6;3260;3313:2;3301:9;3292:7;3288:23;3284:32;3281:52;;;3329:1;3326;3319:12;3281:52;3365:9;3352:23;3342:33;;3426:2;3415:9;3411:18;3398:32;3453:18;3445:6;3442:30;3439:50;;;3485:1;3482;3475:12;3439:50;3508;3550:7;3541:6;3530:9;3526:22;3508:50;:::i;:::-;3498:60;;;3174:390;;;;;:::o;3751:615::-;3837:6;3845;3898:2;3886:9;3877:7;3873:23;3869:32;3866:52;;;3914:1;3911;3904:12;3866:52;3954:9;3941:23;3983:18;4024:2;4016:6;4013:14;4010:34;;;4040:1;4037;4030:12;4010:34;4078:6;4067:9;4063:22;4053:32;;4123:7;4116:4;4112:2;4108:13;4104:27;4094:55;;4145:1;4142;4135:12;4094:55;4185:2;4172:16;4211:2;4203:6;4200:14;4197:34;;;4227:1;4224;4217:12;4197:34;4280:7;4275:2;4265:6;4262:1;4258:14;4254:2;4250:23;4246:32;4243:45;4240:65;;;4301:1;4298;4291:12;4240:65;4332:2;4324:11;;;;;4354:6;;-1:-1:-1;3751:615:18;;-1:-1:-1;;;;3751:615:18:o;4371:328::-;4448:6;4456;4464;4517:2;4505:9;4496:7;4492:23;4488:32;4485:52;;;4533:1;4530;4523:12;4485:52;4556:29;4575:9;4556:29;:::i;:::-;4546:39;;4604:38;4638:2;4627:9;4623:18;4604:38;:::i;:::-;4594:48;;4689:2;4678:9;4674:18;4661:32;4651:42;;4371:328;;;;;:::o;4704:160::-;4769:20;;4825:13;;4818:21;4808:32;;4798:60;;4854:1;4851;4844:12;4869:180;4925:6;4978:2;4966:9;4957:7;4953:23;4949:32;4946:52;;;4994:1;4991;4984:12;4946:52;5017:26;5033:9;5017:26;:::i;5054:322::-;5123:6;5176:2;5164:9;5155:7;5151:23;5147:32;5144:52;;;5192:1;5189;5182:12;5144:52;5232:9;5219:23;5265:18;5257:6;5254:30;5251:50;;;5297:1;5294;5287:12;5251:50;5320;5362:7;5353:6;5342:9;5338:22;5320:50;:::i;5381:186::-;5440:6;5493:2;5481:9;5472:7;5468:23;5464:32;5461:52;;;5509:1;5506;5499:12;5461:52;5532:29;5551:9;5532:29;:::i;5572:592::-;5643:6;5651;5704:2;5692:9;5683:7;5679:23;5675:32;5672:52;;;5720:1;5717;5710:12;5672:52;5760:9;5747:23;5789:18;5830:2;5822:6;5819:14;5816:34;;;5846:1;5843;5836:12;5816:34;5884:6;5873:9;5869:22;5859:32;;5929:7;5922:4;5918:2;5914:13;5910:27;5900:55;;5951:1;5948;5941:12;5900:55;5991:2;5978:16;6017:2;6009:6;6006:14;6003:34;;;6033:1;6030;6023:12;6003:34;6078:7;6073:2;6064:6;6060:2;6056:15;6052:24;6049:37;6046:57;;;6099:1;6096;6089:12;6169:254;6234:6;6242;6295:2;6283:9;6274:7;6270:23;6266:32;6263:52;;;6311:1;6308;6301:12;6263:52;6334:29;6353:9;6334:29;:::i;:::-;6324:39;;6382:35;6413:2;6402:9;6398:18;6382:35;:::i;:::-;6372:45;;6169:254;;;;;:::o;6428:667::-;6523:6;6531;6539;6547;6600:3;6588:9;6579:7;6575:23;6571:33;6568:53;;;6617:1;6614;6607:12;6568:53;6640:29;6659:9;6640:29;:::i;:::-;6630:39;;6688:38;6722:2;6711:9;6707:18;6688:38;:::i;:::-;6678:48;;6773:2;6762:9;6758:18;6745:32;6735:42;;6828:2;6817:9;6813:18;6800:32;6855:18;6847:6;6844:30;6841:50;;;6887:1;6884;6877:12;6841:50;6910:22;;6963:4;6955:13;;6951:27;-1:-1:-1;6941:55:18;;6992:1;6989;6982:12;6941:55;7015:74;7081:7;7076:2;7063:16;7058:2;7054;7050:11;7015:74;:::i;:::-;7005:84;;;6428:667;;;;;;;:::o;7100:260::-;7168:6;7176;7229:2;7217:9;7208:7;7204:23;7200:32;7197:52;;;7245:1;7242;7235:12;7197:52;7268:29;7287:9;7268:29;:::i;:::-;7258:39;;7316:38;7350:2;7339:9;7335:18;7316:38;:::i;7365:356::-;7567:2;7549:21;;;7586:18;;;7579:30;7645:34;7640:2;7625:18;;7618:62;7712:2;7697:18;;7365:356::o;8086:127::-;8147:10;8142:3;8138:20;8135:1;8128:31;8178:4;8175:1;8168:15;8202:4;8199:1;8192:15;8218:168;8291:9;;;8322;;8339:15;;;8333:22;;8319:37;8309:71;;8360:18;;:::i;8748:125::-;8813:9;;;8834:10;;;8831:36;;;8847:18;;:::i;9237:456::-;9469:3;9507:6;9501:13;9523:66;9582:6;9577:3;9570:4;9562:6;9558:17;9523:66;:::i;:::-;-1:-1:-1;;;9611:16:18;;9636:22;;;-1:-1:-1;9685:1:18;9674:13;;9237:456;-1:-1:-1;9237:456:18:o;9698:135::-;9737:3;9758:17;;;9755:43;;9778:18;;:::i;:::-;-1:-1:-1;9825:1:18;9814:13;;9698:135::o;9838:380::-;9917:1;9913:12;;;;9960;;;9981:61;;10035:4;10027:6;10023:17;10013:27;;9981:61;10088:2;10080:6;10077:14;10057:18;10054:38;10051:161;;10134:10;10129:3;10125:20;10122:1;10115:31;10169:4;10166:1;10159:15;10197:4;10194:1;10187:15;10051:161;;9838:380;;;:::o;11463:127::-;11524:10;11519:3;11515:20;11512:1;11505:31;11555:4;11552:1;11545:15;11579:4;11576:1;11569:15;11595:413;11797:2;11779:21;;;11836:2;11816:18;;;11809:30;11875:34;11870:2;11855:18;;11848:62;-1:-1:-1;;;11941:2:18;11926:18;;11919:47;11998:3;11983:19;;11595:413::o;12964:545::-;13066:2;13061:3;13058:11;13055:448;;;13102:1;13127:5;13123:2;13116:17;13172:4;13168:2;13158:19;13242:2;13230:10;13226:19;13223:1;13219:27;13213:4;13209:38;13278:4;13266:10;13263:20;13260:47;;;-1:-1:-1;13301:4:18;13260:47;13356:2;13351:3;13347:12;13344:1;13340:20;13334:4;13330:31;13320:41;;13411:82;13429:2;13422:5;13419:13;13411:82;;;13474:17;;;13455:1;13444:13;13411:82;;;13415:3;;;12964:545;;;:::o;13685:1352::-;13811:3;13805:10;13838:18;13830:6;13827:30;13824:56;;;13860:18;;:::i;:::-;13889:97;13979:6;13939:38;13971:4;13965:11;13939:38;:::i;:::-;13933:4;13889:97;:::i;:::-;14041:4;;14105:2;14094:14;;14122:1;14117:663;;;;14824:1;14841:6;14838:89;;;-1:-1:-1;14893:19:18;;;14887:26;14838:89;-1:-1:-1;;13642:1:18;13638:11;;;13634:24;13630:29;13620:40;13666:1;13662:11;;;13617:57;14940:81;;14087:944;;14117:663;12911:1;12904:14;;;12948:4;12935:18;;-1:-1:-1;;14153:20:18;;;14271:236;14285:7;14282:1;14279:14;14271:236;;;14374:19;;;14368:26;14353:42;;14466:27;;;;14434:1;14422:14;;;;14301:19;;14271:236;;;14275:3;14535:6;14526:7;14523:19;14520:201;;;14596:19;;;14590:26;-1:-1:-1;;14679:1:18;14675:14;;;14691:3;14671:24;14667:37;14663:42;14648:58;14633:74;;14520:201;-1:-1:-1;;;;;14767:1:18;14751:14;;;14747:22;14734:36;;-1:-1:-1;13685:1352:18:o;15452:1206::-;15576:18;15571:3;15568:27;15565:53;;;15598:18;;:::i;:::-;15627:94;15717:3;15677:38;15709:4;15703:11;15677:38;:::i;:::-;15671:4;15627:94;:::i;:::-;15747:1;15772:2;15767:3;15764:11;15789:1;15784:616;;;;16444:1;16461:3;16458:93;;;-1:-1:-1;16517:19:18;;;16504:33;16458:93;-1:-1:-1;;13642:1:18;13638:11;;;13634:24;13630:29;13620:40;13666:1;13662:11;;;13617:57;16564:78;;15757:895;;15784:616;12911:1;12904:14;;;12948:4;12935:18;;-1:-1:-1;;15820:17:18;;;15921:9;15943:229;15957:7;15954:1;15951:14;15943:229;;;16046:19;;;16033:33;16018:49;;16153:4;16138:20;;;;16106:1;16094:14;;;;15973:12;15943:229;;;15947:3;16200;16191:7;16188:16;16185:159;;;16324:1;16320:6;16314:3;16308;16305:1;16301:11;16297:21;16293:34;16289:39;16276:9;16271:3;16267:19;16254:33;16250:79;16242:6;16235:95;16185:159;;;16387:1;16381:3;16378:1;16374:11;16370:19;16364:4;16357:33;15757:895;;;15452:1206;;;:::o;17428:128::-;17495:9;;;17516:11;;;17513:37;;;17530:18;;:::i;18686:127::-;18747:10;18742:3;18738:20;18735:1;18728:31;18778:4;18775:1;18768:15;18802:4;18799:1;18792:15;18818:120;18858:1;18884;18874:35;;18889:18;;:::i;:::-;-1:-1:-1;18923:9:18;;18818:120::o;18943:112::-;18975:1;19001;18991:35;;19006:18;;:::i;:::-;-1:-1:-1;19040:9:18;;18943:112::o;20703:414::-;20905:2;20887:21;;;20944:2;20924:18;;;20917:30;20983:34;20978:2;20963:18;;20956:62;-1:-1:-1;;;21049:2:18;21034:18;;21027:48;21107:3;21092:19;;20703:414::o;21540:496::-;21719:3;21757:6;21751:13;21773:66;21832:6;21827:3;21820:4;21812:6;21808:17;21773:66;:::i;:::-;21902:13;;21861:16;;;;21924:70;21902:13;21861:16;21971:4;21959:17;;21924:70;:::i;:::-;22010:20;;21540:496;-1:-1:-1;;;;21540:496:18:o;22041:489::-;-1:-1:-1;;;;;22310:15:18;;;22292:34;;22362:15;;22357:2;22342:18;;22335:43;22409:2;22394:18;;22387:34;;;22457:3;22452:2;22437:18;;22430:31;;;22235:4;;22478:46;;22504:19;;22496:6;22478:46;:::i;:::-;22470:54;22041:489;-1:-1:-1;;;;;;22041:489:18:o;22535:249::-;22604:6;22657:2;22645:9;22636:7;22632:23;22628:32;22625:52;;;22673:1;22670;22663:12;22625:52;22705:9;22699:16;22724:30;22748:5;22724:30;:::i;23205:127::-;23266:10;23261:3;23257:20;23254:1;23247:31;23297:4;23294:1;23287:15;23321:4;23318:1;23311:15

Swarm Source

ipfs://e32021caf502e6944cf068ce8ab0d80d818c0197caa44128989193b98babb6ba
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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