ETH Price: $3,487.24 (+0.55%)
Gas: 6 Gwei

Token

MoonCatPop Vending Machines (MCPVM)
 

Overview

Max Total Supply

84 MCPVM

Holders

72

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
zibzub.eth
Balance
1 MCPVM
0x2511a8a4223333d730ecbb3e45d88e86d7f14bde
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The MoonCats have begun launching their own brands and flavors of MoonCatPop from their own branded vending machines.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MoonCatPopVendingMachineFactory

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 14 : MCPVMFactory.sol
// SPDX-License-Identifier: AGPL-3.0

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";

interface IReverseResolver {
  function claim(address owner) external returns (bytes32);
}

interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
}

/**
 * @title MoonCatPop Vending Machine Factory
 * @dev ERC721 representing the ability to mint 100 cans of MoonCatPop of a specific flavor.
 */
contract MoonCatPopVendingMachineFactory is ERC721Enumerable, Ownable, Pausable {
  using Strings for uint256;
  string public baseURI;

  /* External Contracts */
  address constant MoonCatAcclimator = 0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69;

  /* Remittance */
  address[2] public beneficiaries;

  /* Structs */
  struct WornAccessory {
      uint232 accessoryId;
      uint8 paletteIndex;
      uint16 zIndex;
  }

  struct VendingMachine {
      uint16 moonCatTokenId;
      uint8 color;
      uint8 textcolor;
      uint8 textshadow;
      uint8 scale;
      uint8 gradient;
      uint8 pattern;
      string flavor;
  }

  struct MintData {
      VendingMachine machine;
      uint256 canMintBlockOffset;
      WornAccessory[] accessories;
  }

  /* State */
  mapping (uint256 => uint256) moonCatToVendingMachine; // MoonCat Rescue Order -> Vending Machine token ID (plus nonce)
  mapping (uint256 => uint256) public vendingMachineCanMintStart; // Vending Machine token ID -> Block height
  uint256 public MaxVendingMachines = 256;
  VendingMachine[] public moonCatVendingMachines; // Vending machine token ID -> Vending Machine metadata
  mapping(uint256 => WornAccessory[]) wornAccessories; // MoonCat Rescue Order -> Accessories worn in can graphic

  /* Events */
  event BaseURISet(string baseURI);

  /**
   * @dev Deploy factory contract.
   */
  constructor(address[2] memory _beneficiaries) ERC721("MoonCatPop Vending Machines", "MCPVM") {
    beneficiaries = _beneficiaries;
    _pause();

    // https://docs.ens.domains/contract-api-reference/reverseregistrar#claim-address
    IReverseResolver(0x084b1c3C81545d370f3634392De611CaaBFf8148)
      .claim(msg.sender);
  }

  /**
   * @dev Pause the contract.
   * Prevent minting and transferring of tokens
   */
  function paws() public onlyOwner {
      _pause();
  }

  /**
   * @dev Unpause the contract.
   * Allow minting and transferring of tokens
   */
  function unpaws() public onlyOwner {
      _unpause();
  }

  /**
   * @dev Finish minting and seal the collection.
   */
  function endMinting() public onlyOwner {
      MaxVendingMachines = totalSupply();
  }

  /**
   * @dev Get the current base URI for token metadata.
   */
  function _baseURI() internal view override returns (string memory) {
      return baseURI;
  }

  /**
   * @dev Update the base URI for token metadata.
   */
  function setBaseURI(string memory _newbaseURI) public onlyOwner {
    baseURI = _newbaseURI;
    emit BaseURISet(_newbaseURI);
  }

  /**
   * @dev Rescue ERC20 assets sent directly to this contract.
   */
  function withdrawForeignERC20(address tokenContract) public onlyOwner {
    IERC20 token = IERC20(tokenContract);
    token.transfer(owner(), token.balanceOf(address(this)));
  }

  /**
   * @dev Rescue ERC721 assets sent directly to this contract.
   */
  function withdrawForeignERC721(address tokenContract, uint256 tokenId) public onlyOwner {
    IERC721(tokenContract).safeTransferFrom(address(this), owner(), tokenId);
  }

  /**
   * @dev Create a new Vending Machine token.
   */
  function mintVendingMachine(MintData calldata mintData)
    public
    onlyOwner
  {
    require( totalSupply() < MaxVendingMachines, "Vending Machine limit exceeded");
    require( moonCatToVendingMachine[mintData.machine.moonCatTokenId] == 0, "Duplicate MoonCat");

    uint256 tokenId = totalSupply();
    address moonCatOwner = IERC721(MoonCatAcclimator).ownerOf(mintData.machine.moonCatTokenId);
    _safeMint(moonCatOwner, tokenId);

    for (uint256 i = 0; i < mintData.accessories.length; i++){
      wornAccessories[tokenId].push(mintData.accessories[i]);
    }

    moonCatVendingMachines.push(mintData.machine);
    vendingMachineCanMintStart[tokenId] = block.number + mintData.canMintBlockOffset;
    moonCatToVendingMachine[mintData.machine.moonCatTokenId] = tokenId + 10;
  }

  /**
   * @dev Create multiple Vending Machine tokens at once.
   */
  function batchMint(MintData[] calldata batch) public onlyOwner {
      for (uint i = 0; i < batch.length; i++) {
          mintVendingMachine(batch[i]);
      }
  }

  /**
   * @dev Check if a given Vending Machine token exists or not.
   */
  function moonCatVendingMachineExists(uint256 _tokenId) public view returns (bool) {
    return _exists(_tokenId);
  }

  /**
   * @dev What Vending Machine has the specified MoonCat as a spokes-cat?
   */
  function vendingMachineForMoonCat(uint256 _acclimatedMoonCatTokenId) public view returns (uint256) {
    require(moonCatToVendingMachine[_acclimatedMoonCatTokenId] > 0, "No Machine");
    return moonCatToVendingMachine[_acclimatedMoonCatTokenId] - 10;
  }

  /**
   * @dev See {ERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 _tokenId)
    public
    view
    override
    returns (string memory)
  {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(
      baseURI, _tokenId.toString(), '.json'
    )) : "";
  }

  /**
   * @dev See {ERC721-_beforeTokenTransfer}.
   */
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal override whenNotPaused {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  /**
   * @dev Get metadata about a specific Vending Machine and the spokes-cat on it.
   */
  function getVendingMachineMetadata(uint256 _vendingMachineId)
    public
    view
    returns (VendingMachine memory vendingMachine, WornAccessory[] memory accessories)
  {
    return (moonCatVendingMachines[_vendingMachineId], wornAccessories[_vendingMachineId]);
  }

  /**
   * @dev Update a beneficiary of the contract.
   */
  function setBeneficiary(address _beneficiary, uint256 _index) public {
    require(_msgSender() == beneficiaries[_index], "Forbidden");
    beneficiaries[_index] = _beneficiary;
  }

  /**
   * @dev Default funds-receiving method.
   */
  receive() external payable {
    splitFees();
  }

  /**
   * @dev Manually trigger a dispersement of whatever funds are in the contract.
   */
  function withdraw() public {
    splitFees();
  }

  bool firstEntry = true;

  /**
   * @dev Send whatever funds are currently in the account to the beneficiaries, in a 50/50 split.
   */
  function splitFees() internal {
      require(firstEntry, "Reentrant");
      firstEntry = false;
      payable(beneficiaries[0]).transfer(address(this).balance * 50 / 100);
      payable(beneficiaries[1]).transfer(address(this).balance);
      firstEntry = true;
  }

}

File 2 of 14 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 14 : ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 4 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 5 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 6 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 7 of 14 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 8 of 14 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 14 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 10 of 14 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 11 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 12 of 14 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 13 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

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

File 14 of 14 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[2]","name":"_beneficiaries","type":"address[2]"}],"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":"string","name":"baseURI","type":"string"}],"name":"BaseURISet","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MaxVendingMachines","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint16","name":"moonCatTokenId","type":"uint16"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"textcolor","type":"uint8"},{"internalType":"uint8","name":"textshadow","type":"uint8"},{"internalType":"uint8","name":"scale","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"pattern","type":"uint8"},{"internalType":"string","name":"flavor","type":"string"}],"internalType":"struct MoonCatPopVendingMachineFactory.VendingMachine","name":"machine","type":"tuple"},{"internalType":"uint256","name":"canMintBlockOffset","type":"uint256"},{"components":[{"internalType":"uint232","name":"accessoryId","type":"uint232"},{"internalType":"uint8","name":"paletteIndex","type":"uint8"},{"internalType":"uint16","name":"zIndex","type":"uint16"}],"internalType":"struct MoonCatPopVendingMachineFactory.WornAccessory[]","name":"accessories","type":"tuple[]"}],"internalType":"struct MoonCatPopVendingMachineFactory.MintData[]","name":"batch","type":"tuple[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"beneficiaries","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vendingMachineId","type":"uint256"}],"name":"getVendingMachineMetadata","outputs":[{"components":[{"internalType":"uint16","name":"moonCatTokenId","type":"uint16"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"textcolor","type":"uint8"},{"internalType":"uint8","name":"textshadow","type":"uint8"},{"internalType":"uint8","name":"scale","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"pattern","type":"uint8"},{"internalType":"string","name":"flavor","type":"string"}],"internalType":"struct MoonCatPopVendingMachineFactory.VendingMachine","name":"vendingMachine","type":"tuple"},{"components":[{"internalType":"uint232","name":"accessoryId","type":"uint232"},{"internalType":"uint8","name":"paletteIndex","type":"uint8"},{"internalType":"uint16","name":"zIndex","type":"uint16"}],"internalType":"struct MoonCatPopVendingMachineFactory.WornAccessory[]","name":"accessories","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint16","name":"moonCatTokenId","type":"uint16"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"textcolor","type":"uint8"},{"internalType":"uint8","name":"textshadow","type":"uint8"},{"internalType":"uint8","name":"scale","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"pattern","type":"uint8"},{"internalType":"string","name":"flavor","type":"string"}],"internalType":"struct MoonCatPopVendingMachineFactory.VendingMachine","name":"machine","type":"tuple"},{"internalType":"uint256","name":"canMintBlockOffset","type":"uint256"},{"components":[{"internalType":"uint232","name":"accessoryId","type":"uint232"},{"internalType":"uint8","name":"paletteIndex","type":"uint8"},{"internalType":"uint16","name":"zIndex","type":"uint16"}],"internalType":"struct MoonCatPopVendingMachineFactory.WornAccessory[]","name":"accessories","type":"tuple[]"}],"internalType":"struct MoonCatPopVendingMachineFactory.MintData","name":"mintData","type":"tuple"}],"name":"mintVendingMachine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"moonCatVendingMachineExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"moonCatVendingMachines","outputs":[{"internalType":"uint16","name":"moonCatTokenId","type":"uint16"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"textcolor","type":"uint8"},{"internalType":"uint8","name":"textshadow","type":"uint8"},{"internalType":"uint8","name":"scale","type":"uint8"},{"internalType":"uint8","name":"gradient","type":"uint8"},{"internalType":"uint8","name":"pattern","type":"uint8"},{"internalType":"string","name":"flavor","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paws","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newbaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpaws","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vendingMachineCanMintStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_acclimatedMoonCatTokenId","type":"uint256"}],"name":"vendingMachineForMoonCat","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526101006010556013805460ff191660011790553480156200002457600080fd5b50604051620037ce380380620037ce8339810160408190526200004791620003a9565b604080518082018252601b81527f4d6f6f6e436174506f702056656e64696e67204d616368696e657300000000006020808301918252835180850190945260058452644d4350564d60d81b908401528151919291620000a9916000916200029b565b508051620000bf9060019060208401906200029b565b505050620000dc620000d66200019360201b60201c565b62000197565b600a805460ff60a01b19169055620000f8600c8260026200032a565b5062000103620001e9565b604051630f41a04d60e11b815233600482015273084b1c3c81545d370f3634392de611caabff814890631e83409a90602401602060405180830381600087803b1580156200015057600080fd5b505af115801562000165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018b919062000445565b50506200049c565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001fd600a54600160a01b900460ff1690565b15620002425760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200027e3390565b6040516001600160a01b03909116815260200160405180910390a1565b828054620002a9906200045f565b90600052602060002090601f016020900481019282620002cd576000855562000318565b82601f10620002e857805160ff191683800117855562000318565b8280016001018555821562000318579182015b8281111562000318578251825591602001919060010190620002fb565b506200032692915062000375565b5090565b826002810192821562000318579160200282015b828111156200031857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200033e565b5b8082111562000326576000815560010162000376565b80516001600160a01b0381168114620003a457600080fd5b919050565b600060408284031215620003bc57600080fd5b82601f830112620003cc57600080fd5b604080519081016001600160401b0381118282101715620003fd57634e487b7160e01b600052604160045260246000fd5b80604052508060408401858111156200041557600080fd5b845b818110156200043a576200042b816200038c565b83526020928301920162000417565b509195945050505050565b6000602082840312156200045857600080fd5b5051919050565b600181811c908216806200047457607f821691505b602082108114156200049657634e487b7160e01b600052602260045260246000fd5b50919050565b61332280620004ac6000396000f3fe6080604052600436106102295760003560e01c80636c0360eb11610123578063b88d4fde116100ab578063ef70aebf1161006f578063ef70aebf1461069f578063efeb5e58146106b4578063f2fde38b146106d4578063f4473e71146106f4578063f803bf4a1461071457600080fd5b8063b88d4fde146105c9578063c7b1756a146105e9578063c87b56dd14610609578063e3c6add314610629578063e985e9c51461065657600080fd5b80638da5cb5b116100f25780638da5cb5b14610533578063900fadc41461055157806395d89b411461057f578063a22cb46514610594578063ad2e22e2146105b457600080fd5b80636c0360eb146104c95780636fd1f270146104de57806370a08231146104fe578063715018a61461051e57600080fd5b80632f745c59116101b157806355f75eee1161017557806355f75eee1461043457806355f804b31461044a5780635c4719951461046a5780635c975abb1461048a5780636352211e146104a957600080fd5b80632f745c591461039f5780633ccfd60b146103bf57806342842e0e146103d4578063481ff53e146103f45780634f6ccce71461041457600080fd5b80630ce06b68116101f85780630ce06b68146102ec57806316705a711461030c57806318160ddd1461034057806323b872dd1461035f5780632aa909d31461037f57600080fd5b806301ffc9a71461023d57806306fdde0314610272578063081812fc14610294578063095ea7b3146102cc57600080fd5b3661023857610236610729565b005b600080fd5b34801561024957600080fd5b5061025d6102583660046126c0565b610811565b60405190151581526020015b60405180910390f35b34801561027e57600080fd5b5061028761083c565b604051610269919061273c565b3480156102a057600080fd5b506102b46102af36600461274f565b6108ce565b6040516001600160a01b039091168152602001610269565b3480156102d857600080fd5b506102366102e736600461277d565b610963565b3480156102f857600080fd5b5061023661030736600461277d565b610a79565b34801561031857600080fd5b5061032c61032736600461274f565b610b30565b6040516102699897969594939291906127a9565b34801561034c57600080fd5b506008545b604051908152602001610269565b34801561036b57600080fd5b5061023661037a366004612809565b610c31565b34801561038b57600080fd5b5061035161039a36600461274f565b610c62565b3480156103ab57600080fd5b506103516103ba36600461277d565b610cc5565b3480156103cb57600080fd5b50610236610d5b565b3480156103e057600080fd5b506102366103ef366004612809565b610d65565b34801561040057600080fd5b5061025d61040f36600461274f565b610d80565b34801561042057600080fd5b5061035161042f36600461274f565b610d9f565b34801561044057600080fd5b5061035160105481565b34801561045657600080fd5b506102366104653660046128d6565b610e32565b34801561047657600080fd5b5061023661048536600461291f565b610eaa565b34801561049657600080fd5b50600a54600160a01b900460ff1661025d565b3480156104b557600080fd5b506102b46104c436600461274f565b610feb565b3480156104d557600080fd5b50610287611062565b3480156104ea57600080fd5b506102366104f936600461277d565b6110f0565b34801561050a57600080fd5b5061035161051936600461291f565b611188565b34801561052a57600080fd5b5061023661120f565b34801561053f57600080fd5b50600a546001600160a01b03166102b4565b34801561055d57600080fd5b5061057161056c36600461274f565b611243565b60405161026992919061299d565b34801561058b57600080fd5b50610287611452565b3480156105a057600080fd5b506102366105af366004612a5b565b611461565b3480156105c057600080fd5b50610236611526565b3480156105d557600080fd5b506102366105e4366004612a94565b611558565b3480156105f557600080fd5b50610236610604366004612b14565b611590565b34801561061557600080fd5b5061028761062436600461274f565b6115fe565b34801561063557600080fd5b5061035161064436600461274f565b600f6020526000908152604090205481565b34801561066257600080fd5b5061025d610671366004612b89565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ab57600080fd5b506102366116d9565b3480156106c057600080fd5b506102b46106cf36600461274f565b61170b565b3480156106e057600080fd5b506102366106ef36600461291f565b61172b565b34801561070057600080fd5b5061023661070f366004612bb7565b6117c6565b34801561072057600080fd5b50610236611a8b565b60135460ff1661076c5760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064015b60405180910390fd5b6013805460ff19169055600c546001600160a01b03166108fc6064610792476032612c1e565b61079c9190612c53565b6040518115909202916000818181858888f193505050501580156107c4573d6000803e3d6000fd5b50600c600101546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610801573d6000803e3d6000fd5b506013805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b1480610836575061083682611abd565b92915050565b60606000805461084b90612c67565b80601f016020809104026020016040519081016040528092919081815260200182805461087790612c67565b80156108c45780601f10610899576101008083540402835291602001916108c4565b820191906000526020600020905b8154815290600101906020018083116108a757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109475760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610763565b506000908152600460205260409020546001600160a01b031690565b600061096e82610feb565b9050806001600160a01b0316836001600160a01b031614156109dc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610763565b336001600160a01b03821614806109f857506109f88133610671565b610a6a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610763565b610a748383611b0d565b505050565b600a546001600160a01b03163314610aa35760405162461bcd60e51b815260040161076390612ca2565b816001600160a01b03166342842e0e30610ac5600a546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b158015610b1457600080fd5b505af1158015610b28573d6000803e3d6000fd5b505050505050565b60118181548110610b4057600080fd5b60009182526020909120600290910201805460018201805461ffff8316945060ff62010000840481169463010000008504821694640100000000810483169465010000000000820484169466010000000000008304851694600160381b9093049092169291610bae90612c67565b80601f0160208091040260200160405190810160405280929190818152602001828054610bda90612c67565b8015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b5050505050905088565b610c3b3382611b7b565b610c575760405162461bcd60e51b815260040161076390612cd7565b610a74838383611c72565b6000818152600e6020526040812054610caa5760405162461bcd60e51b815260206004820152600a6024820152694e6f204d616368696e6560b01b6044820152606401610763565b6000828152600e602052604090205461083690600a90612d28565b6000610cd083611188565b8210610d325760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610763565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d63610729565b565b610a7483838360405180602001604052806000815250611558565b6000818152600260205260408120546001600160a01b03161515610836565b6000610daa60085490565b8210610e0d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610763565b60088281548110610e2057610e20612bf2565b90600052602060002001549050919050565b600a546001600160a01b03163314610e5c5760405162461bcd60e51b815260040161076390612ca2565b8051610e6f90600b906020840190612611565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f681604051610e9f919061273c565b60405180910390a150565b600a546001600160a01b03163314610ed45760405162461bcd60e51b815260040161076390612ca2565b806001600160a01b03811663a9059cbb610ef6600a546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610f3557600080fd5b505afa158015610f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6d9190612d3f565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a749190612d58565b6000818152600260205260408120546001600160a01b0316806108365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610763565b600b805461106f90612c67565b80601f016020809104026020016040519081016040528092919081815260200182805461109b90612c67565b80156110e85780601f106110bd576101008083540402835291602001916110e8565b820191906000526020600020905b8154815290600101906020018083116110cb57829003601f168201915b505050505081565b600c816002811061110357611103612bf2565b01546001600160a01b0316336001600160a01b0316146111515760405162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b6044820152606401610763565b81600c826002811061116557611165612bf2565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b60006001600160a01b0382166111f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610763565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112395760405162461bcd60e51b815260040161076390612ca2565b610d636000611e1d565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c082019290925260e081019190915260606011838154811061129b5761129b612bf2565b60009182526020808320868452601282526040938490208451610100810186526002909402909101805461ffff8116855260ff620100008204811694860194909452630100000081048416958501959095526401000000008504831660608501526501000000000085048316608085015266010000000000008504831660a0850152600160381b90940490911660c0830152600183018054919291849160e084019161134690612c67565b80601f016020809104026020016040519081016040528092919081815260200182805461137290612c67565b80156113bf5780601f10611394576101008083540402835291602001916113bf565b820191906000526020600020905b8154815290600101906020018083116113a257829003601f168201915b505050505081525050915080805480602002602001604051908101604052809291908181526020016000905b8282101561144357600084815260209081902060408051606081018252918501546001600160e81b0381168352600160e81b810460ff1683850152600160f01b900461ffff16908201528252600190920191016113eb565b50505050905091509150915091565b60606001805461084b90612c67565b6001600160a01b0382163314156114ba5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610763565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146115505760405162461bcd60e51b815260040161076390612ca2565b610d63611e6f565b6115623383611b7b565b61157e5760405162461bcd60e51b815260040161076390612cd7565b61158a84848484611f0c565b50505050565b600a546001600160a01b031633146115ba5760405162461bcd60e51b815260040161076390612ca2565b60005b81811015610a74576115ec8383838181106115da576115da612bf2565b905060200281019061070f9190612d75565b806115f681612d95565b9150506115bd565b6000818152600260205260409020546060906001600160a01b031661167d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610763565b6000600b805461168c90612c67565b9050116116a85760405180602001604052806000815250610836565b600b6116b383611f3f565b6040516020016116c4929190612db0565b60405160208183030381529060405292915050565b600a546001600160a01b031633146117035760405162461bcd60e51b815260040161076390612ca2565b600854601055565b600c816002811061171b57600080fd5b01546001600160a01b0316905081565b600a546001600160a01b031633146117555760405162461bcd60e51b815260040161076390612ca2565b6001600160a01b0381166117ba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b6117c381611e1d565b50565b600a546001600160a01b031633146117f05760405162461bcd60e51b815260040161076390612ca2565b601054600854106118435760405162461bcd60e51b815260206004820152601e60248201527f56656e64696e67204d616368696e65206c696d697420657863656564656400006044820152606401610763565b600e60006118518380612e43565b61185f906020810190612e69565b61ffff168152602001908152602001600020546000146118b55760405162461bcd60e51b8152602060048201526011602482015270111d5c1b1a58d85d1948135bdbdb90d85d607a1b6044820152606401610763565b60006118c060085490565b9050600073c3f733ca98e0dad0386979eb96fb1722a1a05e69636352211e6118e88580612e43565b6118f6906020810190612e69565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561193057600080fd5b505afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119689190612e86565b9050611974818361203d565b60005b6119846040850185612ea3565b90508110156119fb5760008381526012602052604090819020906119aa90860186612ea3565b838181106119ba576119ba612bf2565b835460018101855560009485526020909420606090910292909201929190910190506119e68282612f06565b505080806119f390612d95565b915050611977565b506011611a088480612e43565b815460018101835560009283526020909220909160020201611a2a82826130c2565b50611a3b90506020840135436131fe565b6000838152600f6020526040902055611a5582600a6131fe565b600e6000611a638680612e43565b611a71906020810190612e69565b61ffff168152602081019190915260400160002055505050565b600a546001600160a01b03163314611ab55760405162461bcd60e51b815260040161076390612ca2565b610d6361205b565b60006001600160e01b031982166380ac58cd60e01b1480611aee57506001600160e01b03198216635b5e139f60e01b145b8061083657506301ffc9a760e01b6001600160e01b0319831614610836565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b4282610feb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611bf45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610763565b6000611bff83610feb565b9050806001600160a01b0316846001600160a01b03161480611c3a5750836001600160a01b0316611c2f846108ce565b6001600160a01b0316145b80611c6a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c8582610feb565b6001600160a01b031614611ced5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610763565b6001600160a01b038216611d4f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b611d5a8383836120e3565b611d65600082611b0d565b6001600160a01b0383166000908152600360205260408120805460019290611d8e908490612d28565b90915550506001600160a01b0382166000908152600360205260408120805460019290611dbc9084906131fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600160a01b900460ff16611ebf5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610763565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611f17848484611c72565b611f238484848461213b565b61158a5760405162461bcd60e51b815260040161076390613216565b606081611f635750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f8d5780611f7781612d95565b9150611f869050600a83612c53565b9150611f67565b60008167ffffffffffffffff811115611fa857611fa861284a565b6040519080825280601f01601f191660200182016040528015611fd2576020820181803683370190505b5090505b8415611c6a57611fe7600183612d28565b9150611ff4600a86613268565b611fff9060306131fe565b60f81b81838151811061201457612014612bf2565b60200101906001600160f81b031916908160001a905350612036600a86612c53565b9450611fd6565b612057828260405180602001604052806000815250612248565b5050565b600a54600160a01b900460ff16156120a85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610763565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611eef3390565b600a54600160a01b900460ff16156121305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610763565b610a7483838361227b565b60006001600160a01b0384163b1561223d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061217f90339089908890889060040161327c565b602060405180830381600087803b15801561219957600080fd5b505af19250505080156121c9575060408051601f3d908101601f191682019092526121c6918101906132b9565b60015b612223573d8080156121f7576040519150601f19603f3d011682016040523d82523d6000602084013e6121fc565b606091505b50805161221b5760405162461bcd60e51b815260040161076390613216565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c6a565b506001949350505050565b6122528383612333565b61225f600084848461213b565b610a745760405162461bcd60e51b815260040161076390613216565b6001600160a01b0383166122d6576122d181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6122f9565b816001600160a01b0316836001600160a01b0316146122f9576122f98382612481565b6001600160a01b03821661231057610a748161251e565b826001600160a01b0316826001600160a01b031614610a7457610a7482826125cd565b6001600160a01b0382166123895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610763565b6000818152600260205260409020546001600160a01b0316156123ee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610763565b6123fa600083836120e3565b6001600160a01b03821660009081526003602052604081208054600192906124239084906131fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161248e84611188565b6124989190612d28565b6000838152600760205260409020549091508082146124eb576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061253090600190612d28565b6000838152600960205260408120546008805493945090928490811061255857612558612bf2565b90600052602060002001549050806008838154811061257957612579612bf2565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125b1576125b16132d6565b6001900381819060005260206000200160009055905550505050565b60006125d883611188565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461261d90612c67565b90600052602060002090601f01602090048101928261263f5760008555612685565b82601f1061265857805160ff1916838001178555612685565b82800160010185558215612685579182015b8281111561268557825182559160200191906001019061266a565b50612691929150612695565b5090565b5b808211156126915760008155600101612696565b6001600160e01b0319811681146117c357600080fd5b6000602082840312156126d257600080fd5b81356126dd816126aa565b9392505050565b60005b838110156126ff5781810151838201526020016126e7565b8381111561158a5750506000910152565b600081518084526127288160208601602086016126e4565b601f01601f19169290920160200192915050565b6020815260006126dd6020830184612710565b60006020828403121561276157600080fd5b5035919050565b6001600160a01b03811681146117c357600080fd5b6000806040838503121561279057600080fd5b823561279b81612768565b946020939093013593505050565b600061010061ffff8b16835260ff808b166020850152808a1660408501528089166060850152808816608085015280871660a085015280861660c0850152508060e08401526127fa81840185612710565b9b9a5050505050505050505050565b60008060006060848603121561281e57600080fd5b833561282981612768565b9250602084013561283981612768565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561287b5761287b61284a565b604051601f8501601f19908116603f011681019082821181831017156128a3576128a361284a565b816040528093508581528686860111156128bc57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156128e857600080fd5b813567ffffffffffffffff8111156128ff57600080fd5b8201601f8101841361291057600080fd5b611c6a84823560208401612860565b60006020828403121561293157600080fd5b81356126dd81612768565b600081518084526020808501945080840160005b8381101561299257815180516001600160e81b031688528381015160ff168489015260409081015161ffff169088015260609096019590820190600101612950565b509495945050505050565b6040815261ffff835116604082015260ff6020840151166060820152600060408401516129cf608084018260ff169052565b50606084015160ff811660a084015250608084015160ff811660c08401525060a084015160ff811660e08401525060c0840151610100612a138185018360ff169052565b60e086015191508061012085015250612a30610140840182612710565b90508281036020840152612a44818561293c565b95945050505050565b80151581146117c357600080fd5b60008060408385031215612a6e57600080fd5b8235612a7981612768565b91506020830135612a8981612a4d565b809150509250929050565b60008060008060808587031215612aaa57600080fd5b8435612ab581612768565b93506020850135612ac581612768565b925060408501359150606085013567ffffffffffffffff811115612ae857600080fd5b8501601f81018713612af957600080fd5b612b0887823560208401612860565b91505092959194509250565b60008060208385031215612b2757600080fd5b823567ffffffffffffffff80821115612b3f57600080fd5b818501915085601f830112612b5357600080fd5b813581811115612b6257600080fd5b8660208260051b8501011115612b7757600080fd5b60209290920196919550909350505050565b60008060408385031215612b9c57600080fd5b8235612ba781612768565b91506020830135612a8981612768565b600060208284031215612bc957600080fd5b813567ffffffffffffffff811115612be057600080fd5b8201606081850312156126dd57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612c3857612c38612c08565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612c6257612c62612c3d565b500490565b600181811c90821680612c7b57607f821691505b60208210811415612c9c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082821015612d3a57612d3a612c08565b500390565b600060208284031215612d5157600080fd5b5051919050565b600060208284031215612d6a57600080fd5b81516126dd81612a4d565b60008235605e19833603018112612d8b57600080fd5b9190910192915050565b6000600019821415612da957612da9612c08565b5060010190565b6000808454612dbe81612c67565b60018281168015612dd65760018114612de757612e16565b60ff19841687528287019450612e16565b8860005260208060002060005b85811015612e0d5781548a820152908401908201612df4565b50505082870194505b505050508351612e2a8183602088016126e4565b64173539b7b760d91b9101908152600501949350505050565b6000823560fe19833603018112612d8b57600080fd5b61ffff811681146117c357600080fd5b600060208284031215612e7b57600080fd5b81356126dd81612e59565b600060208284031215612e9857600080fd5b81516126dd81612768565b6000808335601e19843603018112612eba57600080fd5b83018035915067ffffffffffffffff821115612ed557600080fd5b6020019150606081023603821315612eec57600080fd5b9250929050565b6000813560ff8116811461083657600080fd5b81356001600160e81b038116808214612f1e57600080fd5b82546001600160e81b0319811682178455915060ff60e81b612f4260208601612ef3565b60e81b1661ffff60f01b81838286161717855560408601359350612f6584612e59565b911760f09290921b1617905550565b6000808335601e19843603018112612f8b57600080fd5b83018035915067ffffffffffffffff821115612fa657600080fd5b602001915036819003821315612eec57600080fd5b601f821115610a7457600081815260208120601f850160051c81016020861015612fe25750805b601f850160051c820191505b81811015610b2857828155600101612fee565b67ffffffffffffffff8311156130195761301961284a565b61302d836130278354612c67565b83612fbb565b6000601f84116001811461306157600085156130495750838201355b600019600387901b1c1916600186901b1783556130bb565b600083815260209020601f19861690835b828110156130925786850135825560209485019460019092019101613072565b50868210156130af5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81356130cd81612e59565b61ffff8116905081548161ffff19821617835562ff00006130f060208601612ef3565b60101b168262ffffff19831617178355505061312b61311160408401612ef3565b825463ff000000191660189190911b63ff00000016178255565b61315661313a60608401612ef3565b825464ff00000000191660209190911b64ff0000000016178255565b61318361316560808401612ef3565b825465ff0000000000191660289190911b65ff000000000016178255565b6131b261319260a08401612ef3565b825466ff000000000000191660309190911b66ff00000000000016178255565b6131e36131c160c08401612ef3565b825467ff00000000000000191660389190911b67ff0000000000000016178255565b6131f060e0830183612f74565b61158a818360018601613001565b6000821982111561321157613211612c08565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261327757613277612c3d565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132af90830184612710565b9695505050505050565b6000602082840312156132cb57600080fd5b81516126dd816126aa565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a9680db9dc7f1e91d14b56a6fb46ee26b102af075d5aed06f009e50904ec5f3b64736f6c634300080900330000000000000000000000000d559a63df6016e1dfbfa0b0a8929a3d606f7f90000000000000000000000000d342a4f0397b4268e6adce89b9b88c746afa85ee

Deployed Bytecode

0x6080604052600436106102295760003560e01c80636c0360eb11610123578063b88d4fde116100ab578063ef70aebf1161006f578063ef70aebf1461069f578063efeb5e58146106b4578063f2fde38b146106d4578063f4473e71146106f4578063f803bf4a1461071457600080fd5b8063b88d4fde146105c9578063c7b1756a146105e9578063c87b56dd14610609578063e3c6add314610629578063e985e9c51461065657600080fd5b80638da5cb5b116100f25780638da5cb5b14610533578063900fadc41461055157806395d89b411461057f578063a22cb46514610594578063ad2e22e2146105b457600080fd5b80636c0360eb146104c95780636fd1f270146104de57806370a08231146104fe578063715018a61461051e57600080fd5b80632f745c59116101b157806355f75eee1161017557806355f75eee1461043457806355f804b31461044a5780635c4719951461046a5780635c975abb1461048a5780636352211e146104a957600080fd5b80632f745c591461039f5780633ccfd60b146103bf57806342842e0e146103d4578063481ff53e146103f45780634f6ccce71461041457600080fd5b80630ce06b68116101f85780630ce06b68146102ec57806316705a711461030c57806318160ddd1461034057806323b872dd1461035f5780632aa909d31461037f57600080fd5b806301ffc9a71461023d57806306fdde0314610272578063081812fc14610294578063095ea7b3146102cc57600080fd5b3661023857610236610729565b005b600080fd5b34801561024957600080fd5b5061025d6102583660046126c0565b610811565b60405190151581526020015b60405180910390f35b34801561027e57600080fd5b5061028761083c565b604051610269919061273c565b3480156102a057600080fd5b506102b46102af36600461274f565b6108ce565b6040516001600160a01b039091168152602001610269565b3480156102d857600080fd5b506102366102e736600461277d565b610963565b3480156102f857600080fd5b5061023661030736600461277d565b610a79565b34801561031857600080fd5b5061032c61032736600461274f565b610b30565b6040516102699897969594939291906127a9565b34801561034c57600080fd5b506008545b604051908152602001610269565b34801561036b57600080fd5b5061023661037a366004612809565b610c31565b34801561038b57600080fd5b5061035161039a36600461274f565b610c62565b3480156103ab57600080fd5b506103516103ba36600461277d565b610cc5565b3480156103cb57600080fd5b50610236610d5b565b3480156103e057600080fd5b506102366103ef366004612809565b610d65565b34801561040057600080fd5b5061025d61040f36600461274f565b610d80565b34801561042057600080fd5b5061035161042f36600461274f565b610d9f565b34801561044057600080fd5b5061035160105481565b34801561045657600080fd5b506102366104653660046128d6565b610e32565b34801561047657600080fd5b5061023661048536600461291f565b610eaa565b34801561049657600080fd5b50600a54600160a01b900460ff1661025d565b3480156104b557600080fd5b506102b46104c436600461274f565b610feb565b3480156104d557600080fd5b50610287611062565b3480156104ea57600080fd5b506102366104f936600461277d565b6110f0565b34801561050a57600080fd5b5061035161051936600461291f565b611188565b34801561052a57600080fd5b5061023661120f565b34801561053f57600080fd5b50600a546001600160a01b03166102b4565b34801561055d57600080fd5b5061057161056c36600461274f565b611243565b60405161026992919061299d565b34801561058b57600080fd5b50610287611452565b3480156105a057600080fd5b506102366105af366004612a5b565b611461565b3480156105c057600080fd5b50610236611526565b3480156105d557600080fd5b506102366105e4366004612a94565b611558565b3480156105f557600080fd5b50610236610604366004612b14565b611590565b34801561061557600080fd5b5061028761062436600461274f565b6115fe565b34801561063557600080fd5b5061035161064436600461274f565b600f6020526000908152604090205481565b34801561066257600080fd5b5061025d610671366004612b89565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ab57600080fd5b506102366116d9565b3480156106c057600080fd5b506102b46106cf36600461274f565b61170b565b3480156106e057600080fd5b506102366106ef36600461291f565b61172b565b34801561070057600080fd5b5061023661070f366004612bb7565b6117c6565b34801561072057600080fd5b50610236611a8b565b60135460ff1661076c5760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064015b60405180910390fd5b6013805460ff19169055600c546001600160a01b03166108fc6064610792476032612c1e565b61079c9190612c53565b6040518115909202916000818181858888f193505050501580156107c4573d6000803e3d6000fd5b50600c600101546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610801573d6000803e3d6000fd5b506013805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b1480610836575061083682611abd565b92915050565b60606000805461084b90612c67565b80601f016020809104026020016040519081016040528092919081815260200182805461087790612c67565b80156108c45780601f10610899576101008083540402835291602001916108c4565b820191906000526020600020905b8154815290600101906020018083116108a757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109475760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610763565b506000908152600460205260409020546001600160a01b031690565b600061096e82610feb565b9050806001600160a01b0316836001600160a01b031614156109dc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610763565b336001600160a01b03821614806109f857506109f88133610671565b610a6a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610763565b610a748383611b0d565b505050565b600a546001600160a01b03163314610aa35760405162461bcd60e51b815260040161076390612ca2565b816001600160a01b03166342842e0e30610ac5600a546001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b158015610b1457600080fd5b505af1158015610b28573d6000803e3d6000fd5b505050505050565b60118181548110610b4057600080fd5b60009182526020909120600290910201805460018201805461ffff8316945060ff62010000840481169463010000008504821694640100000000810483169465010000000000820484169466010000000000008304851694600160381b9093049092169291610bae90612c67565b80601f0160208091040260200160405190810160405280929190818152602001828054610bda90612c67565b8015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b5050505050905088565b610c3b3382611b7b565b610c575760405162461bcd60e51b815260040161076390612cd7565b610a74838383611c72565b6000818152600e6020526040812054610caa5760405162461bcd60e51b815260206004820152600a6024820152694e6f204d616368696e6560b01b6044820152606401610763565b6000828152600e602052604090205461083690600a90612d28565b6000610cd083611188565b8210610d325760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610763565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610d63610729565b565b610a7483838360405180602001604052806000815250611558565b6000818152600260205260408120546001600160a01b03161515610836565b6000610daa60085490565b8210610e0d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610763565b60088281548110610e2057610e20612bf2565b90600052602060002001549050919050565b600a546001600160a01b03163314610e5c5760405162461bcd60e51b815260040161076390612ca2565b8051610e6f90600b906020840190612611565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f681604051610e9f919061273c565b60405180910390a150565b600a546001600160a01b03163314610ed45760405162461bcd60e51b815260040161076390612ca2565b806001600160a01b03811663a9059cbb610ef6600a546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610f3557600080fd5b505afa158015610f49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6d9190612d3f565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610fb357600080fd5b505af1158015610fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a749190612d58565b6000818152600260205260408120546001600160a01b0316806108365760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610763565b600b805461106f90612c67565b80601f016020809104026020016040519081016040528092919081815260200182805461109b90612c67565b80156110e85780601f106110bd576101008083540402835291602001916110e8565b820191906000526020600020905b8154815290600101906020018083116110cb57829003601f168201915b505050505081565b600c816002811061110357611103612bf2565b01546001600160a01b0316336001600160a01b0316146111515760405162461bcd60e51b81526020600482015260096024820152682337b93134b23232b760b91b6044820152606401610763565b81600c826002811061116557611165612bf2565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b60006001600160a01b0382166111f35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610763565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112395760405162461bcd60e51b815260040161076390612ca2565b610d636000611e1d565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c082019290925260e081019190915260606011838154811061129b5761129b612bf2565b60009182526020808320868452601282526040938490208451610100810186526002909402909101805461ffff8116855260ff620100008204811694860194909452630100000081048416958501959095526401000000008504831660608501526501000000000085048316608085015266010000000000008504831660a0850152600160381b90940490911660c0830152600183018054919291849160e084019161134690612c67565b80601f016020809104026020016040519081016040528092919081815260200182805461137290612c67565b80156113bf5780601f10611394576101008083540402835291602001916113bf565b820191906000526020600020905b8154815290600101906020018083116113a257829003601f168201915b505050505081525050915080805480602002602001604051908101604052809291908181526020016000905b8282101561144357600084815260209081902060408051606081018252918501546001600160e81b0381168352600160e81b810460ff1683850152600160f01b900461ffff16908201528252600190920191016113eb565b50505050905091509150915091565b60606001805461084b90612c67565b6001600160a01b0382163314156114ba5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610763565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146115505760405162461bcd60e51b815260040161076390612ca2565b610d63611e6f565b6115623383611b7b565b61157e5760405162461bcd60e51b815260040161076390612cd7565b61158a84848484611f0c565b50505050565b600a546001600160a01b031633146115ba5760405162461bcd60e51b815260040161076390612ca2565b60005b81811015610a74576115ec8383838181106115da576115da612bf2565b905060200281019061070f9190612d75565b806115f681612d95565b9150506115bd565b6000818152600260205260409020546060906001600160a01b031661167d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610763565b6000600b805461168c90612c67565b9050116116a85760405180602001604052806000815250610836565b600b6116b383611f3f565b6040516020016116c4929190612db0565b60405160208183030381529060405292915050565b600a546001600160a01b031633146117035760405162461bcd60e51b815260040161076390612ca2565b600854601055565b600c816002811061171b57600080fd5b01546001600160a01b0316905081565b600a546001600160a01b031633146117555760405162461bcd60e51b815260040161076390612ca2565b6001600160a01b0381166117ba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610763565b6117c381611e1d565b50565b600a546001600160a01b031633146117f05760405162461bcd60e51b815260040161076390612ca2565b601054600854106118435760405162461bcd60e51b815260206004820152601e60248201527f56656e64696e67204d616368696e65206c696d697420657863656564656400006044820152606401610763565b600e60006118518380612e43565b61185f906020810190612e69565b61ffff168152602001908152602001600020546000146118b55760405162461bcd60e51b8152602060048201526011602482015270111d5c1b1a58d85d1948135bdbdb90d85d607a1b6044820152606401610763565b60006118c060085490565b9050600073c3f733ca98e0dad0386979eb96fb1722a1a05e69636352211e6118e88580612e43565b6118f6906020810190612e69565b6040516001600160e01b031960e084901b16815261ffff909116600482015260240160206040518083038186803b15801561193057600080fd5b505afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119689190612e86565b9050611974818361203d565b60005b6119846040850185612ea3565b90508110156119fb5760008381526012602052604090819020906119aa90860186612ea3565b838181106119ba576119ba612bf2565b835460018101855560009485526020909420606090910292909201929190910190506119e68282612f06565b505080806119f390612d95565b915050611977565b506011611a088480612e43565b815460018101835560009283526020909220909160020201611a2a82826130c2565b50611a3b90506020840135436131fe565b6000838152600f6020526040902055611a5582600a6131fe565b600e6000611a638680612e43565b611a71906020810190612e69565b61ffff168152602081019190915260400160002055505050565b600a546001600160a01b03163314611ab55760405162461bcd60e51b815260040161076390612ca2565b610d6361205b565b60006001600160e01b031982166380ac58cd60e01b1480611aee57506001600160e01b03198216635b5e139f60e01b145b8061083657506301ffc9a760e01b6001600160e01b0319831614610836565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b4282610feb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611bf45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610763565b6000611bff83610feb565b9050806001600160a01b0316846001600160a01b03161480611c3a5750836001600160a01b0316611c2f846108ce565b6001600160a01b0316145b80611c6a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c8582610feb565b6001600160a01b031614611ced5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610763565b6001600160a01b038216611d4f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610763565b611d5a8383836120e3565b611d65600082611b0d565b6001600160a01b0383166000908152600360205260408120805460019290611d8e908490612d28565b90915550506001600160a01b0382166000908152600360205260408120805460019290611dbc9084906131fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54600160a01b900460ff16611ebf5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610763565b600a805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b611f17848484611c72565b611f238484848461213b565b61158a5760405162461bcd60e51b815260040161076390613216565b606081611f635750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611f8d5780611f7781612d95565b9150611f869050600a83612c53565b9150611f67565b60008167ffffffffffffffff811115611fa857611fa861284a565b6040519080825280601f01601f191660200182016040528015611fd2576020820181803683370190505b5090505b8415611c6a57611fe7600183612d28565b9150611ff4600a86613268565b611fff9060306131fe565b60f81b81838151811061201457612014612bf2565b60200101906001600160f81b031916908160001a905350612036600a86612c53565b9450611fd6565b612057828260405180602001604052806000815250612248565b5050565b600a54600160a01b900460ff16156120a85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610763565b600a805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611eef3390565b600a54600160a01b900460ff16156121305760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610763565b610a7483838361227b565b60006001600160a01b0384163b1561223d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061217f90339089908890889060040161327c565b602060405180830381600087803b15801561219957600080fd5b505af19250505080156121c9575060408051601f3d908101601f191682019092526121c6918101906132b9565b60015b612223573d8080156121f7576040519150601f19603f3d011682016040523d82523d6000602084013e6121fc565b606091505b50805161221b5760405162461bcd60e51b815260040161076390613216565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c6a565b506001949350505050565b6122528383612333565b61225f600084848461213b565b610a745760405162461bcd60e51b815260040161076390613216565b6001600160a01b0383166122d6576122d181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6122f9565b816001600160a01b0316836001600160a01b0316146122f9576122f98382612481565b6001600160a01b03821661231057610a748161251e565b826001600160a01b0316826001600160a01b031614610a7457610a7482826125cd565b6001600160a01b0382166123895760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610763565b6000818152600260205260409020546001600160a01b0316156123ee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610763565b6123fa600083836120e3565b6001600160a01b03821660009081526003602052604081208054600192906124239084906131fe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161248e84611188565b6124989190612d28565b6000838152600760205260409020549091508082146124eb576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061253090600190612d28565b6000838152600960205260408120546008805493945090928490811061255857612558612bf2565b90600052602060002001549050806008838154811061257957612579612bf2565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125b1576125b16132d6565b6001900381819060005260206000200160009055905550505050565b60006125d883611188565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461261d90612c67565b90600052602060002090601f01602090048101928261263f5760008555612685565b82601f1061265857805160ff1916838001178555612685565b82800160010185558215612685579182015b8281111561268557825182559160200191906001019061266a565b50612691929150612695565b5090565b5b808211156126915760008155600101612696565b6001600160e01b0319811681146117c357600080fd5b6000602082840312156126d257600080fd5b81356126dd816126aa565b9392505050565b60005b838110156126ff5781810151838201526020016126e7565b8381111561158a5750506000910152565b600081518084526127288160208601602086016126e4565b601f01601f19169290920160200192915050565b6020815260006126dd6020830184612710565b60006020828403121561276157600080fd5b5035919050565b6001600160a01b03811681146117c357600080fd5b6000806040838503121561279057600080fd5b823561279b81612768565b946020939093013593505050565b600061010061ffff8b16835260ff808b166020850152808a1660408501528089166060850152808816608085015280871660a085015280861660c0850152508060e08401526127fa81840185612710565b9b9a5050505050505050505050565b60008060006060848603121561281e57600080fd5b833561282981612768565b9250602084013561283981612768565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561287b5761287b61284a565b604051601f8501601f19908116603f011681019082821181831017156128a3576128a361284a565b816040528093508581528686860111156128bc57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156128e857600080fd5b813567ffffffffffffffff8111156128ff57600080fd5b8201601f8101841361291057600080fd5b611c6a84823560208401612860565b60006020828403121561293157600080fd5b81356126dd81612768565b600081518084526020808501945080840160005b8381101561299257815180516001600160e81b031688528381015160ff168489015260409081015161ffff169088015260609096019590820190600101612950565b509495945050505050565b6040815261ffff835116604082015260ff6020840151166060820152600060408401516129cf608084018260ff169052565b50606084015160ff811660a084015250608084015160ff811660c08401525060a084015160ff811660e08401525060c0840151610100612a138185018360ff169052565b60e086015191508061012085015250612a30610140840182612710565b90508281036020840152612a44818561293c565b95945050505050565b80151581146117c357600080fd5b60008060408385031215612a6e57600080fd5b8235612a7981612768565b91506020830135612a8981612a4d565b809150509250929050565b60008060008060808587031215612aaa57600080fd5b8435612ab581612768565b93506020850135612ac581612768565b925060408501359150606085013567ffffffffffffffff811115612ae857600080fd5b8501601f81018713612af957600080fd5b612b0887823560208401612860565b91505092959194509250565b60008060208385031215612b2757600080fd5b823567ffffffffffffffff80821115612b3f57600080fd5b818501915085601f830112612b5357600080fd5b813581811115612b6257600080fd5b8660208260051b8501011115612b7757600080fd5b60209290920196919550909350505050565b60008060408385031215612b9c57600080fd5b8235612ba781612768565b91506020830135612a8981612768565b600060208284031215612bc957600080fd5b813567ffffffffffffffff811115612be057600080fd5b8201606081850312156126dd57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612c3857612c38612c08565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612c6257612c62612c3d565b500490565b600181811c90821680612c7b57607f821691505b60208210811415612c9c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082821015612d3a57612d3a612c08565b500390565b600060208284031215612d5157600080fd5b5051919050565b600060208284031215612d6a57600080fd5b81516126dd81612a4d565b60008235605e19833603018112612d8b57600080fd5b9190910192915050565b6000600019821415612da957612da9612c08565b5060010190565b6000808454612dbe81612c67565b60018281168015612dd65760018114612de757612e16565b60ff19841687528287019450612e16565b8860005260208060002060005b85811015612e0d5781548a820152908401908201612df4565b50505082870194505b505050508351612e2a8183602088016126e4565b64173539b7b760d91b9101908152600501949350505050565b6000823560fe19833603018112612d8b57600080fd5b61ffff811681146117c357600080fd5b600060208284031215612e7b57600080fd5b81356126dd81612e59565b600060208284031215612e9857600080fd5b81516126dd81612768565b6000808335601e19843603018112612eba57600080fd5b83018035915067ffffffffffffffff821115612ed557600080fd5b6020019150606081023603821315612eec57600080fd5b9250929050565b6000813560ff8116811461083657600080fd5b81356001600160e81b038116808214612f1e57600080fd5b82546001600160e81b0319811682178455915060ff60e81b612f4260208601612ef3565b60e81b1661ffff60f01b81838286161717855560408601359350612f6584612e59565b911760f09290921b1617905550565b6000808335601e19843603018112612f8b57600080fd5b83018035915067ffffffffffffffff821115612fa657600080fd5b602001915036819003821315612eec57600080fd5b601f821115610a7457600081815260208120601f850160051c81016020861015612fe25750805b601f850160051c820191505b81811015610b2857828155600101612fee565b67ffffffffffffffff8311156130195761301961284a565b61302d836130278354612c67565b83612fbb565b6000601f84116001811461306157600085156130495750838201355b600019600387901b1c1916600186901b1783556130bb565b600083815260209020601f19861690835b828110156130925786850135825560209485019460019092019101613072565b50868210156130af5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81356130cd81612e59565b61ffff8116905081548161ffff19821617835562ff00006130f060208601612ef3565b60101b168262ffffff19831617178355505061312b61311160408401612ef3565b825463ff000000191660189190911b63ff00000016178255565b61315661313a60608401612ef3565b825464ff00000000191660209190911b64ff0000000016178255565b61318361316560808401612ef3565b825465ff0000000000191660289190911b65ff000000000016178255565b6131b261319260a08401612ef3565b825466ff000000000000191660309190911b66ff00000000000016178255565b6131e36131c160c08401612ef3565b825467ff00000000000000191660389190911b67ff0000000000000016178255565b6131f060e0830183612f74565b61158a818360018601613001565b6000821982111561321157613211612c08565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008261327757613277612c3d565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132af90830184612710565b9695505050505050565b6000602082840312156132cb57600080fd5b81516126dd816126aa565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a9680db9dc7f1e91d14b56a6fb46ee26b102af075d5aed06f009e50904ec5f3b64736f6c63430008090033

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

0000000000000000000000000d559a63df6016e1dfbfa0b0a8929a3d606f7f90000000000000000000000000d342a4f0397b4268e6adce89b9b88c746afa85ee

-----Decoded View---------------
Arg [0] : _beneficiaries (address[2]): 0x0d559a63Df6016E1DFbfA0b0A8929a3D606f7F90,0xD342a4F0397B4268e6adce89b9B88C746AFA85Ee

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000d559a63df6016e1dfbfa0b0a8929a3d606f7f90
Arg [1] : 000000000000000000000000d342a4f0397b4268e6adce89b9b88c746afa85ee


Deployed Bytecode Sourcemap

684:6749:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6836:11;:9;:11::i;:::-;684:6749;;;;;938:224:5;;;;;;;;;;-1:-1:-1;938:224:5;;;;;:::i;:::-;;:::i;:::-;;;565:14:14;;558:22;540:41;;528:2;513:18;938:224:5;;;;;;;;2491:100:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4050:221::-;;;;;;;;;;-1:-1:-1;4050:221:2;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:14;;;1674:51;;1662:2;1647:18;4050:221:2;1528:203:14;3573:411:2;;;;;;;;;;-1:-1:-1;3573:411:2;;;;;:::i;:::-;;:::i;3629:173:13:-;;;;;;;;;;-1:-1:-1;3629:173:13;;;;;:::i;:::-;;:::i;1768:46::-;;;;;;;;;;-1:-1:-1;1768:46:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;1578:113:5:-;;;;;;;;;;-1:-1:-1;1666:10:5;:17;1578:113;;;3230:25:14;;;3218:2;3203:18;1578:113:5;3084:177:14;4940:339:2;;;;;;;;;;-1:-1:-1;4940:339:2;;;;;:::i;:::-;;:::i;5222:258:13:-;;;;;;;;;;-1:-1:-1;5222:258:13;;;;;:::i;:::-;;:::i;1246:256:5:-;;;;;;;;;;-1:-1:-1;1246:256:5;;;;;:::i;:::-;;:::i;6955:51:13:-;;;;;;;;;;;;;:::i;5350:185:2:-;;;;;;;;;;-1:-1:-1;5350:185:2;;;;;:::i;:::-;;:::i;5008:119:13:-;;;;;;;;;;-1:-1:-1;5008:119:13;;;;;:::i;:::-;;:::i;1768:233:5:-;;;;;;;;;;-1:-1:-1;1768:233:5;;;;;:::i;:::-;;:::i;1724:39:13:-;;;;;;;;;;;;;;;;3148:133;;;;;;;;;;-1:-1:-1;3148:133:13;;;;;:::i;:::-;;:::i;3364:181::-;;;;;;;;;;-1:-1:-1;3364:181:13;;;;;:::i;:::-;;:::i;1079:86:1:-;;;;;;;;;;-1:-1:-1;1150:7:1;;-1:-1:-1;;;1150:7:1;;;;1079:86;;2185:239:2;;;;;;;;;;-1:-1:-1;2185:239:2;;;;;:::i;:::-;;:::i;799:21:13:-;;;;;;;;;;;;;:::i;6555:184::-;;;;;;;;;;-1:-1:-1;6555:184:13;;;;;:::i;:::-;;:::i;1915:208:2:-;;;;;;;;;;-1:-1:-1;1915:208:2;;;;;:::i;:::-;;:::i;1657:94:0:-;;;;;;;;;;;;;:::i;1006:87::-;;;;;;;;;;-1:-1:-1;1079:6:0;;-1:-1:-1;;;;;1079:6:0;1006:87;;6212:274:13;;;;;;;;;;-1:-1:-1;6212:274:13;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2660:104:2:-;;;;;;;;;;;;;:::i;4343:295::-;;;;;;;;;;-1:-1:-1;4343:295:2;;;;;:::i;:::-;;:::i;2686:60:13:-;;;;;;;;;;;;;:::i;5606:328:2:-;;;;;;;;;;-1:-1:-1;5606:328:2;;;;;:::i;:::-;;:::i;4755:168:13:-;;;;;;;;;;-1:-1:-1;4755:168:13;;;;;:::i;:::-;;:::i;5542:318::-;;;;;;;;;;-1:-1:-1;5542:318:13;;;;;:::i;:::-;;:::i;1613:62::-;;;;;;;;;;-1:-1:-1;1613:62:13;;;;;:::i;:::-;;;;;;;;;;;;;;4709:164:2;;;;;;;;;;-1:-1:-1;4709:164:2;;;;;:::i;:::-;-1:-1:-1;;;;;4830:25:2;;;4806:4;4830:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4709:164;2817:88:13;;;;;;;;;;;;;:::i;961:31::-;;;;;;;;;;-1:-1:-1;961:31:13;;;;;:::i;:::-;;:::i;1906:192:0:-;;;;;;;;;;-1:-1:-1;1906:192:0;;;;;:::i;:::-;;:::i;3869:807:13:-;;;;;;;;;;-1:-1:-1;3869:807:13;;;;;:::i;:::-;;:::i;2530:56::-;;;;;;;;;;;;;:::i;7155:273::-;7202:10;;;;7194:32;;;;-1:-1:-1;;;7194:32:13;;10196:2:14;7194:32:13;;;10178:21:14;10235:1;10215:18;;;10208:29;-1:-1:-1;;;10253:18:14;;;10246:39;10302:18;;7194:32:13;;;;;;;;;7235:10;:18;;-1:-1:-1;;7235:18:13;;;7270:13;:16;-1:-1:-1;;;;;7270:16:13;7262:68;7326:3;7297:26;:21;7321:2;7297:26;:::i;:::-;:32;;;;:::i;:::-;7262:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7347:13:13;7361:1;7347:16;;7339:57;;-1:-1:-1;;;;;7347:16:13;;;;7374:21;7339:57;;;;;7347:16;7339:57;7347:16;7339:57;7374:21;7347:16;7339:57;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7405:10:13;:17;;-1:-1:-1;;7405:17:13;7418:4;7405:17;;;7155:273::o;938:224:5:-;1040:4;-1:-1:-1;;;;;;1064:50:5;;-1:-1:-1;;;1064:50:5;;:90;;;1118:36;1142:11;1118:23;:36::i;:::-;1057:97;938:224;-1:-1:-1;;938:224:5:o;2491:100:2:-;2545:13;2578:5;2571:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2491:100;:::o;4050:221::-;4126:7;7533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7533:16:2;4146:73;;;;-1:-1:-1;;;4146:73:2;;11612:2:14;4146:73:2;;;11594:21:14;11651:2;11631:18;;;11624:30;11690:34;11670:18;;;11663:62;-1:-1:-1;;;11741:18:14;;;11734:42;11793:19;;4146:73:2;11410:408:14;4146:73:2;-1:-1:-1;4239:24:2;;;;:15;:24;;;;;;-1:-1:-1;;;;;4239:24:2;;4050:221::o;3573:411::-;3654:13;3670:23;3685:7;3670:14;:23::i;:::-;3654:39;;3718:5;-1:-1:-1;;;;;3712:11:2;:2;-1:-1:-1;;;;;3712:11:2;;;3704:57;;;;-1:-1:-1;;;3704:57:2;;12025:2:14;3704:57:2;;;12007:21:14;12064:2;12044:18;;;12037:30;12103:34;12083:18;;;12076:62;-1:-1:-1;;;12154:18:14;;;12147:31;12195:19;;3704:57:2;11823:397:14;3704:57:2;682:10:9;-1:-1:-1;;;;;3796:21:2;;;;:62;;-1:-1:-1;3821:37:2;3838:5;682:10:9;4709:164:2;:::i;3821:37::-;3774:168;;;;-1:-1:-1;;;3774:168:2;;12427:2:14;3774:168:2;;;12409:21:14;12466:2;12446:18;;;12439:30;12505:34;12485:18;;;12478:62;12576:26;12556:18;;;12549:54;12620:19;;3774:168:2;12225:420:14;3774:168:2;3955:21;3964:2;3968:7;3955:8;:21::i;:::-;3643:341;3573:411;;:::o;3629:173:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;3732:13:13::1;-1:-1:-1::0;;;;;3724:39:13::1;;3772:4;3779:7;1079:6:0::0;;-1:-1:-1;;;;;1079:6:0;;1006:87;3779:7:13::1;3724:72;::::0;-1:-1:-1;;;;;;3724:72:13::1;::::0;;;;;;-1:-1:-1;;;;;13269:15:14;;;3724:72:13::1;::::0;::::1;13251:34:14::0;13321:15;;13301:18;;;13294:43;13353:18;;;13346:34;;;13186:18;;3724:72:13::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3629:173:::0;;:::o;1768:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1768:46:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1768:46:13;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4940:339:2:-;5135:41;682:10:9;5168:7:2;5135:18;:41::i;:::-;5127:103;;;;-1:-1:-1;;;5127:103:2;;;;;;;:::i;:::-;5243:28;5253:4;5259:2;5263:7;5243:9;:28::i;5222:258:13:-;5312:7;5336:50;;;:23;:50;;;;;;5328:77;;;;-1:-1:-1;;;5328:77:13;;14011:2:14;5328:77:13;;;13993:21:14;14050:2;14030:18;;;14023:30;-1:-1:-1;;;14069:18:14;;;14062:40;14119:18;;5328:77:13;13809:334:14;5328:77:13;5419:50;;;;:23;:50;;;;;;:55;;5472:2;;5419:55;:::i;1246:256:5:-;1343:7;1379:23;1396:5;1379:16;:23::i;:::-;1371:5;:31;1363:87;;;;-1:-1:-1;;;1363:87:5;;14480:2:14;1363:87:5;;;14462:21:14;14519:2;14499:18;;;14492:30;14558:34;14538:18;;;14531:62;-1:-1:-1;;;14609:18:14;;;14602:41;14660:19;;1363:87:5;14278:407:14;1363:87:5;-1:-1:-1;;;;;;1468:19:5;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1246:256::o;6955:51:13:-;6989:11;:9;:11::i;:::-;6955:51::o;5350:185:2:-;5488:39;5505:4;5511:2;5515:7;5488:39;;;;;;;;;;;;:16;:39::i;5008:119:13:-;5084:4;7533:16:2;;;:7;:16;;;;;;-1:-1:-1;;;;;7533:16:2;:30;;5104:17:13;7444:127:2;1768:233:5;1843:7;1879:30;1666:10;:17;;1578:113;1879:30;1871:5;:38;1863:95;;;;-1:-1:-1;;;1863:95:5;;14892:2:14;1863:95:5;;;14874:21:14;14931:2;14911:18;;;14904:30;14970:34;14950:18;;;14943:62;-1:-1:-1;;;15021:18:14;;;15014:42;15073:19;;1863:95:5;14690:408:14;1863:95:5;1976:10;1987:5;1976:17;;;;;;;;:::i;:::-;;;;;;;;;1969:24;;1768:233;;;:::o;3148:133:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;3219:21:13;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;3252:23;3263:11;3252:23;;;;;;:::i;:::-;;;;;;;;3148:133:::0;:::o;3364:181::-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;3463:13:13;-1:-1:-1;;;;;3484:14:13;::::1;;3499:7;1079:6:0::0;;-1:-1:-1;;;;;1079:6:0;;1006:87;3499:7:13::1;3508:30;::::0;-1:-1:-1;;;3508:30:13;;3532:4:::1;3508:30;::::0;::::1;1674:51:14::0;-1:-1:-1;;;;;3508:15:13;::::1;::::0;::::1;::::0;1647:18:14;;3508:30:13::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3484:55;::::0;-1:-1:-1;;;;;;3484:55:13::1;::::0;;;;;;-1:-1:-1;;;;;15484:32:14;;;3484:55:13::1;::::0;::::1;15466:51:14::0;15533:18;;;15526:34;15439:18;;3484:55:13::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2185:239:2:-:0;2257:7;2293:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2293:16:2;2328:19;2320:73;;;;-1:-1:-1;;;2320:73:2;;16023:2:14;2320:73:2;;;16005:21:14;16062:2;16042:18;;;16035:30;16101:34;16081:18;;;16074:62;-1:-1:-1;;;16152:18:14;;;16145:39;16201:19;;2320:73:2;15821:405:14;799:21:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6555:184::-;6655:13;6669:6;6655:21;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;6655:21:13;682:10:9;-1:-1:-1;;;;;6639:37:13;;6631:59;;;;-1:-1:-1;;;6631:59:13;;16433:2:14;6631:59:13;;;16415:21:14;16472:1;16452:18;;;16445:29;-1:-1:-1;;;16490:18:14;;;16483:39;16539:18;;6631:59:13;16231:332:14;6631:59:13;6721:12;6697:13;6711:6;6697:21;;;;;;;:::i;:::-;;:36;;-1:-1:-1;;;;;;6697:36:13;-1:-1:-1;;;;;6697:36:13;;;;;;;;;;-1:-1:-1;;6555:184:13:o;1915:208:2:-;1987:7;-1:-1:-1;;;;;2015:19:2;;2007:74;;;;-1:-1:-1;;;2007:74:2;;16770:2:14;2007:74:2;;;16752:21:14;16809:2;16789:18;;;16782:30;16848:34;16828:18;;;16821:62;-1:-1:-1;;;16899:18:14;;;16892:40;16949:19;;2007:74:2;16568:406:14;2007:74:2;-1:-1:-1;;;;;;2099:16:2;;;;;:9;:16;;;;;;;1915:208::o;1657:94:0:-;1079:6;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;1722:21:::1;1740:1;1722:9;:21::i;6212:274:13:-:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6348:34:13;6402:22;6425:17;6402:41;;;;;;;;:::i;:::-;;;;;;;;;6445:34;;;:15;:34;;;;;;;6394:86;;;;;;;6402:41;;;;;;;6394:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6394:86:13;;;;;;;;;;;;;;;6445:34;;6394:86;6402:41;;6394:86;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6394:86:13;;;;-1:-1:-1;;;6394:86:13;;;;;;;;-1:-1:-1;;;6394:86:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6212:274;;;:::o;2660:104:2:-;2716:13;2749:7;2742:14;;;;;:::i;4343:295::-;-1:-1:-1;;;;;4446:24:2;;682:10:9;4446:24:2;;4438:62;;;;-1:-1:-1;;;4438:62:2;;17181:2:14;4438:62:2;;;17163:21:14;17220:2;17200:18;;;17193:30;17259:27;17239:18;;;17232:55;17304:18;;4438:62:2;16979:349:14;4438:62:2;682:10:9;4513:32:2;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4513:42:2;;;;;;;;;;;;:53;;-1:-1:-1;;4513:53:2;;;;;;;;;;4582:48;;540:41:14;;;4513:42:2;;682:10:9;4582:48:2;;513:18:14;4582:48:2;;;;;;;4343:295;;:::o;2686:60:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;2730:10:13::1;:8;:10::i;5606:328:2:-:0;5781:41;682:10:9;5814:7:2;5781:18;:41::i;:::-;5773:103;;;;-1:-1:-1;;;5773:103:2;;;;;;;:::i;:::-;5887:39;5901:4;5907:2;5911:7;5920:5;5887:13;:39::i;:::-;5606:328;;;;:::o;4755:168:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;4832:6:13::1;4827:91;4844:16:::0;;::::1;4827:91;;;4880:28;4899:5;;4905:1;4899:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;4880:28::-;4862:3:::0;::::1;::::0;::::1;:::i;:::-;;;;4827:91;;5542:318:::0;7509:4:2;7533:16;;;:7;:16;;;;;;5628:13:13;;-1:-1:-1;;;;;7533:16:2;5653:77:13;;;;-1:-1:-1;;;5653:77:13;;18005:2:14;5653:77:13;;;17987:21:14;18044:2;18024:18;;;18017:30;18083:34;18063:18;;;18056:62;-1:-1:-1;;;18134:18:14;;;18127:45;18189:19;;5653:77:13;17803:411:14;5653:77:13;5768:1;5750:7;5744:21;;;;;:::i;:::-;;;:25;:110;;;;;;;;;;;;;;;;;5804:7;5813:19;:8;:17;:19::i;:::-;5779:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5737:117;5542:318;-1:-1:-1;;5542:318:13:o;2817:88::-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;1666:10:5;:17;2865:18:13::1;:34:::0;2817:88::o;961:31::-;;;;;;;;;;;;;;-1:-1:-1;;;;;961:31:13;;-1:-1:-1;961:31:13;:::o;1906:192:0:-;1079:6;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1995:22:0;::::1;1987:73;;;::::0;-1:-1:-1;;;1987:73:0;;19697:2:14;1987:73:0::1;::::0;::::1;19679:21:14::0;19736:2;19716:18;;;19709:30;19775:34;19755:18;;;19748:62;-1:-1:-1;;;19826:18:14;;;19819:36;19872:19;;1987:73:0::1;19495:402:14::0;1987:73:0::1;2071:19;2081:8;2071:9;:19::i;:::-;1906:192:::0;:::o;3869:807:13:-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;3987:18:13::1;::::0;1666:10:5;:17;3971:34:13::1;3962:78;;;::::0;-1:-1:-1;;;3962:78:13;;20104:2:14;3962:78:13::1;::::0;::::1;20086:21:14::0;20143:2;20123:18;;;20116:30;20182:32;20162:18;;;20155:60;20232:18;;3962:78:13::1;19902:354:14::0;3962:78:13::1;4056:23;:56;4080:16;:8:::0;;:16:::1;:::i;:::-;:31;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;4056:56;;;;;;;;;;;;;;4116:1;4056:61;4047:92;;;::::0;-1:-1:-1;;;4047:92:13;;21172:2:14;4047:92:13::1;::::0;::::1;21154:21:14::0;21211:2;21191:18;;;21184:30;-1:-1:-1;;;21230:18:14;;;21223:47;21287:18;;4047:92:13::1;20970:341:14::0;4047:92:13::1;4148:15;4166:13;1666:10:5::0;:17;;1578:113;4166:13:13::1;4148:31:::0;-1:-1:-1;4186:20:13::1;892:42;4209:34;4244:16;:8:::0;;:16:::1;:::i;:::-;:31;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;4209:67;::::0;-1:-1:-1;;;;;;4209:67:13::1;::::0;;;;;;21491:6:14;21479:19;;;4209:67:13::1;::::0;::::1;21461:38:14::0;21434:18;;4209:67:13::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4186:90;;4283:32;4293:12;4307:7;4283:9;:32::i;:::-;4329:9;4324:128;4348:20;;::::0;::::1;:8:::0;:20:::1;:::i;:::-;:27;;4344:1;:31;4324:128;;;4390:24;::::0;;;:15:::1;:24;::::0;;;;;;;4420:20:::1;::::0;;::::1;:8:::0;:20:::1;:::i;:::-;4441:1;4420:23;;;;;;;:::i;:::-;4390:54:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;4390:54:13;;;::::1;::::0;;;4420:23:::1;::::0;;::::1;::::0;;;::::1;::::0;4390:54;;;::::1;::::0;-1:-1:-1;4390:54:13::1;4420:23:::0;4390:54;::::1;:::i;:::-;;;4377:3;;;;;:::i;:::-;;;;4324:128;;;-1:-1:-1::0;4460:22:13::1;4488:16;:8:::0;;:16:::1;:::i;:::-;4460:45:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;4460:45:13;;;::::1;::::0;;;;;::::1;;;;::::0;;::::1;:::i;:::-;-1:-1:-1::0;4550:42:13::1;::::0;-1:-1:-1;4565:27:13::1;::::0;::::1;;4550:12;:42;:::i;:::-;4512:35;::::0;;;:26:::1;:35;::::0;;;;:80;4658:12:::1;4539:7:::0;4668:2:::1;4658:12;:::i;:::-;4599:23;:56;4623:16;:8:::0;;:16:::1;:::i;:::-;:31;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;4599:56;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;4599:56:13;:71;-1:-1:-1;;;3869:807:13:o;2530:56::-;1079:6:0;;-1:-1:-1;;;;;1079:6:0;682:10:9;1226:23:0;1218:68;;;;-1:-1:-1;;;1218:68:0;;;;;;;:::i;:::-;2572:8:13::1;:6;:8::i;1546:305:2:-:0;1648:4;-1:-1:-1;;;;;;1685:40:2;;-1:-1:-1;;;1685:40:2;;:105;;-1:-1:-1;;;;;;;1742:48:2;;-1:-1:-1;;;1742:48:2;1685:105;:158;;;-1:-1:-1;;;;;;;;;;896:40:11;;;1807:36:2;787:157:11;11426:174:2;11501:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11501:29:2;-1:-1:-1;;;;;11501:29:2;;;;;;;;:24;;11555:23;11501:24;11555:14;:23::i;:::-;-1:-1:-1;;;;;11546:46:2;;;;;;;;;;;11426:174;;:::o;7738:348::-;7831:4;7533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7533:16:2;7848:73;;;;-1:-1:-1;;;7848:73:2;;28298:2:14;7848:73:2;;;28280:21:14;28337:2;28317:18;;;28310:30;28376:34;28356:18;;;28349:62;-1:-1:-1;;;28427:18:14;;;28420:42;28479:19;;7848:73:2;28096:408:14;7848:73:2;7932:13;7948:23;7963:7;7948:14;:23::i;:::-;7932:39;;8001:5;-1:-1:-1;;;;;7990:16:2;:7;-1:-1:-1;;;;;7990:16:2;;:51;;;;8034:7;-1:-1:-1;;;;;8010:31:2;:20;8022:7;8010:11;:20::i;:::-;-1:-1:-1;;;;;8010:31:2;;7990:51;:87;;;-1:-1:-1;;;;;;4830:25:2;;;4806:4;4830:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8045:32;7982:96;7738:348;-1:-1:-1;;;;7738:348:2:o;10730:578::-;10889:4;-1:-1:-1;;;;;10862:31:2;:23;10877:7;10862:14;:23::i;:::-;-1:-1:-1;;;;;10862:31:2;;10854:85;;;;-1:-1:-1;;;10854:85:2;;28711:2:14;10854:85:2;;;28693:21:14;28750:2;28730:18;;;28723:30;28789:34;28769:18;;;28762:62;-1:-1:-1;;;28840:18:14;;;28833:39;28889:19;;10854:85:2;28509:405:14;10854:85:2;-1:-1:-1;;;;;10958:16:2;;10950:65;;;;-1:-1:-1;;;10950:65:2;;29121:2:14;10950:65:2;;;29103:21:14;29160:2;29140:18;;;29133:30;29199:34;29179:18;;;29172:62;-1:-1:-1;;;29250:18:14;;;29243:34;29294:19;;10950:65:2;28919:400:14;10950:65:2;11028:39;11049:4;11055:2;11059:7;11028:20;:39::i;:::-;11132:29;11149:1;11153:7;11132:8;:29::i;:::-;-1:-1:-1;;;;;11174:15:2;;;;;;:9;:15;;;;;:20;;11193:1;;11174:15;:20;;11193:1;;11174:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11205:13:2;;;;;;:9;:13;;;;;:18;;11222:1;;11205:13;:18;;11222:1;;11205:18;:::i;:::-;;;;-1:-1:-1;;11234:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11234:21:2;-1:-1:-1;;;;;11234:21:2;;;;;;;;;11273:27;;11234:16;;11273:27;;;;;;;10730:578;;;:::o;2106:173:0:-;2181:6;;;-1:-1:-1;;;;;2198:17:0;;;-1:-1:-1;;;;;;2198:17:0;;;;;;;2231:40;;2181:6;;;2198:17;2181:6;;2231:40;;2162:16;;2231:40;2151:128;2106:173;:::o;2138:120:1:-;1150:7;;-1:-1:-1;;;1150:7:1;;;;1674:41;;;;-1:-1:-1;;;1674:41:1;;29526:2:14;1674:41:1;;;29508:21:14;29565:2;29545:18;;;29538:30;-1:-1:-1;;;29584:18:14;;;29577:50;29644:18;;1674:41:1;29324:344:14;1674:41:1;2197:7:::1;:15:::0;;-1:-1:-1;;;;2197:15:1::1;::::0;;2228:22:::1;682:10:9::0;2237:12:1::1;2228:22;::::0;-1:-1:-1;;;;;1692:32:14;;;1674:51;;1662:2;1647:18;2228:22:1::1;;;;;;;2138:120::o:0;6816:315:2:-;6973:28;6983:4;6989:2;6993:7;6973:9;:28::i;:::-;7020:48;7043:4;7049:2;7053:7;7062:5;7020:22;:48::i;:::-;7012:111;;;;-1:-1:-1;;;7012:111:2;;;;;;;:::i;288:723:10:-;344:13;565:10;561:53;;-1:-1:-1;;592:10:10;;;;;;;;;;;;-1:-1:-1;;;592:10:10;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:10;;-1:-1:-1;744:2:10;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:10;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:10;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;878:56:10;;;;;;;;-1:-1:-1;949:11:10;958:2;949:11;;:::i;:::-;;;818:154;;8428:110:2;8504:26;8514:2;8518:7;8504:26;;;;;;;;;;;;:9;:26::i;:::-;8428:110;;:::o;1879:118:1:-;1150:7;;-1:-1:-1;;;1150:7:1;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:1;;30411:2:14;1396:38:1;;;30393:21:14;30450:2;30430:18;;;30423:30;-1:-1:-1;;;30469:18:14;;;30462:46;30525:18;;1396:38:1;30209:340:14;1396:38:1;1939:7:::1;:14:::0;;-1:-1:-1;;;;1939:14:1::1;-1:-1:-1::0;;;1939:14:1::1;::::0;;1969:20:::1;1976:12;682:10:9::0;;602:98;5926:183:13;1150:7:1;;-1:-1:-1;;;1150:7:1;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:1;;30411:2:14;1396:38:1;;;30393:21:14;30450:2;30430:18;;;30423:30;-1:-1:-1;;;30469:18:14;;;30462:46;30525:18;;1396:38:1;30209:340:14;1396:38:1;6058:45:13::1;6085:4;6091:2;6095:7;6058:26;:45::i;12165:799:2:-:0;12320:4;-1:-1:-1;;;;;12341:13:2;;1066:20:8;1114:8;12337:620:2;;12377:72;;-1:-1:-1;;;12377:72:2;;-1:-1:-1;;;;;12377:36:2;;;;;:72;;682:10:9;;12428:4:2;;12434:7;;12443:5;;12377:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12377:72:2;;;;;;;;-1:-1:-1;;12377:72:2;;;;;;;;;;;;:::i;:::-;;;12373:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12619:13:2;;12615:272;;12662:60;;-1:-1:-1;;;12662:60:2;;;;;;;:::i;12615:272::-;12837:6;12831:13;12822:6;12818:2;12814:15;12807:38;12373:529;-1:-1:-1;;;;;;12500:51:2;-1:-1:-1;;;12500:51:2;;-1:-1:-1;12493:58:2;;12337:620;-1:-1:-1;12941:4:2;12165:799;;;;;;:::o;8765:321::-;8895:18;8901:2;8905:7;8895:5;:18::i;:::-;8946:54;8977:1;8981:2;8985:7;8994:5;8946:22;:54::i;:::-;8924:154;;;;-1:-1:-1;;;8924:154:2;;;;;;;:::i;2614:589:5:-;-1:-1:-1;;;;;2820:18:5;;2816:187;;2855:40;2887:7;4030:10;:17;;4003:24;;;;:15;:24;;;;;:44;;;4058:24;;;;;;;;;;;;3926:164;2855:40;2816:187;;;2925:2;-1:-1:-1;;;;;2917:10:5;:4;-1:-1:-1;;;;;2917:10:5;;2913:90;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3017:16:5;;3013:183;;3050:45;3087:7;3050:36;:45::i;3013:183::-;3123:4;-1:-1:-1;;;;;3117:10:5;:2;-1:-1:-1;;;;;3117:10:5;;3113:83;;3144:40;3172:2;3176:7;3144:27;:40::i;9422:382:2:-;-1:-1:-1;;;;;9502:16:2;;9494:61;;;;-1:-1:-1;;;9494:61:2;;31504:2:14;9494:61:2;;;31486:21:14;;;31523:18;;;31516:30;31582:34;31562:18;;;31555:62;31634:18;;9494:61:2;31302:356:14;9494:61:2;7509:4;7533:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7533:16:2;:30;9566:58;;;;-1:-1:-1;;;9566:58:2;;31865:2:14;9566:58:2;;;31847:21:14;31904:2;31884:18;;;31877:30;31943;31923:18;;;31916:58;31991:18;;9566:58:2;31663:352:14;9566:58:2;9637:45;9666:1;9670:2;9674:7;9637:20;:45::i;:::-;-1:-1:-1;;;;;9695:13:2;;;;;;:9;:13;;;;;:18;;9712:1;;9695:13;:18;;9712:1;;9695:18;:::i;:::-;;;;-1:-1:-1;;9724:16:2;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9724:21:2;-1:-1:-1;;;;;9724:21:2;;;;;;;;9763:33;;9724:16;;;9763:33;;9724:16;;9763:33;9422:382;;:::o;4717:988:5:-;4983:22;5033:1;5008:22;5025:4;5008:16;:22::i;:::-;:26;;;;:::i;:::-;5045:18;5066:26;;;:17;:26;;;;;;4983:51;;-1:-1:-1;5199:28:5;;;5195:328;;-1:-1:-1;;;;;5266:18:5;;5244:19;5266:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5317:30;;;;;;:44;;;5434:30;;:17;:30;;;;;:43;;;5195:328;-1:-1:-1;5619:26:5;;;;:17;:26;;;;;;;;5612:33;;;-1:-1:-1;;;;;5663:18:5;;;;;:12;:18;;;;;:34;;;;;;;5656:41;4717:988::o;6000:1079::-;6278:10;:17;6253:22;;6278:21;;6298:1;;6278:21;:::i;:::-;6310:18;6331:24;;;:15;:24;;;;;;6704:10;:26;;6253:46;;-1:-1:-1;6331:24:5;;6253:46;;6704:26;;;;;;:::i;:::-;;;;;;;;;6682:48;;6768:11;6743:10;6754;6743:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6848:28;;;:15;:28;;;;;;;:41;;;7020:24;;;;;7013:31;7055:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6071:1008;;;6000:1079;:::o;3504:221::-;3589:14;3606:20;3623:2;3606:16;:20::i;:::-;-1:-1:-1;;;;;3637:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3682:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3504:221:5:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:14;-1:-1:-1;;;;;;88:32:14;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:14:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:14;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:14;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:14:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:14;;1343:180;-1:-1:-1;1343:180:14:o;1736:131::-;-1:-1:-1;;;;;1811:31:14;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:14:o;2272:807::-;2554:4;2583:3;2625:6;2617;2613:19;2602:9;2595:38;2652:4;2704:2;2696:6;2692:15;2687:2;2676:9;2672:18;2665:43;2756:2;2748:6;2744:15;2739:2;2728:9;2724:18;2717:43;2808:2;2800:6;2796:15;2791:2;2780:9;2776:18;2769:43;2861:2;2853:6;2849:15;2843:3;2832:9;2828:19;2821:44;2914:2;2906:6;2902:15;2896:3;2885:9;2881:19;2874:44;2967:2;2959:6;2955:15;2949:3;2938:9;2934:19;2927:44;;3008:2;3002:3;2991:9;2987:19;2980:31;3028:45;3069:2;3058:9;3054:18;3046:6;3028:45;:::i;:::-;3020:53;2272:807;-1:-1:-1;;;;;;;;;;;2272:807:14:o;3266:456::-;3343:6;3351;3359;3412:2;3400:9;3391:7;3387:23;3383:32;3380:52;;;3428:1;3425;3418:12;3380:52;3467:9;3454:23;3486:31;3511:5;3486:31;:::i;:::-;3536:5;-1:-1:-1;3593:2:14;3578:18;;3565:32;3606:33;3565:32;3606:33;:::i;:::-;3266:456;;3658:7;;-1:-1:-1;;;3712:2:14;3697:18;;;;3684:32;;3266:456::o;3727:127::-;3788:10;3783:3;3779:20;3776:1;3769:31;3819:4;3816:1;3809:15;3843:4;3840:1;3833:15;3859:632;3924:5;3954:18;3995:2;3987:6;3984:14;3981:40;;;4001:18;;:::i;:::-;4076:2;4070:9;4044:2;4130:15;;-1:-1:-1;;4126:24:14;;;4152:2;4122:33;4118:42;4106:55;;;4176:18;;;4196:22;;;4173:46;4170:72;;;4222:18;;:::i;:::-;4262:10;4258:2;4251:22;4291:6;4282:15;;4321:6;4313;4306:22;4361:3;4352:6;4347:3;4343:16;4340:25;4337:45;;;4378:1;4375;4368:12;4337:45;4428:6;4423:3;4416:4;4408:6;4404:17;4391:44;4483:1;4476:4;4467:6;4459;4455:19;4451:30;4444:41;;;;3859:632;;;;;:::o;4496:451::-;4565:6;4618:2;4606:9;4597:7;4593:23;4589:32;4586:52;;;4634:1;4631;4624:12;4586:52;4674:9;4661:23;4707:18;4699:6;4696:30;4693:50;;;4739:1;4736;4729:12;4693:50;4762:22;;4815:4;4807:13;;4803:27;-1:-1:-1;4793:55:14;;4844:1;4841;4834:12;4793:55;4867:74;4933:7;4928:2;4915:16;4910:2;4906;4902:11;4867:74;:::i;4952:247::-;5011:6;5064:2;5052:9;5043:7;5039:23;5035:32;5032:52;;;5080:1;5077;5070:12;5032:52;5119:9;5106:23;5138:31;5163:5;5138:31;:::i;5204:665::-;5270:3;5308:5;5302:12;5335:6;5330:3;5323:19;5361:4;5390:2;5385:3;5381:12;5374:19;;5427:2;5420:5;5416:14;5448:1;5458:386;5472:6;5469:1;5466:13;5458:386;;;5531:13;;5573:9;;-1:-1:-1;;;;;5569:35:14;5557:48;;5649:11;;;5643:18;5663:4;5639:29;5625:12;;;5618:51;5692:4;5740:11;;;5734:18;5754:6;5730:31;5716:12;;;5709:53;5791:4;5782:14;;;;5819:15;;;;5601:1;5487:9;5458:386;;;-1:-1:-1;5860:3:14;;5204:665;-1:-1:-1;;;;;5204:665:14:o;5874:1372::-;6207:2;6196:9;6189:21;6265:6;6256;6250:13;6246:26;6241:2;6230:9;6226:18;6219:54;6339:4;6331;6323:6;6319:17;6313:24;6309:35;6304:2;6293:9;6289:18;6282:63;6170:4;6392:2;6384:6;6380:15;6374:22;6405:51;6451:3;6440:9;6436:19;6422:12;2259:4;2248:16;2236:29;;2192:75;6405:51;-1:-1:-1;6505:2:14;6493:15;;6487:22;2259:4;2248:16;;6566:3;6551:19;;2236:29;-1:-1:-1;6620:3:14;6608:16;;6602:23;2259:4;2248:16;;6682:3;6667:19;;2236:29;-1:-1:-1;6736:3:14;6724:16;;6718:23;2259:4;2248:16;;6798:3;6783:19;;2236:29;6750:53;6852:3;6844:6;6840:16;6834:23;6876:6;6891:52;6939:2;6928:9;6924:18;6908:14;2259:4;2248:16;2236:29;;2192:75;6891:52;6992:3;6984:6;6980:16;6974:23;6952:45;;7034:2;7028:3;7017:9;7013:19;7006:31;;7057:54;7106:3;7095:9;7091:19;7075:14;7057:54;:::i;:::-;7046:65;;7158:9;7153:3;7149:19;7142:4;7131:9;7127:20;7120:49;7186:54;7236:3;7228:6;7186:54;:::i;:::-;7178:62;5874:1372;-1:-1:-1;;;;;5874:1372:14:o;7251:118::-;7337:5;7330:13;7323:21;7316:5;7313:32;7303:60;;7359:1;7356;7349:12;7374:382;7439:6;7447;7500:2;7488:9;7479:7;7475:23;7471:32;7468:52;;;7516:1;7513;7506:12;7468:52;7555:9;7542:23;7574:31;7599:5;7574:31;:::i;:::-;7624:5;-1:-1:-1;7681:2:14;7666:18;;7653:32;7694:30;7653:32;7694:30;:::i;:::-;7743:7;7733:17;;;7374:382;;;;;:::o;7761:795::-;7856:6;7864;7872;7880;7933:3;7921:9;7912:7;7908:23;7904:33;7901:53;;;7950:1;7947;7940:12;7901:53;7989:9;7976:23;8008:31;8033:5;8008:31;:::i;:::-;8058:5;-1:-1:-1;8115:2:14;8100:18;;8087:32;8128:33;8087:32;8128:33;:::i;:::-;8180:7;-1:-1:-1;8234:2:14;8219:18;;8206:32;;-1:-1:-1;8289:2:14;8274:18;;8261:32;8316:18;8305:30;;8302:50;;;8348:1;8345;8338:12;8302:50;8371:22;;8424:4;8416:13;;8412:27;-1:-1:-1;8402:55:14;;8453:1;8450;8443:12;8402:55;8476:74;8542:7;8537:2;8524:16;8519:2;8515;8511:11;8476:74;:::i;:::-;8466:84;;;7761:795;;;;;;;:::o;8561:643::-;8675:6;8683;8736:2;8724:9;8715:7;8711:23;8707:32;8704:52;;;8752:1;8749;8742:12;8704:52;8792:9;8779:23;8821:18;8862:2;8854:6;8851:14;8848:34;;;8878:1;8875;8868:12;8848:34;8916:6;8905:9;8901:22;8891:32;;8961:7;8954:4;8950:2;8946:13;8942:27;8932:55;;8983:1;8980;8973:12;8932:55;9023:2;9010:16;9049:2;9041:6;9038:14;9035:34;;;9065:1;9062;9055:12;9035:34;9118:7;9113:2;9103:6;9100:1;9096:14;9092:2;9088:23;9084:32;9081:45;9078:65;;;9139:1;9136;9129:12;9078:65;9170:2;9162:11;;;;;9192:6;;-1:-1:-1;8561:643:14;;-1:-1:-1;;;;8561:643:14:o;9209:388::-;9277:6;9285;9338:2;9326:9;9317:7;9313:23;9309:32;9306:52;;;9354:1;9351;9344:12;9306:52;9393:9;9380:23;9412:31;9437:5;9412:31;:::i;:::-;9462:5;-1:-1:-1;9519:2:14;9504:18;;9491:32;9532:33;9491:32;9532:33;:::i;9602:387::-;9689:6;9742:2;9730:9;9721:7;9717:23;9713:32;9710:52;;;9758:1;9755;9748:12;9710:52;9798:9;9785:23;9831:18;9823:6;9820:30;9817:50;;;9863:1;9860;9853:12;9817:50;9886:22;;9942:2;9924:16;;;9920:25;9917:45;;;9958:1;9955;9948:12;10331:127;10392:10;10387:3;10383:20;10380:1;10373:31;10423:4;10420:1;10413:15;10447:4;10444:1;10437:15;10463:127;10524:10;10519:3;10515:20;10512:1;10505:31;10555:4;10552:1;10545:15;10579:4;10576:1;10569:15;10595:168;10635:7;10701:1;10697;10693:6;10689:14;10686:1;10683:21;10678:1;10671:9;10664:17;10660:45;10657:71;;;10708:18;;:::i;:::-;-1:-1:-1;10748:9:14;;10595:168::o;10768:127::-;10829:10;10824:3;10820:20;10817:1;10810:31;10860:4;10857:1;10850:15;10884:4;10881:1;10874:15;10900:120;10940:1;10966;10956:35;;10971:18;;:::i;:::-;-1:-1:-1;11005:9:14;;10900:120::o;11025:380::-;11104:1;11100:12;;;;11147;;;11168:61;;11222:4;11214:6;11210:17;11200:27;;11168:61;11275:2;11267:6;11264:14;11244:18;11241:38;11238:161;;;11321:10;11316:3;11312:20;11309:1;11302:31;11356:4;11353:1;11346:15;11384:4;11381:1;11374:15;11238:161;;11025:380;;;:::o;12650:356::-;12852:2;12834:21;;;12871:18;;;12864:30;12930:34;12925:2;12910:18;;12903:62;12997:2;12982:18;;12650:356::o;13391:413::-;13593:2;13575:21;;;13632:2;13612:18;;;13605:30;13671:34;13666:2;13651:18;;13644:62;-1:-1:-1;;;13737:2:14;13722:18;;13715:47;13794:3;13779:19;;13391:413::o;14148:125::-;14188:4;14216:1;14213;14210:8;14207:34;;;14221:18;;:::i;:::-;-1:-1:-1;14258:9:14;;14148:125::o;15103:184::-;15173:6;15226:2;15214:9;15205:7;15201:23;15197:32;15194:52;;;15242:1;15239;15232:12;15194:52;-1:-1:-1;15265:16:14;;15103:184;-1:-1:-1;15103:184:14:o;15571:245::-;15638:6;15691:2;15679:9;15670:7;15666:23;15662:32;15659:52;;;15707:1;15704;15697:12;15659:52;15739:9;15733:16;15758:28;15780:5;15758:28;:::i;17333:325::-;17427:4;17485:11;17472:25;17579:2;17575:7;17564:8;17548:14;17544:29;17540:43;17520:18;17516:68;17506:96;;17598:1;17595;17588:12;17506:96;17619:33;;;;;17333:325;-1:-1:-1;;17333:325:14:o;17663:135::-;17702:3;-1:-1:-1;;17723:17:14;;17720:43;;;17743:18;;:::i;:::-;-1:-1:-1;17790:1:14;17779:13;;17663:135::o;18345:1145::-;18622:3;18651:1;18684:6;18678:13;18714:36;18740:9;18714:36;:::i;:::-;18769:1;18786:18;;;18813:104;;;;18931:1;18926:356;;;;18779:503;;18813:104;-1:-1:-1;;18846:24:14;;18834:37;;18891:16;;;;-1:-1:-1;18813:104:14;;18926:356;18957:6;18954:1;18947:17;18987:4;19032:2;19029:1;19019:16;19057:1;19071:165;19085:6;19082:1;19079:13;19071:165;;;19163:14;;19150:11;;;19143:35;19206:16;;;;19100:10;;19071:165;;;19075:3;;;19265:6;19260:3;19256:16;19249:23;;18779:503;;;;;19313:6;19307:13;19329:55;19375:8;19370:3;19363:4;19355:6;19351:17;19329:55;:::i;:::-;-1:-1:-1;;;19406:18:14;;19433:22;;;19482:1;19471:13;;18345:1145;-1:-1:-1;;;;18345:1145:14:o;20261:332::-;20361:4;20419:11;20406:25;20513:3;20509:8;20498;20482:14;20478:29;20474:44;20454:18;20450:69;20440:97;;20533:1;20530;20523:12;20598:117;20683:6;20676:5;20672:18;20665:5;20662:29;20652:57;;20705:1;20702;20695:12;20720:245;20778:6;20831:2;20819:9;20810:7;20806:23;20802:32;20799:52;;;20847:1;20844;20837:12;20799:52;20886:9;20873:23;20905:30;20929:5;20905:30;:::i;21510:251::-;21580:6;21633:2;21621:9;21612:7;21608:23;21604:32;21601:52;;;21649:1;21646;21639:12;21601:52;21681:9;21675:16;21700:31;21725:5;21700:31;:::i;21766:581::-;21892:4;21898:6;21958:11;21945:25;22052:2;22048:7;22037:8;22021:14;22017:29;22013:43;21993:18;21989:68;21979:96;;22071:1;22068;22061:12;21979:96;22098:33;;22150:20;;;-1:-1:-1;22193:18:14;22182:30;;22179:50;;;22225:1;22222;22215:12;22179:50;22258:4;22246:17;;-1:-1:-1;22317:4:14;22305:17;;22289:14;22285:38;22275:49;;22272:69;;;22337:1;22334;22327:12;22272:69;21766:581;;;;;:::o;22352:198::-;22395:11;22447:3;22434:17;22491:4;22484:5;22480:16;22473:5;22470:27;22460:55;;22511:1;22508;22501:12;22555:731;22719:19;;-1:-1:-1;;;;;22757:33:14;;22809:15;;;22799:43;;22838:1;22835;22828:12;22799:43;22861:11;;-1:-1:-1;;;;;;22897:27:14;;22894:35;;22881:49;;22861:11;-1:-1:-1;;;;22968:41:14;23005:2;22994:14;;22968:41;:::i;:::-;22963:3;22959:51;22955:71;23054:5;23049:3;23045:15;23106:8;23101:2;23096;23092;23088:11;23085:19;23082:33;23076:4;23069:47;23164:2;23157:5;23153:14;23140:28;23125:43;;23177:32;23201:7;23177:32;:::i;:::-;23234:16;;23260:3;23256:17;;;;23252:26;23231:48;23218:62;;-1:-1:-1;22555:731:14:o;24319:516::-;24391:4;24397:6;24457:11;24444:25;24551:2;24547:7;24536:8;24520:14;24516:29;24512:43;24492:18;24488:68;24478:96;;24570:1;24567;24560:12;24478:96;24597:33;;24649:20;;;-1:-1:-1;24692:18:14;24681:30;;24678:50;;;24724:1;24721;24714:12;24678:50;24757:4;24745:17;;-1:-1:-1;24788:14:14;24784:27;;;24774:38;;24771:58;;;24825:1;24822;24815:12;24840:545;24942:2;24937:3;24934:11;24931:448;;;24978:1;25003:5;24999:2;24992:17;25048:4;25044:2;25034:19;25118:2;25106:10;25102:19;25099:1;25095:27;25089:4;25085:38;25154:4;25142:10;25139:20;25136:47;;;-1:-1:-1;25177:4:14;25136:47;25232:2;25227:3;25223:12;25220:1;25216:20;25210:4;25206:31;25196:41;;25287:82;25305:2;25298:5;25295:13;25287:82;;;25350:17;;;25331:1;25320:13;25287:82;;25561:1190;25669:18;25664:3;25661:27;25658:53;;;25691:18;;:::i;:::-;25720:94;25810:3;25770:38;25802:4;25796:11;25770:38;:::i;:::-;25764:4;25720:94;:::i;:::-;25840:1;25865:2;25860:3;25857:11;25882:1;25877:616;;;;26537:1;26554:3;26551:93;;;-1:-1:-1;26610:19:14;;;26597:33;26551:93;-1:-1:-1;;25518:1:14;25514:11;;;25510:24;25506:29;25496:40;25542:1;25538:11;;;25493:57;26657:78;;25850:895;;25877:616;18292:1;18285:14;;;18329:4;18316:18;;-1:-1:-1;;25913:17:14;;;26014:9;26036:229;26050:7;26047:1;26044:14;26036:229;;;26139:19;;;26126:33;26111:49;;26246:4;26231:20;;;;26199:1;26187:14;;;;26066:12;26036:229;;;26040:3;26293;26284:7;26281:16;26278:159;;;26417:1;26413:6;26407:3;26401;26398:1;26394:11;26390:21;26386:34;26382:39;26369:9;26364:3;26360:19;26347:33;26343:79;26335:6;26328:95;26278:159;;;26480:1;26474:3;26471:1;26467:11;26463:19;26457:4;26450:33;25850:895;;;25561:1190;;;:::o;26756:1202::-;26935:5;26922:19;26950:32;26974:7;26950:32;:::i;:::-;27014:6;27005:7;27001:20;26991:30;;27046:4;27040:11;27097:2;27088:5;27084:10;27080:2;27076:19;27073:27;27067:4;27060:41;27214:8;27170:41;27207:2;27200:5;27196:14;27170:41;:::i;:::-;27166:2;27162:50;27158:65;27153:2;27141:8;27137:13;27133:2;27129:22;27126:30;27123:101;27117:4;27110:115;;;27234:94;27286:41;27323:2;27316:5;27312:14;27286:41;:::i;:::-;23383:11;;-1:-1:-1;;23419:24:14;23453:2;23449:14;;;;23465:10;23445:31;23416:61;23403:75;;23291:193;27234:94;27337;27389:41;27426:2;27419:5;27415:14;27389:41;:::i;:::-;23581:11;;-1:-1:-1;;23617:26:14;23653:2;23649:14;;;;23665:12;23645:33;23614:65;23601:79;;23489:197;27337:94;27440:95;27492:42;27529:3;27522:5;27518:15;27492:42;:::i;:::-;23783:11;;-1:-1:-1;;23819:28:14;23857:2;23853:14;;;;23869;23849:35;23816:69;23803:83;;23691:201;27440:95;27544:93;27594:42;27631:3;27624:5;27620:15;27594:42;:::i;:::-;23987:11;;-1:-1:-1;;24023:30:14;24063:2;24059:14;;;;24075:16;24055:37;24020:73;24007:87;;23897:203;27544:93;27646:95;27698:42;27735:3;27728:5;27724:15;27698:42;:::i;:::-;24197:11;;-1:-1:-1;;24233:32:14;24275:2;24271:14;;;;24287:18;24267:39;24230:77;24217:91;;24105:209;27646:95;27784:60;27839:3;27832:5;27828:15;27821:5;27784:60;:::i;:::-;27853:99;27938:13;27925:11;27921:1;27915:4;27911:12;27853:99;:::i;27963:128::-;28003:3;28034:1;28030:6;28027:1;28024:13;28021:39;;;28040:18;;:::i;:::-;-1:-1:-1;28076:9:14;;27963:128::o;29673:414::-;29875:2;29857:21;;;29914:2;29894:18;;;29887:30;29953:34;29948:2;29933:18;;29926:62;-1:-1:-1;;;30019:2:14;30004:18;;29997:48;30077:3;30062:19;;29673:414::o;30092:112::-;30124:1;30150;30140:35;;30155:18;;:::i;:::-;-1:-1:-1;30189:9:14;;30092:112::o;30554:489::-;-1:-1:-1;;;;;30823:15:14;;;30805:34;;30875:15;;30870:2;30855:18;;30848:43;30922:2;30907:18;;30900:34;;;30970:3;30965:2;30950:18;;30943:31;;;30748:4;;30991:46;;31017:19;;31009:6;30991:46;:::i;:::-;30983:54;30554:489;-1:-1:-1;;;;;;30554:489:14:o;31048:249::-;31117:6;31170:2;31158:9;31149:7;31145:23;31141:32;31138:52;;;31186:1;31183;31176:12;31138:52;31218:9;31212:16;31237:30;31261:5;31237:30;:::i;32020:127::-;32081:10;32076:3;32072:20;32069:1;32062:31;32112:4;32109:1;32102:15;32136:4;32133:1;32126:15

Swarm Source

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