ETH Price: $2,628.62 (-1.89%)

BoringBearFortuneClub (BBFC)
 

Overview

TokenID

2

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

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

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @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)"))`.
   * @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;

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @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;

  /**
   * @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.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @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;

  /**
   * @dev Set or reaffirm the approved address for an NFT.
   * @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.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice The contract MUST allow multiple operators per owner.
   * @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.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

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

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid 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);

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

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

}
/**
 * @dev Utility library of inline functions on addresses.
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 */
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);
  }

}
/**
 * @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);
    
}
/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @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.
   * @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.
   * @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);

}
/**
 * @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];
  }

}
/**
 * @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
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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)"))`.
   * @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);
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @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, "");
  }

  /**
   * @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.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @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);
  }

  /**
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @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 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);
  }

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice This works even if sender doesn't own any tokens at the time.
   * @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);
  }

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid 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];
  }

  /**
   * @dev Actually performs the transfer.
   * @notice Does NO checks.
   * @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);
  }

  /**
   * @dev Mints a new NFT.
   * @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.
   * @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);
  }

  /**
   * @dev Burns a NFT.
   * @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.
   * @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);
  }

  /**
   * @dev Removes a NFT from owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @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];
  }

  /**
   * @dev Assigns a new NFT to owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @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];
  }

}
/**
 * @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;

  /**
   * @dev Contract constructor.
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   */
  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
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @dev Burns a NFT.
   * @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.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

  /**
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @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.
   * @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;
  }

}
/**
 * @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
{

  /**
   * @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;
  }

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

  /**
   * @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;
  }

}

contract utils{
     function strConcat(string memory _a, string memory _b) internal pure returns (string memory){
     bytes memory _ba = bytes(_a);
     bytes memory _bb = bytes(_b);
     string memory ret = new string(_ba.length + _bb.length);
     bytes memory bret = bytes(ret);
     uint k = 0;
     for (uint i = 0; i < _ba.length; i++)bret[k++] = _ba[i];
     for (uint i = 0; i < _bb.length; i++) {
         bret[k++] = _bb[i];
         
     }
     return string(ret);
 } 
   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);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
  }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract BBFC is NFTokenMetadata, Ownable, utils {

    //0.18eth
    uint256 public price = 180000000 * 10 ** 9;
    uint256 public tokenId = 1;
    
    uint256 public minMint = 1;

    string baseUri = "https://boringbearfortuneclub.mypinata.cloud/ipfs/QmVrKn1ZFEvhPJKtbJUvHByws5geiGdgH7SyXzYcbhHTNb/";
   
    constructor() {
        nftName = "BoringBearFortuneClub";
        nftSymbol = "BBFC";
    }
    address payable public payAddress = payable(0x4F867ad863E3FC714792480A3F53f90C4259aAA7);

    function mint(uint256 tokenQuantity) payable public{
      require(msg.value * tokenQuantity >= price, "price too little");
      require(tokenId <= totalSupply(), "too many");
      require(tokenQuantity >= minMint && tokenQuantity <= 10, "amount false");
      for (uint256 i = 0; i < tokenQuantity; i++) {
          super._mint(msg.sender, tokenId);
          super._setTokenUri(tokenId, strConcat(baseUri, toString(tokenId)));
          tokenId ++;
      }
      payAddress.transfer(msg.value);
      
    }

    function setPrice(uint256 _target) external onlyOwner{
        price = _target * 10 ** 9;
    }

    function setMinAmount(uint256 _target) external onlyOwner{
        minMint = _target;
    }

    function totalSupply() public pure returns (uint256) {
        return 3333;
    }
}

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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","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":[],"name":"payAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"setMinAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"setPrice","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":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

67027f7d0bdb9200006009556001600a819055600b55610120604052606160808181529062001fed60a03980516200004091600c9160209091019062000198565b50600d80546001600160a01b031916734f867ad863e3fc714792480a3f53f90c4259aaa71790553480156200007457600080fd5b50600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c5805460ff1990811660019081179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed7808008054821683179055635b5e139f60e01b9093527f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805490931617909155600880546001600160a01b031916331790556040805180820190915260158082527f426f72696e6742656172466f7274756e65436c756200000000000000000000009190920190815262000163916005919062000198565b50604080518082019091526004808252634242464360e01b6020909201918252620001919160069162000198565b506200027b565b828054620001a6906200023e565b90600052602060002090601f016020900481019282620001ca576000855562000215565b82601f10620001e557805160ff191683800117855562000215565b8280016001018555821562000215579182015b8281111562000215578251825591602001919060010190620001f8565b506200022392915062000227565b5090565b5b8082111562000223576000815560010162000228565b6002810460018216806200025357607f821691505b602082108114156200027557634e487b7160e01b600052602260045260246000fd5b50919050565b611d62806200028b6000396000f3fe6080604052600436106101665760003560e01c8063860d248a116100d1578063a0712d681161008a578063c87b56dd11610064578063c87b56dd146103da578063e985e9c5146103fa578063f2fde38b1461041a578063f3fe3bc31461043a57610166565b8063a0712d6814610387578063a22cb4651461039a578063b88d4fde146103ba57610166565b8063860d248a146102f3578063897b0637146103085780638da5cb5b1461032857806391b7f5ed1461033d57806395d89b411461035d578063a035b1fe1461037257610166565b806323b872dd1161012357806323b872dd14610249578063294bfa8e1461026957806342842e0e1461027e5780636352211e1461029e57806370a08231146102be5780638376112a146102de57610166565b806301ffc9a71461016b57806306fdde03146101a1578063081812fc146101c3578063095ea7b3146101f057806317d70f7c1461021257806318160ddd14610234575b600080fd5b34801561017757600080fd5b5061018b610186366004611a9c565b61044f565b6040516101989190611b88565b60405180910390f35b3480156101ad57600080fd5b506101b6610472565b6040516101989190611b93565b3480156101cf57600080fd5b506101e36101de366004611ad4565b610504565b6040516101989190611b37565b3480156101fc57600080fd5b5061021061020b366004611a73565b610586565b005b34801561021e57600080fd5b50610227610728565b6040516101989190611c18565b34801561024057600080fd5b5061022761072e565b34801561025557600080fd5b50610210610264366004611968565b610734565b34801561027557600080fd5b506101e36108ef565b34801561028a57600080fd5b50610210610299366004611968565b6108fe565b3480156102aa57600080fd5b506101e36102b9366004611ad4565b61091e565b3480156102ca57600080fd5b506102276102d9366004611915565b610976565b3480156102ea57600080fd5b506102276109cd565b3480156102ff57600080fd5b506101b66109d3565b34801561031457600080fd5b50610210610323366004611ad4565b6109f5565b34801561033457600080fd5b506101e3610a44565b34801561034957600080fd5b50610210610358366004611ad4565b610a53565b34801561036957600080fd5b506101b6610ab1565b34801561037e57600080fd5b50610227610ac0565b610210610395366004611ad4565b610ac6565b3480156103a657600080fd5b506102106103b5366004611a39565b610c6f565b3480156103c657600080fd5b506102106103d53660046119a3565b610cde565b3480156103e657600080fd5b506101b66103f5366004611ad4565b610d27565b34801561040657600080fd5b5061018b610415366004611936565b610e22565b34801561042657600080fd5b50610210610435366004611915565b610e50565b34801561044657600080fd5b506101b6610f3b565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60606005805461048190611c83565b80601f01602080910402602001604051908101604052809291908181526020018280546104ad90611c83565b80156104fa5780601f106104cf576101008083540402835291602001916104fa565b820191906000526020600020905b8154815290600101906020018083116104dd57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166105645760405162461bcd60e51b815260040161055b9190611b93565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b0316338114806105d157506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b8152509061060e5760405162461bcd60e51b815260040161055b9190611b93565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166106685760405162461bcd60e51b815260040161055b9190611b93565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156106c85760405162461bcd60e51b815260040161055b9190611b93565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b600a5481565b610d0590565b60008181526001602052604090205481906001600160a01b03163381148061077257506000828152600260205260409020546001600160a01b031633145b806107a057506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906107dd5760405162461bcd60e51b815260040161055b9190611b93565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166108375760405162461bcd60e51b815260040161055b9190611b93565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146108965760405162461bcd60e51b815260040161055b9190611b93565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0387166108db5760405162461bcd60e51b815260040161055b9190611b93565b506108e68686610f5d565b50505050505050565b600d546001600160a01b031681565b61091983838360405180602001604052806000815250610fd8565b505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816105805760405162461bcd60e51b815260040161055b9190611b93565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166109bd5760405162461bcd60e51b815260040161055b9190611b93565b506109c782611286565b92915050565b600b5481565b6040518060400160405280600681526020016518189c18181960d11b81525081565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610a3e5760405162461bcd60e51b815260040161055b9190611b93565b50600b55565b6008546001600160a01b031681565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610a9c5760405162461bcd60e51b815260040161055b9190611b93565b50610aab81633b9aca00611c4d565b60095550565b60606006805461048190611c83565b60095481565b600954610ad38234611c4d565b1015610af15760405162461bcd60e51b815260040161055b90611bcc565b610af961072e565b600a541115610b1a5760405162461bcd60e51b815260040161055b90611bf6565b600b548110158015610b2d5750600a8111155b610b495760405162461bcd60e51b815260040161055b90611ba6565b60005b81811015610c3157610b6033600a546112a1565b610c09600a54610c04600c8054610b7690611c83565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba290611c83565b8015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b5050505050610bff600a54611384565b6114a7565b611640565b600a8054906000610c1983611cb8565b91905055508080610c2990611cb8565b915050610b4c565b50600d546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610c6b573d6000803e3d6000fd5b5050565b3360008181526004602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610cd2908590611b88565b60405180910390a35050565b610d2085858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fd892505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610d825760405162461bcd60e51b815260040161055b9190611b93565b5060008381526007602052604090208054610d9c90611c83565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890611c83565b8015610e155780601f10610dea57610100808354040283529160200191610e15565b820191906000526020600020905b815481529060010190602001808311610df857829003601f168201915b5050505050915050919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610e995760405162461bcd60e51b815260040161055b9190611b93565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216610ede5760405162461bcd60e51b815260040161055b9190611b93565b506008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b6000818152600160205260409020546001600160a01b0316610f7e826116bf565b610f8881836116dd565b610f928383611786565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b03163381148061101657506000828152600260205260409020546001600160a01b031633145b8061104457506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906110815760405162461bcd60e51b815260040161055b9190611b93565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166110db5760405162461bcd60e51b815260040161055b9190611b93565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908916821461113a5760405162461bcd60e51b815260040161055b9190611b93565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b03881661117f5760405162461bcd60e51b815260040161055b9190611b93565b5061118a8787610f5d565b61119c876001600160a01b031661182e565b1561127c57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a02906111d69033908d908c908c90600401611b4b565b602060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190611ab8565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b146112795760405162461bcd60e51b815260040161055b9190611b93565b50505b5050505050505050565b6001600160a01b031660009081526003602052604090205490565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b0383166112e55760405162461bcd60e51b815260040161055b9190611b93565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561133d5760405162461bcd60e51b815260040161055b9190611b93565b506113488282611786565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816113a957506040805180820190915260018152600360fc1b602082015261046d565b8160005b81156113d357806113bd81611cb8565b91506113cc9050600a83611c39565b91506113ad565b60008167ffffffffffffffff8111156113fc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611426576020820181803683370190505b5090505b841561149f5761143b600183611c6c565b9150611448600a86611cd3565b611453906030611c21565b60f81b81838151811061147657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611498600a86611c39565b945061142a565b949350505050565b80518251606091849184916000916114bf9190611c21565b67ffffffffffffffff8111156114e557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561150f576020820181803683370190505b509050806000805b85518110156115a35785818151811061154057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916838361155a81611cb8565b94508151811061157a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061159b81611cb8565b915050611517565b5060005b8451811015611633578481815181106115d057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683836115ea81611cb8565b94508151811061160a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061162b81611cb8565b9150506115a7565b5091979650505050505050565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166116995760405162461bcd60e51b815260040161055b9190611b93565b50600083815260076020908152604090912083516116b992850190611865565b50505050565b600090815260026020526040902080546001600160a01b0319169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146117385760405162461bcd60e51b815260040161055b9190611b93565b506001600160a01b0382166000908152600360205260408120805460019290611762908490611c6c565b9091555050600090815260016020526040902080546001600160a01b031916905550565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156117dd5760405162461bcd60e51b815260040161055b9190611b93565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155845260039091528220805491929091611825908490611c21565b90915550505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061149f5750141592915050565b82805461187190611c83565b90600052602060002090601f01602090048101928261189357600085556118d9565b82601f106118ac57805160ff19168380011785556118d9565b828001600101855582156118d9579182015b828111156118d95782518255916020019190600101906118be565b506118e59291506118e9565b5090565b5b808211156118e557600081556001016118ea565b80356001600160a01b038116811461046d57600080fd5b600060208284031215611926578081fd5b61192f826118fe565b9392505050565b60008060408385031215611948578081fd5b611951836118fe565b915061195f602084016118fe565b90509250929050565b60008060006060848603121561197c578081fd5b611985846118fe565b9250611993602085016118fe565b9150604084013590509250925092565b6000806000806000608086880312156119ba578081fd5b6119c3866118fe565b94506119d1602087016118fe565b935060408601359250606086013567ffffffffffffffff808211156119f4578283fd5b818801915088601f830112611a07578283fd5b813581811115611a15578384fd5b896020828501011115611a26578384fd5b9699959850939650602001949392505050565b60008060408385031215611a4b578182fd5b611a54836118fe565b915060208301358015158114611a68578182fd5b809150509250929050565b60008060408385031215611a85578182fd5b611a8e836118fe565b946020939093013593505050565b600060208284031215611aad578081fd5b813561192f81611d13565b600060208284031215611ac9578081fd5b815161192f81611d13565b600060208284031215611ae5578081fd5b5035919050565b60008151808452815b81811015611b1157602081850181015186830182015201611af5565b81811115611b225782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b7e90830184611aec565b9695505050505050565b901515815260200190565b60006020825261192f6020830184611aec565b6020808252600c908201526b616d6f756e742066616c736560a01b604082015260600190565b60208082526010908201526f707269636520746f6f206c6974746c6560801b604082015260600190565b602080825260089082015267746f6f206d616e7960c01b604082015260600190565b90815260200190565b60008219821115611c3457611c34611ce7565b500190565b600082611c4857611c48611cfd565b500490565b6000816000190483118215151615611c6757611c67611ce7565b500290565b600082821015611c7e57611c7e611ce7565b500390565b600281046001821680611c9757607f821691505b6020821081141561058057634e487b7160e01b600052602260045260246000fd5b6000600019821415611ccc57611ccc611ce7565b5060010190565b600082611ce257611ce2611cfd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160e01b031981168114611d2957600080fd5b5056fea2646970667358221220ac5e78bb686354d7a2d4bf754bc3ed9b4b58b34b775f59ed7fe9ec1c20ce2e5464736f6c6343000800003368747470733a2f2f626f72696e6762656172666f7274756e65636c75622e6d7970696e6174612e636c6f75642f697066732f516d56724b6e315a46457668504a4b74624a557648427977733567656947646748375379587a5963626848544e622f

Deployed Bytecode

0x6080604052600436106101665760003560e01c8063860d248a116100d1578063a0712d681161008a578063c87b56dd11610064578063c87b56dd146103da578063e985e9c5146103fa578063f2fde38b1461041a578063f3fe3bc31461043a57610166565b8063a0712d6814610387578063a22cb4651461039a578063b88d4fde146103ba57610166565b8063860d248a146102f3578063897b0637146103085780638da5cb5b1461032857806391b7f5ed1461033d57806395d89b411461035d578063a035b1fe1461037257610166565b806323b872dd1161012357806323b872dd14610249578063294bfa8e1461026957806342842e0e1461027e5780636352211e1461029e57806370a08231146102be5780638376112a146102de57610166565b806301ffc9a71461016b57806306fdde03146101a1578063081812fc146101c3578063095ea7b3146101f057806317d70f7c1461021257806318160ddd14610234575b600080fd5b34801561017757600080fd5b5061018b610186366004611a9c565b61044f565b6040516101989190611b88565b60405180910390f35b3480156101ad57600080fd5b506101b6610472565b6040516101989190611b93565b3480156101cf57600080fd5b506101e36101de366004611ad4565b610504565b6040516101989190611b37565b3480156101fc57600080fd5b5061021061020b366004611a73565b610586565b005b34801561021e57600080fd5b50610227610728565b6040516101989190611c18565b34801561024057600080fd5b5061022761072e565b34801561025557600080fd5b50610210610264366004611968565b610734565b34801561027557600080fd5b506101e36108ef565b34801561028a57600080fd5b50610210610299366004611968565b6108fe565b3480156102aa57600080fd5b506101e36102b9366004611ad4565b61091e565b3480156102ca57600080fd5b506102276102d9366004611915565b610976565b3480156102ea57600080fd5b506102276109cd565b3480156102ff57600080fd5b506101b66109d3565b34801561031457600080fd5b50610210610323366004611ad4565b6109f5565b34801561033457600080fd5b506101e3610a44565b34801561034957600080fd5b50610210610358366004611ad4565b610a53565b34801561036957600080fd5b506101b6610ab1565b34801561037e57600080fd5b50610227610ac0565b610210610395366004611ad4565b610ac6565b3480156103a657600080fd5b506102106103b5366004611a39565b610c6f565b3480156103c657600080fd5b506102106103d53660046119a3565b610cde565b3480156103e657600080fd5b506101b66103f5366004611ad4565b610d27565b34801561040657600080fd5b5061018b610415366004611936565b610e22565b34801561042657600080fd5b50610210610435366004611915565b610e50565b34801561044657600080fd5b506101b6610f3b565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60606005805461048190611c83565b80601f01602080910402602001604051908101604052809291908181526020018280546104ad90611c83565b80156104fa5780601f106104cf576101008083540402835291602001916104fa565b820191906000526020600020905b8154815290600101906020018083116104dd57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166105645760405162461bcd60e51b815260040161055b9190611b93565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b0316338114806105d157506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b8152509061060e5760405162461bcd60e51b815260040161055b9190611b93565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166106685760405162461bcd60e51b815260040161055b9190611b93565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156106c85760405162461bcd60e51b815260040161055b9190611b93565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b600a5481565b610d0590565b60008181526001602052604090205481906001600160a01b03163381148061077257506000828152600260205260409020546001600160a01b031633145b806107a057506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906107dd5760405162461bcd60e51b815260040161055b9190611b93565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166108375760405162461bcd60e51b815260040161055b9190611b93565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146108965760405162461bcd60e51b815260040161055b9190611b93565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0387166108db5760405162461bcd60e51b815260040161055b9190611b93565b506108e68686610f5d565b50505050505050565b600d546001600160a01b031681565b61091983838360405180602001604052806000815250610fd8565b505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816105805760405162461bcd60e51b815260040161055b9190611b93565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166109bd5760405162461bcd60e51b815260040161055b9190611b93565b506109c782611286565b92915050565b600b5481565b6040518060400160405280600681526020016518189c18181960d11b81525081565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610a3e5760405162461bcd60e51b815260040161055b9190611b93565b50600b55565b6008546001600160a01b031681565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610a9c5760405162461bcd60e51b815260040161055b9190611b93565b50610aab81633b9aca00611c4d565b60095550565b60606006805461048190611c83565b60095481565b600954610ad38234611c4d565b1015610af15760405162461bcd60e51b815260040161055b90611bcc565b610af961072e565b600a541115610b1a5760405162461bcd60e51b815260040161055b90611bf6565b600b548110158015610b2d5750600a8111155b610b495760405162461bcd60e51b815260040161055b90611ba6565b60005b81811015610c3157610b6033600a546112a1565b610c09600a54610c04600c8054610b7690611c83565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba290611c83565b8015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b5050505050610bff600a54611384565b6114a7565b611640565b600a8054906000610c1983611cb8565b91905055508080610c2990611cb8565b915050610b4c565b50600d546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610c6b573d6000803e3d6000fd5b5050565b3360008181526004602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610cd2908590611b88565b60405180910390a35050565b610d2085858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fd892505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610d825760405162461bcd60e51b815260040161055b9190611b93565b5060008381526007602052604090208054610d9c90611c83565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890611c83565b8015610e155780601f10610dea57610100808354040283529160200191610e15565b820191906000526020600020905b815481529060010190602001808311610df857829003601f168201915b5050505050915050919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610e995760405162461bcd60e51b815260040161055b9190611b93565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216610ede5760405162461bcd60e51b815260040161055b9190611b93565b506008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b6000818152600160205260409020546001600160a01b0316610f7e826116bf565b610f8881836116dd565b610f928383611786565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b03163381148061101657506000828152600260205260409020546001600160a01b031633145b8061104457506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906110815760405162461bcd60e51b815260040161055b9190611b93565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b03166110db5760405162461bcd60e51b815260040161055b9190611b93565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b0390811691908916821461113a5760405162461bcd60e51b815260040161055b9190611b93565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b03881661117f5760405162461bcd60e51b815260040161055b9190611b93565b5061118a8787610f5d565b61119c876001600160a01b031661182e565b1561127c57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a02906111d69033908d908c908c90600401611b4b565b602060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190611ab8565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b146112795760405162461bcd60e51b815260040161055b9190611b93565b50505b5050505050505050565b6001600160a01b031660009081526003602052604090205490565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b0383166112e55760405162461bcd60e51b815260040161055b9190611b93565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561133d5760405162461bcd60e51b815260040161055b9190611b93565b506113488282611786565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816113a957506040805180820190915260018152600360fc1b602082015261046d565b8160005b81156113d357806113bd81611cb8565b91506113cc9050600a83611c39565b91506113ad565b60008167ffffffffffffffff8111156113fc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611426576020820181803683370190505b5090505b841561149f5761143b600183611c6c565b9150611448600a86611cd3565b611453906030611c21565b60f81b81838151811061147657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611498600a86611c39565b945061142a565b949350505050565b80518251606091849184916000916114bf9190611c21565b67ffffffffffffffff8111156114e557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561150f576020820181803683370190505b509050806000805b85518110156115a35785818151811061154057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916838361155a81611cb8565b94508151811061157a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061159b81611cb8565b915050611517565b5060005b8451811015611633578481815181106115d057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191683836115ea81611cb8565b94508151811061160a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061162b81611cb8565b9150506115a7565b5091979650505050505050565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b03166116995760405162461bcd60e51b815260040161055b9190611b93565b50600083815260076020908152604090912083516116b992850190611865565b50505050565b600090815260026020526040902080546001600160a01b0319169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146117385760405162461bcd60e51b815260040161055b9190611b93565b506001600160a01b0382166000908152600360205260408120805460019290611762908490611c6c565b9091555050600090815260016020526040902080546001600160a01b031916905550565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156117dd5760405162461bcd60e51b815260040161055b9190611b93565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155845260039091528220805491929091611825908490611c21565b90915550505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061149f5750141592915050565b82805461187190611c83565b90600052602060002090601f01602090048101928261189357600085556118d9565b82601f106118ac57805160ff19168380011785556118d9565b828001600101855582156118d9579182015b828111156118d95782518255916020019190600101906118be565b506118e59291506118e9565b5090565b5b808211156118e557600081556001016118ea565b80356001600160a01b038116811461046d57600080fd5b600060208284031215611926578081fd5b61192f826118fe565b9392505050565b60008060408385031215611948578081fd5b611951836118fe565b915061195f602084016118fe565b90509250929050565b60008060006060848603121561197c578081fd5b611985846118fe565b9250611993602085016118fe565b9150604084013590509250925092565b6000806000806000608086880312156119ba578081fd5b6119c3866118fe565b94506119d1602087016118fe565b935060408601359250606086013567ffffffffffffffff808211156119f4578283fd5b818801915088601f830112611a07578283fd5b813581811115611a15578384fd5b896020828501011115611a26578384fd5b9699959850939650602001949392505050565b60008060408385031215611a4b578182fd5b611a54836118fe565b915060208301358015158114611a68578182fd5b809150509250929050565b60008060408385031215611a85578182fd5b611a8e836118fe565b946020939093013593505050565b600060208284031215611aad578081fd5b813561192f81611d13565b600060208284031215611ac9578081fd5b815161192f81611d13565b600060208284031215611ae5578081fd5b5035919050565b60008151808452815b81811015611b1157602081850181015186830182015201611af5565b81811115611b225782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611b7e90830184611aec565b9695505050505050565b901515815260200190565b60006020825261192f6020830184611aec565b6020808252600c908201526b616d6f756e742066616c736560a01b604082015260600190565b60208082526010908201526f707269636520746f6f206c6974746c6560801b604082015260600190565b602080825260089082015267746f6f206d616e7960c01b604082015260600190565b90815260200190565b60008219821115611c3457611c34611ce7565b500190565b600082611c4857611c48611cfd565b500490565b6000816000190483118215151615611c6757611c67611ce7565b500290565b600082821015611c7e57611c7e611ce7565b500390565b600281046001821680611c9757607f821691505b6020821081141561058057634e487b7160e01b600052602260045260246000fd5b6000600019821415611ccc57611ccc611ce7565b5060010190565b600082611ce257611ce2611cfd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160e01b031981168114611d2957600080fd5b5056fea2646970667358221220ac5e78bb686354d7a2d4bf754bc3ed9b4b58b34b775f59ed7fe9ec1c20ce2e5464736f6c63430008000033

Deployed Bytecode Sourcemap

31677:1343:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10603:172;;;;;;;;;;-1:-1:-1;10603:172:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24639:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18750:183::-;;;;;;;;;;-1:-1:-1;18750:183:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16535:352::-;;;;;;;;;;-1:-1:-1;16535:352:0;;;;;:::i;:::-;;:::i;:::-;;31799:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32934:83::-;;;;;;;;;;;;;:::i;15761:353::-;;;;;;;;;;-1:-1:-1;15761:353:0;;;;;:::i;:::-;;:::i;32102:87::-;;;;;;;;;;;;;:::i;15006:179::-;;;;;;;;;;-1:-1:-1;15006:179:0;;;;;:::i;:::-;;:::i;18298:208::-;;;;;;;;;;-1:-1:-1;18298:208:0;;;;;:::i;:::-;;:::i;17824:204::-;;;;;;;;;;-1:-1:-1;17824:204:0;;;;;:::i;:::-;;:::i;31838:26::-;;;;;;;;;;;;;:::i;26881:65::-;;;;;;;;;;;;;:::i;32833:93::-;;;;;;;;;;-1:-1:-1;32833:93:0;;;;;:::i;:::-;;:::i;27001:20::-;;;;;;;;;;;;;:::i;32728:97::-;;;;;;;;;;-1:-1:-1;32728:97:0;;;;;:::i;:::-;;:::i;24875:128::-;;;;;;;;;;;;;:::i;31750:42::-;;;;;;;;;;;;;:::i;32198:522::-;;;;;;:::i;:::-;;:::i;17298:232::-;;;;;;;;;;-1:-1:-1;17298:232:0;;;;;:::i;:::-;;:::i;14387:209::-;;;;;;;;;;-1:-1:-1;14387:209:0;;;;;:::i;:::-;;:::i;25156:181::-;;;;;;;;;;-1:-1:-1;25156:181:0;;;;;:::i;:::-;;:::i;19202:192::-;;;;;;;;;;-1:-1:-1;19202:192:0;;;;;:::i;:::-;;:::i;27826:238::-;;;;;;;;;;-1:-1:-1;27826:238:0;;;;;:::i;:::-;;:::i;26825:51::-;;;;;;;;;;;;;:::i;10603:172::-;-1:-1:-1;;;;;;10736:33:0;;10713:4;10736:33;;;;;;;;;;;;;10603:172;;;;:::o;24639:120::-;24707:19;24746:7;24738:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24639:120;:::o;18750:183::-;18879:7;13319:19;;;:9;:19;;;;;;;;;13354:13;;;;;;;;;;;-1:-1:-1;;;13354:13:0;;;;;;;18855:8;;-1:-1:-1;;;;;13319:19:0;13311:57;;;;-1:-1:-1;;;13311:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;18905:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;18905:22:0::1;::::0;-1:-1:-1;13375:1:0::1;18750:183:::0;;;;:::o;16535:352::-;12503:18;12524:19;;;:9;:19;;;;;;16648:8;;-1:-1:-1;;;;;12524:19:0;12580:10;12566:24;;;:68;;-1:-1:-1;;;;;;12594:28:0;;;;;;:16;:28;;;;;;;;12623:10;12594:40;;;;;;;;;;12566:68;12643:21;;;;;;;;;;;;;-1:-1:-1;;;12643:21:0;;;12550:121;;;;;-1:-1:-1;;;12550:121:0;;;;;;;;:::i;:::-;-1:-1:-1;13350:1:0::1;13319:19:::0;;;:9:::1;:19;::::0;;;;;;;;;13354:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13354:13:0;;::::1;::::0;;;;16676:8;;13354:13;-1:-1:-1;;;;;13319:19:0::1;13311:57;;;;-1:-1:-1::0;;;13311:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;16696:18:0::2;16717:19:::0;;;:9:::2;:19;::::0;;;;;;;;;16776:8;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;16776:8:0;;::::2;::::0;;;;-1:-1:-1;;;;;16717:19:0;;::::2;::::0;16776:8;16751:23;::::2;::::0;::::2;;16743:42;;;;-1:-1:-1::0;;;16743:42:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;16794:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;16794:34:0::2;-1:-1:-1::0;;;;;16794:34:0;;::::2;::::0;;::::2;::::0;;;16840:41;;16794:22;;16840:41;;::::2;::::0;::::2;::::0;::::2;13375:1;12678::::1;16535:352:::0;;;;:::o;31799:26::-;;;;:::o;32934:83::-;33005:4;32934:83;:::o;15761:353::-;12883:18;12904:19;;;:9;:19;;;;;;15894:8;;-1:-1:-1;;;;;12904:19:0;12960:10;12946:24;;;:71;;-1:-1:-1;12981:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12981:22:0;13007:10;12981:36;12946:71;:122;;;-1:-1:-1;;;;;;13028:28:0;;;;;;:16;:28;;;;;;;;13057:10;13028:40;;;;;;;;;;12946:122;13077:30;;;;;;;;;;;;;-1:-1:-1;;;13077:30:0;;;12930:184;;;;;-1:-1:-1;;;12930:184:0;;;;;;;;:::i;:::-;-1:-1:-1;13350:1:0::1;13319:19:::0;;;:9:::1;:19;::::0;;;;;;;;;13354:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13354:13:0;;::::1;::::0;;;;15922:8;;13354:13;-1:-1:-1;;;;;13319:19:0::1;13311:57;;;;-1:-1:-1::0;;;13311:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;15942:18:0::2;15963:19:::0;;;:9:::2;:19;::::0;;;;;;;;;16018:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;16018:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;15963:19:0;;::::2;::::0;16018:9;15997:19;::::2;::::0;::::2;15989:39;;;;-1:-1:-1::0;;;15989:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;16062:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;16062:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;16043:17:0;::::2;16035:40;;;;-1:-1:-1::0;;;16035:40:0::2;;;;;;;;:::i;:::-;;16084:24;16094:3;16099:8;16084:9;:24::i;:::-;13375:1;13121::::1;15761:353:::0;;;;;:::o;32102:87::-;;;-1:-1:-1;;;;;32102:87:0;;:::o;15006:179::-;15136:43;15154:5;15161:3;15166:8;15136:43;;;;;;;;;;;;:17;:43::i;:::-;15006:179;;;:::o;18298:208::-;18395:14;18430:19;;;:9;:19;;;;;;;;;;18486:13;;;;;;;;;;;-1:-1:-1;;;18486:13:0;;;;;;;-1:-1:-1;;;;;18430:19:0;;18464:20;18456:44;;;;-1:-1:-1;;;18456:44:0;;;;;;;;:::i;17824:204::-;17970:12;;;;;;;;;;;;-1:-1:-1;;;17970:12:0;;;;17921:7;;-1:-1:-1;;;;;17948:20:0;;17940:43;;;;-1:-1:-1;;;17940:43:0;;;;;;;;:::i;:::-;;17997:25;18015:6;17997:17;:25::i;:::-;17990:32;17824:204;-1:-1:-1;;17824:204:0:o;31838:26::-;;;;:::o;26881:65::-;;;;;;;;;;;;;;-1:-1:-1;;;26881:65:0;;;;:::o;32833:93::-;27619:5;;27626:17;;;;;;;;;;;;-1:-1:-1;;;27626:17:0;;;;;-1:-1:-1;;;;;27619:5:0;27605:10;:19;27597:47;;;;-1:-1:-1;;;27597:47:0;;;;;;;;:::i;:::-;-1:-1:-1;32901:7:0::1;:17:::0;32833:93::o;27001:20::-;;;-1:-1:-1;;;;;27001:20:0;;:::o;32728:97::-;27619:5;;27626:17;;;;;;;;;;;;-1:-1:-1;;;27626:17:0;;;;;-1:-1:-1;;;;;27619:5:0;27605:10;:19;27597:47;;;;-1:-1:-1;;;27597:47:0;;;;;;;;:::i;:::-;-1:-1:-1;32800:17:0::1;:7:::0;32810::::1;32800:17;:::i;:::-;32792:5;:25:::0;-1:-1:-1;32728:97:0:o;24875:128::-;24945:21;24988:9;24978:19;;;;;:::i;31750:42::-;;;;:::o;32198:522::-;32295:5;;32266:25;32278:13;32266:9;:25;:::i;:::-;:34;;32258:63;;;;-1:-1:-1;;;32258:63:0;;;;;;;:::i;:::-;32349:13;:11;:13::i;:::-;32338:7;;:24;;32330:45;;;;-1:-1:-1;;;32330:45:0;;;;;;;:::i;:::-;32409:7;;32392:13;:24;;:47;;;;;32437:2;32420:13;:19;;32392:47;32384:72;;;;-1:-1:-1;;;32384:72:0;;;;;;;:::i;:::-;32470:9;32465:201;32489:13;32485:1;:17;32465:201;;;32522:32;32534:10;32546:7;;32522:11;:32::i;:::-;32567:66;32586:7;;32595:37;32605:7;32595:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32614:17;32623:7;;32614:8;:17::i;:::-;32595:9;:37::i;:::-;32567:18;:66::i;:::-;32646:7;:10;;;:7;:10;;;:::i;:::-;;;;;;32504:3;;;;;:::i;:::-;;;;32465:201;;;-1:-1:-1;32674:10:0;;:30;;-1:-1:-1;;;;;32674:10:0;;;;32694:9;32674:30;;;;;:10;:30;:10;:30;32694:9;32674:10;:30;;;;;;;;;;;;;;;;;;;;;32198:522;:::o;17298:232::-;17430:10;17413:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;17413:39:0;;;;;;;;;;;:51;;-1:-1:-1;;17413:51:0;;;;;;;17476:48;;17413:39;;17430:10;17476:48;;;;17413:51;;17476:48;:::i;:::-;;;;;;;;17298:232;;:::o;14387:209::-;14544:46;14562:5;14569:3;14574:8;14584:5;;14544:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14544:17:0;;-1:-1:-1;;;14544:46:0:i;:::-;14387:209;;;;;:::o;25156:181::-;13350:1;13319:19;;;:9;:19;;;;;;;;;;13354:13;;;;;;;;;;;-1:-1:-1;;;13354:13:0;;;;;;;25282;;25258:8;;-1:-1:-1;;;;;13319:19:0;13311:57;;;;-1:-1:-1;;;13311:57:0;;;;;;;;:::i;:::-;-1:-1:-1;25314:17:0::1;::::0;;;:7:::1;:17;::::0;;;;25307:24;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25156:181:::0;;;;:::o;19202:192::-;-1:-1:-1;;;;;19353:24:0;;;19330:4;19353:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;19202:192::o;27826:238::-;27619:5;;27626:17;;;;;;;;;;;;-1:-1:-1;;;27626:17:0;;;;;-1:-1:-1;;;;;27619:5:0;27605:10;:19;27597:47;;;;-1:-1:-1;;;27597:47:0;;;;;;;;:::i;:::-;-1:-1:-1;27952:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;27952:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;27927:23:0;::::1;27919:65;;;;-1:-1:-1::0;;;27919:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;28017:5:0::1;::::0;27996:38:::1;::::0;-1:-1:-1;;;;;27996:38:0;;::::1;::::0;28017:5:::1;::::0;27996:38:::1;::::0;28017:5:::1;::::0;27996:38:::1;28041:5;:17:::0;;-1:-1:-1;;;;;;28041:17:0::1;-1:-1:-1::0;;;;;28041:17:0;;;::::1;::::0;;;::::1;::::0;;27826:238::o;26825:51::-;;;;;;;;;;;;;;-1:-1:-1;;;26825:51:0;;;;:::o;19585:275::-;19674:12;19689:19;;;:9;:19;;;;;;-1:-1:-1;;;;;19689:19:0;19715:24;19699:8;19715:14;:24::i;:::-;19748:30;19763:4;19769:8;19748:14;:30::i;:::-;19785:26;19797:3;19802:8;19785:11;:26::i;:::-;19845:8;19840:3;-1:-1:-1;;;;;19825:29:0;19834:4;-1:-1:-1;;;;;19825:29:0;;;;;;;;;;;19585:275;;;:::o;22987:590::-;12883:18;12904:19;;;:9;:19;;;;;;23135:8;;-1:-1:-1;;;;;12904:19:0;12960:10;12946:24;;;:71;;-1:-1:-1;12981:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12981:22:0;13007:10;12981:36;12946:71;:122;;;-1:-1:-1;;;;;;13028:28:0;;;;;;:16;:28;;;;;;;;13057:10;13028:40;;;;;;;;;;12946:122;13077:30;;;;;;;;;;;;;-1:-1:-1;;;13077:30:0;;;12930:184;;;;;-1:-1:-1;;;12930:184:0;;;;;;;;:::i;:::-;-1:-1:-1;13350:1:0::1;13319:19:::0;;;:9:::1;:19;::::0;;;;;;;;;13354:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13354:13:0;;::::1;::::0;;;;23163:8;;13354:13;-1:-1:-1;;;;;13319:19:0::1;13311:57;;;;-1:-1:-1::0;;;13311:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;23183:18:0::2;23204:19:::0;;;:9:::2;:19;::::0;;;;;;;;;23259:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;23259:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;23204:19:0;;::::2;::::0;23259:9;23238:19;::::2;::::0;::::2;23230:39;;;;-1:-1:-1::0;;;23230:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;23303:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;23303:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;23284:17:0;::::2;23276:40;;;;-1:-1:-1::0;;;23276:40:0::2;;;;;;;;:::i;:::-;;23325:24;23335:3;23340:8;23325:9;:24::i;:::-;23362:16;:3;-1:-1:-1::0;;;;;23362:14:0::2;;:16::i;:::-;23358:214;;;23410:77;::::0;-1:-1:-1;;;23410:77:0;;23394:13:::2;::::0;-1:-1:-1;;;;;23410:41:0;::::2;::::0;::::2;::::0;:77:::2;::::0;23452:10:::2;::::0;23464:5;;23471:8;;23481:5;;23410:77:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23540:23;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;23540:23:0::2;::::0;::::2;::::0;23394:93;;-1:-1:-1;;;;;;;23504:34:0;::::2;-1:-1:-1::0;;;23504:34:0::2;23496:68;;;;-1:-1:-1::0;;;23496:68:0::2;;;;;;;;:::i;:::-;;23358:214;;13375:1;13121::::1;22987:590:::0;;;;;;:::o;22546:163::-;-1:-1:-1;;;;;22676:27:0;22650:7;22676:27;;;:19;:27;;;;;;;22546:163::o;20251:297::-;20376:12;;;;;;;;;;;;-1:-1:-1;;;20376:12:0;;;;-1:-1:-1;;;;;20357:17:0;;20349:40;;;;-1:-1:-1;;;20349:40:0;;;;;;;;:::i;:::-;-1:-1:-1;20435:1:0;20404:19;;;:9;:19;;;;;;;;;;20439:18;;;;;;;;;;;-1:-1:-1;;;20439:18:0;;;;;;;-1:-1:-1;;;;;20404:19:0;:33;20396:62;;;;-1:-1:-1;;;20396:62:0;;;;;;;;:::i;:::-;;20467:26;20479:3;20484:8;20467:11;:26::i;:::-;20507:35;;20533:8;;-1:-1:-1;;;;;20507:35:0;;;20524:1;;20507:35;;20524:1;;20507:35;20251:297;;:::o;28573:530::-;28629:13;28659:10;28655:53;;-1:-1:-1;28686:10:0;;;;;;;;;;;;-1:-1:-1;;;28686:10:0;;;;;;28655:53;28733:5;28718:12;28774:78;28781:9;;28774:78;;28807:8;;;;:::i;:::-;;-1:-1:-1;28830:10:0;;-1:-1:-1;28838:2:0;28830:10;;:::i;:::-;;;28774:78;;;28862:19;28894:6;28884:17;;;;;;-1:-1:-1;;;28884:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28884:17:0;;28862:39;;28912:154;28919:10;;28912:154;;28946:11;28956:1;28946:11;;:::i;:::-;;-1:-1:-1;29015:10:0;29023:2;29015:5;:10;:::i;:::-;29002:24;;:2;:24;:::i;:::-;28989:39;;28972:6;28979;28972:14;;;;;;-1:-1:-1;;;28972:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;28972:56:0;;;;;;;;-1:-1:-1;29043:11:0;29052:2;29043:11;;:::i;:::-;;;28912:154;;;29090:6;28573:530;-1:-1:-1;;;;28573:530:0:o;28095:472::-;28311:10;;28298;;28173:13;;28220:2;;28256;;28195:16;;28298:23;;28311:10;28298:23;:::i;:::-;28287:35;;;;;;-1:-1:-1;;;28287:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28287:35:0;-1:-1:-1;28267:55:0;-1:-1:-1;28267:55:0;28330:17;;28386:55;28407:3;:10;28403:1;:14;28386:55;;;28435:3;28439:1;28435:6;;;;;;-1:-1:-1;;;28435:6:0;;;;;;;;;;;;;-1:-1:-1;;;;;;28435:6:0;28423:4;28428:3;;;;:::i;:::-;;;28423:9;;;;;;-1:-1:-1;;;28423:9:0;;;;;;;;;;;;:18;-1:-1:-1;;;;;28423:18:0;;;;;;;;-1:-1:-1;28419:3:0;;;;:::i;:::-;;;;28386:55;;;;28454:6;28449:88;28470:3;:10;28466:1;:14;28449:88;;;28511:3;28515:1;28511:6;;;;;;-1:-1:-1;;;28511:6:0;;;;;;;;;;;;;-1:-1:-1;;;;;;28511:6:0;28499:4;28504:3;;;;:::i;:::-;;;28499:9;;;;;;-1:-1:-1;;;28499:9:0;;;;;;;;;;;;:18;-1:-1:-1;;;;;28499:18:0;;;;;;;;-1:-1:-1;28482:3:0;;;;:::i;:::-;;;;28449:88;;;-1:-1:-1;28558:3:0;;28095:472;-1:-1:-1;;;;;;;28095:472:0:o;26289:157::-;13350:1;13319:19;;;:9;:19;;;;;;;;;;13354:13;;;;;;;;;;;-1:-1:-1;;;13354:13:0;;;;;;;26396:8;;13354:13;-1:-1:-1;;;;;13319:19:0;13311:57;;;;-1:-1:-1;;;13311:57:0;;;;;;;;:::i;:::-;-1:-1:-1;26416:17:0::1;::::0;;;:7:::1;:17;::::0;;;;;;;:24;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;26289:157:::0;;;:::o;23710:110::-;23792:22;;;;:12;:22;;;;;23785:29;;-1:-1:-1;;;;;;23785:29:0;;;23710:110::o;21508:234::-;21625:19;;;;:9;:19;;;;;;;;;;21655:9;;;;;;;;;;;-1:-1:-1;;;21655:9:0;;;;;;;-1:-1:-1;;;;;21625:28:0;;;:19;;:28;21617:48;;;;-1:-1:-1;;;21617:48:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21672:26:0;;;;;;:19;:26;;;;;:31;;21702:1;;21672:26;:31;;21702:1;;21672:31;:::i;:::-;;;;-1:-1:-1;;21717:19:0;;;;:9;:19;;;;;21710:26;;-1:-1:-1;;;;;;21710:26:0;;;-1:-1:-1;21508:234:0:o;22009:242::-;22152:1;22121:19;;;:9;:19;;;;;;;;;;22156:18;;;;;;;;;;;-1:-1:-1;;;22156:18:0;;;;;;;-1:-1:-1;;;;;22121:19:0;:33;22113:62;;;;-1:-1:-1;;;22113:62:0;;;;;;;;:::i;:::-;-1:-1:-1;22184:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;22184:25:0;-1:-1:-1;;;;;22184:25:0;;;;;;;;22216:24;;:19;:24;;;;;:29;;22184:9;;22216:24;;:29;;22184:9;;22216:29;:::i;:::-;;;;-1:-1:-1;;;;22009:242:0:o;7374:780::-;7457:17;8039:18;;7943:66;8105:15;;;;;:42;;-1:-1:-1;8124:23:0;;;8089:59;-1:-1:-1;;7374:780:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;:::-;345:41;264:128;-1:-1:-1;;;264:128:1:o;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:862::-;;;;;;1205:3;1193:9;1184:7;1180:23;1176:33;1173:2;;;1227:6;1219;1212:22;1173:2;1255:31;1276:9;1255:31;:::i;:::-;1245:41;;1305:40;1341:2;1330:9;1326:18;1305:40;:::i;:::-;1295:50;;1392:2;1381:9;1377:18;1364:32;1354:42;;1447:2;1436:9;1432:18;1419:32;1470:18;1511:2;1503:6;1500:14;1497:2;;;1532:6;1524;1517:22;1497:2;1575:6;1564:9;1560:22;1550:32;;1620:7;1613:4;1609:2;1605:13;1601:27;1591:2;;1647:6;1639;1632:22;1591:2;1692;1679:16;1718:2;1710:6;1707:14;1704:2;;;1739:6;1731;1724:22;1704:2;1789:7;1784:2;1775:6;1771:2;1767:15;1763:24;1760:37;1757:2;;;1815:6;1807;1800:22;1757:2;1163:722;;;;-1:-1:-1;1163:722:1;;-1:-1:-1;1851:2:1;1843:11;;1873:6;1163:722;-1:-1:-1;;;1163:722:1:o;1890:369::-;;;2016:2;2004:9;1995:7;1991:23;1987:32;1984:2;;;2037:6;2029;2022:22;1984:2;2065:31;2086:9;2065:31;:::i;:::-;2055:41;;2146:2;2135:9;2131:18;2118:32;2193:5;2186:13;2179:21;2172:5;2169:32;2159:2;;2220:6;2212;2205:22;2159:2;2248:5;2238:15;;;1974:285;;;;;:::o;2264:266::-;;;2393:2;2381:9;2372:7;2368:23;2364:32;2361:2;;;2414:6;2406;2399:22;2361:2;2442:31;2463:9;2442:31;:::i;:::-;2432:41;2520:2;2505:18;;;;2492:32;;-1:-1:-1;;;2351:179:1:o;2535:257::-;;2646:2;2634:9;2625:7;2621:23;2617:32;2614:2;;;2667:6;2659;2652:22;2614:2;2711:9;2698:23;2730:32;2756:5;2730:32;:::i;2797:261::-;;2919:2;2907:9;2898:7;2894:23;2890:32;2887:2;;;2940:6;2932;2925:22;2887:2;2977:9;2971:16;2996:32;3022:5;2996:32;:::i;3063:190::-;;3175:2;3163:9;3154:7;3150:23;3146:32;3143:2;;;3196:6;3188;3181:22;3143:2;-1:-1:-1;3224:23:1;;3133:120;-1:-1:-1;3133:120:1:o;3258:477::-;;3339:5;3333:12;3366:6;3361:3;3354:19;3391:3;3403:162;3417:6;3414:1;3411:13;3403:162;;;3479:4;3535:13;;;3531:22;;3525:29;3507:11;;;3503:20;;3496:59;3432:12;3403:162;;;3583:6;3580:1;3577:13;3574:2;;;3649:3;3642:4;3633:6;3628:3;3624:16;3620:27;3613:40;3574:2;-1:-1:-1;3717:2:1;3696:15;-1:-1:-1;;3692:29:1;3683:39;;;;3724:4;3679:50;;3309:426;-1:-1:-1;;3309:426:1:o;3740:203::-;-1:-1:-1;;;;;3904:32:1;;;;3886:51;;3874:2;3859:18;;3841:102::o;4172:490::-;-1:-1:-1;;;;;4441:15:1;;;4423:34;;4493:15;;4488:2;4473:18;;4466:43;4540:2;4525:18;;4518:34;;;4588:3;4583:2;4568:18;;4561:31;;;4172:490;;4609:47;;4636:19;;4628:6;4609:47;:::i;:::-;4601:55;4375:287;-1:-1:-1;;;;;;4375:287:1:o;4667:187::-;4832:14;;4825:22;4807:41;;4795:2;4780:18;;4762:92::o;4859:221::-;;5008:2;4997:9;4990:21;5028:46;5070:2;5059:9;5055:18;5047:6;5028:46;:::i;5085:336::-;5287:2;5269:21;;;5326:2;5306:18;;;5299:30;-1:-1:-1;;;5360:2:1;5345:18;;5338:42;5412:2;5397:18;;5259:162::o;5426:340::-;5628:2;5610:21;;;5667:2;5647:18;;;5640:30;-1:-1:-1;;;5701:2:1;5686:18;;5679:46;5757:2;5742:18;;5600:166::o;5771:331::-;5973:2;5955:21;;;6012:1;5992:18;;;5985:29;-1:-1:-1;;;6045:2:1;6030:18;;6023:38;6093:2;6078:18;;5945:157::o;6107:177::-;6253:25;;;6241:2;6226:18;;6208:76::o;6289:128::-;;6360:1;6356:6;6353:1;6350:13;6347:2;;;6366:18;;:::i;:::-;-1:-1:-1;6402:9:1;;6337:80::o;6422:120::-;;6488:1;6478:2;;6493:18;;:::i;:::-;-1:-1:-1;6527:9:1;;6468:74::o;6547:168::-;;6653:1;6649;6645:6;6641:14;6638:1;6635:21;6630:1;6623:9;6616:17;6612:45;6609:2;;;6660:18;;:::i;:::-;-1:-1:-1;6700:9:1;;6599:116::o;6720:125::-;;6788:1;6785;6782:8;6779:2;;;6793:18;;:::i;:::-;-1:-1:-1;6830:9:1;;6769:76::o;6850:380::-;6935:1;6925:12;;6982:1;6972:12;;;6993:2;;7047:4;7039:6;7035:17;7025:27;;6993:2;7100;7092:6;7089:14;7069:18;7066:38;7063:2;;;7146:10;7141:3;7137:20;7134:1;7127:31;7181:4;7178:1;7171:15;7209:4;7206:1;7199:15;7235:135;;-1:-1:-1;;7295:17:1;;7292:2;;;7315:18;;:::i;:::-;-1:-1:-1;7362:1:1;7351:13;;7282:88::o;7375:112::-;;7433:1;7423:2;;7438:18;;:::i;:::-;-1:-1:-1;7472:9:1;;7413:74::o;7492:127::-;7553:10;7548:3;7544:20;7541:1;7534:31;7584:4;7581:1;7574:15;7608:4;7605:1;7598:15;7624:127;7685:10;7680:3;7676:20;7673:1;7666:31;7716:4;7713:1;7706:15;7740:4;7737:1;7730:15;7756:133;-1:-1:-1;;;;;;7832:32:1;;7822:43;;7812:2;;7879:1;7876;7869:12;7812:2;7802:87;:::o

Swarm Source

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

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