ETH Price: $3,861.00 (+0.68%)

Token

BONK Minter (BONKNFT)
 

Overview

Max Total Supply

139 BONKNFT

Holders

84

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x000...000
Balance
0 BONKNFT
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

BONK is proof of art combined with decentralized staking protocols.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BonkNftMinter

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-28
*/

pragma solidity ^0.5.16;

/**
 * @dev Allow tokens to be transferred to contracts and have the contract trigger logic for how to respond to receiving the tokens within a single transaction.
 * https://github.com/ethereum/EIPs/issues/677
 */
interface Callable {
  function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  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 Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "SafeMath: addition overflow");

    return c;
  }

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

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   *
   * _Available since v2.4.0._
   */
  function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
  }

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

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   *
   * _Available since v2.4.0._
   */
  function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

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

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   *
   * _Available since v2.4.0._
   */
  function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
  using SafeMath for uint256;

  struct Counter {
    // This variable should never be directly accessed by users of the library: interactions must be restricted to
    // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
    // this feature: see https://github.com/ethereum/solidity/issues/4637
    uint256 _value; // default: 0
  }

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

  function increment(Counter storage counter) internal {
    // The {SafeMath} overflow check can be skipped here, see the comment at the top
    counter._value += 1;
  }

  function decrement(Counter storage counter) internal {
    counter._value = counter._value.sub(1);
  }
}

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
  // Empty internal constructor, to prevent people from mistakenly deploying
  // an instance of this contract, which should be used via inheritance.
  constructor () internal {}
  // solhint-disable-previous-line no-empty-blocks

  function _msgSender() internal view returns (address payable) {
    return msg.sender;
  }

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

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

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   * after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
   * otherwise the caller will revert the transaction. The selector to be
   * returned can be obtained as `this.onERC721Received.selector`. This
   * function MAY throw to revert and reject the transfer.
   * Note: the ERC721 contract address is always the message sender.
   * @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 bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
   */
  function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
  public returns (bytes4);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
  event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
  event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
  event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

  /**
   * @dev Returns the owner of the NFT specified by `tokenId`.
   */
  function ownerOf(uint256 tokenId) public view returns (address owner);

  /**
   * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
   * another (`to`).
   *
   *
   *
   * Requirements:
   * - `from`, `to` cannot be zero.
   * - `tokenId` must be owned by `from`.
   * - If the caller is not `from`, it must be have been allowed to move this
   * NFT by either {approve} or {setApprovalForAll}.
   */
  function safeTransferFrom(address from, address to, uint256 tokenId) public;
  /**
   * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
   * another (`to`).
   *
   * Requirements:
   * - If the caller is not `from`, it must be approved to move this NFT by
   * either {approve} or {setApprovalForAll}.
   */
  function transferFrom(address from, address to, uint256 tokenId) public;

  function approve(address to, uint256 tokenId) public;

  function getApproved(uint256 tokenId) public view returns (address operator);

  function setApprovalForAll(address operator, bool _approved) public;

  function isApprovedForAll(address owner, address operator) public view returns (bool);


  function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

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

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

  function tokenURI(uint256 tokenId) external view returns (string memory);
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
  function totalSupply() public view returns (uint256);

  function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

  function tokenByIndex(uint256 index) public view returns (uint256);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
  /**
   * @dev Returns true if `account` is a contract.
   *
   * [IMPORTANT]
   * ====
   * It is unsafe to assume that an address for which this function returns
   * false is an externally-owned account (EOA) and not a contract.
   *
   * Among others, `isContract` will return false for the following
   * types of addresses:
   *
   *  - an externally-owned account
   *  - a contract in construction
   *  - an address where a contract will be created
   *  - an address where a contract lived, but was destroyed
   * ====
   */
  function isContract(address account) internal view returns (bool) {
    // 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;
    // solhint-disable-next-line no-inline-assembly
    assembly {codehash := extcodehash(account)}
    return (codehash != accountHash && codehash != 0x0);
  }

  /**
   * @dev Converts an `address` into `address payable`. Note that this is
   * simply a type cast: the actual underlying value is not changed.
   *
   * _Available since v2.4.0._
   */
  function toPayable(address account) internal pure returns (address payable) {
    return address(uint160(account));
  }

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

    // solhint-disable-next-line avoid-call-value
    (bool success,) = recipient.call.value(amount)("");
    require(success, "Address: unable to send value, recipient may have reverted");
  }
}

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

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

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

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

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

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

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

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

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

  // Mapping from owner to number of owned token
  mapping(address => Counters.Counter) private _ownedTokensCount;

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

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

  constructor () public {
    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(_INTERFACE_ID_ERC721);
  }

  /**
   * @dev Gets the balance of the specified address.
   * @param owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address owner) public view returns (uint256) {
    require(owner != address(0), "ERC721: balance query for the zero address");

    return _ownedTokensCount[owner].current();
  }

  /**
   * @dev Gets the owner of the specified token ID.
   * @param tokenId uint256 ID of the token to query the owner of
   * @return address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 tokenId) public view returns (address) {
    address owner = _tokenOwner[tokenId];
    require(owner != address(0), "ERC721: owner query for nonexistent token");

    return owner;
  }

  /**
   * @dev Approves another address to transfer the given token ID
   * The zero address indicates there is no approved address.
   * There can only be one approved address per token at a given time.
   * Can only be called by the token owner or an approved operator.
   * @param to address to be approved for the given token ID
   * @param tokenId uint256 ID of the token to be approved
   */
  function approve(address to, uint256 tokenId) public {
    address owner = ownerOf(tokenId);
    require(to != owner, "ERC721: approval to current owner");

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

    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * Reverts if the token ID does not exist.
   * @param tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 tokenId) public view returns (address) {
    require(_exists(tokenId), "ERC721: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev Sets or unsets the approval of a given operator
   * An operator is allowed to transfer all tokens of the sender on their behalf.
   * @param to operator address to set the approval
   * @param approved representing the status of the approval to be set
   */
  function setApprovalForAll(address to, bool approved) public {
    require(to != _msgSender(), "ERC721: approve to caller");

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

  /**
   * @dev Tells whether an operator is approved by a given owner.
   * @param owner owner address which you want to query the approval of
   * @param operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(address owner, address operator) public view returns (bool) {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev Transfers the ownership of a given token ID to another address.
   * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
   * Requires the msg.sender to be the owner, approved, or operator.
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
   */
  function transferFrom(address from, address to, uint256 tokenId) public {
    //solhint-disable-next-line max-line-length
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

    _transferFrom(from, to, tokenId);
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the msg.sender to be the owner, approved, or operator
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
   */
  function safeTransferFrom(address from, address to, uint256 tokenId) public {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the _msgSender() to be the owner, approved, or operator
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
    _safeTransferFrom(from, to, tokenId, _data);
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the msg.sender to be the owner, approved, or operator
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) internal {
    _transferFrom(from, to, tokenId);
    require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
  }

  /**
   * @dev Returns whether the specified token exists.
   * @param tokenId uint256 ID of the token to query the existence of
   * @return bool whether the token exists
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    address owner = _tokenOwner[tokenId];
    return owner != address(0);
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID.
   * @param spender address of the spender to query
   * @param tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   * is an operator of the owner, or is the owner of the token
   */
  function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
    require(_exists(tokenId), "ERC721: operator query for nonexistent token");
    address owner = ownerOf(tokenId);
    return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
  }

  /**
   * @dev Internal function to safely mint a new token.
   * Reverts if the given token ID already exists.
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * @param to The address that will own the minted token
   * @param tokenId uint256 ID of the token to be minted
   */
  function _safeMint(address to, uint256 tokenId) internal {
    _safeMint(to, tokenId, "");
  }

  /**
   * @dev Internal function to safely mint a new token.
   * Reverts if the given token ID already exists.
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * @param to The address that will own the minted token
   * @param tokenId uint256 ID of the token to be minted
   * @param _data bytes data to send along with a safe transfer check
   */
  function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
    _mint(to, tokenId);
    require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
  }

  /**
   * @dev Internal function to mint a new token.
   * Reverts if the given token ID already exists.
   * @param to The address that will own the minted token
   * @param tokenId uint256 ID of the token to be minted
   */
  function _mint(address to, uint256 tokenId) internal {
    require(to != address(0), "ERC721: mint to the zero address");
    require(!_exists(tokenId), "ERC721: token already minted");

    _tokenOwner[tokenId] = to;
    _ownedTokensCount[to].increment();

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

  /**
   * @dev Internal function to burn a specific token.
   * Reverts if the token does not exist.
   * Deprecated, use {_burn} instead.
   * @param owner owner of the token to burn
   * @param tokenId uint256 ID of the token being burned
   */
  function _burn(address owner, uint256 tokenId) internal {
    require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

    _clearApproval(tokenId);

    _ownedTokensCount[owner].decrement();
    _tokenOwner[tokenId] = address(0);

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

  /**
   * @dev Internal function to burn a specific token.
   * Reverts if the token does not exist.
   * @param tokenId uint256 ID of the token being burned
   */
  function _burn(uint256 tokenId) internal {
    _burn(ownerOf(tokenId), tokenId);
  }

  /**
   * @dev Internal function to transfer ownership of a given token ID to another address.
   * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
   */
  function _transferFrom(address from, address to, uint256 tokenId) internal {
    require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
    require(to != address(0), "ERC721: transfer to the zero address");

    _clearApproval(tokenId);

    _ownedTokensCount[from].decrement();
    _ownedTokensCount[to].increment();

    _tokenOwner[tokenId] = to;

    emit Transfer(from, to, tokenId);
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * This is an internal detail of the `ERC721` contract and its use is deprecated.
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
  internal returns (bool)
  {
    if (!to.isContract()) {
      return true;
    }
    // solhint-disable-next-line avoid-low-level-calls
    (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector(
        IERC721Receiver(to).onERC721Received.selector,
        _msgSender(),
        from,
        tokenId,
        _data
      ));
    if (!success) {
      if (returndata.length > 0) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
          let returndata_size := mload(returndata)
          revert(add(32, returndata), returndata_size)
        }
      } else {
        revert("ERC721: transfer to non ERC721Receiver implementer");
      }
    } else {
      bytes4 retval = abi.decode(returndata, (bytes4));
      return (retval == _ERC721_RECEIVED);
    }
  }

  /**
   * @dev Private function to clear current approval of a given token ID.
   * @param tokenId uint256 ID of the token to be transferred
   */
  function _clearApproval(uint256 tokenId) private {
    if (_tokenApprovals[tokenId] != address(0)) {
      _tokenApprovals[tokenId] = address(0);
    }
  }
}

/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
  // Mapping from owner to list of owned token IDs
  mapping(address => uint256[]) private _ownedTokens;

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

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

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

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

  /**
   * @dev Constructor function.
   */
  constructor () public {
    // register the supported interface to conform to ERC721Enumerable via ERC165
    _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
  }

  /**
   * @dev Gets the token ID at a given index of the tokens list of the requested owner.
   * @param owner address owning the tokens list to be accessed
   * @param index uint256 representing the index to be accessed of the requested tokens list
   * @return uint256 token ID at the given index of the tokens list owned by the requested address
   */
  function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
    require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
    return _ownedTokens[owner][index];
  }

  /**
   * @dev Gets the total amount of tokens stored by the contract.
   * @return uint256 representing the total amount of tokens
   */
  function totalSupply() public view returns (uint256) {
    return _allTokens.length;
  }

  /**
   * @dev Gets the token ID at a given index of all the tokens in this contract
   * Reverts if the index is greater or equal to the total number of tokens.
   * @param index uint256 representing the index to be accessed of the tokens list
   * @return uint256 token ID at the given index of the tokens list
   */
  function tokenByIndex(uint256 index) public view returns (uint256) {
    require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
    return _allTokens[index];
  }

  /**
   * @dev Internal function to transfer ownership of a given token ID to another address.
   * As opposed to transferFrom, this imposes no restrictions on msg.sender.
   * @param from current owner of the token
   * @param to address to receive the ownership of the given token ID
   * @param tokenId uint256 ID of the token to be transferred
   */
  function _transferFrom(address from, address to, uint256 tokenId) internal {
    super._transferFrom(from, to, tokenId);

    _removeTokenFromOwnerEnumeration(from, tokenId);

    _addTokenToOwnerEnumeration(to, tokenId);
  }

  /**
   * @dev Internal function to mint a new token.
   * Reverts if the given token ID already exists.
   * @param to address the beneficiary that will own the minted token
   * @param tokenId uint256 ID of the token to be minted
   */
  function _mint(address to, uint256 tokenId) internal {
    super._mint(to, tokenId);

    _addTokenToOwnerEnumeration(to, tokenId);

    _addTokenToAllTokensEnumeration(tokenId);
  }

  /**
   * @dev Internal function to burn a specific token.
   * Reverts if the token does not exist.
   * Deprecated, use {ERC721-_burn} instead.
   * @param owner owner of the token to burn
   * @param tokenId uint256 ID of the token being burned
   */
  function _burn(address owner, uint256 tokenId) internal {
    super._burn(owner, tokenId);

    _removeTokenFromOwnerEnumeration(owner, tokenId);
    // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
    _ownedTokensIndex[tokenId] = 0;

    _removeTokenFromAllTokensEnumeration(tokenId);
  }

  /**
   * @dev Gets the list of token IDs of the requested owner.
   * @param owner address owning the tokens
   * @return uint256[] List of token IDs owned by the requested address
   */
  function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
    return _ownedTokens[owner];
  }

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

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

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

    uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
    uint256 tokenIndex = _ownedTokensIndex[tokenId];

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

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

    // This also deletes the contents at the last position of the array
    _ownedTokens[from].length--;

    // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
    // lastTokenId, or just over the end of the array if the token was the last one).
  }

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

    uint256 lastTokenIndex = _allTokens.length.sub(1);
    uint256 tokenIndex = _allTokensIndex[tokenId];

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

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

    // This also deletes the contents at the last position of the array
    _allTokens.length--;
    _allTokensIndex[tokenId] = 0;
  }
}

contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata {
  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Base URI
  string private _baseURI;

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

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

  /**
   * @dev Constructor function
   */
  constructor (string memory name, string memory symbol) public {
    _name = name;
    _symbol = symbol;

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

  /**
   * @dev Gets the token name.
   * @return string representing the token name
   */
  function name() external view returns (string memory) {
    return _name;
  }

  /**
   * @dev Gets the token symbol.
   * @return string representing the token symbol
   */
  function symbol() external view returns (string memory) {
    return _symbol;
  }

  /**
   * @dev Returns the URI for a given token ID. May return an empty string.
   *
   * If the token's URI is non-empty and a base URI was set (via
   * {_setBaseURI}), it will be added to the token ID's URI as a prefix.
   *
   * Reverts if the token ID does not exist.
   */
  function tokenURI(uint256 tokenId) external view returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

    string memory _tokenURI = _tokenURIs[tokenId];

    // Even if there is a base URI, it is only appended to non-empty token-specific URIs
    if (bytes(_tokenURI).length == 0) {
      return "";
    } else {
      // abi.encodePacked is being used to concatenate strings
      return string(abi.encodePacked(_baseURI, _tokenURI));
    }
  }

  /**
   * @dev Internal function to set the token URI for a given token.
   *
   * Reverts if the token ID does not exist.
   *
   * TIP: if all token IDs share a prefix (e.g. if your URIs look like
   * `http://api.myproject.com/token/<id>`), use {_setBaseURI} to store
   * it and save gas.
   */
  function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal {
    require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
    _tokenURIs[tokenId] = _tokenURI;
  }

  /**
   * @dev Internal function to set the base URI for all token IDs. It is
   * automatically added as a prefix to the value returned in {tokenURI}.
   *
   * _Available since v2.5.0._
   */
  function _setBaseURI(string memory baseURI) internal {
    _baseURI = baseURI;
  }

  /**
  * @dev Returns the base URI set via {_setBaseURI}. This will be
  * automatically added as a preffix in {tokenURI} to each token's URI, when
  * they are non-empty.
  *
  * _Available since v2.5.0._
  */
  function baseURI() external view returns (string memory) {
    return _baseURI;
  }

  /**
   * @dev Internal function to burn a specific token.
   * Reverts if the token does not exist.
   * Deprecated, use _burn(uint256) instead.
   * @param owner owner of the token to burn
   * @param tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address owner, uint256 tokenId) internal {
    super._burn(owner, tokenId);

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
  address private _owner;

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

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor () internal {
    address msgSender = _msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(isOwner(), "Ownable: caller is not the owner");
    _;
  }

  /**
   * @dev Returns true if the caller is the current owner.
   */
  function isOwner() public view returns (bool) {
    return _msgSender() == _owner;
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipTransferred(_owner, address(0));
    _owner = address(0);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    _transferOwnership(newOwner);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   */
  function _transferOwnership(address newOwner) internal {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

/**
 * @title Full ERC721 Token
 * @dev This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology.
 *
 * See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
  constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
    // solhint-disable-previous-line no-empty-blocks
  }
}

contract BonkNftMinter is ERC721Full, Ownable, Callable {

  using SafeMath for uint256;

  // Mapping from token ID to the creator's address.
  mapping(uint256 => address) private tokenCreators;

  // Counter for creating token IDs
  uint256 private idCounter;

  // BONK ERC20 token
  IERC20 public bonkToken;

  // Where to send collected fees
  address public feeCollector;

  // BONK fee amount with decimals, for example, 1*10**18 means one BONK
  uint256 public bonkFee;

  // Event indicating metadata was updated.
  event TokenURIUpdated(uint256 indexed _tokenId, string _uri);

  // Event indicating bonk fee was updated.
  event BonkFeeUpdated(uint256 _newFee, uint _timestamp);

  constructor(
    string memory _name,
    string memory _symbol,
    address _bonkToken,
    address _feeCollector,
    uint256 _bonkFee
  )
  public
  ERC721Full(_name, _symbol)
  {
    bonkToken = IERC20(_bonkToken);
    feeCollector = _feeCollector;
    bonkFee = _bonkFee;
  }

  /**
   * @dev Checks that the token is owned by the sender.
   * @param _tokenId uint256 ID of the token.
   */
  modifier onlyTokenOwner(uint256 _tokenId) {
    address owner = ownerOf(_tokenId);
    require(owner == msg.sender, "must be the owner of the token");
    _;
  }

  /**
  * @dev Checks that the caller is BONK token.
  */
  modifier onlyBonkToken() {
    require(msg.sender == address(bonkToken), "must be BONK token");
    _;
  }

  /**
   * @dev callback function that is called by BONK token. Adds new NFT token. Trusted.
   * @param _from who sent the tokens.
   * @param _tokens how many tokens were sent.
   * @param _data extra call data.
   * @return success.
   */
  function tokenCallback(address _from, uint256 _tokens, bytes calldata _data)
  external
  onlyBonkToken
  returns (bool) {
    if (bonkFee > 0) {
      uint256 tokensWithTransferFee = _tokens * 100 / 99; // there is 1% fee upon some transfers of BONK
      require(tokensWithTransferFee >= bonkFee, "not enough tokens");
      _forwardBonkTokens();
    }
    _createToken(string(_data), _from);
    return true;
  }

  /**
   * @dev Adds a new unique token to the supply.
   * @param _uri string metadata uri associated with the token.
   */
  function addNewToken(string calldata _uri) external {
    if (bonkFee > 0) {
      require(bonkToken.transferFrom(msg.sender, address(this), bonkFee), "fee transferFrom failed");
      _forwardBonkTokens();
    }
    _createToken(_uri, msg.sender);
  }

  /**
   * @dev Deletes the token with the provided ID.
   * @param _tokenId uint256 ID of the token.
   */
  function deleteToken(uint256 _tokenId) external onlyTokenOwner(_tokenId) {
    _burn(msg.sender, _tokenId);
  }

  /**
   * @dev Allows owner of the contract updating the token metadata in case there is a need.
   * @param _tokenId uint256 ID of the token.
   * @param _uri string metadata URI.
   */
  function updateTokenMetadata(uint256 _tokenId, string calldata _uri) external onlyOwner {
    _setTokenURI(_tokenId, _uri);
    emit TokenURIUpdated(_tokenId, _uri);
  }

  /**
   * @dev change address of BONK token
   * @param _bonkToken address of ERC20 contract
   */
  function setBonkToken(address _bonkToken) external onlyOwner {
    bonkToken = IERC20(_bonkToken);
  }

  /**
   * @dev change address of where collected fees are sent
   * @param _feeCollector address where to send the fees
   */
  function setFeeCollector(address _feeCollector) external onlyOwner {
    feeCollector = _feeCollector;
  }

  /**
   * @dev change BONK fee
   * @param _bonkFee new fee in BONK (with decimals)
   */
  function setBonkFee(uint _bonkFee) external onlyOwner {
    bonkFee = _bonkFee;
    emit BonkFeeUpdated(_bonkFee, now);
  }

  /**
   * @dev allows withdrawal of ETH in case it was sent by accident
   * @param _beneficiary address where to send the eth.
   */
  function withdrawEth(address payable _beneficiary) external onlyOwner {
    _beneficiary.transfer(address(this).balance);
  }

  /**
   * @dev allows withdrawal of ERC20 token in case it was sent by accident
   * @param _tokenAddress address of ERC20 token.
   * @param _beneficiary address where to send the tokens.
   * @param _amount amount to send.
   */
  function withdrawERC20(address _tokenAddress, address _beneficiary, uint _amount) external onlyOwner {
    IERC20(_tokenAddress).transfer(_beneficiary, _amount);
  }

  /**
  * @dev Gets the current fee in BONK.
  * @return BONK fee.
  */
  function getBonkFee() public view returns (uint256) {
    return bonkFee;
  }

  /**
  * @dev Gets the creator of the token.
  * @param _tokenId uint256 ID of the token.
  * @return address of the creator.
  */
  function tokenCreator(uint256 _tokenId) public view returns (address) {
    return tokenCreators[_tokenId];
  }

  /**
   * @dev Internal function for setting the token's creator.
   * @param _tokenId uint256 id of the token.
   * @param _creator address of the creator of the token.
   */
  function _setTokenCreator(uint256 _tokenId, address _creator) internal {
    tokenCreators[_tokenId] = _creator;
  }

  /**
   * @dev Internal function creating a new token.
   * @param _uri string metadata uri associated with the token
   * @param _creator address of the creator of the token.
   */
  function _createToken(string memory _uri, address _creator) internal returns (uint256) {
    uint256 newId = idCounter;
    idCounter++;
    _mint(_creator, newId);
    _setTokenURI(newId, _uri);
    _setTokenCreator(newId, _creator);
    return newId;
  }

  /**
   * @dev Internal function for forwarding collected fees to the fee collector.
   */
  function _forwardBonkTokens() internal {
    uint balance = IERC20(bonkToken).balanceOf(address(this));
    require(IERC20(bonkToken).transfer(feeCollector, balance), "fee transfer failed");
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_bonkToken","type":"address"},{"internalType":"address","name":"_feeCollector","type":"address"},{"internalType":"uint256","name":"_bonkFee","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"BonkFeeUpdated","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":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_uri","type":"string"}],"name":"TokenURIUpdated","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"},{"constant":false,"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"addNewToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonkFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonkToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deleteToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBonkFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_bonkFee","type":"uint256"}],"name":"setBonkFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_bonkToken","type":"address"}],"name":"setBonkToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_feeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"tokenCallback","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateTokenMetadata","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"withdrawEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620048c2380380620048c2833981810160405260a08110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b838201915060208201858111156200006f57600080fd5b82518660018202830111640100000000821117156200008d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620000c3578082015181840152602081019050620000a6565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b838201915060208201858111156200012c57600080fd5b82518660018202830111640100000000821117156200014a57600080fd5b8083526020830192505050908051906020019080838360005b838110156200018057808201518184015260208101905062000163565b50505050905090810190601f168015620001ae5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291908051906020019092919050505084848181620001f26301ffc9a760e01b620003b560201b60201c565b6200020a6380ac58cd60e01b620003b560201b60201c565b6200022263780e9d6360e01b620003b560201b60201c565b81600990805190602001906200023a929190620004c6565b5080600a908051906020019062000253929190620004c6565b506200026c635b5e139f60e01b620003b560201b60201c565b50505050600062000282620004be60201b60201c565b905080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601281905550505050505062000575565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200050957805160ff19168380011785556200053a565b828001600101855582156200053a579182015b82811115620005395782518255916020019190600101906200051c565b5b5090506200054991906200054d565b5090565b6200057291905b808211156200056e57600081600090555060010162000554565b5090565b90565b61433d80620005856000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80636352211e1161012557806395d89b41116100ad578063c415b95c1161007c578063c415b95c14610cb7578063c87b56dd14610d01578063d9856c2114610da8578063e985e9c514610e21578063f2fde38b14610e9d57610211565b806395d89b4114610a9b578063a22cb46514610b1e578063a42dce8014610b6e578063b88d4fde14610bb257610211565b806370a08231116100f457806370a08231146109af578063715018a614610a0757806377d220c614610a115780638da5cb5b14610a2f5780638f32d59b14610a7957610211565b80636352211e146107b95780636be32e73146108275780636c0360eb146108e25780636f4b778e1461096557610211565b80632f745c59116101a857806344004cc11161017757806344004cc11461066957806344d233a6146106d75780634f6ccce71461071b578063526101911461075d5780636297c16c1461078b57610211565b80632f745c591461050d57806330b3baab1461056f57806340c1a0641461058d57806342842e0e146105fb57610211565b806318160ddd116101e457806318160ddd146103ba57806323b872dd146103d857806325e16063146104465780632cb2f52e1461048a57610211565b806301ffc9a71461021657806306fdde031461027b578063081812fc146102fe578063095ea7b31461036c575b600080fd5b6102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610ee1565b604051808215151515815260200191505060405180910390f35b610283610f48565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61032a6004803603602081101561031457600080fd5b8101908080359060200190929190505050610fea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103b86004803603604081101561038257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611085565b005b6103c261126c565b6040518082815260200191505060405180910390f35b610444600480360360608110156103ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611279565b005b6104886004803603602081101561045c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ef565b005b61050b600480360360408110156104a057600080fd5b8101908080359060200190929190803590602001906401000000008111156104c757600080fd5b8201836020820111156104d957600080fd5b803590602001918460018302840111640100000000831117156104fb57600080fd5b90919293919293905050506113b3565b005b6105596004803603604081101561052357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b6040518082815260200191505060405180910390f35b6105776115a3565b6040518082815260200191505060405180910390f35b6105b9600480360360208110156105a357600080fd5b81019080803590602001909291905050506115ad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106676004803603606081101561061157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115ea565b005b6106d56004803603606081101561067f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061160a565b005b610719600480360360208110156106ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061174c565b005b6107476004803603602081101561073157600080fd5b810190808035906020019092919050505061180a565b6040518082815260200191505060405180910390f35b6107896004803603602081101561077357600080fd5b810190808035906020019092919050505061188a565b005b6107b7600480360360208110156107a157600080fd5b810190808035906020019092919050505061194d565b005b6107e5600480360360208110156107cf57600080fd5b8101908080359060200190929190505050611a0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108c86004803603606081101561083d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561088457600080fd5b82018360208201111561089657600080fd5b803590602001918460018302840111640100000000831117156108b857600080fd5b9091929391929390505050611ad3565b604051808215151515815260200191505060405180910390f35b6108ea611c92565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561092a57808201518184015260208101905061090f565b50505050905090810190601f1680156109575780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61096d611d34565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f1600480360360208110156109c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d5a565b6040518082815260200191505060405180910390f35b610a0f611e2f565b005b610a19611f6a565b6040518082815260200191505060405180910390f35b610a37611f70565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a81611f9a565b604051808215151515815260200191505060405180910390f35b610aa3611ff9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae3578082015181840152602081019050610ac8565b50505050905090810190601f168015610b105780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b6c60048036036040811015610b3457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061209b565b005b610bb060048036036020811015610b8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612253565b005b610cb560048036036080811015610bc857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c2f57600080fd5b820183602082011115610c4157600080fd5b80359060200191846001830284011164010000000083111715610c6357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612311565b005b610cbf612389565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d2d60048036036020811015610d1757600080fd5b81019080803590602001909291905050506123af565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d6d578082015181840152602081019050610d52565b50505050905090810190601f168015610d9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610e1f60048036036020811015610dbe57600080fd5b8101908080359060200190640100000000811115610ddb57600080fd5b820183602082011115610ded57600080fd5b80359060200191846001830284011164010000000083111715610e0f57600080fd5b90919293919293905050506125b1565b005b610e8360048036036040811015610e3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127a4565b604051808215151515815260200191505060405180910390f35b610edf60048036036020811015610eb357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612838565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fe05780601f10610fb557610100808354040283529160200191610fe0565b820191906000526020600020905b815481529060010190602001808311610fc357829003601f168201915b5050505050905090565b6000610ff5826128be565b61104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806141b6602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061109082611a0b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142666021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611136612930565b73ffffffffffffffffffffffffffffffffffffffff16148061116557506111648161115f612930565b6127a4565b5b6111ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061412b6038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600780549050905090565b61128a611284612930565b82612938565b6112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806142876031913960400191505060405180910390fd5b6112ea838383612a2c565b505050565b6112f7611f9a565b611369576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113af573d6000803e3d6000fd5b5050565b6113bb611f9a565b61142d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61147b8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a50565b827f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd838360405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a2505050565b60006114ef83611d5a565b8210611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614058602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061159057fe5b9060005260206000200154905092915050565b6000601254905090565b6000600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61160583838360405180602001604052806000815250612311565b505050565b611612611f9a565b611684576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561170b57600080fd5b505af115801561171f573d6000803e3d6000fd5b505050506040513d602081101561173557600080fd5b810190808051906020019092919050505050505050565b611754611f9a565b6117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061181461126c565b821061186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142b8602c913960400191505060405180910390fd5b6007828154811061187857fe5b90600052602060002001549050919050565b611892611f9a565b611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806012819055507fb375f59efc92e69e3aca7685665f806cd91c6ceec465a1ddd9a94191a2c32a2e8142604051808381526020018281526020019250505060405180910390a150565b80600061195982611a0b565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6d75737420626520746865206f776e6572206f662074686520746f6b656e000081525060200191505060405180910390fd5b611a063384612ada565b505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061418d6029913960400191505060405180910390fd5b80915050919050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6d75737420626520424f4e4b20746f6b656e000000000000000000000000000081525060200191505060405180910390fd5b60006012541115611c3757600060636064860281611bb257fe5b049050601254811015611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f6e6f7420656e6f75676820746f6b656e7300000000000000000000000000000081525060200191505060405180910390fd5b611c35612b37565b505b611c8583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086612d90565b5060019050949350505050565b6060600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d2a5780601f10611cff57610100808354040283529160200191611d2a565b820191906000526020600020905b815481529060010190602001808311611d0d57829003601f168201915b5050505050905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614163602a913960400191505060405180910390fd5b611e28600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dd2565b9050919050565b611e37611f9a565b611ea9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60125481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fdd612930565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120915780601f1061206657610100808354040283529160200191612091565b820191906000526020600020905b81548152906001019060200180831161207457829003601f168201915b5050505050905090565b6120a3612930565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612144576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060046000612151612930565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121fe612930565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b61225b611f9a565b6122cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61232261231c612930565b83612938565b612377576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806142876031913960400191505060405180910390fd5b61238384848484612de0565b50505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606123ba826128be565b61240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614237602f913960400191505060405180910390fd5b6060600c60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124b85780601f1061248d576101008083540402835291602001916124b8565b820191906000526020600020905b81548152906001019060200180831161249b57829003601f168201915b505050505090506000815114156124e157604051806020016040528060008152509150506125ac565b600b8160405160200180838054600181600116156101000203166002900480156125425780601f10612520576101008083540402835291820191612542565b820191906000526020600020905b81548152906001019060200180831161252e575b505082805190602001908083835b602083106125735780518252602082019150602081019050602083039250612550565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529150505b919050565b6000601254111561275157601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306012546040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561269b57600080fd5b505af11580156126af573d6000803e3d6000fd5b505050506040513d60208110156126c557600080fd5b8101908080519060200190929190505050612748576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f666565207472616e7366657246726f6d206661696c656400000000000000000081525060200191505060405180910390fd5b612750612b37565b5b61279f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505033612d90565b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612840611f9a565b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6128bb81612e52565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b6000612943826128be565b612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806140ff602c913960400191505060405180910390fd5b60006129a383611a0b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a1257508373ffffffffffffffffffffffffffffffffffffffff166129fa84610fea565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a235750612a2281856127a4565b5b91505092915050565b612a37838383612f98565b612a4183826131f3565b612a4b8282613391565b505050565b612a59826128be565b612aae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806141e2602c913960400191505060405180910390fd5b80600c60008481526020019081526020016000209080519060200190612ad5929190613f3e565b505050565b612ae48282613458565b6000600c600083815260200190815260200160002080546001816001161561010002031660029004905014612b3357600c60008281526020019081526020016000206000612b329190613fbe565b5b5050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d6020811015612c0257600080fd5b81019080805190602001909291905050509050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ce057600080fd5b505af1158015612cf4573d6000803e3d6000fd5b505050506040513d6020811015612d0a57600080fd5b8101908080519060200190929190505050612d8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f666565207472616e73666572206661696c65640000000000000000000000000081525060200191505060405180910390fd5b50565b600080600f549050600f60008154809291906001019190505550612db48382613492565b612dbe8185612a50565b612dc881846134b3565b8091505092915050565b600081600001549050919050565b612deb848484612a2c565b612df784848484613509565b612e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140836032913960400191505060405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ed8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140b56026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16612fb882611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614613024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061420e6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140db6024913960400191505060405180910390fd5b6130b381613845565b6130fa600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613903565b613141600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613926565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061324b6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061393c90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114613338576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106132b857fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061331057fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361338a9190614006565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6134628282613986565b61346c82826131f3565b6000600660008381526020019081526020016000208190555061348e81613b15565b5050565b61349c8282613bcf565b6134a68282613391565b6134af81613de7565b5050565b80600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600061352a8473ffffffffffffffffffffffffffffffffffffffff16613e33565b613537576001905061383d565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b61357b612930565b898888604051602401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561362b578082015181840152602081019050613610565b50505050905090810190601f1680156136585780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106136f057805182526020820191506020810190506020830392506136cd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613752576040519150601f19603f3d011682016040523d82523d6000602084013e613757565b606091505b5091509150816137c5576000815111156137745780518082602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140836032913960400191505060405180910390fd5b60008180602001905160208110156137dc57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139005760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b61391b6001826000015461393c90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600061397e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e7e565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff166139a682611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614613a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142e46025913960400191505060405180910390fd5b613a1b81613845565b613a62600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613903565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613b30600160078054905061393c90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110613b5957fe5b906000526020600020015490508060078381548110613b7457fe5b90600052602060002001819055508160086000838152602001908152602001600020819055506007805480919060019003613baf9190614006565b506000600860008681526020019081526020016000208190555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613c7b816128be565b15613cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613d87600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613926565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613e7557506000801b8214155b92505050919050565b6000838311158290613f2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef0578082015181840152602081019050613ed5565b50505050905090810190601f168015613f1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f7f57805160ff1916838001178555613fad565b82800160010185558215613fad579182015b82811115613fac578251825591602001919060010190613f91565b5b509050613fba9190614032565b5090565b50805460018160011615610100020316600290046000825580601f10613fe45750614003565b601f0160209004906000526020600020908101906140029190614032565b5b50565b81548183558181111561402d5781836000526020600020918201910161402c9190614032565b5b505050565b61405491905b80821115614050576000816000905550600101614038565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e64734552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776ea265627a7a72315820168be1331c570ee7509ace5bef2d911439de5b4083444f4e6e734b7c4cb60e2d64736f6c6343000510003200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006d6506e6f438ede269877a0a720026559110b7d50000000000000000000000004cb22371f39f7333a59d20cca6a92b29dd7dc2980000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000b424f4e4b204d696e7465720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007424f4e4b4e465400000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c80636352211e1161012557806395d89b41116100ad578063c415b95c1161007c578063c415b95c14610cb7578063c87b56dd14610d01578063d9856c2114610da8578063e985e9c514610e21578063f2fde38b14610e9d57610211565b806395d89b4114610a9b578063a22cb46514610b1e578063a42dce8014610b6e578063b88d4fde14610bb257610211565b806370a08231116100f457806370a08231146109af578063715018a614610a0757806377d220c614610a115780638da5cb5b14610a2f5780638f32d59b14610a7957610211565b80636352211e146107b95780636be32e73146108275780636c0360eb146108e25780636f4b778e1461096557610211565b80632f745c59116101a857806344004cc11161017757806344004cc11461066957806344d233a6146106d75780634f6ccce71461071b578063526101911461075d5780636297c16c1461078b57610211565b80632f745c591461050d57806330b3baab1461056f57806340c1a0641461058d57806342842e0e146105fb57610211565b806318160ddd116101e457806318160ddd146103ba57806323b872dd146103d857806325e16063146104465780632cb2f52e1461048a57610211565b806301ffc9a71461021657806306fdde031461027b578063081812fc146102fe578063095ea7b31461036c575b600080fd5b6102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610ee1565b604051808215151515815260200191505060405180910390f35b610283610f48565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61032a6004803603602081101561031457600080fd5b8101908080359060200190929190505050610fea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103b86004803603604081101561038257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611085565b005b6103c261126c565b6040518082815260200191505060405180910390f35b610444600480360360608110156103ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611279565b005b6104886004803603602081101561045c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ef565b005b61050b600480360360408110156104a057600080fd5b8101908080359060200190929190803590602001906401000000008111156104c757600080fd5b8201836020820111156104d957600080fd5b803590602001918460018302840111640100000000831117156104fb57600080fd5b90919293919293905050506113b3565b005b6105596004803603604081101561052357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b6040518082815260200191505060405180910390f35b6105776115a3565b6040518082815260200191505060405180910390f35b6105b9600480360360208110156105a357600080fd5b81019080803590602001909291905050506115ad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106676004803603606081101561061157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115ea565b005b6106d56004803603606081101561067f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061160a565b005b610719600480360360208110156106ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061174c565b005b6107476004803603602081101561073157600080fd5b810190808035906020019092919050505061180a565b6040518082815260200191505060405180910390f35b6107896004803603602081101561077357600080fd5b810190808035906020019092919050505061188a565b005b6107b7600480360360208110156107a157600080fd5b810190808035906020019092919050505061194d565b005b6107e5600480360360208110156107cf57600080fd5b8101908080359060200190929190505050611a0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108c86004803603606081101561083d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561088457600080fd5b82018360208201111561089657600080fd5b803590602001918460018302840111640100000000831117156108b857600080fd5b9091929391929390505050611ad3565b604051808215151515815260200191505060405180910390f35b6108ea611c92565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561092a57808201518184015260208101905061090f565b50505050905090810190601f1680156109575780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61096d611d34565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f1600480360360208110156109c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d5a565b6040518082815260200191505060405180910390f35b610a0f611e2f565b005b610a19611f6a565b6040518082815260200191505060405180910390f35b610a37611f70565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a81611f9a565b604051808215151515815260200191505060405180910390f35b610aa3611ff9565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae3578082015181840152602081019050610ac8565b50505050905090810190601f168015610b105780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b6c60048036036040811015610b3457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061209b565b005b610bb060048036036020811015610b8457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612253565b005b610cb560048036036080811015610bc857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c2f57600080fd5b820183602082011115610c4157600080fd5b80359060200191846001830284011164010000000083111715610c6357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612311565b005b610cbf612389565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610d2d60048036036020811015610d1757600080fd5b81019080803590602001909291905050506123af565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d6d578082015181840152602081019050610d52565b50505050905090810190601f168015610d9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610e1f60048036036020811015610dbe57600080fd5b8101908080359060200190640100000000811115610ddb57600080fd5b820183602082011115610ded57600080fd5b80359060200191846001830284011164010000000083111715610e0f57600080fd5b90919293919293905050506125b1565b005b610e8360048036036040811015610e3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127a4565b604051808215151515815260200191505060405180910390f35b610edf60048036036020811015610eb357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612838565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fe05780601f10610fb557610100808354040283529160200191610fe0565b820191906000526020600020905b815481529060010190602001808311610fc357829003601f168201915b5050505050905090565b6000610ff5826128be565b61104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806141b6602c913960400191505060405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061109082611a0b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806142666021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611136612930565b73ffffffffffffffffffffffffffffffffffffffff16148061116557506111648161115f612930565b6127a4565b5b6111ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061412b6038913960400191505060405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600780549050905090565b61128a611284612930565b82612938565b6112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806142876031913960400191505060405180910390fd5b6112ea838383612a2c565b505050565b6112f7611f9a565b611369576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113af573d6000803e3d6000fd5b5050565b6113bb611f9a565b61142d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61147b8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a50565b827f931f495b9a8e5d8e61946ea5d61e021f636cfe213a801f97589c18c152e408bd838360405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a2505050565b60006114ef83611d5a565b8210611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614058602b913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061159057fe5b9060005260206000200154905092915050565b6000601254905090565b6000600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61160583838360405180602001604052806000815250612311565b505050565b611612611f9a565b611684576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561170b57600080fd5b505af115801561171f573d6000803e3d6000fd5b505050506040513d602081101561173557600080fd5b810190808051906020019092919050505050505050565b611754611f9a565b6117c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061181461126c565b821061186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806142b8602c913960400191505060405180910390fd5b6007828154811061187857fe5b90600052602060002001549050919050565b611892611f9a565b611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806012819055507fb375f59efc92e69e3aca7685665f806cd91c6ceec465a1ddd9a94191a2c32a2e8142604051808381526020018281526020019250505060405180910390a150565b80600061195982611a0b565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146119fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6d75737420626520746865206f776e6572206f662074686520746f6b656e000081525060200191505060405180910390fd5b611a063384612ada565b505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061418d6029913960400191505060405180910390fd5b80915050919050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6d75737420626520424f4e4b20746f6b656e000000000000000000000000000081525060200191505060405180910390fd5b60006012541115611c3757600060636064860281611bb257fe5b049050601254811015611c2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f6e6f7420656e6f75676820746f6b656e7300000000000000000000000000000081525060200191505060405180910390fd5b611c35612b37565b505b611c8583838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086612d90565b5060019050949350505050565b6060600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d2a5780601f10611cff57610100808354040283529160200191611d2a565b820191906000526020600020905b815481529060010190602001808311611d0d57829003601f168201915b5050505050905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614163602a913960400191505060405180910390fd5b611e28600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612dd2565b9050919050565b611e37611f9a565b611ea9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60125481565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fdd612930565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120915780601f1061206657610100808354040283529160200191612091565b820191906000526020600020905b81548152906001019060200180831161207457829003601f168201915b5050505050905090565b6120a3612930565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612144576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060046000612151612930565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166121fe612930565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b61225b611f9a565b6122cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61232261231c612930565b83612938565b612377576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806142876031913960400191505060405180910390fd5b61238384848484612de0565b50505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606123ba826128be565b61240f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614237602f913960400191505060405180910390fd5b6060600c60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124b85780601f1061248d576101008083540402835291602001916124b8565b820191906000526020600020905b81548152906001019060200180831161249b57829003601f168201915b505050505090506000815114156124e157604051806020016040528060008152509150506125ac565b600b8160405160200180838054600181600116156101000203166002900480156125425780601f10612520576101008083540402835291820191612542565b820191906000526020600020905b81548152906001019060200180831161252e575b505082805190602001908083835b602083106125735780518252602082019150602081019050602083039250612550565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529150505b919050565b6000601254111561275157601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306012546040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561269b57600080fd5b505af11580156126af573d6000803e3d6000fd5b505050506040513d60208110156126c557600080fd5b8101908080519060200190929190505050612748576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f666565207472616e7366657246726f6d206661696c656400000000000000000081525060200191505060405180910390fd5b612750612b37565b5b61279f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505033612d90565b505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612840611f9a565b6128b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6128bb81612e52565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b6000612943826128be565b612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806140ff602c913960400191505060405180910390fd5b60006129a383611a0b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a1257508373ffffffffffffffffffffffffffffffffffffffff166129fa84610fea565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a235750612a2281856127a4565b5b91505092915050565b612a37838383612f98565b612a4183826131f3565b612a4b8282613391565b505050565b612a59826128be565b612aae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806141e2602c913960400191505060405180910390fd5b80600c60008481526020019081526020016000209080519060200190612ad5929190613f3e565b505050565b612ae48282613458565b6000600c600083815260200190815260200160002080546001816001161561010002031660029004905014612b3357600c60008281526020019081526020016000206000612b329190613fbe565b5b5050565b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bd857600080fd5b505afa158015612bec573d6000803e3d6000fd5b505050506040513d6020811015612c0257600080fd5b81019080805190602001909291905050509050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ce057600080fd5b505af1158015612cf4573d6000803e3d6000fd5b505050506040513d6020811015612d0a57600080fd5b8101908080519060200190929190505050612d8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f666565207472616e73666572206661696c65640000000000000000000000000081525060200191505060405180910390fd5b50565b600080600f549050600f60008154809291906001019190505550612db48382613492565b612dbe8185612a50565b612dc881846134b3565b8091505092915050565b600081600001549050919050565b612deb848484612a2c565b612df784848484613509565b612e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140836032913960400191505060405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612ed8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140b56026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16612fb882611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614613024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061420e6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806140db6024913960400191505060405180910390fd5b6130b381613845565b6130fa600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613903565b613141600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613926565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061324b6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061393c90919063ffffffff16565b9050600060066000848152602001908152602001600020549050818114613338576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106132b857fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061331057fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361338a9190614006565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6134628282613986565b61346c82826131f3565b6000600660008381526020019081526020016000208190555061348e81613b15565b5050565b61349c8282613bcf565b6134a68282613391565b6134af81613de7565b5050565b80600e600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600061352a8473ffffffffffffffffffffffffffffffffffffffff16613e33565b613537576001905061383d565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b61357b612930565b898888604051602401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561362b578082015181840152602081019050613610565b50505050905090810190601f1680156136585780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106136f057805182526020820191506020810190506020830392506136cd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613752576040519150601f19603f3d011682016040523d82523d6000602084013e613757565b606091505b5091509150816137c5576000815111156137745780518082602001fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806140836032913960400191505060405180910390fd5b60008180602001905160208110156137dc57600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139005760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b61391b6001826000015461393c90919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600061397e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613e7e565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff166139a682611a0b565b73ffffffffffffffffffffffffffffffffffffffff1614613a12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142e46025913960400191505060405180910390fd5b613a1b81613845565b613a62600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613903565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613b30600160078054905061393c90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110613b5957fe5b906000526020600020015490508060078381548110613b7457fe5b90600052602060002001819055508160086000838152602001908152602001600020819055506007805480919060019003613baf9190614006565b506000600860008681526020019081526020016000208190555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b613c7b816128be565b15613cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613d87600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613926565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015613e7557506000801b8214155b92505050919050565b6000838311158290613f2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef0578082015181840152602081019050613ed5565b50505050905090810190601f168015613f1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613f7f57805160ff1916838001178555613fad565b82800160010185558215613fad579182015b82811115613fac578251825591602001919060010190613f91565b5b509050613fba9190614032565b5090565b50805460018160011615610100020316600290046000825580601f10613fe45750614003565b601f0160209004906000526020600020908101906140029190614032565b5b50565b81548183558181111561402d5781836000526020600020918201910161402c9190614032565b5b505050565b61405491905b80821115614050576000816000905550600101614038565b5090565b9056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e64734552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776ea265627a7a72315820168be1331c570ee7509ace5bef2d911439de5b4083444f4e6e734b7c4cb60e2d64736f6c63430005100032

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006d6506e6f438ede269877a0a720026559110b7d50000000000000000000000004cb22371f39f7333a59d20cca6a92b29dd7dc2980000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000b424f4e4b204d696e7465720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007424f4e4b4e465400000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): BONK Minter
Arg [1] : _symbol (string): BONKNFT
Arg [2] : _bonkToken (address): 0x6D6506E6F438edE269877a0A720026559110B7d5
Arg [3] : _feeCollector (address): 0x4CB22371F39f7333A59D20cCa6a92B29DD7dc298
Arg [4] : _bonkFee (uint256): 1000000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000006d6506e6f438ede269877a0a720026559110b7d5
Arg [3] : 0000000000000000000000004cb22371f39f7333a59d20cca6a92b29dd7dc298
Arg [4] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [6] : 424f4e4b204d696e746572000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [8] : 424f4e4b4e465400000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

49142:6002:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49142:6002:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18487:129;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18487:129:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43639:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43639:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23121:194;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23121:194:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22449:393;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22449:393:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36193:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24728:278;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24728:278:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53125:127;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53125:127:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;52122:172;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52122:172:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;52122:172:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;52122:172:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;52122:172:0;;;;;;;;;;;;:::i;:::-;;35822:222;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35822:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53745:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53967:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53967:113:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25644:128;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25644:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53496:167;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53496:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52404:104;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52404:104:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36615:189;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36615:189:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52854:126;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52854:126:0;;;;;;;;;;;;;;;;;:::i;:::-;;51810:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51810:113:0;;;;;;;;;;;;;;;;;:::i;:::-;;21822:214;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21822:214:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;50873:426;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50873:426:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;50873:426:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50873:426:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;50873:426:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45742:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;45742:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49440:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21407:201;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21407:201:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47937:130;;;:::i;:::-;;49613:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47180:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;47514:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;43823:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43823:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23602:240;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23602:240:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52645:108;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52645:108:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;26483:262;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;26483:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;26483:262:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26483:262:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;26483:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;26483:262:0;;;;;;;;;;;;;;;:::i;:::-;;49505:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;44201:513;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44201:513:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;44201:513:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51434:258;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51434:258:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;51434:258:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51434:258:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51434:258:0;;;;;;;;;;;;:::i;:::-;;24158:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24158:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;48212:103;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48212:103:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;18487:129;18557:4;18577:20;:33;18598:11;18577:33;;;;;;;;;;;;;;;;;;;;;;;;;;;18570:40;;18487:129;;;:::o;43639:79::-;43678:13;43707:5;43700:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43639:79;:::o;23121:194::-;23180:7;23204:16;23212:7;23204;:16::i;:::-;23196:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23285:15;:24;23301:7;23285:24;;;;;;;;;;;;;;;;;;;;;23278:31;;23121:194;;;:::o;22449:393::-;22509:13;22525:16;22533:7;22525;:16::i;:::-;22509:32;;22562:5;22556:11;;:2;:11;;;;22548:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22638:5;22622:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22647:37;22664:5;22671:12;:10;:12::i;:::-;22647:16;:37::i;:::-;22622:62;22614:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22794:2;22767:15;:24;22783:7;22767:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22828:7;22824:2;22808:28;;22817:5;22808:28;;;;;;;;;;;;22449:393;;;:::o;36193:90::-;36237:7;36260:10;:17;;;;36253:24;;36193:90;:::o;24728:278::-;24864:41;24883:12;:10;:12::i;:::-;24897:7;24864:18;:41::i;:::-;24856:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24968:32;24982:4;24988:2;24992:7;24968:13;:32::i;:::-;24728:278;;;:::o;53125:127::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53202:12;:21;;:44;53224:21;53202:44;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53202:44:0;53125:127;:::o;52122:172::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52217:28;52230:8;52240:4;;52217:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;52217:28:0;;;;;;:12;:28::i;:::-;52273:8;52257:31;52283:4;;52257:31;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;52257:31:0;;;;;;;;;;;;;;52122:172;;;:::o;35822:222::-;35902:7;35934:16;35944:5;35934:9;:16::i;:::-;35926:5;:24;35918:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36012:12;:19;36025:5;36012:19;;;;;;;;;;;;;;;36032:5;36012:26;;;;;;;;;;;;;;;;36005:33;;35822:222;;;;:::o;53745:79::-;53788:7;53811;;53804:14;;53745:79;:::o;53967:113::-;54028:7;54051:13;:23;54065:8;54051:23;;;;;;;;;;;;;;;;;;;;;54044:30;;53967:113;;;:::o;25644:128::-;25727:39;25744:4;25750:2;25754:7;25727:39;;;;;;;;;;;;:16;:39::i;:::-;25644:128;;;:::o;53496:167::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53611:13;53604:30;;;53635:12;53649:7;53604:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53604:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53604:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53604:53:0;;;;;;;;;;;;;;;;;53496:167;;;:::o;52404:104::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52491:10;52472:9;;:30;;;;;;;;;;;;;;;;;;52404:104;:::o;36615:189::-;36673:7;36705:13;:11;:13::i;:::-;36697:5;:21;36689:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36781:10;36792:5;36781:17;;;;;;;;;;;;;;;;36774:24;;36615:189;;;:::o;52854:126::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52925:8;52915:7;:18;;;;52945:29;52960:8;52970:3;52945:29;;;;;;;;;;;;;;;;;;;;;;;;52854:126;:::o;51810:113::-;51873:8;50326:13;50342:17;50350:8;50342:7;:17::i;:::-;50326:33;;50383:10;50374:19;;:5;:19;;;50366:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51890:27;51896:10;51908:8;51890:5;:27::i;:::-;51810:113;;;:::o;21822:214::-;21877:7;21893:13;21909:11;:20;21921:7;21909:20;;;;;;;;;;;;;;;;;;;;;21893:36;;21961:1;21944:19;;:5;:19;;;;21936:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22025:5;22018:12;;;21822:214;;;:::o;50873:426::-;50991:4;50571:9;;;;;;;;;;;50549:32;;:10;:32;;;50541:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51018:1;51008:7;;:11;51004:231;;;51030:29;51078:2;51072:3;51062:7;:13;:18;;;;;;51030:50;;51169:7;;51144:21;:32;;51136:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51207:20;:18;:20::i;:::-;51004:231;;51241:34;51261:5;;51241:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;51241:34:0;;;;;;51269:5;51241:12;:34::i;:::-;;51289:4;51282:11;;50873:426;;;;;;:::o;45742:85::-;45784:13;45813:8;45806:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45742:85;:::o;49440:23::-;;;;;;;;;;;;;:::o;21407:201::-;21462:7;21503:1;21486:19;;:5;:19;;;;21478:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21568:34;:17;:24;21586:5;21568:24;;;;;;;;;;;;;;;:32;:34::i;:::-;21561:41;;21407:201;;;:::o;47937:130::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48032:1;47995:40;;48016:6;;;;;;;;;;;47995:40;;;;;;;;;;;;48059:1;48042:6;;:19;;;;;;;;;;;;;;;;;;47937:130::o;49613:22::-;;;;:::o;47180:73::-;47218:7;47241:6;;;;;;;;;;;47234:13;;47180:73;:::o;47514:88::-;47554:4;47590:6;;;;;;;;;;;47574:22;;:12;:10;:12::i;:::-;:22;;;47567:29;;47514:88;:::o;43823:83::-;43864:13;43893:7;43886:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43823:83;:::o;23602:240::-;23684:12;:10;:12::i;:::-;23678:18;;:2;:18;;;;23670:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23774:8;23735:18;:32;23754:12;:10;:12::i;:::-;23735:32;;;;;;;;;;;;;;;:36;23768:2;23735:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;23823:2;23794:42;;23809:12;:10;:12::i;:::-;23794:42;;;23827:8;23794:42;;;;;;;;;;;;;;;;;;;;;;23602:240;;:::o;52645:108::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52734:13;52719:12;;:28;;;;;;;;;;;;;;;;;;52645:108;:::o;26483:262::-;26594:41;26613:12;:10;:12::i;:::-;26627:7;26594:18;:41::i;:::-;26586:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26696:43;26714:4;26720:2;26724:7;26733:5;26696:17;:43::i;:::-;26483:262;;;;:::o;49505:27::-;;;;;;;;;;;;;:::o;44201:513::-;44259:13;44289:16;44297:7;44289;:16::i;:::-;44281:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44366:23;44392:10;:19;44403:7;44392:19;;;;;;;;;;;44366:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44541:1;44520:9;44514:23;:28;44510:199;;;44553:9;;;;;;;;;;;;;;;;;44510:199;44680:8;44690:9;44663:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;44663:37:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;44663:37:0;;;44649:52;;;44201:513;;;;:::o;51434:258::-;51507:1;51497:7;;:11;51493:157;;;51527:9;;;;;;;;;;;:22;;;51550:10;51570:4;51577:7;;51527:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51527:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51527:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51527:58:0;;;;;;;;;;;;;;;;51519:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51622:20;:18;:20::i;:::-;51493:157;51656:30;51669:4;;51656:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;51656:30:0;;;;;;51675:10;51656:12;:30::i;:::-;;51434:258;;:::o;24158:141::-;24238:4;24258:18;:25;24277:5;24258:25;;;;;;;;;;;;;;;:35;24284:8;24258:35;;;;;;;;;;;;;;;;;;;;;;;;;24251:42;;24158:141;;;;:::o;48212:103::-;47374:9;:7;:9::i;:::-;47366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48281:28;48300:8;48281:18;:28::i;:::-;48212:103;:::o;27890:145::-;27947:4;27960:13;27976:11;:20;27988:7;27976:20;;;;;;;;;;;;;;;;;;;;;27960:36;;28027:1;28010:19;;:5;:19;;;;28003:26;;;27890:145;;;:::o;9881:92::-;9926:15;9957:10;9950:17;;9881:92;:::o;28389:319::-;28474:4;28495:16;28503:7;28495;:16::i;:::-;28487:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28567:13;28583:16;28591:7;28583;:16::i;:::-;28567:32;;28625:5;28614:16;;:7;:16;;;:51;;;;28658:7;28634:31;;:20;28646:7;28634:11;:20::i;:::-;:31;;;28614:51;:87;;;;28669:32;28686:5;28693:7;28669:16;:32::i;:::-;28614:87;28606:96;;;28389:319;;;;:::o;37172:231::-;37254:38;37274:4;37280:2;37284:7;37254:19;:38::i;:::-;37301:47;37334:4;37340:7;37301:32;:47::i;:::-;37357:40;37385:2;37389:7;37357:27;:40::i;:::-;37172:231;;;:::o;45029:197::-;45117:16;45125:7;45117;:16::i;:::-;45109:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45211:9;45189:10;:19;45200:7;45189:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;45029:197;;:::o;46113:223::-;46176:27;46188:5;46195:7;46176:11;:27::i;:::-;46285:1;46254:10;:19;46265:7;46254:19;;;;;;;;;;;46248:33;;;;;;;;;;;;;;;;:38;46244:87;;46304:10;:19;46315:7;46304:19;;;;;;;;;;;;46297:26;;;;:::i;:::-;46244:87;46113:223;;:::o;54944:197::-;54990:12;55012:9;;;;;;;;;;;55005:27;;;55041:4;55005:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55005:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55005:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55005:42:0;;;;;;;;;;;;;;;;54990:57;;55069:9;;;;;;;;;;;55062:26;;;55089:12;;;;;;;;;;;55103:7;55062:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55062:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55062:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;55062:49:0;;;;;;;;;;;;;;;;55054:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54944:197;:::o;54580:263::-;54658:7;54674:13;54690:9;;54674:25;;54706:9;;:11;;;;;;;;;;;;;54724:22;54730:8;54740:5;54724;:22::i;:::-;54753:25;54766:5;54773:4;54753:12;:25::i;:::-;54785:33;54802:5;54809:8;54785:16;:33::i;:::-;54832:5;54825:12;;;54580:263;;;;:::o;8711:108::-;8776:7;8799;:14;;;8792:21;;8711:108;;;:::o;27438:262::-;27544:32;27558:4;27564:2;27568:7;27544:13;:32::i;:::-;27591:48;27614:4;27620:2;27624:7;27633:5;27591:22;:48::i;:::-;27583:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27438:262;;;;:::o;48413:215::-;48503:1;48483:22;;:8;:22;;;;48475:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48589:8;48560:38;;48581:6;;;;;;;;;;;48560:38;;;;;;;;;;;;48614:8;48605:6;;:17;;;;;;;;;;;;;;;;;;48413:215;:::o;31901:429::-;32011:4;31991:24;;:16;31999:7;31991;:16::i;:::-;:24;;;31983:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32090:1;32076:16;;:2;:16;;;;32068:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32142:23;32157:7;32142:14;:23::i;:::-;32174:35;:17;:23;32192:4;32174:23;;;;;;;;;;;;;;;:33;:35::i;:::-;32216:33;:17;:21;32234:2;32216:21;;;;;;;;;;;;;;;:31;:33::i;:::-;32281:2;32258:11;:20;32270:7;32258:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;32316:7;32312:2;32297:27;;32306:4;32297:27;;;;;;;;;;;;31901:429;;;:::o;40199:1098::-;40453:22;40478:32;40508:1;40478:12;:18;40491:4;40478:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;40453:57;;40517:18;40538:17;:26;40556:7;40538:26;;;;;;;;;;;;40517:47;;40677:14;40663:10;:28;40659:320;;40702:19;40724:12;:18;40737:4;40724:18;;;;;;;;;;;;;;;40743:14;40724:34;;;;;;;;;;;;;;;;40702:56;;40802:11;40769:12;:18;40782:4;40769:18;;;;;;;;;;;;;;;40788:10;40769:30;;;;;;;;;;;;;;;:44;;;;40920:10;40887:17;:30;40905:11;40887:30;;;;;;;;;;;:43;;;;40659:320;;41060:12;:18;41073:4;41060:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;40199:1098;;;;:::o;39069:176::-;39179:12;:16;39192:2;39179:16;;;;;;;;;;;;;;;:23;;;;39150:17;:26;39168:7;39150:26;;;;;;;;;;;:52;;;;39209:12;:16;39222:2;39209:16;;;;;;;;;;;;;;;39231:7;39209:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;39209:30:0;;;;;;;;;;;;;;;;;;;;;;39069:176;;:::o;38110:350::-;38173:27;38185:5;38192:7;38173:11;:27::i;:::-;38209:48;38242:5;38249:7;38209:32;:48::i;:::-;38399:1;38370:17;:26;38388:7;38370:26;;;;;;;;;;;:30;;;;38409:45;38446:7;38409:36;:45::i;:::-;38110:350;;:::o;37654:188::-;37714:24;37726:2;37730:7;37714:11;:24::i;:::-;37747:40;37775:2;37779:7;37747:27;:40::i;:::-;37796;37828:7;37796:31;:40::i;:::-;37654:188;;:::o;54268:118::-;54372:8;54346:13;:23;54360:8;54346:23;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;54268:118;;:::o;32958:931::-;33074:4;33095:15;:2;:13;;;:15::i;:::-;33090:50;;33128:4;33121:11;;;;33090:50;33203:12;33217:23;33244:2;:7;;33301:2;33285:36;;;:45;;;;33341:12;:10;:12::i;:::-;33364:4;33379:7;33397:5;33252:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;33252:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;33252:159:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;33252:159:0;33244:168;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;33244:168:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;33202:210:0;;;;33424:7;33419:465;;33466:1;33446:10;:17;:21;33442:320;;;33588:10;33582:17;33639:15;33626:10;33622:2;33618:19;33611:44;33546:120;33692:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33419:465;33784:13;33811:10;33800:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33800:32:0;;;;;;;;;;;;;;;;33784:48;;19683:10;33859:16;;33849:26;;;:6;:26;;;;33841:35;;;;;32958:931;;;;;;;:::o;34047:159::-;34143:1;34107:38;;:15;:24;34123:7;34107:24;;;;;;;;;;;;;;;;;;;;;:38;;;34103:98;;34191:1;34156:15;:24;34172:7;34156:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;34103:98;34047:159;:::o;9002:104::-;9079:21;9098:1;9079:7;:14;;;:18;;:21;;;;:::i;:::-;9062:7;:14;;:38;;;;9002:104;:::o;8825:171::-;8989:1;8971:7;:14;;;:19;;;;;;;;;;;8825:171;:::o;3817:130::-;3875:7;3898:43;3902:1;3905;3898:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3891:50;;3817:130;;;;:::o;30958:311::-;31049:5;31029:25;;:16;31037:7;31029;:16::i;:::-;:25;;;31021:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31105:23;31120:7;31105:14;:23::i;:::-;31137:36;:17;:24;31155:5;31137:24;;;;;;;;;;;;;;;:34;:36::i;:::-;31211:1;31180:11;:20;31192:7;31180:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;31255:7;31251:1;31227:36;;31236:5;31227:36;;;;;;;;;;;;30958:311;;:::o;41580:1038::-;41821:22;41846:24;41868:1;41846:10;:17;;;;:21;;:24;;;;:::i;:::-;41821:49;;41877:18;41898:15;:24;41914:7;41898:24;;;;;;;;;;;;41877:45;;42233:19;42255:10;42266:14;42255:26;;;;;;;;;;;;;;;;42233:48;;42315:11;42290:10;42301;42290:22;;;;;;;;;;;;;;;:36;;;;42427:10;42396:15;:28;42412:11;42396:28;;;;;;;;;;;:41;;;;42558:10;:19;;;;;;;;;;;;:::i;:::-;;42611:1;42584:15;:24;42600:7;42584:24;;;;;;;;;;;:28;;;;41580:1038;;;;:::o;30384:313::-;30466:1;30452:16;;:2;:16;;;;30444:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30521:16;30529:7;30521;:16::i;:::-;30520:17;30512:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30602:2;30579:11;:20;30591:7;30579:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;30611:33;:17;:21;30629:2;30611:21;;;;;;;;;;;;;;;:31;:33::i;:::-;30683:7;30679:2;30658:33;;30675:1;30658:33;;;;;;;;;;;;30384:313;;:::o;39436:154::-;39536:10;:17;;;;39509:15;:24;39525:7;39509:24;;;;;;;;;;;:44;;;;39560:10;39576:7;39560:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;39560:24:0;;;;;;;;;;;;;;;;;;;;;;39436:154;:::o;15433:583::-;15493:4;15739:16;15762:19;15784:66;15762:88;;;;15944:7;15932:20;15920:32;;15979:11;15967:8;:23;;:42;;;;;16006:3;15994:15;;:8;:15;;15967:42;15959:51;;;;15433:583;;;:::o;4260:178::-;4346:7;4375:1;4370;:6;;4378:12;4362:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4362:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4398:9;4414:1;4410;:5;4398:17;;4431:1;4424:8;;;4260:178;;;;;:::o;49142:6002::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://168be1331c570ee7509ace5bef2d911439de5b4083444f4e6e734b7c4cb60e2d
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.