ETH Price: $3,450.99 (+1.54%)
Gas: 4.81 Gwei

Token

Kaiba v2 Celebration NFT (THEPACK)
 

Overview

Max Total Supply

128 THEPACK

Holders

128

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
williamwallet.eth
Balance
1 THEPACK
0xe12d731750e222ec53b001e00d978901b134cfc9
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:
KaibaNFT

Compiler Version
v0.8.6+commit.11564f7e

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

// SPDX-License-Identifier: MIT


pragma solidity 0.8.6;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

    mapping (address => bool) public isAuth;
    address tokenLinkAddress;

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
    isAuth[owner] = true;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  modifier onlyAuthorized()
  {
    require(isAuth[msg.sender] || msg.sender == owner, "Unauth");
    _;
  }
  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

// File: contracts/tokens/erc721-metadata.sol


/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

// File: contracts/utils/address-utils.sol



/**
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 * @dev Utility library of inline functions on addresses.
 */
library AddressUtils
{

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}

// File: contracts/utils/erc165.sol



/**
 * @dev A standard for detecting smart contract interfaces.
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);

}

// File: contracts/utils/supports-interface.sol




/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}

// File: contracts/tokens/erc721-token-receiver.sol



/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}

// File: contracts/tokens/erc721.sol


/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.  This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Query if an address is an authorized operator for another address.
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}

// File: contracts/tokens/nf-token.sol

/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @notice This works even if sender doesn't own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @notice Does NO checks.
   * @dev Actually performs the transfer.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @param _from Address from which we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @param _to Address to which we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    delete idToApproval[_tokenId];
  }

}




interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}


// File: contracts/tokens/nf-token-metadata.sol





/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    virtual
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

   /**
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }

}




library Strings {
    /**
     * @dev Converts a uint256 to its ASCII string representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {

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

contract KaibaNFT is NFTokenMetadata, Ownable {

  using Strings for uint256;

  uint256 _lastTokenId = 0;
  bool public mintEnabled;
  mapping(address => bool) is_auth;
  string public baseuri;
  mapping(address => bool) hasMinted;
  mapping(address => bool) isFree;
  address kaiba = 0xF2210f65235c2FB391aB8650520237E6378e5C5A;
  uint256 givingAway;
  IERC20 kaibatoken = IERC20(kaiba);

  modifier onlyAuth() {
      require(msg.sender==owner || is_auth[msg.sender], "Unauthorized");
      _;
  }

bool locked;

modifier safe() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
  }

  constructor() {
    nftName = "Kaiba v2 Celebration NFT";
    nftSymbol = "THEPACK";
    baseuri = "https://interplanetarykitchen.mypinata.cloud/ipfs/QmRWHp6q55hP82DNiEZmDQrM2SMMy6jzcMKrixu4t2E1js";
    owner = msg.sender;
    is_auth[owner] = true;
    mintNFT();
  }

  function takeBalance () public onlyAuth {
        (bool sent,) =owner.call{value: (address(this).balance)}("");
        require(sent);
  }

  function setBaseuri(string calldata newUri) public onlyAuth {
      baseuri = newUri;
  }

   function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return string(abi.encodePacked(baseuri));
  }

  function getOwner() external view returns (address) {
        return owner;
    }

  function decimals() external pure returns (uint8) {
        return 0;
    }

  function totalSupply() external view returns (uint256) {
        return _lastTokenId;
    }

  function setAuth(bool booly, address addy) public onlyAuth {
      is_auth[addy] = booly;
  }

  function enableMint(bool booly) public onlyAuth {
      mintEnabled = booly;
  }

  function setKaiba(address addy) public onlyAuth {
      kaiba = addy;
      kaibatoken = IERC20(kaiba);
  }

  function setFree(address addy) public onlyAuth {
      isFree[addy] = true;
  }

  function giveaway(uint256 qty) public onlyAuth {
      if(qty==0) {
          givingAway = 100000000;
      } else {
          givingAway = qty; 
      }
  }

function mintNFT() payable public safe {
    bool isGiveaway;
    if (givingAway > 0) {
        isGiveaway = true;
        givingAway -= 1;
    } else {
        isGiveaway = false;
    }
    if (!is_auth[msg.sender] && !isFree[msg.sender] && !isGiveaway) {
        require(mintEnabled, "Minting enabled");
        require(!hasMinted[msg.sender], "Minted already");
        require(kaibatoken.balanceOf(msg.sender) > 0, "Kaiba 2 not owned");
    }
    uint256 _tokenId = _lastTokenId;
    super._mint(msg.sender, _tokenId);
    _lastTokenId = _tokenId + 1;
    hasMinted[msg.sender] = true;
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseuri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"enableMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"isAuth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","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":"bool","name":"booly","type":"bool"},{"internalType":"address","name":"addy","type":"address"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setBaseuri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"setFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"setKaiba","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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b556011805473f2210f65235c2fb391ab8650520237e6378e5c5a6001600160a01b031991821681179092556013805490911690911790553480156200004c57600080fd5b507f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c5805460ff1990811660019081179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed78080080548216831790557f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df8054821683179055600a80546001600160a01b031916339081179091556000908152600860209081526040918290208054909316909317909155805180820190915260188082527f4b616962612076322043656c6562726174696f6e204e46540000000000000000919092019081526200014691600591906200060f565b50604080518082019091526007808252665448455041434b60c81b602090920191825262000177916006916200060f565b5060405180608001604052806060815260200162002653606091398051620001a891600e916020909101906200060f565b50600a80546001600160a01b031916339081179091556000908152600d60205260409020805460ff19166001179055620001e1620001e7565b620007af565b601354600160a01b900460ff1615620002385760405162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b60448201526064015b60405180910390fd5b6013805460ff60a01b1916600160a01b179055601254600090156200027c576001905060016012600082825462000270919062000742565b90915550620002809050565b5060005b336000908152600d602052604090205460ff16158015620002b157503360009081526010602052604090205460ff16155b8015620002bc575080155b156200041e57600c5460ff16620003085760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c8195b98589b1959608a1b60448201526064016200022f565b336000908152600f602052604090205460ff16156200035b5760405162461bcd60e51b815260206004820152600e60248201526d4d696e74656420616c726561647960901b60448201526064016200022f565b6013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015620003a057600080fd5b505afa158015620003b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003db9190620006b5565b116200041e5760405162461bcd60e51b815260206004820152601160248201527012d85a5898480c881b9bdd081bdddb9959607a1b60448201526064016200022f565b6000600b5490506200043c33826200047760201b6200137f1760201c565b6200044981600162000727565b600b555050336000908152600f60205260409020805460ff191660011790556013805460ff60a01b19169055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316620004be5760405162461bcd60e51b81526004016200022f9190620006cf565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615620005195760405162461bcd60e51b81526004016200022f9190620006cf565b5062000526828262000562565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615620005bc5760405162461bcd60e51b81526004016200022f9190620006cf565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600390915282208054919290916200060690849062000727565b90915550505050565b8280546200061d906200075c565b90600052602060002090601f0160209004810192826200064157600085556200068c565b82601f106200065c57805160ff19168380011785556200068c565b828001600101855582156200068c579182015b828111156200068c5782518255916020019190600101906200066f565b506200069a9291506200069e565b5090565b5b808211156200069a57600081556001016200069f565b600060208284031215620006c857600080fd5b5051919050565b600060208083528351808285015260005b81811015620006fe57858101830151858201604001528201620006e0565b8181111562000711576000604083870101525b50601f01601f1916929092016040019392505050565b600082198211156200073d576200073d62000799565b500190565b60008282101562000757576200075762000799565b500390565b600181811c908216806200077157607f821691505b602082108114156200079357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b611e9480620007bf6000396000f3fe6080604052600436106101d85760003560e01c8063799b31e811610102578063b3a775ce11610095578063d123973011610064578063d12397301461056a578063e985e9c514610584578063f2fde38b146105cd578063f3fe3bc3146105ed57600080fd5b8063b3a775ce146104ea578063b88d4fde1461050a578063c68b33051461052a578063c87b56dd1461054a57600080fd5b80638da5cb5b116100d15780638da5cb5b1461047557806395d89b41146104955780639ed6bbc7146104aa578063a22cb465146104ca57600080fd5b8063799b31e8146103e5578063860d248a14610405578063893d20e81461043757806389ef69f61461045557600080fd5b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103655780634794878f146103855780636352211e146103a557806370a08231146103c557600080fd5b806323b872dd146102e45780632520e7ff1461030457806329a2192b14610334578063313ce5671461034957600080fd5b8063095ea7b3116101b6578063095ea7b31461028657806314f710fe146102a857806318160ddd146102b05780631a0d4bca146102cf57600080fd5b806301ffc9a7146101dd57806306fdde031461022c578063081812fc1461024e575b600080fd5b3480156101e957600080fd5b506102176101f8366004611bc1565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561023857600080fd5b5061024161061f565b6040516102239190611d95565b34801561025a57600080fd5b5061026e610269366004611c3d565b6106b1565b6040516001600160a01b039091168152602001610223565b34801561029257600080fd5b506102a66102a1366004611b60565b610733565b005b6102a66108d5565b3480156102bc57600080fd5b50600b545b604051908152602001610223565b3480156102db57600080fd5b50610241610b3b565b3480156102f057600080fd5b506102a66102ff366004611a8b565b610bc9565b34801561031057600080fd5b5061021761031f366004611a36565b60086020526000908152604090205460ff1681565b34801561034057600080fd5b506102a6610d84565b34801561035557600080fd5b5060405160008152602001610223565b34801561037157600080fd5b506102a6610380366004611a8b565b610e2b565b34801561039157600080fd5b506102a66103a0366004611a36565b610e4b565b3480156103b157600080fd5b5061026e6103c0366004611c3d565b610ebb565b3480156103d157600080fd5b506102c16103e0366004611a36565b610f13565b3480156103f157600080fd5b506102a6610400366004611c3d565b610f77565b34801561041157600080fd5b506102416040518060400160405280600681526020016518189c18181960d11b81525081565b34801561044357600080fd5b50600a546001600160a01b031661026e565b34801561046157600080fd5b506102a6610470366004611a36565b610fd0565b34801561048157600080fd5b50600a5461026e906001600160a01b031681565b3480156104a157600080fd5b50610241611038565b3480156104b657600080fd5b506102a66104c5366004611ba5565b611047565b3480156104d657600080fd5b506102a66104e5366004611b36565b6110b3565b3480156104f657600080fd5b506102a6610505366004611bfb565b61111f565b34801561051657600080fd5b506102a6610525366004611ac7565b61116f565b34801561053657600080fd5b506102a6610545366004611b8a565b6111b8565b34801561055657600080fd5b50610241610565366004611c3d565b61120f565b34801561057657600080fd5b50600c546102179060ff1681565b34801561059057600080fd5b5061021761059f366004611a58565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156105d957600080fd5b506102a66105e8366004611a36565b611294565b3480156105f957600080fd5b506102416040518060400160405280600681526020016530313830303160d01b81525081565b60606005805461062e90611dfd565b80601f016020809104026020016040519081016040528092919081815260200182805461065a90611dfd565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166107115760405162461bcd60e51b81526004016107089190611d95565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b03163381148061077e57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906107bb5760405162461bcd60e51b81526004016107089190611d95565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166108155760405162461bcd60e51b81526004016107089190611d95565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156108755760405162461bcd60e51b81526004016107089190611d95565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b601354600160a01b900460ff16156109205760405162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b6044820152606401610708565b6013805460ff60a01b1916600160a01b1790556012546000901561096057600190506001601260008282546109559190611de6565b909155506109649050565b5060005b336000908152600d602052604090205460ff1615801561099457503360009081526010602052604090205460ff16155b801561099e575080155b15610af557600c5460ff166109e75760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c8195b98589b1959608a1b6044820152606401610708565b336000908152600f602052604090205460ff1615610a385760405162461bcd60e51b815260206004820152600e60248201526d4d696e74656420616c726561647960901b6044820152606401610708565b6013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610a7c57600080fd5b505afa158015610a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab49190611c56565b11610af55760405162461bcd60e51b815260206004820152601160248201527012d85a5898480c881b9bdd081bdddb9959607a1b6044820152606401610708565b600b54610b02338261137f565b610b0d816001611dce565b600b555050336000908152600f60205260409020805460ff191660011790556013805460ff60a01b19169055565b600e8054610b4890611dfd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7490611dfd565b8015610bc15780601f10610b9657610100808354040283529160200191610bc1565b820191906000526020600020905b815481529060010190602001808311610ba457829003601f168201915b505050505081565b60008181526001602052604090205481906001600160a01b031633811480610c0757506000828152600260205260409020546001600160a01b031633145b80610c3557506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610c725760405162461bcd60e51b81526004016107089190611d95565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610ccc5760405162461bcd60e51b81526004016107089190611d95565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919088168214610d2b5760405162461bcd60e51b81526004016107089190611d95565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038716610d705760405162461bcd60e51b81526004016107089190611d95565b50610d7b8686611462565b50505050505050565b600a546001600160a01b0316331480610dac5750336000908152600d602052604090205460ff165b610dc85760405162461bcd60e51b815260040161070890611da8565b600a546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610e15576040519150601f19603f3d011682016040523d82523d6000602084013e610e1a565b606091505b5050905080610e2857600080fd5b50565b610e46838383604051806020016040528060008152506114ed565b505050565b600a546001600160a01b0316331480610e735750336000908152600d602052604090205460ff165b610e8f5760405162461bcd60e51b815260040161070890611da8565b601180546001600160a01b039092166001600160a01b0319928316811790915560138054909216179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161072d5760405162461bcd60e51b81526004016107089190611d95565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b038316610f5a5760405162461bcd60e51b81526004016107089190611d95565b50506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331480610f9f5750336000908152600d602052604090205460ff165b610fbb5760405162461bcd60e51b815260040161070890611da8565b80610fcb576305f5e10060125550565b601255565b600a546001600160a01b0316331480610ff85750336000908152600d602052604090205460ff165b6110145760405162461bcd60e51b815260040161070890611da8565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b60606006805461062e90611dfd565b600a546001600160a01b031633148061106f5750336000908152600d602052604090205460ff165b61108b5760405162461bcd60e51b815260040161070890611da8565b6001600160a01b03166000908152600d60205260409020805460ff1916911515919091179055565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314806111475750336000908152600d602052604090205460ff165b6111635760405162461bcd60e51b815260040161070890611da8565b610e46600e8383611928565b6111b185858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114ed92505050565b5050505050565b600a546001600160a01b03163314806111e05750336000908152600d602052604090205460ff165b6111fc5760405162461bcd60e51b815260040161070890611da8565b600c805460ff1916911515919091179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b031661126a5760405162461bcd60e51b81526004016107089190611d95565b50600e60405160200161127d9190611cbc565b604051602081830303815290604052915050919050565b600a5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146112dd5760405162461bcd60e51b81526004016107089190611d95565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b0382166113225760405162461bcd60e51b81526004016107089190611d95565b50600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b0383166113c35760405162461bcd60e51b81526004016107089190611d95565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561141b5760405162461bcd60e51b81526004016107089190611d95565b50611426828261179b565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b031661149d8183611843565b6114a7838361179b565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b03163381148061152b57506000828152600260205260409020546001600160a01b031633145b8061155957506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115965760405162461bcd60e51b81526004016107089190611d95565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166115f05760405162461bcd60e51b81526004016107089190611d95565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908916821461164f5760405162461bcd60e51b81526004016107089190611d95565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0388166116945760405162461bcd60e51b81526004016107089190611d95565b5061169f8787611462565b6116b1876001600160a01b03166118ec565b1561179157604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a02906116eb9033908d908c908c90600401611d58565b602060405180830381600087803b15801561170557600080fd5b505af1158015611719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173d9190611bde565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b1461178e5760405162461bcd60e51b81526004016107089190611d95565b50505b5050505050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156117f25760405162461bcd60e51b81526004016107089190611d95565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b03881690811790915584526003909152822080549192909161183a908490611dce565b90915550505050565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0384811691161461189e5760405162461bcd60e51b81526004016107089190611d95565b506001600160a01b03821660009081526003602052604081208054600192906118c8908490611de6565b9091555050600090815260016020526040902080546001600160a01b031916905550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906119205750808214155b949350505050565b82805461193490611dfd565b90600052602060002090601f016020900481019282611956576000855561199c565b82601f1061196f5782800160ff1982351617855561199c565b8280016001018555821561199c579182015b8281111561199c578235825591602001919060010190611981565b506119a89291506119ac565b5090565b5b808211156119a857600081556001016119ad565b80356001600160a01b03811681146119d857600080fd5b919050565b803580151581146119d857600080fd5b60008083601f8401126119ff57600080fd5b50813567ffffffffffffffff811115611a1757600080fd5b602083019150836020828501011115611a2f57600080fd5b9250929050565b600060208284031215611a4857600080fd5b611a51826119c1565b9392505050565b60008060408385031215611a6b57600080fd5b611a74836119c1565b9150611a82602084016119c1565b90509250929050565b600080600060608486031215611aa057600080fd5b611aa9846119c1565b9250611ab7602085016119c1565b9150604084013590509250925092565b600080600080600060808688031215611adf57600080fd5b611ae8866119c1565b9450611af6602087016119c1565b935060408601359250606086013567ffffffffffffffff811115611b1957600080fd5b611b25888289016119ed565b969995985093965092949392505050565b60008060408385031215611b4957600080fd5b611b52836119c1565b9150611a82602084016119dd565b60008060408385031215611b7357600080fd5b611b7c836119c1565b946020939093013593505050565b600060208284031215611b9c57600080fd5b611a51826119dd565b60008060408385031215611bb857600080fd5b611a74836119dd565b600060208284031215611bd357600080fd5b8135611a5181611e48565b600060208284031215611bf057600080fd5b8151611a5181611e48565b60008060208385031215611c0e57600080fd5b823567ffffffffffffffff811115611c2557600080fd5b611c31858286016119ed565b90969095509350505050565b600060208284031215611c4f57600080fd5b5035919050565b600060208284031215611c6857600080fd5b5051919050565b6000815180845260005b81811015611c9557602081850181015186830182015201611c79565b81811115611ca7576000602083870101525b50601f01601f19169290920160200192915050565b600080835481600182811c915080831680611cd857607f831692505b6020808410821415611cf857634e487b7160e01b86526022600452602486fd5b818015611d0c5760018114611d1d57611d4a565b60ff19861689528489019650611d4a565b60008a81526020902060005b86811015611d425781548b820152908501908301611d29565b505084890196505b509498975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611d8b90830184611c6f565b9695505050505050565b602081526000611a516020830184611c6f565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b60008219821115611de157611de1611e32565b500190565b600082821015611df857611df8611e32565b500390565b600181811c90821680611e1157607f821691505b6020821081141561072d57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160e01b031981168114610e2857600080fdfea2646970667358221220310b7f9f5d0a49a80f17130a40125fb1dff7c95e3e55171609c00ccd5be709d464736f6c6343000806003368747470733a2f2f696e746572706c616e65746172796b69746368656e2e6d7970696e6174612e636c6f75642f697066732f516d525748703671353568503832444e69455a6d4451724d32534d4d79366a7a634d4b7269787534743245316a73

Deployed Bytecode

0x6080604052600436106101d85760003560e01c8063799b31e811610102578063b3a775ce11610095578063d123973011610064578063d12397301461056a578063e985e9c514610584578063f2fde38b146105cd578063f3fe3bc3146105ed57600080fd5b8063b3a775ce146104ea578063b88d4fde1461050a578063c68b33051461052a578063c87b56dd1461054a57600080fd5b80638da5cb5b116100d15780638da5cb5b1461047557806395d89b41146104955780639ed6bbc7146104aa578063a22cb465146104ca57600080fd5b8063799b31e8146103e5578063860d248a14610405578063893d20e81461043757806389ef69f61461045557600080fd5b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103655780634794878f146103855780636352211e146103a557806370a08231146103c557600080fd5b806323b872dd146102e45780632520e7ff1461030457806329a2192b14610334578063313ce5671461034957600080fd5b8063095ea7b3116101b6578063095ea7b31461028657806314f710fe146102a857806318160ddd146102b05780631a0d4bca146102cf57600080fd5b806301ffc9a7146101dd57806306fdde031461022c578063081812fc1461024e575b600080fd5b3480156101e957600080fd5b506102176101f8366004611bc1565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561023857600080fd5b5061024161061f565b6040516102239190611d95565b34801561025a57600080fd5b5061026e610269366004611c3d565b6106b1565b6040516001600160a01b039091168152602001610223565b34801561029257600080fd5b506102a66102a1366004611b60565b610733565b005b6102a66108d5565b3480156102bc57600080fd5b50600b545b604051908152602001610223565b3480156102db57600080fd5b50610241610b3b565b3480156102f057600080fd5b506102a66102ff366004611a8b565b610bc9565b34801561031057600080fd5b5061021761031f366004611a36565b60086020526000908152604090205460ff1681565b34801561034057600080fd5b506102a6610d84565b34801561035557600080fd5b5060405160008152602001610223565b34801561037157600080fd5b506102a6610380366004611a8b565b610e2b565b34801561039157600080fd5b506102a66103a0366004611a36565b610e4b565b3480156103b157600080fd5b5061026e6103c0366004611c3d565b610ebb565b3480156103d157600080fd5b506102c16103e0366004611a36565b610f13565b3480156103f157600080fd5b506102a6610400366004611c3d565b610f77565b34801561041157600080fd5b506102416040518060400160405280600681526020016518189c18181960d11b81525081565b34801561044357600080fd5b50600a546001600160a01b031661026e565b34801561046157600080fd5b506102a6610470366004611a36565b610fd0565b34801561048157600080fd5b50600a5461026e906001600160a01b031681565b3480156104a157600080fd5b50610241611038565b3480156104b657600080fd5b506102a66104c5366004611ba5565b611047565b3480156104d657600080fd5b506102a66104e5366004611b36565b6110b3565b3480156104f657600080fd5b506102a6610505366004611bfb565b61111f565b34801561051657600080fd5b506102a6610525366004611ac7565b61116f565b34801561053657600080fd5b506102a6610545366004611b8a565b6111b8565b34801561055657600080fd5b50610241610565366004611c3d565b61120f565b34801561057657600080fd5b50600c546102179060ff1681565b34801561059057600080fd5b5061021761059f366004611a58565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156105d957600080fd5b506102a66105e8366004611a36565b611294565b3480156105f957600080fd5b506102416040518060400160405280600681526020016530313830303160d01b81525081565b60606005805461062e90611dfd565b80601f016020809104026020016040519081016040528092919081815260200182805461065a90611dfd565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166107115760405162461bcd60e51b81526004016107089190611d95565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b03163381148061077e57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b815250906107bb5760405162461bcd60e51b81526004016107089190611d95565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166108155760405162461bcd60e51b81526004016107089190611d95565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156108755760405162461bcd60e51b81526004016107089190611d95565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b601354600160a01b900460ff16156109205760405162461bcd60e51b815260206004820152600e60248201526d4e6f2072652d656e7472616e637960901b6044820152606401610708565b6013805460ff60a01b1916600160a01b1790556012546000901561096057600190506001601260008282546109559190611de6565b909155506109649050565b5060005b336000908152600d602052604090205460ff1615801561099457503360009081526010602052604090205460ff16155b801561099e575080155b15610af557600c5460ff166109e75760405162461bcd60e51b815260206004820152600f60248201526e135a5b9d1a5b99c8195b98589b1959608a1b6044820152606401610708565b336000908152600f602052604090205460ff1615610a385760405162461bcd60e51b815260206004820152600e60248201526d4d696e74656420616c726561647960901b6044820152606401610708565b6013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610a7c57600080fd5b505afa158015610a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab49190611c56565b11610af55760405162461bcd60e51b815260206004820152601160248201527012d85a5898480c881b9bdd081bdddb9959607a1b6044820152606401610708565b600b54610b02338261137f565b610b0d816001611dce565b600b555050336000908152600f60205260409020805460ff191660011790556013805460ff60a01b19169055565b600e8054610b4890611dfd565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7490611dfd565b8015610bc15780601f10610b9657610100808354040283529160200191610bc1565b820191906000526020600020905b815481529060010190602001808311610ba457829003601f168201915b505050505081565b60008181526001602052604090205481906001600160a01b031633811480610c0757506000828152600260205260409020546001600160a01b031633145b80610c3557506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610c725760405162461bcd60e51b81526004016107089190611d95565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610ccc5760405162461bcd60e51b81526004016107089190611d95565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919088168214610d2b5760405162461bcd60e51b81526004016107089190611d95565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038716610d705760405162461bcd60e51b81526004016107089190611d95565b50610d7b8686611462565b50505050505050565b600a546001600160a01b0316331480610dac5750336000908152600d602052604090205460ff165b610dc85760405162461bcd60e51b815260040161070890611da8565b600a546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610e15576040519150601f19603f3d011682016040523d82523d6000602084013e610e1a565b606091505b5050905080610e2857600080fd5b50565b610e46838383604051806020016040528060008152506114ed565b505050565b600a546001600160a01b0316331480610e735750336000908152600d602052604090205460ff165b610e8f5760405162461bcd60e51b815260040161070890611da8565b601180546001600160a01b039092166001600160a01b0319928316811790915560138054909216179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161072d5760405162461bcd60e51b81526004016107089190611d95565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b038316610f5a5760405162461bcd60e51b81526004016107089190611d95565b50506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331480610f9f5750336000908152600d602052604090205460ff165b610fbb5760405162461bcd60e51b815260040161070890611da8565b80610fcb576305f5e10060125550565b601255565b600a546001600160a01b0316331480610ff85750336000908152600d602052604090205460ff165b6110145760405162461bcd60e51b815260040161070890611da8565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b60606006805461062e90611dfd565b600a546001600160a01b031633148061106f5750336000908152600d602052604090205460ff165b61108b5760405162461bcd60e51b815260040161070890611da8565b6001600160a01b03166000908152600d60205260409020805460ff1916911515919091179055565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314806111475750336000908152600d602052604090205460ff165b6111635760405162461bcd60e51b815260040161070890611da8565b610e46600e8383611928565b6111b185858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114ed92505050565b5050505050565b600a546001600160a01b03163314806111e05750336000908152600d602052604090205460ff165b6111fc5760405162461bcd60e51b815260040161070890611da8565b600c805460ff1916911515919091179055565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b031661126a5760405162461bcd60e51b81526004016107089190611d95565b50600e60405160200161127d9190611cbc565b604051602081830303815290604052915050919050565b600a5460408051808201909152600681526530313830303160d01b6020820152906001600160a01b031633146112dd5760405162461bcd60e51b81526004016107089190611d95565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b0382166113225760405162461bcd60e51b81526004016107089190611d95565b50600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b0383166113c35760405162461bcd60e51b81526004016107089190611d95565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561141b5760405162461bcd60e51b81526004016107089190611d95565b50611426828261179b565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b031661149d8183611843565b6114a7838361179b565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b03163381148061152b57506000828152600260205260409020546001600160a01b031633145b8061155957506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906115965760405162461bcd60e51b81526004016107089190611d95565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166115f05760405162461bcd60e51b81526004016107089190611d95565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908916821461164f5760405162461bcd60e51b81526004016107089190611d95565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0388166116945760405162461bcd60e51b81526004016107089190611d95565b5061169f8787611462565b6116b1876001600160a01b03166118ec565b1561179157604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a02906116eb9033908d908c908c90600401611d58565b602060405180830381600087803b15801561170557600080fd5b505af1158015611719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173d9190611bde565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b1461178e5760405162461bcd60e51b81526004016107089190611d95565b50505b5050505050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156117f25760405162461bcd60e51b81526004016107089190611d95565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b03881690811790915584526003909152822080549192909161183a908490611dce565b90915550505050565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0384811691161461189e5760405162461bcd60e51b81526004016107089190611d95565b506001600160a01b03821660009081526003602052604081208054600192906118c8908490611de6565b9091555050600090815260016020526040902080546001600160a01b031916905550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906119205750808214155b949350505050565b82805461193490611dfd565b90600052602060002090601f016020900481019282611956576000855561199c565b82601f1061196f5782800160ff1982351617855561199c565b8280016001018555821561199c579182015b8281111561199c578235825591602001919060010190611981565b506119a89291506119ac565b5090565b5b808211156119a857600081556001016119ad565b80356001600160a01b03811681146119d857600080fd5b919050565b803580151581146119d857600080fd5b60008083601f8401126119ff57600080fd5b50813567ffffffffffffffff811115611a1757600080fd5b602083019150836020828501011115611a2f57600080fd5b9250929050565b600060208284031215611a4857600080fd5b611a51826119c1565b9392505050565b60008060408385031215611a6b57600080fd5b611a74836119c1565b9150611a82602084016119c1565b90509250929050565b600080600060608486031215611aa057600080fd5b611aa9846119c1565b9250611ab7602085016119c1565b9150604084013590509250925092565b600080600080600060808688031215611adf57600080fd5b611ae8866119c1565b9450611af6602087016119c1565b935060408601359250606086013567ffffffffffffffff811115611b1957600080fd5b611b25888289016119ed565b969995985093965092949392505050565b60008060408385031215611b4957600080fd5b611b52836119c1565b9150611a82602084016119dd565b60008060408385031215611b7357600080fd5b611b7c836119c1565b946020939093013593505050565b600060208284031215611b9c57600080fd5b611a51826119dd565b60008060408385031215611bb857600080fd5b611a74836119dd565b600060208284031215611bd357600080fd5b8135611a5181611e48565b600060208284031215611bf057600080fd5b8151611a5181611e48565b60008060208385031215611c0e57600080fd5b823567ffffffffffffffff811115611c2557600080fd5b611c31858286016119ed565b90969095509350505050565b600060208284031215611c4f57600080fd5b5035919050565b600060208284031215611c6857600080fd5b5051919050565b6000815180845260005b81811015611c9557602081850181015186830182015201611c79565b81811115611ca7576000602083870101525b50601f01601f19169290920160200192915050565b600080835481600182811c915080831680611cd857607f831692505b6020808410821415611cf857634e487b7160e01b86526022600452602486fd5b818015611d0c5760018114611d1d57611d4a565b60ff19861689528489019650611d4a565b60008a81526020902060005b86811015611d425781548b820152908501908301611d29565b505084890196505b509498975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611d8b90830184611c6f565b9695505050505050565b602081526000611a516020830184611c6f565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b60008219821115611de157611de1611e32565b500190565b600082821015611df857611df8611e32565b500390565b600181811c90821680611e1157607f821691505b6020821081141561072d57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160e01b031981168114610e2857600080fdfea2646970667358221220310b7f9f5d0a49a80f17130a40125fb1dff7c95e3e55171609c00ccd5be709d464736f6c63430008060033

Deployed Bytecode Sourcemap

30643:2844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5502:172;;;;;;;;;;-1:-1:-1;5502:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;;5635:33:0;5612:4;5635:33;;;;;;;;;;;;;;5502:172;;;;7040:14:1;;7033:22;7015:41;;7003:2;6988:18;5502:172:0;;;;;;;;28134:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21224:183::-;;;;;;;;;;-1:-1:-1;21224:183:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6338:32:1;;;6320:51;;6308:2;6293:18;21224:183:0;6275:102:1;19009:352:0;;;;;;;;;;-1:-1:-1;19009:352:0;;;;;:::i;:::-;;:::i;:::-;;32872:610;;;:::i;32214:93::-;;;;;;;;;;-1:-1:-1;32287:12:0;;32214:93;;;9154:25:1;;;9142:2;9127:18;32214:93:0;9109:76:1;30822:21:0;;;;;;;;;;;;;:::i;18235:353::-;;;;;;;;;;-1:-1:-1;18235:353:0;;;;;:::i;:::-;;:::i;395:39::-;;;;;;;;;;-1:-1:-1;395:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31594:141;;;;;;;;;;;;;:::i;32131:77::-;;;;;;;;;;-1:-1:-1;32131:77:0;;32174:5;9332:36:1;;9320:2;9305:18;32131:77:0;9287:87:1;17480:179:0;;;;;;;;;;-1:-1:-1;17480:179:0;;;;;:::i;:::-;;:::i;32502:110::-;;;;;;;;;;-1:-1:-1;32502:110:0;;;;;:::i;:::-;;:::i;20772:208::-;;;;;;;;;;-1:-1:-1;20772:208:0;;;;;:::i;:::-;;:::i;20298:204::-;;;;;;;;;;-1:-1:-1;20298:204:0;;;;;:::i;:::-;;:::i;32705:163::-;;;;;;;;;;-1:-1:-1;32705:163:0;;;;;:::i;:::-;;:::i;570:65::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;570:65:0;;;;;32042:83;;;;;;;;;;-1:-1:-1;32112:5:0;;-1:-1:-1;;;;;32112:5:0;32042:83;;32618:81;;;;;;;;;;-1:-1:-1;32618:81:0;;;;;:::i;:::-;;:::i;690:20::-;;;;;;;;;;-1:-1:-1;690:20:0;;;;-1:-1:-1;;;;;690:20:0;;;28370:128;;;;;;;;;;;;;:::i;32313:95::-;;;;;;;;;;-1:-1:-1;32313:95:0;;;;;:::i;:::-;;:::i;19772:232::-;;;;;;;;;;-1:-1:-1;19772:232:0;;;;;:::i;:::-;;:::i;31741:91::-;;;;;;;;;;-1:-1:-1;31741:91:0;;;;;:::i;:::-;;:::i;16860:209::-;;;;;;;;;;-1:-1:-1;16860:209:0;;;;;:::i;:::-;;:::i;32414:82::-;;;;;;;;;;-1:-1:-1;32414:82:0;;;;;:::i;:::-;;:::i;31839:197::-;;;;;;;;;;-1:-1:-1;31839:197:0;;;;;:::i;:::-;;:::i;30757:23::-;;;;;;;;;;-1:-1:-1;30757:23:0;;;;;;;;21676:192;;;;;;;;;;-1:-1:-1;21676:192:0;;;;;:::i;:::-;-1:-1:-1;;;;;21827:24:0;;;21804:4;21827:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;21676:192;1656:238;;;;;;;;;;-1:-1:-1;1656:238:0;;;;;:::i;:::-;;:::i;514:51::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;514:51:0;;;;;28134:120;28202:19;28241:7;28233:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28134:120;:::o;21224:183::-;21353:7;15792:19;;;:9;:19;;;;;;;;;15827:13;;;;;;;;;;;-1:-1:-1;;;15827:13:0;;;;;;;21329:8;;-1:-1:-1;;;;;15792:19:0;15784:57;;;;-1:-1:-1;;;15784:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;21379:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;21379:22:0::1;::::0;-1:-1:-1;15848:1:0::1;21224:183:::0;;;;:::o;19009:352::-;14976:18;14997:19;;;:9;:19;;;;;;19122:8;;-1:-1:-1;;;;;14997:19:0;15053:10;15039:24;;;:68;;-1:-1:-1;;;;;;15067:28:0;;;;;;:16;:28;;;;;;;;15096:10;15067:40;;;;;;;;;;15039:68;15116:21;;;;;;;;;;;;;-1:-1:-1;;;15116:21:0;;;15023:121;;;;;-1:-1:-1;;;15023:121:0;;;;;;;;:::i;:::-;-1:-1:-1;15823:1:0::1;15792:19:::0;;;:9:::1;:19;::::0;;;;;;;;;15827:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;15827:13:0;;::::1;::::0;;;;19150:8;;15827:13;-1:-1:-1;;;;;15792:19:0::1;15784:57;;;;-1:-1:-1::0;;;15784:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;19170:18:0::2;19191:19:::0;;;:9:::2;:19;::::0;;;;;;;;;19250:8;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;19250:8:0;;::::2;::::0;;;;-1:-1:-1;;;;;19191:19:0;;::::2;::::0;19250:8;19225:23;::::2;::::0;::::2;;19217:42;;;;-1:-1:-1::0;;;19217:42:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;19268:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;19268:34:0::2;-1:-1:-1::0;;;;;19268:34:0;;::::2;::::0;;::::2;::::0;;;19314:41;;19268:22;;19314:41;;::::2;::::0;::::2;::::0;::::2;19163:198;15151:1:::1;14969:189:::0;19009:352;;;:::o;32872:610::-;31215:6;;-1:-1:-1;;;31215:6:0;;;;31214:7;31206:34;;;;-1:-1:-1;;;31206:34:0;;8867:2:1;31206:34:0;;;8849:21:1;8906:2;8886:18;;;8879:30;-1:-1:-1;;;8925:18:1;;;8918:44;8979:18;;31206:34:0;8839:164:1;31206:34:0;31251:6;:13;;-1:-1:-1;;;;31251:13:0;-1:-1:-1;;;31251:13:0;;;32944:10:::1;::::0;31251:13;;32944:14;32940:125:::1;;32984:4;32971:17;;33013:1;32999:10;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;32940:125:0::1;::::0;-1:-1:-1;32940:125:0::1;;-1:-1:-1::0;33052:5:0::1;32940:125;33084:10;33076:19;::::0;;;:7:::1;:19;::::0;;;;;::::1;;33075:20;:43:::0;::::1;;;-1:-1:-1::0;33107:10:0::1;33100:18;::::0;;;:6:::1;:18;::::0;;;;;::::1;;33099:19;33075:43;:58;;;;;33123:10;33122:11;33075:58;33071:259;;;33154:11;::::0;::::1;;33146:39;;;::::0;-1:-1:-1;;;33146:39:0;;7834:2:1;33146:39:0::1;::::0;::::1;7816:21:1::0;7873:2;7853:18;;;7846:30;-1:-1:-1;;;7892:18:1;;;7885:45;7947:18;;33146:39:0::1;7806:165:1::0;33146:39:0::1;33215:10;33205:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;33204:22;33196:49;;;::::0;-1:-1:-1;;;33196:49:0;;8524:2:1;33196:49:0::1;::::0;::::1;8506:21:1::0;8563:2;8543:18;;;8536:30;-1:-1:-1;;;8582:18:1;;;8575:44;8636:18;;33196:49:0::1;8496:164:1::0;33196:49:0::1;33264:10;::::0;:32:::1;::::0;-1:-1:-1;;;33264:32:0;;33285:10:::1;33264:32;::::0;::::1;6320:51:1::0;33299:1:0::1;::::0;-1:-1:-1;;;;;33264:10:0::1;::::0;:20:::1;::::0;6293:18:1;;33264:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;33256:66;;;::::0;-1:-1:-1;;;33256:66:0;;8178:2:1;33256:66:0::1;::::0;::::1;8160:21:1::0;8217:2;8197:18;;;8190:30;-1:-1:-1;;;8236:18:1;;;8229:47;8293:18;;33256:66:0::1;8150:167:1::0;33256:66:0::1;33355:12;::::0;33374:33:::1;33386:10;33355:12:::0;33374:11:::1;:33::i;:::-;33429:12;:8:::0;33440:1:::1;33429:12;:::i;:::-;33414;:27:::0;-1:-1:-1;;33458:10:0::1;33448:21;::::0;;;:9:::1;:21;::::0;;;;:28;;-1:-1:-1;;33448:28:0::1;33472:4;33448:28;::::0;;31287:6;:14;;-1:-1:-1;;;;31287:14:0;;;32872:610::o;30822:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18235:353::-;15356:18;15377:19;;;:9;:19;;;;;;18368:8;;-1:-1:-1;;;;;15377:19:0;15433:10;15419:24;;;:71;;-1:-1:-1;15454:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;15454:22:0;15480:10;15454:36;15419:71;:122;;;-1:-1:-1;;;;;;15501:28:0;;;;;;:16;:28;;;;;;;;15530:10;15501:40;;;;;;;;;;15419:122;15550:30;;;;;;;;;;;;;-1:-1:-1;;;15550:30:0;;;15403:184;;;;;-1:-1:-1;;;15403:184:0;;;;;;;;:::i;:::-;-1:-1:-1;15823:1:0::1;15792:19:::0;;;:9:::1;:19;::::0;;;;;;;;;15827:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;15827:13:0;;::::1;::::0;;;;18396:8;;15827:13;-1:-1:-1;;;;;15792:19:0::1;15784:57;;;;-1:-1:-1::0;;;15784:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;18416:18:0::2;18437:19:::0;;;:9:::2;:19;::::0;;;;;;;;;18492:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;18492:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;18437:19:0;;::::2;::::0;18492:9;18471:19;::::2;::::0;::::2;18463:39;;;;-1:-1:-1::0;;;18463:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;18536:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;18536:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;18517:17:0;::::2;18509:40;;;;-1:-1:-1::0;;;18509:40:0::2;;;;;;;;:::i;:::-;;18558:24;18568:3;18573:8;18558:9;:24::i;:::-;18409:179;15594:1:::1;15349:252:::0;18235:353;;;;:::o;31594:141::-;31098:5;;-1:-1:-1;;;;;31098:5:0;31086:10;:17;;:40;;-1:-1:-1;31115:10:0;31107:19;;;;:7;:19;;;;;;;;31086:40;31078:65;;;;-1:-1:-1;;;31078:65:0;;;;;;;:::i;:::-;31659:5:::1;::::0;:46:::1;::::0;31646:9:::1;::::0;-1:-1:-1;;;;;31659:5:0::1;::::0;31678:21:::1;::::0;31646:9;31659:46;31646:9;31659:46;31678:21;31659:5;:46:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31645:60;;;31724:4;31716:13;;;::::0;::::1;;31634:101;31594:141::o:0;17480:179::-;17610:43;17628:5;17635:3;17640:8;17610:43;;;;;;;;;;;;:17;:43::i;:::-;17480:179;;;:::o;32502:110::-;31098:5;;-1:-1:-1;;;;;31098:5:0;31086:10;:17;;:40;;-1:-1:-1;31115:10:0;31107:19;;;;:7;:19;;;;;;;;31086:40;31078:65;;;;-1:-1:-1;;;31078:65:0;;;;;;;:::i;:::-;32559:5:::1;:12:::0;;-1:-1:-1;;;;;32559:12:0;;::::1;-1:-1:-1::0;;;;;;32559:12:0;;::::1;::::0;::::1;::::0;;;32580:10:::1;:26:::0;;;;::::1;;::::0;;32502:110::o;20772:208::-;20869:14;20904:19;;;:9;:19;;;;;;;;;;20960:13;;;;;;;;;;;-1:-1:-1;;;20960:13:0;;;;;;;-1:-1:-1;;;;;20904:19:0;;20938:20;20930:44;;;;-1:-1:-1;;;20930:44:0;;;;;;;;:::i;20298:204::-;20444:12;;;;;;;;;;;;-1:-1:-1;;;20444:12:0;;;;20395:7;;-1:-1:-1;;;;;20422:20:0;;20414:43;;;;-1:-1:-1;;;20414:43:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;25150:27:0;25124:7;25150:27;;;:19;:27;;;;;;;20298:204::o;32705:163::-;31098:5;;-1:-1:-1;;;;;31098:5:0;31086:10;:17;;:40;;-1:-1:-1;31115:10:0;31107:19;;;;:7;:19;;;;;;;;31086:40;31078:65;;;;-1:-1:-1;;;31078:65:0;;;;;;;:::i;:::-;32764:6;32761:102:::1;;32798:9;32785:10;:22:::0;31634:101:::1;31594:141::o:0;32761:102::-:1;32836:10;:16:::0;32705:163::o;32618:81::-;31098:5;;-1:-1:-1;;;;;31098:5:0;31086:10;:17;;:40;;-1:-1:-1;31115:10:0;31107:19;;;;:7;:19;;;;;;;;31086:40;31078:65;;;;-1:-1:-1;;;31078:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32674:12:0::1;;::::0;;;:6:::1;:12;::::0;;;;:19;;-1:-1:-1;;32674:19:0::1;32689:4;32674:19;::::0;;32618:81::o;28370:128::-;28440:21;28483:9;28473:19;;;;;:::i;32313:95::-;31098:5;;-1:-1:-1;;;;;31098:5:0;31086:10;:17;;:40;;-1:-1:-1;31115:10:0;31107:19;;;;:7;:19;;;;;;;;31086:40;31078:65;;;;-1:-1:-1;;;31078:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32381:13:0::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;32381:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32313:95::o;19772:232::-;19904:10;19887:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;19887:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;19887:51:0;;;;;;;;;;19950:48;;7015:41:1;;;19887:39:0;;19904:10;19950:48;;6988:18:1;19950:48:0;;;;;;;19772:232;;:::o;31741:91::-;31098:5;;-1:-1:-1;;;;;31098:5:0;31086:10;:17;;:40;;-1:-1:-1;31115:10:0;31107:19;;;;:7;:19;;;;;;;;31086:40;31078:65;;;;-1:-1:-1;;;31078:65:0;;;;;;;:::i;:::-;31810:16:::1;:7;31820:6:::0;;31810:16:::1;:::i;16860:209::-:0;17017:46;17035:5;17042:3;17047:8;17057:5;;17017:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17017:17:0;;-1:-1:-1;;;17017:46:0:i;:::-;16860:209;;;;;:::o;32414:82::-;31098:5;;-1:-1:-1;;;;;31098:5:0;31086:10;:17;;:40;;-1:-1:-1;31115:10:0;31107:19;;;;:7;:19;;;;;;;;31086:40;31078:65;;;;-1:-1:-1;;;31078:65:0;;;;;;;:::i;:::-;32471:11:::1;:19:::0;;-1:-1:-1;;32471:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32414:82::o;31839:197::-;15823:1;15792:19;;;:9;:19;;;;;;;;;;15827:13;;;;;;;;;;;-1:-1:-1;;;15827:13:0;;;;;;;31965;;31941:8;;-1:-1:-1;;;;;15792:19:0;15784:57;;;;-1:-1:-1;;;15784:57:0;;;;;;;;:::i;:::-;;32021:7:::1;32004:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;31990:40;;31839:197:::0;;;;:::o;1656:238::-;1335:5;;1342:17;;;;;;;;;;;;-1:-1:-1;;;1342:17:0;;;;;-1:-1:-1;;;;;1335:5:0;1321:10;:19;1313:47;;;;-1:-1:-1;;;1313:47:0;;;;;;;;:::i;:::-;-1:-1:-1;1782:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;1782:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;1757:23:0;::::1;1749:65;;;;-1:-1:-1::0;;;1749:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;1847:5:0::1;::::0;1826:38:::1;::::0;-1:-1:-1;;;;;1826:38:0;;::::1;::::0;1847:5:::1;::::0;1826:38:::1;::::0;1847:5:::1;::::0;1826:38:::1;1871:5;:17:::0;;-1:-1:-1;;;;;;1871:17:0::1;-1:-1:-1::0;;;;;1871:17:0;;;::::1;::::0;;;::::1;::::0;;1656:238::o;22725:297::-;22850:12;;;;;;;;;;;;-1:-1:-1;;;22850:12:0;;;;-1:-1:-1;;;;;22831:17:0;;22823:40;;;;-1:-1:-1;;;22823:40:0;;;;;;;;:::i;:::-;-1:-1:-1;22909:1:0;22878:19;;;:9;:19;;;;;;;;;;22913:18;;;;;;;;;;;-1:-1:-1;;;22913:18:0;;;;;;;-1:-1:-1;;;;;22878:19:0;:33;22870:62;;;;-1:-1:-1;;;22870:62:0;;;;;;;;:::i;:::-;;22941:26;22953:3;22958:8;22941:11;:26::i;:::-;22981:35;;23007:8;;-1:-1:-1;;;;;22981:35:0;;;22998:1;;22981:35;;22998:1;;22981:35;22725:297;;:::o;22059:275::-;22148:12;22163:19;;;:9;:19;;;;;;;;;26266:12;:22;;;;;;26259:29;;-1:-1:-1;;;;;;26259:29:0;;;-1:-1:-1;;;;;22163:19:0;22222:30;22237:4;22243:8;22222:14;:30::i;:::-;22259:26;22271:3;22276:8;22259:11;:26::i;:::-;22319:8;22314:3;-1:-1:-1;;;;;22299:29:0;22308:4;-1:-1:-1;;;;;22299:29:0;;;;;;;;;;;22141:193;22059:275;;:::o;25461:590::-;15356:18;15377:19;;;:9;:19;;;;;;25609:8;;-1:-1:-1;;;;;15377:19:0;15433:10;15419:24;;;:71;;-1:-1:-1;15454:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;15454:22:0;15480:10;15454:36;15419:71;:122;;;-1:-1:-1;;;;;;15501:28:0;;;;;;:16;:28;;;;;;;;15530:10;15501:40;;;;;;;;;;15419:122;15550:30;;;;;;;;;;;;;-1:-1:-1;;;15550:30:0;;;15403:184;;;;;-1:-1:-1;;;15403:184:0;;;;;;;;:::i;:::-;-1:-1:-1;15823:1:0::1;15792:19:::0;;;:9:::1;:19;::::0;;;;;;;;;15827:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;15827:13:0;;::::1;::::0;;;;25637:8;;15827:13;-1:-1:-1;;;;;15792:19:0::1;15784:57;;;;-1:-1:-1::0;;;15784:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;25657:18:0::2;25678:19:::0;;;:9:::2;:19;::::0;;;;;;;;;25733:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;25733:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;25678:19:0;;::::2;::::0;25733:9;25712:19;::::2;::::0;::::2;25704:39;;;;-1:-1:-1::0;;;25704:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;25777:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;25777:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;25758:17:0;::::2;25750:40;;;;-1:-1:-1::0;;;25750:40:0::2;;;;;;;;:::i;:::-;;25799:24;25809:3;25814:8;25799:9;:24::i;:::-;25836:16;:3;-1:-1:-1::0;;;;;25836:14:0::2;;:16::i;:::-;25832:214;;;25884:77;::::0;-1:-1:-1;;;25884:77:0;;25868:13:::2;::::0;-1:-1:-1;;;;;25884:41:0;::::2;::::0;::::2;::::0;:77:::2;::::0;25926:10:::2;::::0;25938:5;;25945:8;;25955:5;;25884:77:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26014:23;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;26014:23:0::2;::::0;::::2;::::0;25868:93;;-1:-1:-1;;;;;;;25978:34:0;::::2;-1:-1:-1::0;;;25978:34:0::2;25970:68;;;;-1:-1:-1::0;;;25970:68:0::2;;;;;;;;:::i;:::-;;25859:187;25832:214;25650:401;15594:1:::1;15349:252:::0;25461:590;;;;;:::o;24483:242::-;24626:1;24595:19;;;:9;:19;;;;;;;;;;24630:18;;;;;;;;;;;-1:-1:-1;;;24630:18:0;;;;;;;-1:-1:-1;;;;;24595:19:0;:33;24587:62;;;;-1:-1:-1;;;24587:62:0;;;;;;;;:::i;:::-;-1:-1:-1;24658:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;24658:25:0;-1:-1:-1;;;;;24658:25:0;;;;;;;;24690:24;;:19;:24;;;;;:29;;24658:9;;24690:24;;:29;;24658:9;;24690:29;:::i;:::-;;;;-1:-1:-1;;;;24483:242:0:o;23982:234::-;24099:19;;;;:9;:19;;;;;;;;;;24129:9;;;;;;;;;;;-1:-1:-1;;;24129:9:0;;;;;;;-1:-1:-1;;;;;24099:28:0;;;:19;;:28;24091:48;;;;-1:-1:-1;;;24091:48:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;24146:26:0;;;;;;:19;:26;;;;;:31;;24176:1;;24146:26;:31;;24176:1;;24146:31;:::i;:::-;;;;-1:-1:-1;;24191:19:0;;;;:9;:19;;;;;24184:26;;-1:-1:-1;;;;;;24184:26:0;;;-1:-1:-1;23982:234:0:o;3453:780::-;3536:17;4118:18;;4022:66;4184:15;;;;;:42;;;4215:11;4203:8;:23;;4184:42;4168:59;3453:780;-1:-1:-1;;;;3453:780:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:2;;342:1;339;332:12;357:347;408:8;418:6;472:3;465:4;457:6;453:17;449:27;439:2;;490:1;487;480:12;439:2;-1:-1:-1;513:20:1;;556:18;545:30;;542:2;;;588:1;585;578:12;542:2;625:4;617:6;613:17;601:29;;677:3;670:4;661:6;653;649:19;645:30;642:39;639:2;;;694:1;691;684:12;639:2;429:275;;;;;:::o;709:186::-;768:6;821:2;809:9;800:7;796:23;792:32;789:2;;;837:1;834;827:12;789:2;860:29;879:9;860:29;:::i;:::-;850:39;779:116;-1:-1:-1;;;779:116:1:o;900:260::-;968:6;976;1029:2;1017:9;1008:7;1004:23;1000:32;997:2;;;1045:1;1042;1035:12;997:2;1068:29;1087:9;1068:29;:::i;:::-;1058:39;;1116:38;1150:2;1139:9;1135:18;1116:38;:::i;:::-;1106:48;;987:173;;;;;:::o;1165:328::-;1242:6;1250;1258;1311:2;1299:9;1290:7;1286:23;1282:32;1279:2;;;1327:1;1324;1317:12;1279:2;1350:29;1369:9;1350:29;:::i;:::-;1340:39;;1398:38;1432:2;1421:9;1417:18;1398:38;:::i;:::-;1388:48;;1483:2;1472:9;1468:18;1455:32;1445:42;;1269:224;;;;;:::o;1498:626::-;1595:6;1603;1611;1619;1627;1680:3;1668:9;1659:7;1655:23;1651:33;1648:2;;;1697:1;1694;1687:12;1648:2;1720:29;1739:9;1720:29;:::i;:::-;1710:39;;1768:38;1802:2;1791:9;1787:18;1768:38;:::i;:::-;1758:48;;1853:2;1842:9;1838:18;1825:32;1815:42;;1908:2;1897:9;1893:18;1880:32;1935:18;1927:6;1924:30;1921:2;;;1967:1;1964;1957:12;1921:2;2006:58;2056:7;2047:6;2036:9;2032:22;2006:58;:::i;:::-;1638:486;;;;-1:-1:-1;1638:486:1;;-1:-1:-1;2083:8:1;;1980:84;1638:486;-1:-1:-1;;;1638:486:1:o;2129:254::-;2194:6;2202;2255:2;2243:9;2234:7;2230:23;2226:32;2223:2;;;2271:1;2268;2261:12;2223:2;2294:29;2313:9;2294:29;:::i;:::-;2284:39;;2342:35;2373:2;2362:9;2358:18;2342:35;:::i;2388:254::-;2456:6;2464;2517:2;2505:9;2496:7;2492:23;2488:32;2485:2;;;2533:1;2530;2523:12;2485:2;2556:29;2575:9;2556:29;:::i;:::-;2546:39;2632:2;2617:18;;;;2604:32;;-1:-1:-1;;;2475:167:1:o;2647:180::-;2703:6;2756:2;2744:9;2735:7;2731:23;2727:32;2724:2;;;2772:1;2769;2762:12;2724:2;2795:26;2811:9;2795:26;:::i;2832:254::-;2897:6;2905;2958:2;2946:9;2937:7;2933:23;2929:32;2926:2;;;2974:1;2971;2964:12;2926:2;2997:26;3013:9;2997:26;:::i;3091:245::-;3149:6;3202:2;3190:9;3181:7;3177:23;3173:32;3170:2;;;3218:1;3215;3208:12;3170:2;3257:9;3244:23;3276:30;3300:5;3276:30;:::i;3341:249::-;3410:6;3463:2;3451:9;3442:7;3438:23;3434:32;3431:2;;;3479:1;3476;3469:12;3431:2;3511:9;3505:16;3530:30;3554:5;3530:30;:::i;3595:410::-;3666:6;3674;3727:2;3715:9;3706:7;3702:23;3698:32;3695:2;;;3743:1;3740;3733:12;3695:2;3783:9;3770:23;3816:18;3808:6;3805:30;3802:2;;;3848:1;3845;3838:12;3802:2;3887:58;3937:7;3928:6;3917:9;3913:22;3887:58;:::i;:::-;3964:8;;3861:84;;-1:-1:-1;3685:320:1;-1:-1:-1;;;;3685:320:1:o;4010:180::-;4069:6;4122:2;4110:9;4101:7;4097:23;4093:32;4090:2;;;4138:1;4135;4128:12;4090:2;-1:-1:-1;4161:23:1;;4080:110;-1:-1:-1;4080:110:1:o;4195:184::-;4265:6;4318:2;4306:9;4297:7;4293:23;4289:32;4286:2;;;4334:1;4331;4324:12;4286:2;-1:-1:-1;4357:16:1;;4276:103;-1:-1:-1;4276:103:1:o;4384:471::-;4425:3;4463:5;4457:12;4490:6;4485:3;4478:19;4515:1;4525:162;4539:6;4536:1;4533:13;4525:162;;;4601:4;4657:13;;;4653:22;;4647:29;4629:11;;;4625:20;;4618:59;4554:12;4525:162;;;4705:6;4702:1;4699:13;4696:2;;;4771:1;4764:4;4755:6;4750:3;4746:16;4742:27;4735:38;4696:2;-1:-1:-1;4837:2:1;4816:15;-1:-1:-1;;4812:29:1;4803:39;;;;4844:4;4799:50;;4433:422;-1:-1:-1;;4433:422:1:o;4860:1099::-;4988:3;5017:1;5050:6;5044:13;5080:3;5102:1;5130:9;5126:2;5122:18;5112:28;;5190:2;5179:9;5175:18;5212;5202:2;;5256:4;5248:6;5244:17;5234:27;;5202:2;5282;5330;5322:6;5319:14;5299:18;5296:38;5293:2;;;-1:-1:-1;;;5357:33:1;;5413:4;5410:1;5403:15;5443:4;5364:3;5431:17;5293:2;5474:18;5501:104;;;;5619:1;5614:320;;;;5467:467;;5501:104;-1:-1:-1;;5534:24:1;;5522:37;;5579:16;;;;-1:-1:-1;5501:104:1;;5614:320;9452:1;9445:14;;;9489:4;9476:18;;5709:1;5723:165;5737:6;5734:1;5731:13;5723:165;;;5815:14;;5802:11;;;5795:35;5858:16;;;;5752:10;;5723:165;;;5727:3;;5917:6;5912:3;5908:16;5901:23;;5467:467;-1:-1:-1;5950:3:1;;4996:963;-1:-1:-1;;;;;;;;4996:963:1:o;6382:488::-;-1:-1:-1;;;;;6651:15:1;;;6633:34;;6703:15;;6698:2;6683:18;;6676:43;6750:2;6735:18;;6728:34;;;6798:3;6793:2;6778:18;;6771:31;;;6576:4;;6819:45;;6844:19;;6836:6;6819:45;:::i;:::-;6811:53;6585:285;-1:-1:-1;;;;;;6585:285:1:o;7067:219::-;7216:2;7205:9;7198:21;7179:4;7236:44;7276:2;7265:9;7261:18;7253:6;7236:44;:::i;7291:336::-;7493:2;7475:21;;;7532:2;7512:18;;;7505:30;-1:-1:-1;;;7566:2:1;7551:18;;7544:42;7618:2;7603:18;;7465:162::o;9505:128::-;9545:3;9576:1;9572:6;9569:1;9566:13;9563:2;;;9582:18;;:::i;:::-;-1:-1:-1;9618:9:1;;9553:80::o;9638:125::-;9678:4;9706:1;9703;9700:8;9697:2;;;9711:18;;:::i;:::-;-1:-1:-1;9748:9:1;;9687:76::o;9768:380::-;9847:1;9843:12;;;;9890;;;9911:2;;9965:4;9957:6;9953:17;9943:27;;9911:2;10018;10010:6;10007:14;9987:18;9984:38;9981:2;;;10064:10;10059:3;10055:20;10052:1;10045:31;10099:4;10096:1;10089:15;10127:4;10124:1;10117:15;10153:127;10214:10;10209:3;10205:20;10202:1;10195:31;10245:4;10242:1;10235:15;10269:4;10266:1;10259:15;10285:131;-1:-1:-1;;;;;;10359:32:1;;10349:43;;10339:2;;10406:1;10403;10396:12

Swarm Source

ipfs://310b7f9f5d0a49a80f17130a40125fb1dff7c95e3e55171609c00ccd5be709d4
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.