ETH Price: $3,399.49 (+6.50%)
Gas: 22 Gwei

Token

Ski Friends (FSKI)
 

Overview

Max Total Supply

0 FSKI

Holders

601

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
pethol.eth
Balance
2 FSKI
0x59c3ce2b9316e5339dc3a34f701792a48c3c99ed
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:
SkiFriendsContract

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//*********************************************************************//
//*********************************************************************//                                                    
//  
//       
//       8888888b.         d8888 888b     d888 8888888b.  8888888b.  
//       888   Y88b       d88888 8888b   d8888 888   Y88b 888   Y88b 
//       888    888      d88P888 88888b.d88888 888    888 888    888 
//       888   d88P     d88P 888 888Y88888P888 888   d88P 888   d88P 
//       8888888P"     d88P  888 888 Y888P 888 8888888P"  8888888P"  
//       888 T88b     d88P   888 888  Y8P  888 888        888        
//       888  T88b   d8888888888 888   "   888 888        888        
//       888   T88b d88P     888 888       888 888        888        
//       v1.0.0
//     
//                                                               
//    This project and smart contract was generated by rampp.xyz.
//            Rampp allows creators like you to launch 
//             large scale NFT projects without code!
//
//    Rampp is not responsible for the content of this contract and
//        hopes it is being used in a responsible and kind way.                                                         
//             Twitter: @RamppDAO ---- rampp.xyz
//    
//*********************************************************************//                                                     
//*********************************************************************// 



    
    // File: contracts/common/meta-transactions/Initializable.sol

    pragma solidity ^ 0.8.0;

    contract Initializable {
      bool inited = false;

      modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
      }
    }

    // File: contracts/common/meta-transactions/EIP712Base.sol



    pragma solidity ^ 0.8.0;


    contract EIP712Base is Initializable {
        struct EIP712Domain {
          string name;
          string version;
          address verifyingContract;
          bytes32 salt;
        }

        string public constant ERC712_VERSION = "1";

        bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
      keccak256(
        bytes(
          "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
      );
        bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(string memory name) internal initializer {
      _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
      domainSeperator = keccak256(
        abi.encode(
          EIP712_DOMAIN_TYPEHASH,
          keccak256(bytes(name)),
          keccak256(bytes(ERC712_VERSION)),
          address(this),
          bytes32(getChainId())
        )
      );
    }

    function getDomainSeperator() public view returns(bytes32) {
      return domainSeperator;
    }

    function getChainId() public view returns(uint256) {
            uint256 id;
            assembly {
        id:= chainid()
      }
      return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\x19" makes the encoding deterministic
     * "\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
    internal
    view
    returns(bytes32)
    {
      return
      keccak256(
        abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
      );
    }
  }

// File: contracts/common/meta-transactions/ContentMixin.sol



pragma solidity ^ 0.8.0;

abstract contract ContextMixin {
  function msgSender() internal view returns(address payable sender) {
    if (msg.sender == address(this)) {
              bytes memory array = msg.data;
              uint256 index = msg.data.length;
              assembly {
        // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
        sender:= and(
          mload(add(array, index)),
          0xffffffffffffffffffffffffffffffffffffffff
        )
      }
    } else {
      sender = payable(msg.sender);
    }
    return sender;
  }
}

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



pragma solidity ^ 0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // File: contracts/common/meta-transactions/NativeMetaTransaction.sol



    pragma solidity ^ 0.8.0;



    contract NativeMetaTransaction is EIP712Base {
        using SafeMath for uint256;
      bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
          bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
          )
        );
        event MetaTransactionExecuted(
          address userAddress,
          address payable relayerAddress,
          bytes functionSignature
        );
    mapping(address => uint256) nonces;

        /*
        * Meta transaction structure.
        * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
        * He should call the desired function directly in that case.
        */
        struct MetaTransaction {
            uint256 nonce;
            address from;
            bytes functionSignature;
    }

    function executeMetaTransaction(
      address userAddress,
      bytes memory functionSignature,
      bytes32 sigR,
      bytes32 sigS,
      uint8 sigV
    ) public payable returns(bytes memory) {
            MetaTransaction memory metaTx = MetaTransaction({
      nonce: nonces[userAddress],
      from: userAddress,
      functionSignature: functionSignature
    });

      require(
        verify(userAddress, metaTx, sigR, sigS, sigV),
        "Signer and signature do not match"
      );

      // increase nonce for user (to avoid re-use)
      nonces[userAddress] = nonces[userAddress].add(1);

            emit MetaTransactionExecuted(
        userAddress,
        payable(msg.sender),
        functionSignature
      );

      // Append userAddress and relayer address at the end to extract it from calling context
      (bool success, bytes memory returnData) = address(this).call(
        abi.encodePacked(functionSignature, userAddress)
      );
      require(success, "Function call not successful");

      return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
    internal
    pure
    returns(bytes32)
    {
      return
      keccak256(
        abi.encode(
          META_TRANSACTION_TYPEHASH,
          metaTx.nonce,
          metaTx.from,
          keccak256(metaTx.functionSignature)
        )
      );
    }

    function getNonce(address user) public view returns(uint256 nonce) {
      nonce = nonces[user];
    }

    function verify(
      address signer,
      MetaTransaction memory metaTx,
      bytes32 sigR,
      bytes32 sigS,
      uint8 sigV
    ) internal view returns(bool) {
      require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
      return
      signer ==
        ecrecover(
          toTypedMessageHash(hashMetaTransaction(metaTx)),
          sigV,
          sigR,
          sigS
        );
    }
  }

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



    pragma solidity ^ 0.8.0;

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

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

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

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

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

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



    pragma solidity ^ 0.8.0;

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

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

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



    pragma solidity ^ 0.8.0;


    /**
     * @dev Contract module which provides a basic access control mechanism, where
     * there is an account (an owner) that can be granted exclusive access to
     * specific functions.
     *
     * By default, the owner account will be the one that deploys the contract. This
     * can later be changed with {transferOwnership}.
     *
     * This module is used through inheritance. It will make available the modifier
     * 'onlyOwner', which can be applied to your functions to restrict their use to
     * the owner.
     */
     abstract contract Ownable is Context {
      address private _owner;
  
      event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
  
      /**
       * @dev Initializes the contract setting the deployer as the initial owner.
       */
      constructor() {
          _setOwner(_msgSender());
      }
  
      /**
       * @dev Returns the address of the current owner.
       */
      function owner() public view virtual returns (address) {
          return _owner;
      }
  
      /**
       * @dev Throws if called by any account other than the owner.
       */
      modifier onlyOwner() {
          require(owner() == _msgSender(), "Ownable: caller is not the owner");
          _;
      }
     
      /**
       * @dev Leaves the contract without owner. It will not be possible to call
       * 'onlyOwner' functions anymore. Can only be called by the current owner.
       *
       * NOTE: Renouncing ownership will leave the contract without an owner,
       * thereby removing any functionality that is only available to the owner.
       */
      
      function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
      }
  
      /**
       * @dev Transfers ownership of the contract to a new account ('newOwner').
       * Can only be called by the current owner.
       */
      function transferOwnership(address newOwner) public virtual onlyOwner {
          require(newOwner != address(0), "Ownable: new owner is the zero address");
          _setOwner(newOwner);
      }
      
      function _setOwner(address newOwner) private {
          address oldOwner = _owner;
          _owner = newOwner;
          emit OwnershipTransferred(oldOwner, newOwner);
      }
    }

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

    pragma solidity ^ 0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^ 0.8.0;

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

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



pragma solidity ^ 0.8.0;

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

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



pragma solidity ^ 0.8.0;


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

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



pragma solidity ^ 0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^ 0.8.0;


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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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



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



pragma solidity ^ 0.8.0;



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

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

    _transfer(from, to, tokenId);
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _beforeTokenTransfer(from, to, tokenId);

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

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

            emit Transfer(from, to, tokenId);
  }

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

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

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


 
    
    // File: contracts/ERC721Tradable.sol
    pragma solidity ^0.8.0;

    contract OwnableDelegateProxy {}

    contract ProxyRegistry {
        mapping(address => OwnableDelegateProxy) public proxies;
    }

    /**
     * @title ERC721Tradable
     * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
     */
    abstract contract ERC721Tradable is
        ContextMixin,
        ERC721,
        NativeMetaTransaction,
        Ownable
        
    {
        using SafeMath for uint256;
        using Counters for Counters.Counter;

        Counters.Counter private _tokenSupply;
        address proxyRegistryAddress;
        address public RAMPPADDRESS = 0xa9dAC8f3aEDC55D0FE707B86B8A45d246858d2E1;
        bool public mintingOpen = true;
        uint256 public SUPPLYCAP = 1000;
        uint256 public PRICE = 0.01 ether;
        address[] public payableAddresses = [RAMPPADDRESS];
        uint256[] public payableFees = [5];
        uint256 public payableAddressCount = 2;
        
        

        constructor(
            string memory _name,
            string memory _symbol,
            address _proxyRegistryAddress
        ) ERC721(_name, _symbol) {
            proxyRegistryAddress = _proxyRegistryAddress;
            // Establish user-defined payableAddresses and amounts
            payableAddresses.push(0x68372a4d01e4261A5D60D81EABfF6f712d09b7bd);
            payableFees.push(uint256(95));
    
            _initializeEIP712(_name);
        }
        
        modifier isRampp() {
            require(msg.sender == RAMPPADDRESS, "Ownable: caller is not RAMPP");
            _;
        }

        
        /**
        * @dev Mints a token to an address with a tokenURI.
        * This is owner only and allows a fee-free drop
        * @param _to address of the future owner of the token
        */
        function mintToAdmin(address _to) public onlyOwner {
            require(_getNextTokenId() <= SUPPLYCAP, "Cannot mint over supply cap of 1000");
            uint256 newTokenId = _getNextTokenId();
            _mint(_to, newTokenId);
            _incrementTokenId();
        }

        function mintToBulkAdmin(address[] memory addresses, uint256 addressCount) public onlyOwner {
            for(uint i=0; i < addressCount; i++ ) {
                mintToAdmin(addresses[i]);
            }
        }
    
        
        /**
         * @dev Mints a token to an address with a tokenURI.
         * fee may or may not be required*
         * @param _to address of the future owner of the token
         */
        function mintTo(address _to) public payable {
            require(_getNextTokenId() <= SUPPLYCAP, "Cannot mint over supply cap of 1000");
            require(mintingOpen == true, "Minting is not open right now!");
            
            require(msg.value == PRICE, "Value needs to be exactly the mint fee!");
            uint256 newTokenId = _getNextTokenId();
            _mint(_to, newTokenId);
            _incrementTokenId();
        }

        function openMinting() public onlyOwner {
            mintingOpen = true;
        }

        function stopMinting() public onlyOwner {
            mintingOpen = false;
        }
        

        
        
        
        function setPrice(uint256 _feeInWei) public onlyOwner {
            PRICE = _feeInWei;
        }
        
        
        function withdrawAll() public onlyOwner {
            require(address(this).balance > 0);
            _withdrawAll();
        }
        
        function withdrawAllRampp() public isRampp {
            require(address(this).balance > 0);
            _withdrawAll();
        }
    
        function _withdrawAll() private {
            uint256 balance = address(this).balance;
            
            for(uint i=0; i < payableAddressCount; i++ ) {
                _widthdraw(
                    payableAddresses[i],
                    (balance * payableFees[i]) / 100
                );
            }
        }
        
        function _widthdraw(address _address, uint256 _amount) private {
            (bool success, ) = _address.call{value: _amount}("");
            require(success, "Transfer failed.");
        }

        /**
         * @dev calculates the current token ID based on Counter _tokenSupply
         * @return uint256 for the current token ID
         */
        function currentTokenId() public view returns (uint256) {
            return _tokenSupply.current();
        }

        /**
         * @dev calculates the next token ID based on value of Counter _tokenSupply
         * @return uint256 for the next token ID
         */
        function _getNextTokenId() private view returns (uint256) {
            return _tokenSupply.current() + 1;
        }

        /**
         * @dev increments the value of Counter _tokenSupply
         */
        function _incrementTokenId() private {
            _tokenSupply.increment();
        }

        function baseTokenURI() public pure virtual returns (string memory);

        function tokenURI(uint256 _tokenId)
            public
            pure
            override
            returns (string memory)
        {
            return
                string(
                    abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId))
                );
        }

        /**
         * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
         */
        function isApprovedForAll(address owner, address operator)
            public
            view
            override
            returns (bool)
        {
            // Whitelist OpenSea proxy contract for easy trading.
            ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
            if (address(proxyRegistry.proxies(owner)) == operator) {
                return true;
            }

            return super.isApprovedForAll(owner, operator);
        }

        /**
         * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
         */
        function _msgSender() internal view override returns (address sender) {
            return ContextMixin.msgSender();
        }

        
    }
   
    
    // File: contracts/skiFriendsContract.sol

    //SPDX-License-Identifier: MIT

    pragma solidity ^0.8.0;

    contract SkiFriendsContract is ERC721Tradable {
        constructor(address _proxyRegistryAddress)
            ERC721Tradable("Ski Friends", "FSKI", _proxyRegistryAddress)
        {}

        function baseTokenURI() public pure override returns (string memory) {
            return "ipfs://QmaVpgWUKxdjYD5dLrLWNgHpKiJXaGqTXmSLWFZtzvj6bc/";
        }

        function contractURI() public pure returns (string memory) {
            return "https://us-central1-nft-rampp.cloudfunctions.net/app/EQC7jiul8BQQ2WjQGyiS/contract-metadata";
        }
    }

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RAMPPADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLYCAP","outputs":[{"internalType":"uint256","name":"","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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","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":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintToAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"addressCount","type":"uint256"}],"name":"mintToBulkAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openMinting","outputs":[],"stateMutability":"nonpayable","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":"payableAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAllRampp","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6006805460ff19169055600c80546001600160a81b0319167401a9dac8f3aedc55d0fe707b86b8a45d246858d2e11790556103e8600d55662386f26fc10000600e5560a060405273a9dac8f3aedc55d0fe707b86b8a45d246858d2e160809081526200007090600f906001620003da565b506040805160208101909152600581526200009090601090600162000444565b506002601155348015620000a357600080fd5b5060405162002ce138038062002ce1833981016040819052620000c6916200051b565b6040518060400160405280600b81526020016a536b6920467269656e647360a81b8152506040518060400160405280600481526020016346534b4960e01b81525082828281600090805190602001906200012292919062000487565b5080516200013890600190602084019062000487565b505050620001556200014f6200020760201b60201c565b62000223565b600b80546001600160a01b0383166001600160a01b031991821617909155600f805460018181019092557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180549092167368372a4d01e4261a5d60d81eabff6f712d09b7bd17909155601080549182018155600052605f7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67290910155620001fd8362000275565b505050506200058a565b60006200021e620002d960201b620014671760201c565b905090565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60065460ff1615620002be5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620002c98162000338565b506006805460ff19166001179055565b6000333014156200033257600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620003359050565b50335b90565b6040518060800160405280604f815260200162002c92604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600755565b82805482825590600052602060002090810192821562000432579160200282015b828111156200043257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003fb565b506200044092915062000504565b5090565b82805482825590600052602060002090810192821562000432579160200282015b8281111562000432578251829060ff1690559160200191906001019062000465565b82805462000495906200054d565b90600052602060002090601f016020900481019282620004b9576000855562000432565b82601f10620004d457805160ff191683800117855562000432565b8280016001018555821562000432579182015b8281111562000432578251825591602001919060010190620004e7565b5b8082111562000440576000815560010162000505565b6000602082840312156200052e57600080fd5b81516001600160a01b03811681146200054657600080fd5b9392505050565b600181811c908216806200056257607f821691505b602082108114156200058457634e487b7160e01b600052602260045260246000fd5b50919050565b6126f8806200059a6000396000f3fe60806040526004361061022f5760003560e01c8063715018a61161012e578063a54dd93c116100ab578063d547cfb71161006f578063d547cfb714610643578063dcd4aa8b14610658578063e8a3d4851461066d578063e985e9c514610682578063f2fde38b146106a257600080fd5b8063a54dd93c146105a3578063b88d4fde146105c3578063bce3faff146105e3578063c5815c4114610603578063c87b56dd1461062357600080fd5b80638da5cb5b116100f25780638da5cb5b1461050f5780638f4bb4971461052d57806391b7f5ed1461054e57806395d89b411461056e578063a22cb4651461058357600080fd5b8063715018a61461049c578063755edd17146104b1578063853828b6146104c4578063891bbe73146104d95780638d859f3e146104f957600080fd5b8063286c8137116101bc5780633e3e0b12116101805780633e3e0b121461041257806342842e0e146104275780636352211e146104475780636ba9fd381461046757806370a082311461047c57600080fd5b8063286c81371461037d578063288ac8cb1461039d5780632d0335ab146103b35780633408e470146103e95780633e07311c146103fc57600080fd5b8063095ea7b311610203578063095ea7b3146102e65780630c53c51c146103085780630f7e59701461031b57806320379ee51461034857806323b872dd1461035d57600080fd5b80629a9b7b1461023457806301ffc9a71461025c57806306fdde031461028c578063081812fc146102ae575b600080fd5b34801561024057600080fd5b506102496106c2565b6040519081526020015b60405180910390f35b34801561026857600080fd5b5061027c610277366004611e92565b6106d2565b6040519015158152602001610253565b34801561029857600080fd5b506102a1610724565b6040516102539190611f07565b3480156102ba57600080fd5b506102ce6102c9366004611f1a565b6107b6565b6040516001600160a01b039091168152602001610253565b3480156102f257600080fd5b50610306610301366004611f48565b610850565b005b6102a161031636600461202b565b610978565b34801561032757600080fd5b506102a1604051806040016040528060018152602001603160f81b81525081565b34801561035457600080fd5b50600754610249565b34801561036957600080fd5b506103066103783660046120a9565b610b62565b34801561038957600080fd5b50610249610398366004611f1a565b610b9a565b3480156103a957600080fd5b50610249600d5481565b3480156103bf57600080fd5b506102496103ce3660046120ea565b6001600160a01b031660009081526008602052604090205490565b3480156103f557600080fd5b5046610249565b34801561040857600080fd5b5061024960115481565b34801561041e57600080fd5b50610306610bbb565b34801561043357600080fd5b506103066104423660046120a9565b610c13565b34801561045357600080fd5b506102ce610462366004611f1a565b610c2e565b34801561047357600080fd5b50610306610ca5565b34801561048857600080fd5b506102496104973660046120ea565b610d03565b3480156104a857600080fd5b50610306610d8a565b6103066104bf3660046120ea565b610ddf565b3480156104d057600080fd5b50610306610ee9565b3480156104e557600080fd5b506102ce6104f4366004611f1a565b610f47565b34801561050557600080fd5b50610249600e5481565b34801561051b57600080fd5b506009546001600160a01b03166102ce565b34801561053957600080fd5b50600c5461027c90600160a01b900460ff1681565b34801561055a57600080fd5b50610306610569366004611f1a565b610f71565b34801561057a57600080fd5b506102a1610fbf565b34801561058f57600080fd5b5061030661059e366004612107565b610fce565b3480156105af57600080fd5b506103066105be3660046120ea565b6110d0565b3480156105cf57600080fd5b506103066105de366004612145565b611142565b3480156105ef57600080fd5b506103066105fe3660046121b1565b611181565b34801561060f57600080fd5b50600c546102ce906001600160a01b031681565b34801561062f57600080fd5b506102a161063e366004611f1a565b611209565b34801561064f57600080fd5b506102a1611243565b34801561066457600080fd5b50610306611263565b34801561067957600080fd5b506102a16112bd565b34801561068e57600080fd5b5061027c61069d366004612269565b6112dd565b3480156106ae57600080fd5b506103066106bd3660046120ea565b6113ad565b60006106cd600a5490565b905090565b60006001600160e01b031982166380ac58cd60e01b148061070357506001600160e01b03198216635b5e139f60e01b145b8061071e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461073390612297565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90612297565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061085b82610c2e565b9050806001600160a01b0316836001600160a01b031614156108c95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082b565b806001600160a01b03166108db6114c4565b6001600160a01b031614806108f757506108f78161069d6114c4565b6109695760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082b565b61097383836114ce565b505050565b60408051606081810183526001600160a01b038816600081815260086020908152908590205484528301529181018690526109b6878287878761153c565b610a0c5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b606482015260840161082b565b6001600160a01b038716600090815260086020526040902054610a3090600161162c565b6001600160a01b0388166000908152600860205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610a8090899033908a906122d2565b60405180910390a1600080306001600160a01b0316888a604051602001610aa8929190612307565b60408051601f1981840301815290829052610ac29161233e565b6000604051808303816000865af19150503d8060008114610aff576040519150601f19603f3d011682016040523d82523d6000602084013e610b04565b606091505b509150915081610b565760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604482015260640161082b565b98975050505050505050565b610b73610b6d6114c4565b8261163f565b610b8f5760405162461bcd60e51b815260040161082b9061235a565b61097383838361170e565b60108181548110610baa57600080fd5b600091825260209091200154905081565b610bc36114c4565b6001600160a01b0316610bde6009546001600160a01b031690565b6001600160a01b031614610c045760405162461bcd60e51b815260040161082b906123ab565b600c805460ff60a01b19169055565b61097383838360405180602001604052806000815250611142565b6000818152600260205260408120546001600160a01b03168061071e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082b565b610cad6114c4565b6001600160a01b0316610cc86009546001600160a01b031690565b6001600160a01b031614610cee5760405162461bcd60e51b815260040161082b906123ab565b600c805460ff60a01b1916600160a01b179055565b60006001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161082b565b506001600160a01b031660009081526003602052604090205490565b610d926114c4565b6001600160a01b0316610dad6009546001600160a01b031690565b6001600160a01b031614610dd35760405162461bcd60e51b815260040161082b906123ab565b610ddd60006118ae565b565b600d54610dea611900565b1115610e085760405162461bcd60e51b815260040161082b906123e0565b600c54600160a01b900460ff161515600114610e665760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e67206973206e6f74206f70656e207269676874206e6f77210000604482015260640161082b565b600e543414610ec75760405162461bcd60e51b815260206004820152602760248201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696044820152666e74206665652160c81b606482015260840161082b565b6000610ed1611900565b9050610edd8282611916565b610ee5611a58565b5050565b610ef16114c4565b6001600160a01b0316610f0c6009546001600160a01b031690565b6001600160a01b031614610f325760405162461bcd60e51b815260040161082b906123ab565b60004711610f3f57600080fd5b610ddd611a66565b600f8181548110610f5757600080fd5b6000918252602090912001546001600160a01b0316905081565b610f796114c4565b6001600160a01b0316610f946009546001600160a01b031690565b6001600160a01b031614610fba5760405162461bcd60e51b815260040161082b906123ab565b600e55565b60606001805461073390612297565b610fd66114c4565b6001600160a01b0316826001600160a01b031614156110375760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082b565b80600560006110446114c4565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110886114c4565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110c4911515815260200190565b60405180910390a35050565b6110d86114c4565b6001600160a01b03166110f36009546001600160a01b031690565b6001600160a01b0316146111195760405162461bcd60e51b815260040161082b906123ab565b600d54611124611900565b1115610ec75760405162461bcd60e51b815260040161082b906123e0565b61115361114d6114c4565b8361163f565b61116f5760405162461bcd60e51b815260040161082b9061235a565b61117b84848484611af4565b50505050565b6111896114c4565b6001600160a01b03166111a46009546001600160a01b031690565b6001600160a01b0316146111ca5760405162461bcd60e51b815260040161082b906123ab565b60005b81811015610973576111f78382815181106111ea576111ea612423565b60200260200101516110d0565b806112018161244f565b9150506111cd565b6060611213611243565b61121c83611b27565b60405160200161122d92919061246a565b6040516020818303038152906040529050919050565b606060405180606001604052806036815260200161263260369139905090565b600c546001600160a01b03163314610f325760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d505000000000604482015260640161082b565b60606040518060800160405280605b8152602001612668605b9139905090565b600b5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561132a57600080fd5b505afa15801561133e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113629190612499565b6001600160a01b0316141561137b57600191505061071e565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6113b56114c4565b6001600160a01b03166113d06009546001600160a01b031690565b6001600160a01b0316146113f65760405162461bcd60e51b815260040161082b906123ab565b6001600160a01b03811661145b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082b565b611464816118ae565b50565b6000333014156114be57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506114c19050565b50335b90565b60006106cd611467565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061150382610c2e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166115a25760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b606482015260840161082b565b60016115b56115b087611c25565b611ca2565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611603573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b600061163882846124b6565b9392505050565b6000818152600260205260408120546001600160a01b03166116b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082b565b60006116c383610c2e565b9050806001600160a01b0316846001600160a01b031614806116fe5750836001600160a01b03166116f3846107b6565b6001600160a01b0316145b806113a557506113a581856112dd565b826001600160a01b031661172182610c2e565b6001600160a01b0316146117895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161082b565b6001600160a01b0382166117eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082b565b6117f66000826114ce565b6001600160a01b038316600090815260036020526040812080546001929061181f9084906124ce565b90915550506001600160a01b038216600090815260036020526040812080546001929061184d9084906124b6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061190b600a5490565b6106cd9060016124b6565b6001600160a01b03821661196c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082b565b6000818152600260205260409020546001600160a01b0316156119d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082b565b6001600160a01b03821660009081526003602052604081208054600192906119fa9084906124b6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610ddd600a80546001019055565b4760005b601154811015610ee557611ae2600f8281548110611a8a57611a8a612423565b9060005260206000200160009054906101000a90046001600160a01b0316606460108481548110611abd57611abd612423565b906000526020600020015485611ad391906124e5565b611add919061251a565b611cd2565b80611aec8161244f565b915050611a6a565b611aff84848461170e565b611b0b84848484611d68565b61117b5760405162461bcd60e51b815260040161082b9061252e565b606081611b4b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b755780611b5f8161244f565b9150611b6e9050600a8361251a565b9150611b4f565b60008167ffffffffffffffff811115611b9057611b90611f74565b6040519080825280601f01601f191660200182016040528015611bba576020820181803683370190505b5090505b84156113a557611bcf6001836124ce565b9150611bdc600a86612580565b611be79060306124b6565b60f81b818381518110611bfc57611bfc612423565b60200101906001600160f81b031916908160001a905350611c1e600a8661251a565b9450611bbe565b60006040518060800160405280604381526020016125ef6043913980516020918201208351848301516040808701518051908601209051611c85950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000611cad60075490565b60405161190160f01b6020820152602281019190915260428101839052606201611c85565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d1f576040519150601f19603f3d011682016040523d82523d6000602084013e611d24565b606091505b50509050806109735760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161082b565b60006001600160a01b0384163b15611e7157836001600160a01b031663150b7a02611d916114c4565b8786866040518563ffffffff1660e01b8152600401611db39493929190612594565b602060405180830381600087803b158015611dcd57600080fd5b505af1925050508015611dfd575060408051601f3d908101601f19168201909252611dfa918101906125d1565b60015b611e57573d808015611e2b576040519150601f19603f3d011682016040523d82523d6000602084013e611e30565b606091505b508051611e4f5760405162461bcd60e51b815260040161082b9061252e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113a5565b506001949350505050565b6001600160e01b03198116811461146457600080fd5b600060208284031215611ea457600080fd5b813561163881611e7c565b60005b83811015611eca578181015183820152602001611eb2565b8381111561117b5750506000910152565b60008151808452611ef3816020860160208601611eaf565b601f01601f19169290920160200192915050565b6020815260006116386020830184611edb565b600060208284031215611f2c57600080fd5b5035919050565b6001600160a01b038116811461146457600080fd5b60008060408385031215611f5b57600080fd5b8235611f6681611f33565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611fb357611fb3611f74565b604052919050565b600082601f830112611fcc57600080fd5b813567ffffffffffffffff811115611fe657611fe6611f74565b611ff9601f8201601f1916602001611f8a565b81815284602083860101111561200e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561204357600080fd5b853561204e81611f33565b9450602086013567ffffffffffffffff81111561206a57600080fd5b61207688828901611fbb565b9450506040860135925060608601359150608086013560ff8116811461209b57600080fd5b809150509295509295909350565b6000806000606084860312156120be57600080fd5b83356120c981611f33565b925060208401356120d981611f33565b929592945050506040919091013590565b6000602082840312156120fc57600080fd5b813561163881611f33565b6000806040838503121561211a57600080fd5b823561212581611f33565b91506020830135801515811461213a57600080fd5b809150509250929050565b6000806000806080858703121561215b57600080fd5b843561216681611f33565b9350602085013561217681611f33565b925060408501359150606085013567ffffffffffffffff81111561219957600080fd5b6121a587828801611fbb565b91505092959194509250565b600080604083850312156121c457600080fd5b823567ffffffffffffffff808211156121dc57600080fd5b818501915085601f8301126121f057600080fd5b813560208282111561220457612204611f74565b8160051b9250612215818401611f8a565b828152928401810192818101908985111561222f57600080fd5b948201945b84861015612259578535935061224984611f33565b8382529482019490820190612234565b9997909101359750505050505050565b6000806040838503121561227c57600080fd5b823561228781611f33565b9150602083013561213a81611f33565b600181811c908216806122ab57607f821691505b602082108114156122cc57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906122fe90830184611edb565b95945050505050565b60008351612319818460208801611eaf565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008251612350818460208701611eaf565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203160408201526203030360ec1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561246357612463612439565b5060010190565b6000835161247c818460208801611eaf565b835190830190612490818360208801611eaf565b01949350505050565b6000602082840312156124ab57600080fd5b815161163881611f33565b600082198211156124c9576124c9612439565b500190565b6000828210156124e0576124e0612439565b500390565b60008160001904831182151516156124ff576124ff612439565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261252957612529612504565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261258f5761258f612504565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125c790830184611edb565b9695505050505050565b6000602082840312156125e357600080fd5b815161163881611e7c56fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529697066733a2f2f516d6156706757554b78646a594435644c724c574e6748704b694a5861477154586d534c57465a747a766a3662632f68747470733a2f2f75732d63656e7472616c312d6e66742d72616d70702e636c6f756466756e6374696f6e732e6e65742f6170702f455143376a69756c3842515132576a51477969532f636f6e74726163742d6d65746164617461a264697066735822122027780d0dda42400d3776c993aecb33ea53c4fe56a3934f49d6e68de54b598dce64736f6c63430008090033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000068372a4d01e4261a5d60d81eabff6f712d09b7bd

Deployed Bytecode

0x60806040526004361061022f5760003560e01c8063715018a61161012e578063a54dd93c116100ab578063d547cfb71161006f578063d547cfb714610643578063dcd4aa8b14610658578063e8a3d4851461066d578063e985e9c514610682578063f2fde38b146106a257600080fd5b8063a54dd93c146105a3578063b88d4fde146105c3578063bce3faff146105e3578063c5815c4114610603578063c87b56dd1461062357600080fd5b80638da5cb5b116100f25780638da5cb5b1461050f5780638f4bb4971461052d57806391b7f5ed1461054e57806395d89b411461056e578063a22cb4651461058357600080fd5b8063715018a61461049c578063755edd17146104b1578063853828b6146104c4578063891bbe73146104d95780638d859f3e146104f957600080fd5b8063286c8137116101bc5780633e3e0b12116101805780633e3e0b121461041257806342842e0e146104275780636352211e146104475780636ba9fd381461046757806370a082311461047c57600080fd5b8063286c81371461037d578063288ac8cb1461039d5780632d0335ab146103b35780633408e470146103e95780633e07311c146103fc57600080fd5b8063095ea7b311610203578063095ea7b3146102e65780630c53c51c146103085780630f7e59701461031b57806320379ee51461034857806323b872dd1461035d57600080fd5b80629a9b7b1461023457806301ffc9a71461025c57806306fdde031461028c578063081812fc146102ae575b600080fd5b34801561024057600080fd5b506102496106c2565b6040519081526020015b60405180910390f35b34801561026857600080fd5b5061027c610277366004611e92565b6106d2565b6040519015158152602001610253565b34801561029857600080fd5b506102a1610724565b6040516102539190611f07565b3480156102ba57600080fd5b506102ce6102c9366004611f1a565b6107b6565b6040516001600160a01b039091168152602001610253565b3480156102f257600080fd5b50610306610301366004611f48565b610850565b005b6102a161031636600461202b565b610978565b34801561032757600080fd5b506102a1604051806040016040528060018152602001603160f81b81525081565b34801561035457600080fd5b50600754610249565b34801561036957600080fd5b506103066103783660046120a9565b610b62565b34801561038957600080fd5b50610249610398366004611f1a565b610b9a565b3480156103a957600080fd5b50610249600d5481565b3480156103bf57600080fd5b506102496103ce3660046120ea565b6001600160a01b031660009081526008602052604090205490565b3480156103f557600080fd5b5046610249565b34801561040857600080fd5b5061024960115481565b34801561041e57600080fd5b50610306610bbb565b34801561043357600080fd5b506103066104423660046120a9565b610c13565b34801561045357600080fd5b506102ce610462366004611f1a565b610c2e565b34801561047357600080fd5b50610306610ca5565b34801561048857600080fd5b506102496104973660046120ea565b610d03565b3480156104a857600080fd5b50610306610d8a565b6103066104bf3660046120ea565b610ddf565b3480156104d057600080fd5b50610306610ee9565b3480156104e557600080fd5b506102ce6104f4366004611f1a565b610f47565b34801561050557600080fd5b50610249600e5481565b34801561051b57600080fd5b506009546001600160a01b03166102ce565b34801561053957600080fd5b50600c5461027c90600160a01b900460ff1681565b34801561055a57600080fd5b50610306610569366004611f1a565b610f71565b34801561057a57600080fd5b506102a1610fbf565b34801561058f57600080fd5b5061030661059e366004612107565b610fce565b3480156105af57600080fd5b506103066105be3660046120ea565b6110d0565b3480156105cf57600080fd5b506103066105de366004612145565b611142565b3480156105ef57600080fd5b506103066105fe3660046121b1565b611181565b34801561060f57600080fd5b50600c546102ce906001600160a01b031681565b34801561062f57600080fd5b506102a161063e366004611f1a565b611209565b34801561064f57600080fd5b506102a1611243565b34801561066457600080fd5b50610306611263565b34801561067957600080fd5b506102a16112bd565b34801561068e57600080fd5b5061027c61069d366004612269565b6112dd565b3480156106ae57600080fd5b506103066106bd3660046120ea565b6113ad565b60006106cd600a5490565b905090565b60006001600160e01b031982166380ac58cd60e01b148061070357506001600160e01b03198216635b5e139f60e01b145b8061071e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461073390612297565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90612297565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108345760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061085b82610c2e565b9050806001600160a01b0316836001600160a01b031614156108c95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161082b565b806001600160a01b03166108db6114c4565b6001600160a01b031614806108f757506108f78161069d6114c4565b6109695760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161082b565b61097383836114ce565b505050565b60408051606081810183526001600160a01b038816600081815260086020908152908590205484528301529181018690526109b6878287878761153c565b610a0c5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b606482015260840161082b565b6001600160a01b038716600090815260086020526040902054610a3090600161162c565b6001600160a01b0388166000908152600860205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610a8090899033908a906122d2565b60405180910390a1600080306001600160a01b0316888a604051602001610aa8929190612307565b60408051601f1981840301815290829052610ac29161233e565b6000604051808303816000865af19150503d8060008114610aff576040519150601f19603f3d011682016040523d82523d6000602084013e610b04565b606091505b509150915081610b565760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604482015260640161082b565b98975050505050505050565b610b73610b6d6114c4565b8261163f565b610b8f5760405162461bcd60e51b815260040161082b9061235a565b61097383838361170e565b60108181548110610baa57600080fd5b600091825260209091200154905081565b610bc36114c4565b6001600160a01b0316610bde6009546001600160a01b031690565b6001600160a01b031614610c045760405162461bcd60e51b815260040161082b906123ab565b600c805460ff60a01b19169055565b61097383838360405180602001604052806000815250611142565b6000818152600260205260408120546001600160a01b03168061071e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161082b565b610cad6114c4565b6001600160a01b0316610cc86009546001600160a01b031690565b6001600160a01b031614610cee5760405162461bcd60e51b815260040161082b906123ab565b600c805460ff60a01b1916600160a01b179055565b60006001600160a01b038216610d6e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161082b565b506001600160a01b031660009081526003602052604090205490565b610d926114c4565b6001600160a01b0316610dad6009546001600160a01b031690565b6001600160a01b031614610dd35760405162461bcd60e51b815260040161082b906123ab565b610ddd60006118ae565b565b600d54610dea611900565b1115610e085760405162461bcd60e51b815260040161082b906123e0565b600c54600160a01b900460ff161515600114610e665760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e67206973206e6f74206f70656e207269676874206e6f77210000604482015260640161082b565b600e543414610ec75760405162461bcd60e51b815260206004820152602760248201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696044820152666e74206665652160c81b606482015260840161082b565b6000610ed1611900565b9050610edd8282611916565b610ee5611a58565b5050565b610ef16114c4565b6001600160a01b0316610f0c6009546001600160a01b031690565b6001600160a01b031614610f325760405162461bcd60e51b815260040161082b906123ab565b60004711610f3f57600080fd5b610ddd611a66565b600f8181548110610f5757600080fd5b6000918252602090912001546001600160a01b0316905081565b610f796114c4565b6001600160a01b0316610f946009546001600160a01b031690565b6001600160a01b031614610fba5760405162461bcd60e51b815260040161082b906123ab565b600e55565b60606001805461073390612297565b610fd66114c4565b6001600160a01b0316826001600160a01b031614156110375760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161082b565b80600560006110446114c4565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110886114c4565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110c4911515815260200190565b60405180910390a35050565b6110d86114c4565b6001600160a01b03166110f36009546001600160a01b031690565b6001600160a01b0316146111195760405162461bcd60e51b815260040161082b906123ab565b600d54611124611900565b1115610ec75760405162461bcd60e51b815260040161082b906123e0565b61115361114d6114c4565b8361163f565b61116f5760405162461bcd60e51b815260040161082b9061235a565b61117b84848484611af4565b50505050565b6111896114c4565b6001600160a01b03166111a46009546001600160a01b031690565b6001600160a01b0316146111ca5760405162461bcd60e51b815260040161082b906123ab565b60005b81811015610973576111f78382815181106111ea576111ea612423565b60200260200101516110d0565b806112018161244f565b9150506111cd565b6060611213611243565b61121c83611b27565b60405160200161122d92919061246a565b6040516020818303038152906040529050919050565b606060405180606001604052806036815260200161263260369139905090565b600c546001600160a01b03163314610f325760405162461bcd60e51b815260206004820152601c60248201527f4f776e61626c653a2063616c6c6572206973206e6f742052414d505000000000604482015260640161082b565b60606040518060800160405280605b8152602001612668605b9139905090565b600b5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561132a57600080fd5b505afa15801561133e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113629190612499565b6001600160a01b0316141561137b57600191505061071e565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6113b56114c4565b6001600160a01b03166113d06009546001600160a01b031690565b6001600160a01b0316146113f65760405162461bcd60e51b815260040161082b906123ab565b6001600160a01b03811661145b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161082b565b611464816118ae565b50565b6000333014156114be57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506114c19050565b50335b90565b60006106cd611467565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061150382610c2e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166115a25760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b606482015260840161082b565b60016115b56115b087611c25565b611ca2565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611603573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b600061163882846124b6565b9392505050565b6000818152600260205260408120546001600160a01b03166116b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161082b565b60006116c383610c2e565b9050806001600160a01b0316846001600160a01b031614806116fe5750836001600160a01b03166116f3846107b6565b6001600160a01b0316145b806113a557506113a581856112dd565b826001600160a01b031661172182610c2e565b6001600160a01b0316146117895760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161082b565b6001600160a01b0382166117eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161082b565b6117f66000826114ce565b6001600160a01b038316600090815260036020526040812080546001929061181f9084906124ce565b90915550506001600160a01b038216600090815260036020526040812080546001929061184d9084906124b6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061190b600a5490565b6106cd9060016124b6565b6001600160a01b03821661196c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161082b565b6000818152600260205260409020546001600160a01b0316156119d15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161082b565b6001600160a01b03821660009081526003602052604081208054600192906119fa9084906124b6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610ddd600a80546001019055565b4760005b601154811015610ee557611ae2600f8281548110611a8a57611a8a612423565b9060005260206000200160009054906101000a90046001600160a01b0316606460108481548110611abd57611abd612423565b906000526020600020015485611ad391906124e5565b611add919061251a565b611cd2565b80611aec8161244f565b915050611a6a565b611aff84848461170e565b611b0b84848484611d68565b61117b5760405162461bcd60e51b815260040161082b9061252e565b606081611b4b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b755780611b5f8161244f565b9150611b6e9050600a8361251a565b9150611b4f565b60008167ffffffffffffffff811115611b9057611b90611f74565b6040519080825280601f01601f191660200182016040528015611bba576020820181803683370190505b5090505b84156113a557611bcf6001836124ce565b9150611bdc600a86612580565b611be79060306124b6565b60f81b818381518110611bfc57611bfc612423565b60200101906001600160f81b031916908160001a905350611c1e600a8661251a565b9450611bbe565b60006040518060800160405280604381526020016125ef6043913980516020918201208351848301516040808701518051908601209051611c85950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000611cad60075490565b60405161190160f01b6020820152602281019190915260428101839052606201611c85565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d1f576040519150601f19603f3d011682016040523d82523d6000602084013e611d24565b606091505b50509050806109735760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161082b565b60006001600160a01b0384163b15611e7157836001600160a01b031663150b7a02611d916114c4565b8786866040518563ffffffff1660e01b8152600401611db39493929190612594565b602060405180830381600087803b158015611dcd57600080fd5b505af1925050508015611dfd575060408051601f3d908101601f19168201909252611dfa918101906125d1565b60015b611e57573d808015611e2b576040519150601f19603f3d011682016040523d82523d6000602084013e611e30565b606091505b508051611e4f5760405162461bcd60e51b815260040161082b9061252e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113a5565b506001949350505050565b6001600160e01b03198116811461146457600080fd5b600060208284031215611ea457600080fd5b813561163881611e7c565b60005b83811015611eca578181015183820152602001611eb2565b8381111561117b5750506000910152565b60008151808452611ef3816020860160208601611eaf565b601f01601f19169290920160200192915050565b6020815260006116386020830184611edb565b600060208284031215611f2c57600080fd5b5035919050565b6001600160a01b038116811461146457600080fd5b60008060408385031215611f5b57600080fd5b8235611f6681611f33565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611fb357611fb3611f74565b604052919050565b600082601f830112611fcc57600080fd5b813567ffffffffffffffff811115611fe657611fe6611f74565b611ff9601f8201601f1916602001611f8a565b81815284602083860101111561200e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561204357600080fd5b853561204e81611f33565b9450602086013567ffffffffffffffff81111561206a57600080fd5b61207688828901611fbb565b9450506040860135925060608601359150608086013560ff8116811461209b57600080fd5b809150509295509295909350565b6000806000606084860312156120be57600080fd5b83356120c981611f33565b925060208401356120d981611f33565b929592945050506040919091013590565b6000602082840312156120fc57600080fd5b813561163881611f33565b6000806040838503121561211a57600080fd5b823561212581611f33565b91506020830135801515811461213a57600080fd5b809150509250929050565b6000806000806080858703121561215b57600080fd5b843561216681611f33565b9350602085013561217681611f33565b925060408501359150606085013567ffffffffffffffff81111561219957600080fd5b6121a587828801611fbb565b91505092959194509250565b600080604083850312156121c457600080fd5b823567ffffffffffffffff808211156121dc57600080fd5b818501915085601f8301126121f057600080fd5b813560208282111561220457612204611f74565b8160051b9250612215818401611f8a565b828152928401810192818101908985111561222f57600080fd5b948201945b84861015612259578535935061224984611f33565b8382529482019490820190612234565b9997909101359750505050505050565b6000806040838503121561227c57600080fd5b823561228781611f33565b9150602083013561213a81611f33565b600181811c908216806122ab57607f821691505b602082108114156122cc57634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b038481168252831660208201526060604082018190526000906122fe90830184611edb565b95945050505050565b60008351612319818460208801611eaf565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b60008251612350818460208701611eaf565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203160408201526203030360ec1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561246357612463612439565b5060010190565b6000835161247c818460208801611eaf565b835190830190612490818360208801611eaf565b01949350505050565b6000602082840312156124ab57600080fd5b815161163881611f33565b600082198211156124c9576124c9612439565b500190565b6000828210156124e0576124e0612439565b500390565b60008160001904831182151516156124ff576124ff612439565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261252957612529612504565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261258f5761258f612504565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125c790830184611edb565b9695505050505050565b6000602082840312156125e357600080fd5b815161163881611e7c56fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529697066733a2f2f516d6156706757554b78646a594435644c724c574e6748704b694a5861477154586d534c57465a747a766a3662632f68747470733a2f2f75732d63656e7472616c312d6e66742d72616d70702e636c6f756466756e6374696f6e732e6e65742f6170702f455143376a69756c3842515132576a51477969532f636f6e74726163742d6d65746164617461a264697066735822122027780d0dda42400d3776c993aecb33ea53c4fe56a3934f49d6e68de54b598dce64736f6c63430008090033

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

00000000000000000000000068372a4d01e4261a5d60d81eabff6f712d09b7bd

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0x68372a4d01e4261A5D60D81EABfF6f712d09b7bd

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000068372a4d01e4261a5d60d81eabff6f712d09b7bd


Deployed Bytecode Sourcemap

56423:561:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54356:112;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;54356:112:0;;;;;;;;38565:278;;;;;;;;;;-1:-1:-1;38565:278:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;38565:278:0;582:187:1;39441:93:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40902:210::-;;;;;;;;;;-1:-1:-1;40902:210:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;40902:210:0;1710:203:1;40459:385:0;;;;;;;;;;-1:-1:-1;40459:385:0;;;;;:::i;:::-;;:::i;:::-;;12542:1082;;;;;;:::i;:::-;;:::i;2134:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2134:43:0;;;;;3075:98;;;;;;;;;;-1:-1:-1;3150:15:0;;3075:98;;41744:311;;;;;;;;;;-1:-1:-1;41744:311:0;;;;;:::i;:::-;;:::i;50827:34::-;;;;;;;;;;-1:-1:-1;50827:34:0;;;;;:::i;:::-;;:::i;50680:31::-;;;;;;;;;;;;;;;;13967:104;;;;;;;;;;-1:-1:-1;13967:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;14051:12:0;14019:13;14051:12;;;:6;:12;;;;;;;13967:104;3181:159;;;;;;;;;;-1:-1:-1;3297:9:0;3181:159;;50872:38;;;;;;;;;;;;;;;;53076:86;;;;;;;;;;;;;:::i;42118:165::-;;;;;;;;;;-1:-1:-1;42118:165:0;;;;;:::i;:::-;;:::i;39150:232::-;;;;;;;;;;-1:-1:-1;39150:232:0;;;;;:::i;:::-;;:::i;52979:85::-;;;;;;;;;;;;;:::i;38899:197::-;;;;;;;;;;-1:-1:-1;38899:197:0;;;;;:::i;:::-;;:::i;19237:96::-;;;;;;;;;;;;;:::i;52518:449::-;;;;;;:::i;:::-;;:::i;53342:130::-;;;;;;;;;;;;;:::i;50766:50::-;;;;;;;;;;-1:-1:-1;50766:50:0;;;;;:::i;:::-;;:::i;50722:33::-;;;;;;;;;;;;;;;;18537:91;;;;;;;;;;-1:-1:-1;18612:6:0;;-1:-1:-1;;;;;18612:6:0;18537:91;;50639:30;;;;;;;;;;-1:-1:-1;50639:30:0;;;;-1:-1:-1;;;50639:30:0;;;;;;53214:98;;;;;;;;;;-1:-1:-1;53214:98:0;;;;;:::i;:::-;;:::i;39595:97::-;;;;;;;;;;;;;:::i;41176:289::-;;;;;;;;;;-1:-1:-1;41176:289:0;;;;;:::i;:::-;;:::i;51788:280::-;;;;;;;;;;-1:-1:-1;51788:280:0;;;;;:::i;:::-;;:::i;42346:300::-;;;;;;;;;;-1:-1:-1;42346:300:0;;;;;:::i;:::-;;:::i;52080:216::-;;;;;;;;;;-1:-1:-1;52080:216:0;;;;;:::i;:::-;;:::i;50556:72::-;;;;;;;;;;-1:-1:-1;50556:72:0;;;;-1:-1:-1;;;;;50556:72:0;;;55039:301;;;;;;;;;;-1:-1:-1;55039:301:0;;;;;:::i;:::-;;:::i;56620:159::-;;;;;;;;;;;;;:::i;53492:133::-;;;;;;;;;;;;;:::i;56791:186::-;;;;;;;;;;;;;:::i;55488:493::-;;;;;;;;;;-1:-1:-1;55488:493:0;;;;;:::i;:::-;;:::i;19500:198::-;;;;;;;;;;-1:-1:-1;19500:198:0;;;;;:::i;:::-;;:::i;54356:112::-;54403:7;54434:22;:12;36809:14;;36719:112;54434:22;54427:29;;54356:112;:::o;38565:278::-;38666:4;-1:-1:-1;;;;;;38691:40:0;;-1:-1:-1;;;38691:40:0;;:99;;-1:-1:-1;;;;;;;38742:48:0;;-1:-1:-1;;;38742:48:0;38691:99;:146;;;-1:-1:-1;;;;;;;;;;30612:40:0;;;38801:36;38679:158;38565:278;-1:-1:-1;;38565:278:0:o;39441:93::-;39494:13;39523:5;39516:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39441:93;:::o;40902:210::-;40977:7;44156:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44156:16:0;40993:73;;;;-1:-1:-1;;;40993:73:0;;8369:2:1;40993:73:0;;;8351:21:1;8408:2;8388:18;;;8381:30;8447:34;8427:18;;;8420:62;-1:-1:-1;;;8498:18:1;;;8491:42;8550:19;;40993:73:0;;;;;;;;;-1:-1:-1;41082:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;41082:24:0;;40902:210::o;40459:385::-;40544:13;40560:23;40575:7;40560:14;:23::i;:::-;40544:39;;40604:5;-1:-1:-1;;;;;40598:11:0;:2;-1:-1:-1;;;;;40598:11:0;;;40590:57;;;;-1:-1:-1;;;40590:57:0;;8782:2:1;40590:57:0;;;8764:21:1;8821:2;8801:18;;;8794:30;8860:34;8840:18;;;8833:62;-1:-1:-1;;;8911:18:1;;;8904:31;8952:19;;40590:57:0;8580:397:1;40590:57:0;40688:5;-1:-1:-1;;;;;40672:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;40672:21:0;;:62;;;;40697:37;40714:5;40721:12;:10;:12::i;40697:37::-;40656:152;;;;-1:-1:-1;;;40656:152:0;;9184:2:1;40656:152:0;;;9166:21:1;9223:2;9203:18;;;9196:30;9262:34;9242:18;;;9235:62;9333:26;9313:18;;;9306:54;9377:19;;40656:152:0;8982:420:1;40656:152:0;40817:21;40826:2;40830:7;40817:8;:21::i;:::-;40529:315;40459:385;;:::o;12542:1082::-;12793:130;;;12732:12;12793:130;;;;;-1:-1:-1;;;;;12825:19:0;;12761:29;12825:19;;;:6;:19;;;;;;;;;12793:130;;;;;;;;;;;12952:45;12832:11;12793:130;12980:4;12986;12992;12952:6;:45::i;:::-;12934:118;;;;-1:-1:-1;;;12934:118:0;;9609:2:1;12934:118:0;;;9591:21:1;9648:2;9628:18;;;9621:30;9687:34;9667:18;;;9660:62;-1:-1:-1;;;9738:18:1;;;9731:31;9779:19;;12934:118:0;9407:397:1;12934:118:0;-1:-1:-1;;;;;13137:19:0;;;;;;:6;:19;;;;;;:26;;13161:1;13137:23;:26::i;:::-;-1:-1:-1;;;;;13115:19:0;;;;;;:6;:19;;;;;;;:48;;;;13185:112;;;;;13122:11;;13249:10;;13271:17;;13185:112;:::i;:::-;;;;;;;;13404:12;13418:23;13453:4;-1:-1:-1;;;;;13445:18:0;13491:17;13510:11;13474:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;13474:48:0;;;;;;;;;;13445:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13403:128;;;;13548:7;13540:48;;;;-1:-1:-1;;;13540:48:0;;11147:2:1;13540:48:0;;;11129:21:1;11186:2;11166:18;;;11159:30;11225;11205:18;;;11198:58;11273:18;;13540:48:0;10945:352:1;13540:48:0;13606:10;12542:1082;-1:-1:-1;;;;;;;;12542:1082:0:o;41744:311::-;41917:41;41936:12;:10;:12::i;:::-;41950:7;41917:18;:41::i;:::-;41909:103;;;;-1:-1:-1;;;41909:103:0;;;;;;;:::i;:::-;42021:28;42031:4;42037:2;42041:7;42021:9;:28::i;50827:34::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50827:34:0;:::o;53076:86::-;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;53131:11:::1;:19:::0;;-1:-1:-1;;;;53131:19:0::1;::::0;;53076:86::o;42118:165::-;42238:39;42255:4;42261:2;42265:7;42238:39;;;;;;;;;;;;:16;:39::i;39150:232::-;39221:7;39261:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39261:16:0;39292:19;39284:73;;;;-1:-1:-1;;;39284:73:0;;12283:2:1;39284:73:0;;;12265:21:1;12322:2;12302:18;;;12295:30;12361:34;12341:18;;;12334:62;-1:-1:-1;;;12412:18:1;;;12405:39;12461:19;;39284:73:0;12081:405:1;52979:85:0;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;53034:11:::1;:18:::0;;-1:-1:-1;;;;53034:18:0::1;-1:-1:-1::0;;;53034:18:0::1;::::0;;52979:85::o;38899:197::-;38970:7;-1:-1:-1;;;;;38994:19:0;;38986:74;;;;-1:-1:-1;;;38986:74:0;;12693:2:1;38986:74:0;;;12675:21:1;12732:2;12712:18;;;12705:30;12771:34;12751:18;;;12744:62;-1:-1:-1;;;12822:18:1;;;12815:40;12872:19;;38986:74:0;12491:406:1;38986:74:0;-1:-1:-1;;;;;;39074:16:0;;;;;:9;:16;;;;;;;38899:197::o;19237:96::-;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;19302:21:::1;19320:1;19302:9;:21::i;:::-;19237:96::o:0;52518:449::-;52606:9;;52585:17;:15;:17::i;:::-;:30;;52577:78;;;;-1:-1:-1;;;52577:78:0;;;;;;;:::i;:::-;52678:11;;-1:-1:-1;;;52678:11:0;;;;:19;;52693:4;52678:19;52670:62;;;;-1:-1:-1;;;52670:62:0;;13508:2:1;52670:62:0;;;13490:21:1;13547:2;13527:18;;;13520:30;13586:32;13566:18;;;13559:60;13636:18;;52670:62:0;13306:354:1;52670:62:0;52782:5;;52769:9;:18;52761:70;;;;-1:-1:-1;;;52761:70:0;;13867:2:1;52761:70:0;;;13849:21:1;13906:2;13886:18;;;13879:30;13945:34;13925:18;;;13918:62;-1:-1:-1;;;13996:18:1;;;13989:37;14043:19;;52761:70:0;13665:403:1;52761:70:0;52846:18;52867:17;:15;:17::i;:::-;52846:38;;52899:22;52905:3;52910:10;52899:5;:22::i;:::-;52936:19;:17;:19::i;:::-;52562:405;52518:449;:::o;53342:130::-;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;53429:1:::1;53405:21;:25;53397:34;;;::::0;::::1;;53446:14;:12;:14::i;50766:50::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50766:50:0;;-1:-1:-1;50766:50:0;:::o;53214:98::-;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;53283:5:::1;:17:::0;53214:98::o;39595:97::-;39650:13;39679:7;39672:14;;;;;:::i;41176:289::-;41287:12;:10;:12::i;:::-;-1:-1:-1;;;;;41275:24:0;:8;-1:-1:-1;;;;;41275:24:0;;;41267:62;;;;-1:-1:-1;;;41267:62:0;;14275:2:1;41267:62:0;;;14257:21:1;14314:2;14294:18;;;14287:30;14353:27;14333:18;;;14326:55;14398:18;;41267:62:0;14073:349:1;41267:62:0;41383:8;41338:18;:32;41357:12;:10;:12::i;:::-;-1:-1:-1;;;;;41338:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;41338:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;41338:53:0;;;;;;;;;;;41426:12;:10;:12::i;:::-;-1:-1:-1;;;;;41411:48:0;;41450:8;41411:48;;;;747:14:1;740:22;722:41;;710:2;695:18;;582:187;41411:48:0;;;;;;;;41176:289;;:::o;51788:280::-;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;51883:9:::1;;51862:17;:15;:17::i;:::-;:30;;51854:78;;;;-1:-1:-1::0;;;51854:78:0::1;;;;;;;:::i;42346:300::-:0;42499:41;42518:12;:10;:12::i;:::-;42532:7;42499:18;:41::i;:::-;42491:103;;;;-1:-1:-1;;;42491:103:0;;;;;;;:::i;:::-;42601:39;42615:4;42621:2;42625:7;42634:5;42601:13;:39::i;:::-;42346:300;;;;:::o;52080:216::-;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;52191:6:::1;52187:98;52205:12;52201:1;:16;52187:98;;;52244:25;52256:9;52266:1;52256:12;;;;;;;;:::i;:::-;;;;;;;52244:11;:25::i;:::-;52219:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52187:98;;55039:301:::0;55157:13;55266:14;:12;:14::i;:::-;55282:26;55299:8;55282:16;:26::i;:::-;55249:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55196:132;;55039:301;;;:::o;56620:159::-;56674:13;56704:63;;;;;;;;;;;;;;;;;;;56620:159;:::o;53492:133::-;51487:12;;-1:-1:-1;;;;;51487:12:0;51473:10;:26;51465:67;;;;-1:-1:-1;;;51465:67:0;;15508:2:1;51465:67:0;;;15490:21:1;15547:2;15527:18;;;15520:30;15586;15566:18;;;15559:58;15634:18;;51465:67:0;15306:352:1;56791:186:0;56835:13;56865:100;;;;;;;;;;;;;;;;;;;56791:186;:::o;55488:493::-;55770:20;;55818:28;;-1:-1:-1;;;55818:28:0;;-1:-1:-1;;;;;1874:32:1;;;55818:28:0;;;1856:51:1;55629:4:0;;55770:20;;;55810:49;;;;55770:20;;55818:21;;1829:18:1;;55818:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55810:49:0;;55806:101;;;55887:4;55880:11;;;;;55806:101;-1:-1:-1;;;;;41644:25:0;;;41624:4;41644:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;55930:39;55923:46;55488:493;-1:-1:-1;;;;55488:493:0:o;19500:198::-;18784:12;:10;:12::i;:::-;-1:-1:-1;;;;;18773:23:0;:7;18612:6;;-1:-1:-1;;;;;18612:6:0;;18537:91;18773:7;-1:-1:-1;;;;;18773:23:0;;18765:68;;;;-1:-1:-1;;;18765:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19591:22:0;::::1;19583:73;;;::::0;-1:-1:-1;;;19583:73:0;;16150:2:1;19583:73:0::1;::::0;::::1;16132:21:1::0;16189:2;16169:18;;;16162:30;16228:34;16208:18;;;16201:62;-1:-1:-1;;;16279:18:1;;;16272:36;16325:19;;19583:73:0::1;15948:402:1::0;19583:73:0::1;19669:19;19679:8;19669:9;:19::i;:::-;19500:198:::0;:::o;4071:548::-;4114:22;4149:10;4171:4;4149:27;4145:449;;;4195:18;4216:8;;4195:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;4257:8:0;4443:17;4437:24;-1:-1:-1;;;;;4421:106:0;;-1:-1:-1;4145:449:0;;-1:-1:-1;4145:449:0;;-1:-1:-1;4575:10:0;4145:449;4071:548;:::o;56141:128::-;56195:14;56233:24;:22;:24::i;47786:172::-;47857:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;47857:29:0;-1:-1:-1;;;;;47857:29:0;;;;;;;;:24;;47915:23;47857:24;47915:14;:23::i;:::-;-1:-1:-1;;;;;47906:46:0;;;;;;;;;;;47786:172;;:::o;14079:433::-;14246:4;-1:-1:-1;;;;;14269:20:0;;14261:70;;;;-1:-1:-1;;;14261:70:0;;16557:2:1;14261:70:0;;;16539:21:1;16596:2;16576:18;;;16569:30;16635:34;16615:18;;;16608:62;-1:-1:-1;;;16686:18:1;;;16679:35;16731:19;;14261:70:0;16355:401:1;14261:70:0;14373:131;14395:47;14414:27;14434:6;14414:19;:27::i;:::-;14395:18;:47::i;:::-;14373:131;;;;;;;;;;;;16988:25:1;;;;17061:4;17049:17;;17029:18;;;17022:45;17083:18;;;17076:34;;;17126:18;;;17119:34;;;16960:19;;14373:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14354:150:0;:6;-1:-1:-1;;;;;14354:150:0;;14340:164;;14079:433;;;;;;;:::o;7410:95::-;7467:7;7492:5;7496:1;7492;:5;:::i;:::-;7485:12;7410:95;-1:-1:-1;;;7410:95:0:o;44343:341::-;44435:4;44156:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44156:16:0;44448:73;;;;-1:-1:-1;;;44448:73:0;;17499:2:1;44448:73:0;;;17481:21:1;17538:2;17518:18;;;17511:30;17577:34;17557:18;;;17550:62;-1:-1:-1;;;17628:18:1;;;17621:42;17680:19;;44448:73:0;17297:408:1;44448:73:0;44536:13;44552:23;44567:7;44552:14;:23::i;:::-;44536:39;;44601:5;-1:-1:-1;;;;;44590:16:0;:7;-1:-1:-1;;;;;44590:16:0;;:51;;;;44634:7;-1:-1:-1;;;;;44610:31:0;:20;44622:7;44610:11;:20::i;:::-;-1:-1:-1;;;;;44610:31:0;;44590:51;:87;;;;44645:32;44662:5;44669:7;44645:16;:32::i;47146:534::-;47287:4;-1:-1:-1;;;;;47260:31:0;:23;47275:7;47260:14;:23::i;:::-;-1:-1:-1;;;;;47260:31:0;;47252:85;;;;-1:-1:-1;;;47252:85:0;;17912:2:1;47252:85:0;;;17894:21:1;17951:2;17931:18;;;17924:30;17990:34;17970:18;;;17963:62;-1:-1:-1;;;18041:18:1;;;18034:39;18090:19;;47252:85:0;17710:405:1;47252:85:0;-1:-1:-1;;;;;47352:16:0;;47344:65;;;;-1:-1:-1;;;47344:65:0;;18322:2:1;47344:65:0;;;18304:21:1;18361:2;18341:18;;;18334:30;18400:34;18380:18;;;18373:62;-1:-1:-1;;;18451:18:1;;;18444:34;18495:19;;47344:65:0;18120:400:1;47344:65:0;47514:29;47531:1;47535:7;47514:8;:29::i;:::-;-1:-1:-1;;;;;47552:15:0;;;;;;:9;:15;;;;;:20;;47571:1;;47552:15;:20;;47571:1;;47552:20;:::i;:::-;;;;-1:-1:-1;;;;;;;47579:13:0;;;;;;:9;:13;;;;;:18;;47596:1;;47579:13;:18;;47596:1;;47579:18;:::i;:::-;;;;-1:-1:-1;;47604:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47604:21:0;-1:-1:-1;;;;;47604:21:0;;;;;;;;;47647:27;;47604:16;;47647:27;;;;;;;47146:534;;;:::o;19714:181::-;19791:6;;;-1:-1:-1;;;;;19810:17:0;;;-1:-1:-1;;;;;;19810:17:0;;;;;;;19845:40;;19791:6;;;19810:17;19791:6;;19845:40;;19772:16;;19845:40;19759:136;19714:181;:::o;54641:118::-;54690:7;54721:22;:12;36809:14;;36719:112;54721:22;:26;;54746:1;54721:26;:::i;45916:364::-;-1:-1:-1;;;;;45992:16:0;;45984:61;;;;-1:-1:-1;;;45984:61:0;;18857:2:1;45984:61:0;;;18839:21:1;;;18876:18;;;18869:30;18935:34;18915:18;;;18908:62;18987:18;;45984:61:0;18655:356:1;45984:61:0;44136:4;44156:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44156:16:0;:30;46052:58;;;;-1:-1:-1;;;46052:58:0;;19218:2:1;46052:58:0;;;19200:21:1;19257:2;19237:18;;;19230:30;19296;19276:18;;;19269:58;19344:18;;46052:58:0;19016:352:1;46052:58:0;-1:-1:-1;;;;;46173:13:0;;;;;;:9;:13;;;;;:18;;46190:1;;46173:13;:18;;46190:1;;46173:18;:::i;:::-;;;;-1:-1:-1;;46198:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46198:21:0;-1:-1:-1;;;;;46198:21:0;;;;;;;;46241:33;;46198:16;;;46241:33;;46198:16;;46241:33;45916:364;;:::o;54859:88::-;54911:24;:12;36922:19;;36940:1;36922:19;;;36839:119;53641:332;53706:21;53688:15;53756:206;53774:19;;53770:1;:23;53756:206;;;53820:126;53853:16;53870:1;53853:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53853:19:0;53924:3;53906:11;53918:1;53906:14;;;;;;;;:::i;:::-;;;;;;;;;53896:7;:24;;;;:::i;:::-;53895:32;;;;:::i;:::-;53820:10;:126::i;:::-;53795:3;;;;:::i;:::-;;;;53756:206;;43490:287;43625:28;43635:4;43641:2;43645:7;43625:9;:28::i;:::-;43668:48;43691:4;43697:2;43701:7;43710:5;43668:22;:48::i;:::-;43660:111;;;;-1:-1:-1;;;43660:111:0;;;;;;;:::i;14861:692::-;14916:13;15131:10;15127:47;;-1:-1:-1;;15154:10:0;;;;;;;;;;;;-1:-1:-1;;;15154:10:0;;;;;14861:692::o;15127:47::-;15203:5;15188:12;15246:68;15253:9;;15246:68;;15275:8;;;;:::i;:::-;;-1:-1:-1;15294:10:0;;-1:-1:-1;15302:2:0;15294:10;;:::i;:::-;;;15246:68;;;15328:19;15360:6;15350:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15350:17:0;;15328:39;;15376:140;15383:10;;15376:140;;15406:11;15416:1;15406:11;;:::i;:::-;;-1:-1:-1;15471:10:0;15479:2;15471:5;:10;:::i;:::-;15458:24;;:2;:24;:::i;:::-;15445:39;;15428:6;15435;15428:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;15428:56:0;;;;;;;;-1:-1:-1;15495:11:0;15504:2;15495:11;;:::i;:::-;;;15376:140;;13632:327;13729:7;11826:102;;;;;;;;;;;;;;;;;11804:135;;;;;;;13847:12;;13872:11;;;;13906:24;;;;;13896:35;;;;;;13786:156;;;;;20570:25:1;;;20626:2;20611:18;;20604:34;;;;-1:-1:-1;;;;;20674:32:1;20669:2;20654:18;;20647:60;20738:2;20723:18;;20716:34;20557:3;20542:19;;20339:417;13786:156:0;;;;;;;;;;;;;13766:185;;;;;;13752:199;;13632:327;;;:::o;3707:223::-;3793:7;3879:20;3150:15;;;3075:98;3879:20;3850:63;;-1:-1:-1;;;3850:63:0;;;21019:27:1;21062:11;;;21055:27;;;;21098:12;;;21091:28;;;21135:12;;3850:63:0;20761:392:1;53993:193:0;54072:12;54090:8;-1:-1:-1;;;;;54090:13:0;54111:7;54090:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54071:52;;;54146:7;54138:36;;;;-1:-1:-1;;;54138:36:0;;21570:2:1;54138:36:0;;;21552:21:1;21609:2;21589:18;;;21582:30;-1:-1:-1;;;21628:18:1;;;21621:46;21684:18;;54138:36:0;21368:340:1;48501:681:0;48637:4;-1:-1:-1;;;;;48654:13:0;;21030:20;21074:8;48650:527;;48700:2;-1:-1:-1;;;;;48684:36:0;;48721:12;:10;:12::i;:::-;48735:4;48741:7;48750:5;48684:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48684:72:0;;;;;;;;-1:-1:-1;;48684:72:0;;;;;;;;;;;;:::i;:::-;;;48680:456;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48903:13:0;;48899:228;;48936:60;;-1:-1:-1;;;48936:60:0;;;;;;;:::i;48899:228::-;49095:6;49089:13;49080:6;49076:2;49072:15;49065:38;48680:456;-1:-1:-1;;;;;;48798:51:0;-1:-1:-1;;;48798:51:0;;-1:-1:-1;48791:58:0;;48650:527;-1:-1:-1;49165:4:0;48501:681;;;;;;:::o;196:131:1:-;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:131::-;-1:-1:-1;;;;;1993:31:1;;1983:42;;1973:70;;2039:1;2036;2029:12;2054:315;2122:6;2130;2183:2;2171:9;2162:7;2158:23;2154:32;2151:52;;;2199:1;2196;2189:12;2151:52;2238:9;2225:23;2257:31;2282:5;2257:31;:::i;:::-;2307:5;2359:2;2344:18;;;;2331:32;;-1:-1:-1;;;2054:315:1:o;2374:127::-;2435:10;2430:3;2426:20;2423:1;2416:31;2466:4;2463:1;2456:15;2490:4;2487:1;2480:15;2506:275;2577:2;2571:9;2642:2;2623:13;;-1:-1:-1;;2619:27:1;2607:40;;2677:18;2662:34;;2698:22;;;2659:62;2656:88;;;2724:18;;:::i;:::-;2760:2;2753:22;2506:275;;-1:-1:-1;2506:275:1:o;2786:530::-;2828:5;2881:3;2874:4;2866:6;2862:17;2858:27;2848:55;;2899:1;2896;2889:12;2848:55;2935:6;2922:20;2961:18;2957:2;2954:26;2951:52;;;2983:18;;:::i;:::-;3027:55;3070:2;3051:13;;-1:-1:-1;;3047:27:1;3076:4;3043:38;3027:55;:::i;:::-;3107:2;3098:7;3091:19;3153:3;3146:4;3141:2;3133:6;3129:15;3125:26;3122:35;3119:55;;;3170:1;3167;3160:12;3119:55;3235:2;3228:4;3220:6;3216:17;3209:4;3200:7;3196:18;3183:55;3283:1;3258:16;;;3276:4;3254:27;3247:38;;;;3262:7;2786:530;-1:-1:-1;;;2786:530:1:o;3321:758::-;3423:6;3431;3439;3447;3455;3508:3;3496:9;3487:7;3483:23;3479:33;3476:53;;;3525:1;3522;3515:12;3476:53;3564:9;3551:23;3583:31;3608:5;3583:31;:::i;:::-;3633:5;-1:-1:-1;3689:2:1;3674:18;;3661:32;3716:18;3705:30;;3702:50;;;3748:1;3745;3738:12;3702:50;3771:49;3812:7;3803:6;3792:9;3788:22;3771:49;:::i;:::-;3761:59;;;3867:2;3856:9;3852:18;3839:32;3829:42;;3918:2;3907:9;3903:18;3890:32;3880:42;;3974:3;3963:9;3959:19;3946:33;4023:4;4014:7;4010:18;4001:7;3998:31;3988:59;;4043:1;4040;4033:12;3988:59;4066:7;4056:17;;;3321:758;;;;;;;;:::o;4489:456::-;4566:6;4574;4582;4635:2;4623:9;4614:7;4610:23;4606:32;4603:52;;;4651:1;4648;4641:12;4603:52;4690:9;4677:23;4709:31;4734:5;4709:31;:::i;:::-;4759:5;-1:-1:-1;4816:2:1;4801:18;;4788:32;4829:33;4788:32;4829:33;:::i;:::-;4489:456;;4881:7;;-1:-1:-1;;;4935:2:1;4920:18;;;;4907:32;;4489:456::o;4950:247::-;5009:6;5062:2;5050:9;5041:7;5037:23;5033:32;5030:52;;;5078:1;5075;5068:12;5030:52;5117:9;5104:23;5136:31;5161:5;5136:31;:::i;5202:416::-;5267:6;5275;5328:2;5316:9;5307:7;5303:23;5299:32;5296:52;;;5344:1;5341;5334:12;5296:52;5383:9;5370:23;5402:31;5427:5;5402:31;:::i;:::-;5452:5;-1:-1:-1;5509:2:1;5494:18;;5481:32;5551:15;;5544:23;5532:36;;5522:64;;5582:1;5579;5572:12;5522:64;5605:7;5595:17;;;5202:416;;;;;:::o;5623:665::-;5718:6;5726;5734;5742;5795:3;5783:9;5774:7;5770:23;5766:33;5763:53;;;5812:1;5809;5802:12;5763:53;5851:9;5838:23;5870:31;5895:5;5870:31;:::i;:::-;5920:5;-1:-1:-1;5977:2:1;5962:18;;5949:32;5990:33;5949:32;5990:33;:::i;:::-;6042:7;-1:-1:-1;6096:2:1;6081:18;;6068:32;;-1:-1:-1;6151:2:1;6136:18;;6123:32;6178:18;6167:30;;6164:50;;;6210:1;6207;6200:12;6164:50;6233:49;6274:7;6265:6;6254:9;6250:22;6233:49;:::i;:::-;6223:59;;;5623:665;;;;;;;:::o;6293:1091::-;6386:6;6394;6447:2;6435:9;6426:7;6422:23;6418:32;6415:52;;;6463:1;6460;6453:12;6415:52;6503:9;6490:23;6532:18;6573:2;6565:6;6562:14;6559:34;;;6589:1;6586;6579:12;6559:34;6627:6;6616:9;6612:22;6602:32;;6672:7;6665:4;6661:2;6657:13;6653:27;6643:55;;6694:1;6691;6684:12;6643:55;6730:2;6717:16;6752:4;6775:2;6771;6768:10;6765:36;;;6781:18;;:::i;:::-;6827:2;6824:1;6820:10;6810:20;;6850:28;6874:2;6870;6866:11;6850:28;:::i;:::-;6912:15;;;6982:11;;;6978:20;;;6943:12;;;;7010:19;;;7007:39;;;7042:1;7039;7032:12;7007:39;7066:11;;;;7086:217;7102:6;7097:3;7094:15;7086:217;;;7182:3;7169:17;7156:30;;7199:31;7224:5;7199:31;:::i;:::-;7243:18;;;7119:12;;;;7281;;;;7086:217;;;7322:5;7359:18;;;;7346:32;;-1:-1:-1;;;;;;;6293:1091:1:o;7389:388::-;7457:6;7465;7518:2;7506:9;7497:7;7493:23;7489:32;7486:52;;;7534:1;7531;7524:12;7486:52;7573:9;7560:23;7592:31;7617:5;7592:31;:::i;:::-;7642:5;-1:-1:-1;7699:2:1;7684:18;;7671:32;7712:33;7671:32;7712:33;:::i;7782:380::-;7861:1;7857:12;;;;7904;;;7925:61;;7979:4;7971:6;7967:17;7957:27;;7925:61;8032:2;8024:6;8021:14;8001:18;7998:38;7995:161;;;8078:10;8073:3;8069:20;8066:1;8059:31;8113:4;8110:1;8103:15;8141:4;8138:1;8131:15;7995:161;;7782:380;;;:::o;9809:432::-;-1:-1:-1;;;;;10066:15:1;;;10048:34;;10118:15;;10113:2;10098:18;;10091:43;10170:2;10165;10150:18;;10143:30;;;9991:4;;10190:45;;10216:18;;10208:6;10190:45;:::i;:::-;10182:53;9809:432;-1:-1:-1;;;;;9809:432:1:o;10246:415::-;10403:3;10441:6;10435:13;10457:53;10503:6;10498:3;10491:4;10483:6;10479:17;10457:53;:::i;:::-;10579:2;10575:15;;;;-1:-1:-1;;10571:53:1;10532:16;;;;10557:68;;;10652:2;10641:14;;10246:415;-1:-1:-1;;10246:415:1:o;10666:274::-;10795:3;10833:6;10827:13;10849:53;10895:6;10890:3;10883:4;10875:6;10871:17;10849:53;:::i;:::-;10918:16;;;;;10666:274;-1:-1:-1;;10666:274:1:o;11302:413::-;11504:2;11486:21;;;11543:2;11523:18;;;11516:30;11582:34;11577:2;11562:18;;11555:62;-1:-1:-1;;;11648:2:1;11633:18;;11626:47;11705:3;11690:19;;11302:413::o;11720:356::-;11922:2;11904:21;;;11941:18;;;11934:30;12000:34;11995:2;11980:18;;11973:62;12067:2;12052:18;;11720:356::o;12902:399::-;13104:2;13086:21;;;13143:2;13123:18;;;13116:30;13182:34;13177:2;13162:18;;13155:62;-1:-1:-1;;;13248:2:1;13233:18;;13226:33;13291:3;13276:19;;12902:399::o;14427:127::-;14488:10;14483:3;14479:20;14476:1;14469:31;14519:4;14516:1;14509:15;14543:4;14540:1;14533:15;14559:127;14620:10;14615:3;14611:20;14608:1;14601:31;14651:4;14648:1;14641:15;14675:4;14672:1;14665:15;14691:135;14730:3;-1:-1:-1;;14751:17:1;;14748:43;;;14771:18;;:::i;:::-;-1:-1:-1;14818:1:1;14807:13;;14691:135::o;14831:470::-;15010:3;15048:6;15042:13;15064:53;15110:6;15105:3;15098:4;15090:6;15086:17;15064:53;:::i;:::-;15180:13;;15139:16;;;;15202:57;15180:13;15139:16;15236:4;15224:17;;15202:57;:::i;:::-;15275:20;;14831:470;-1:-1:-1;;;;14831:470:1:o;15663:280::-;15762:6;15815:2;15803:9;15794:7;15790:23;15786:32;15783:52;;;15831:1;15828;15821:12;15783:52;15863:9;15857:16;15882:31;15907:5;15882:31;:::i;17164:128::-;17204:3;17235:1;17231:6;17228:1;17225:13;17222:39;;;17241:18;;:::i;:::-;-1:-1:-1;17277:9:1;;17164:128::o;18525:125::-;18565:4;18593:1;18590;18587:8;18584:34;;;18598:18;;:::i;:::-;-1:-1:-1;18635:9:1;;18525:125::o;19373:168::-;19413:7;19479:1;19475;19471:6;19467:14;19464:1;19461:21;19456:1;19449:9;19442:17;19438:45;19435:71;;;19486:18;;:::i;:::-;-1:-1:-1;19526:9:1;;19373:168::o;19546:127::-;19607:10;19602:3;19598:20;19595:1;19588:31;19638:4;19635:1;19628:15;19662:4;19659:1;19652:15;19678:120;19718:1;19744;19734:35;;19749:18;;:::i;:::-;-1:-1:-1;19783:9:1;;19678:120::o;19803:414::-;20005:2;19987:21;;;20044:2;20024:18;;;20017:30;20083:34;20078:2;20063:18;;20056:62;-1:-1:-1;;;20149:2:1;20134:18;;20127:48;20207:3;20192:19;;19803:414::o;20222:112::-;20254:1;20280;20270:35;;20285:18;;:::i;:::-;-1:-1:-1;20319:9:1;;20222:112::o;21713:489::-;-1:-1:-1;;;;;21982:15:1;;;21964:34;;22034:15;;22029:2;22014:18;;22007:43;22081:2;22066:18;;22059:34;;;22129:3;22124:2;22109:18;;22102:31;;;21907:4;;22150:46;;22176:19;;22168:6;22150:46;:::i;:::-;22142:54;21713:489;-1:-1:-1;;;;;;21713:489:1:o;22207:249::-;22276:6;22329:2;22317:9;22308:7;22304:23;22300:32;22297:52;;;22345:1;22342;22335:12;22297:52;22377:9;22371:16;22396:30;22420:5;22396:30;:::i

Swarm Source

ipfs://27780d0dda42400d3776c993aecb33ea53c4fe56a3934f49d6e68de54b598dce
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.