ETH Price: $3,714.29 (+4.76%)

Token

ERC-20: TakeoutNFT (WAIMAIDAO)
 

Overview

Max Total Supply

1,500 WAIMAIDAO

Holders

578

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
web3messi.eth
Balance
1 WAIMAIDAO
0x3c42528d268b409872bdc3cea1c315cb7206c10e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TakeoutNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 13 : TakeoutNFT.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./ERC721A.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

contract TakeoutNFT is Ownable, ERC721A, ReentrancyGuard {
    constructor(
    ) ERC721A("TakeoutNFT", "WAIMAIDAO", 5, 1500) {}

    // For marketing etc.
    function reserveMint(uint256 quantity) external onlyOwner {
        require(
            totalSupply() + quantity <= collectionSize,
            "too many already minted before dev mint"
        );
        uint256 numChunks = quantity / maxBatchSize;
        for (uint256 i = 0; i < numChunks; i++) {
            _safeMint(msg.sender, maxBatchSize);
        }
        if (quantity % maxBatchSize != 0){
            _safeMint(msg.sender, quantity % maxBatchSize);
        }
    }

    // metadata URI
    string private _baseTokenURI;

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function withdrawMoney() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
        _setOwnersExplicit(quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function refundIfOver(uint256 price) private {
        require(msg.value >= price, "Need to send more ETH.");
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }
    // allowList mint
    uint256 private allowListMintPrice = 0.000000 ether;
    // default false
    bool private allowListStatus = false;
    uint256 private allowListMintAmount = 980;
    uint256 public immutable maxPerAddressDuringMint = 2;

    bytes32 private merkleRoot;

    mapping(address => bool) public addressAppeared;
    mapping(address => uint256) public addressMintStock;


    function allowListMint(uint256 quantity, bytes32[] memory proof) external payable {
        require(tx.origin == msg.sender, "The caller is another contract");
        require(allowListStatus, "allowList sale has not begun yet");
        require(totalSupply() + quantity <= collectionSize, "reached max supply");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(proof, merkleRoot, leaf),
            "Invalid Merkle Proof.");
        if(!addressAppeared[msg.sender]){
            addressAppeared[msg.sender] = true;
            addressMintStock[msg.sender] = maxPerAddressDuringMint;
        }
        require(addressMintStock[msg.sender] >= quantity, "reached allow list per address mint amount");
        addressMintStock[msg.sender] -= quantity;
        _safeMint(msg.sender, quantity);
        allowListMintAmount -= quantity;
        refundIfOver(allowListMintPrice*quantity);
    }

    function setAllowList(bytes32 root_) external onlyOwner{
        merkleRoot = root_;
    }

    function setAllowListStatus(bool status) external onlyOwner {
        allowListStatus = status;
    }

    function getAllowListStatus() external view returns(bool){
        return allowListStatus;
    }
    //public sale
    bool public publicSaleStatus = false;
    uint256 public publicPrice = 0.010000 ether;
    uint256 public amountForPublicSale = 500;
    // per mint public sale limitation
    uint256 public immutable publicSalePerMint = 5;

    function publicSaleMint(uint256 quantity) external payable {
        require(
        publicSaleStatus,
        "public sale has not begun yet"
        );
        require(
        totalSupply() + quantity <= collectionSize,
        "reached max supply"
        );
        require(
        amountForPublicSale >= quantity,
        "reached public sale max amount"
        );

        require(
        quantity <= publicSalePerMint,
        "reached public sale per mint max amount"
        );

        _safeMint(msg.sender, quantity);
        amountForPublicSale -= quantity;
        refundIfOver(uint256(publicPrice) * quantity);
    }

    function setPublicSaleStatus(bool status) external onlyOwner {
        publicSaleStatus = status;
    }

    function getPublicSaleStatus() external view returns(bool) {
        return publicSaleStatus;
    }
}

File 2 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 13 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 13 : ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // 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
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @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 override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: 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 override {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * 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
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @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(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * 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`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

File 5 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 6 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 7 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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 8 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 9 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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 10 of 13 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

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);

    /**
     * @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 11 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 12 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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 13 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressAppeared","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintStock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"allowListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"amountForPublicSale","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":"getAllowListStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveMint","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":"bytes32","name":"root_","type":"bytes32"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setAllowListStatus","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPublicSaleStatus","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":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052600060015560006008556000600b556000600c60006101000a81548160ff0219169083151502179055506103d4600d55600260c0908152506000601160006101000a81548160ff021916908315150217905550662386f26fc100006012556101f4601355600560e0908152503480156200007e57600080fd5b506040518060400160405280600a81526020017f54616b656f75744e4654000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f5741494d414944414f000000000000000000000000000000000000000000000081525060056105dc6200011062000104620001f060201b60201c565b620001f860201b60201c565b6000811162000156576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014d90620003dc565b60405180910390fd5b600082116200019c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200019390620003ba565b60405180910390fd5b8360029080519060200190620001b4929190620002bc565b508260039080519060200190620001cd929190620002bc565b508160a08181525050806080818152505050505050600160098190555062000512565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ca906200040f565b90600052602060002090601f016020900481019282620002ee57600085556200033a565b82601f106200030957805160ff19168380011785556200033a565b828001600101855582156200033a579182015b82811115620003395782518255916020019190600101906200031c565b5b5090506200034991906200034d565b5090565b5b80821115620003685760008160009055506001016200034e565b5090565b60006200037b602783620003fe565b9150620003888262000474565b604082019050919050565b6000620003a2602e83620003fe565b9150620003af82620004c3565b604082019050919050565b60006020820190508181036000830152620003d5816200036c565b9050919050565b60006020820190508181036000830152620003f78162000393565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200042857607f821691505b602082108114156200043f576200043e62000445565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a05160c05160e051615ac5620005a06000396000818161126b0152611ac60152600081816115b8015261204a015260008181610de101528181610e1e01528181610e5a01528181610e8f01528181612ca601528181612ccf0152613506015260008181610d6a01528181611a0c01528181611eb501528181612a2e0152612a620152615ac56000f3fe60806040526004361061023b5760003560e01c80638bc35c2f1161012e578063b6c693e5116100ab578063d7224ba01161006f578063d7224ba014610888578063dc33e681146108b3578063e985e9c5146108f0578063ec8bda8e1461092d578063f2fde38b146109495761023b565b8063b6c693e51461077d578063b88d4fde146107a8578063bb122299146107d1578063c5f77e161461080e578063c87b56dd1461084b5761023b565b8063a22cb465116100f2578063a22cb465146106cd578063a945bf80146106f6578063ac44600214610721578063b3ab66b014610738578063b423fe67146107545761023b565b80638bc35c2f146105e45780638da5cb5b1461060f5780639231ab2a1461063a57806395d89b41146106775780639dc74e63146106a25761023b565b8063300bc3a1116101bc57806355f804b31161018057806355f804b3146105015780636352211e1461052a57806370a0823114610567578063715018a6146105a457806384584d07146105bb5761023b565b8063300bc3a11461041c5780633ba5ae241461044557806342842e0e14610470578063499e8eec146104995780634f6ccce7146104c45761023b565b806318160ddd1161020357806318160ddd146103375780631a534faf1461036257806323b872dd1461038d5780632d20fb60146103b65780632f745c59146103df5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780631342ff4c1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613ebb565b610972565b60405161027491906146c6565b60405180910390f35b34801561028957600080fd5b50610292610abc565b60405161029f91906146e1565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613f62565b610b4e565b6040516102dc919061465f565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613e21565b610bd3565b005b34801561031a57600080fd5b5061033560048036038101906103309190613f62565b610cec565b005b34801561034357600080fd5b5061034c610ec3565b6040516103599190614b7e565b60405180910390f35b34801561036e57600080fd5b50610377610ecd565b60405161038491906146c6565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613d0b565b610ee4565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613f62565b610ef4565b005b3480156103eb57600080fd5b5061040660048036038101906104019190613e21565b610fd2565b6040516104139190614b7e565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190613e61565b6111d0565b005b34801561045157600080fd5b5061045a611269565b6040516104679190614b7e565b60405180910390f35b34801561047c57600080fd5b5061049760048036038101906104929190613d0b565b61128d565b005b3480156104a557600080fd5b506104ae6112ad565b6040516104bb91906146c6565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613f62565b6112c4565b6040516104f89190614b7e565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613f15565b611317565b005b34801561053657600080fd5b50610551600480360381019061054c9190613f62565b6113a9565b60405161055e919061465f565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613c9e565b6113bf565b60405161059b9190614b7e565b60405180910390f35b3480156105b057600080fd5b506105b96114a8565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613e8e565b611530565b005b3480156105f057600080fd5b506105f96115b6565b6040516106069190614b7e565b60405180910390f35b34801561061b57600080fd5b506106246115da565b604051610631919061465f565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190613f62565b611603565b60405161066e9190614b63565b60405180910390f35b34801561068357600080fd5b5061068c61161b565b60405161069991906146e1565b60405180910390f35b3480156106ae57600080fd5b506106b76116ad565b6040516106c49190614b7e565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613de1565b6116b3565b005b34801561070257600080fd5b5061070b611834565b6040516107189190614b7e565b60405180910390f35b34801561072d57600080fd5b5061073661183a565b005b610752600480360381019061074d9190613f62565b6119bb565b005b34801561076057600080fd5b5061077b60048036038101906107769190613e61565b611b63565b005b34801561078957600080fd5b50610792611bfc565b60405161079f91906146c6565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613d5e565b611c0f565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613c9e565b611c6b565b6040516108059190614b7e565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613c9e565b611c83565b60405161084291906146c6565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613f62565b611ca3565b60405161087f91906146e1565b60405180910390f35b34801561089457600080fd5b5061089d611d4a565b6040516108aa9190614b7e565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613c9e565b611d50565b6040516108e79190614b7e565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613ccb565b611d62565b60405161092491906146c6565b60405180910390f35b61094760048036038101906109429190613f8f565b611df6565b005b34801561095557600080fd5b50610970600480360381019061096b9190613c9e565b6121c3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab55750610ab4826122bb565b5b9050919050565b606060028054610acb90614f12565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790614f12565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b6000610b5982612325565b610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f90614b23565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bde826113a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c46906149a3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6e612333565b73ffffffffffffffffffffffffffffffffffffffff161480610c9d5750610c9c81610c97612333565b611d62565b5b610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390614863565b60405180910390fd5b610ce783838361233b565b505050565b610cf4612333565b73ffffffffffffffffffffffffffffffffffffffff16610d126115da565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90614903565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610d92610ec3565b610d9c9190614caf565b1115610ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd490614a83565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000082610e0b9190614d05565b905060005b81811015610e5557610e42337f00000000000000000000000000000000000000000000000000000000000000006123ed565b8080610e4d90614f75565b915050610e10565b5060007f000000000000000000000000000000000000000000000000000000000000000083610e849190614fe2565b14610ebf57610ebe337f000000000000000000000000000000000000000000000000000000000000000084610eb99190614fe2565b6123ed565b5b5050565b6000600154905090565b6000600c60009054906101000a900460ff16905090565b610eef83838361240b565b505050565b610efc612333565b73ffffffffffffffffffffffffffffffffffffffff16610f1a6115da565b73ffffffffffffffffffffffffffffffffffffffff1614610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790614903565b60405180910390fd5b60026009541415610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad90614ae3565b60405180910390fd5b6002600981905550610fc7816129c4565b600160098190555050565b6000610fdd836113bf565b821061101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614703565b60405180910390fd5b6000611028610ec3565b905060008060005b8381101561118e576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461112257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561117a578684141561116b5781955050505050506111ca565b838061117690614f75565b9450505b50808061118690614f75565b915050611030565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614aa3565b60405180910390fd5b92915050565b6111d8612333565b73ffffffffffffffffffffffffffffffffffffffff166111f66115da565b73ffffffffffffffffffffffffffffffffffffffff161461124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390614903565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6112a883838360405180602001604052806000815250611c0f565b505050565b6000601160009054906101000a900460ff16905090565b60006112ce610ec3565b821061130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614783565b60405180910390fd5b819050919050565b61131f612333565b73ffffffffffffffffffffffffffffffffffffffff1661133d6115da565b73ffffffffffffffffffffffffffffffffffffffff1614611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90614903565b60405180910390fd5b8181600a91906113a49291906139df565b505050565b60006113b482612c52565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611427906148a3565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114b0612333565b73ffffffffffffffffffffffffffffffffffffffff166114ce6115da565b73ffffffffffffffffffffffffffffffffffffffff1614611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b90614903565b60405180910390fd5b61152e6000612e55565b565b611538612333565b73ffffffffffffffffffffffffffffffffffffffff166115566115da565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390614903565b60405180910390fd5b80600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61160b613a65565b61161482612c52565b9050919050565b60606003805461162a90614f12565b80601f016020809104026020016040519081016040528092919081815260200182805461165690614f12565b80156116a35780601f10611678576101008083540402835291602001916116a3565b820191906000526020600020905b81548152906001019060200180831161168657829003601f168201915b5050505050905090565b60135481565b6116bb612333565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090614943565b60405180910390fd5b8060076000611736612333565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e3612333565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182891906146c6565b60405180910390a35050565b60125481565b611842612333565b73ffffffffffffffffffffffffffffffffffffffff166118606115da565b73ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad90614903565b60405180910390fd5b600260095414156118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390614ae3565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161192a9061464a565b60006040518083038185875af1925050503d8060008114611967576040519150601f19603f3d011682016040523d82523d6000602084013e61196c565b606091505b50509050806119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a7906149c3565b60405180910390fd5b506001600981905550565b601160009054906101000a900460ff16611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614983565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611a34610ec3565b611a3e9190614caf565b1115611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a76906148c3565b60405180910390fd5b806013541015611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb906147c3565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90614763565b60405180910390fd5b611b3133826123ed565b8060136000828254611b439190614dc4565b92505081905550611b6081601254611b5b9190614d36565b612f19565b50565b611b6b612333565b73ffffffffffffffffffffffffffffffffffffffff16611b896115da565b73ffffffffffffffffffffffffffffffffffffffff1614611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690614903565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b601160009054906101000a900460ff1681565b611c1a84848461240b565b611c2684848484612fba565b611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c906149e3565b60405180910390fd5b50505050565b60106020528060005260406000206000915090505481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6060611cae82612325565b611ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce490614923565b60405180910390fd5b6000611cf7613151565b90506000815111611d175760405180602001604052806000815250611d42565b80611d21846131e3565b604051602001611d32929190614626565b6040516020818303038152906040525b915050919050565b60085481565b6000611d5b82613344565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90614843565b60405180910390fd5b600c60009054906101000a900460ff16611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614a63565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000082611edd610ec3565b611ee79190614caf565b1115611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f906148c3565b60405180910390fd5b600033604051602001611f3b919061460b565b604051602081830303815290604052805190602001209050611f6082600e548361342d565b611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614823565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ad576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f0000000000000000000000000000000000000000000000000000000000000000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561212f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612126906147e3565b60405180910390fd5b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461217e9190614dc4565b9250508190555061218f33846123ed565b82600d60008282546121a19190614dc4565b925050819055506121be83600b546121b99190614d36565b612f19565b505050565b6121cb612333565b73ffffffffffffffffffffffffffffffffffffffff166121e96115da565b73ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614903565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a690614723565b60405180910390fd5b6122b881612e55565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612407828260405180602001604052806000815250613444565b5050565b600061241682612c52565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661243d612333565b73ffffffffffffffffffffffffffffffffffffffff1614806124995750612462612333565b73ffffffffffffffffffffffffffffffffffffffff1661248184610b4e565b73ffffffffffffffffffffffffffffffffffffffff16145b806124b557506124b482600001516124af612333565b611d62565b5b9050806124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90614963565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612560906148e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d0906147a3565b60405180910390fd5b6125e68585856001613924565b6125f6600084846000015161233b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126649190614d90565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166127089190614c69565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461280e9190614caf565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129545761288481612325565b15612953576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129bc868686600161392a565b505050505050565b6000600854905060008211612a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0590614883565b60405180910390fd5b600060018383612a1e9190614caf565b612a289190614dc4565b905060017f0000000000000000000000000000000000000000000000000000000000000000612a579190614dc4565b811115612a8e5760017f0000000000000000000000000000000000000000000000000000000000000000612a8b9190614dc4565b90505b612a9781612325565b612ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acd90614ac3565b60405180910390fd5b60008290505b818111612c3957600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c26576000612b5982612c52565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b8080612c3190614f75565b915050612adc565b50600181612c479190614caf565b600881905550505050565b612c5a613a65565b612c6382612325565b612ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9990614743565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612d065760017f000000000000000000000000000000000000000000000000000000000000000084612cf99190614dc4565b612d039190614caf565b90505b60008390505b818110612e14576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e0057809350505050612e50565b508080612e0c90614ee8565b915050612d0c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4790614b03565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341015612f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5390614a03565b60405180910390fd5b80341115612fb7573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612f8a9190614dc4565b9081150290604051600060405180830381858888f19350505050158015612fb5573d6000803e3d6000fd5b505b50565b6000612fdb8473ffffffffffffffffffffffffffffffffffffffff16613930565b15613144578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613004612333565b8786866040518563ffffffff1660e01b8152600401613026949392919061467a565b602060405180830381600087803b15801561304057600080fd5b505af192505050801561307157506040513d601f19601f8201168201806040525081019061306e9190613ee8565b60015b6130f4573d80600081146130a1576040519150601f19603f3d011682016040523d82523d6000602084013e6130a6565b606091505b506000815114156130ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e3906149e3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613149565b600190505b949350505050565b6060600a805461316090614f12565b80601f016020809104026020016040519081016040528092919081815260200182805461318c90614f12565b80156131d95780601f106131ae576101008083540402835291602001916131d9565b820191906000526020600020905b8154815290600101906020018083116131bc57829003601f168201915b5050505050905090565b6060600082141561322b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061333f565b600082905060005b6000821461325d57808061324690614f75565b915050600a826132569190614d05565b9150613233565b60008167ffffffffffffffff811115613279576132786150cf565b5b6040519080825280601f01601f1916602001820160405280156132ab5781602001600182028036833780820191505090505b5090505b60008514613338576001826132c49190614dc4565b9150600a856132d39190614fe2565b60306132df9190614caf565b60f81b8183815181106132f5576132f46150a0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133319190614d05565b94506132af565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ac90614803565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008261343a8584613953565b1490509392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156134bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b290614a43565b60405180910390fd5b6134c481612325565b15613504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fb90614a23565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355e90614b43565b60405180910390fd5b6135746000858386613924565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136719190614c69565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136989190614c69565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561390757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138a76000888488612fba565b6138e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138dd906149e3565b60405180910390fd5b81806138f190614f75565b92505080806138ff90614f75565b915050613836565b508060018190555061391c600087858861392a565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b84518110156139bd57600085828151811061397a576139796150a0565b5b6020026020010151905080831161399c5761399583826139c8565b92506139a9565b6139a681846139c8565b92505b5080806139b590614f75565b91505061395c565b508091505092915050565b600082600052816020526040600020905092915050565b8280546139eb90614f12565b90600052602060002090601f016020900481019282613a0d5760008555613a54565b82601f10613a2657803560ff1916838001178555613a54565b82800160010185558215613a54579182015b82811115613a53578235825591602001919060010190613a38565b5b509050613a619190613a9f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613ab8576000816000905550600101613aa0565b5090565b6000613acf613aca84614bbe565b614b99565b90508083825260208201905082856020860282011115613af257613af1615108565b5b60005b85811015613b225781613b088882613bc6565b845260208401935060208301925050600181019050613af5565b5050509392505050565b6000613b3f613b3a84614bea565b614b99565b905082815260208101848484011115613b5b57613b5a61510d565b5b613b66848285614ea6565b509392505050565b600081359050613b7d81615a1c565b92915050565b600082601f830112613b9857613b97615103565b5b8135613ba8848260208601613abc565b91505092915050565b600081359050613bc081615a33565b92915050565b600081359050613bd581615a4a565b92915050565b600081359050613bea81615a61565b92915050565b600081519050613bff81615a61565b92915050565b600082601f830112613c1a57613c19615103565b5b8135613c2a848260208601613b2c565b91505092915050565b60008083601f840112613c4957613c48615103565b5b8235905067ffffffffffffffff811115613c6657613c656150fe565b5b602083019150836001820283011115613c8257613c81615108565b5b9250929050565b600081359050613c9881615a78565b92915050565b600060208284031215613cb457613cb3615117565b5b6000613cc284828501613b6e565b91505092915050565b60008060408385031215613ce257613ce1615117565b5b6000613cf085828601613b6e565b9250506020613d0185828601613b6e565b9150509250929050565b600080600060608486031215613d2457613d23615117565b5b6000613d3286828701613b6e565b9350506020613d4386828701613b6e565b9250506040613d5486828701613c89565b9150509250925092565b60008060008060808587031215613d7857613d77615117565b5b6000613d8687828801613b6e565b9450506020613d9787828801613b6e565b9350506040613da887828801613c89565b925050606085013567ffffffffffffffff811115613dc957613dc8615112565b5b613dd587828801613c05565b91505092959194509250565b60008060408385031215613df857613df7615117565b5b6000613e0685828601613b6e565b9250506020613e1785828601613bb1565b9150509250929050565b60008060408385031215613e3857613e37615117565b5b6000613e4685828601613b6e565b9250506020613e5785828601613c89565b9150509250929050565b600060208284031215613e7757613e76615117565b5b6000613e8584828501613bb1565b91505092915050565b600060208284031215613ea457613ea3615117565b5b6000613eb284828501613bc6565b91505092915050565b600060208284031215613ed157613ed0615117565b5b6000613edf84828501613bdb565b91505092915050565b600060208284031215613efe57613efd615117565b5b6000613f0c84828501613bf0565b91505092915050565b60008060208385031215613f2c57613f2b615117565b5b600083013567ffffffffffffffff811115613f4a57613f49615112565b5b613f5685828601613c33565b92509250509250929050565b600060208284031215613f7857613f77615117565b5b6000613f8684828501613c89565b91505092915050565b60008060408385031215613fa657613fa5615117565b5b6000613fb485828601613c89565b925050602083013567ffffffffffffffff811115613fd557613fd4615112565b5b613fe185828601613b83565b9150509250929050565b613ff481614df8565b82525050565b61400381614df8565b82525050565b61401a61401582614df8565b614fbe565b82525050565b61402981614e0a565b82525050565b600061403a82614c1b565b6140448185614c31565b9350614054818560208601614eb5565b61405d8161511c565b840191505092915050565b600061407382614c26565b61407d8185614c4d565b935061408d818560208601614eb5565b6140968161511c565b840191505092915050565b60006140ac82614c26565b6140b68185614c5e565b93506140c6818560208601614eb5565b80840191505092915050565b60006140df602283614c4d565b91506140ea8261513a565b604082019050919050565b6000614102602683614c4d565b915061410d82615189565b604082019050919050565b6000614125602a83614c4d565b9150614130826151d8565b604082019050919050565b6000614148602783614c4d565b915061415382615227565b604082019050919050565b600061416b602383614c4d565b915061417682615276565b604082019050919050565b600061418e602583614c4d565b9150614199826152c5565b604082019050919050565b60006141b1601e83614c4d565b91506141bc82615314565b602082019050919050565b60006141d4602a83614c4d565b91506141df8261533d565b604082019050919050565b60006141f7603183614c4d565b91506142028261538c565b604082019050919050565b600061421a601583614c4d565b9150614225826153db565b602082019050919050565b600061423d601e83614c4d565b915061424882615404565b602082019050919050565b6000614260603983614c4d565b915061426b8261542d565b604082019050919050565b6000614283601883614c4d565b915061428e8261547c565b602082019050919050565b60006142a6602b83614c4d565b91506142b1826154a5565b604082019050919050565b60006142c9601283614c4d565b91506142d4826154f4565b602082019050919050565b60006142ec602683614c4d565b91506142f78261551d565b604082019050919050565b600061430f602083614c4d565b915061431a8261556c565b602082019050919050565b6000614332602f83614c4d565b915061433d82615595565b604082019050919050565b6000614355601a83614c4d565b9150614360826155e4565b602082019050919050565b6000614378603283614c4d565b91506143838261560d565b604082019050919050565b600061439b601d83614c4d565b91506143a68261565c565b602082019050919050565b60006143be602283614c4d565b91506143c982615685565b604082019050919050565b60006143e1600083614c42565b91506143ec826156d4565b600082019050919050565b6000614404601083614c4d565b915061440f826156d7565b602082019050919050565b6000614427603383614c4d565b915061443282615700565b604082019050919050565b600061444a601683614c4d565b91506144558261574f565b602082019050919050565b600061446d601d83614c4d565b915061447882615778565b602082019050919050565b6000614490602183614c4d565b915061449b826157a1565b604082019050919050565b60006144b3602083614c4d565b91506144be826157f0565b602082019050919050565b60006144d6602783614c4d565b91506144e182615819565b604082019050919050565b60006144f9602e83614c4d565b915061450482615868565b604082019050919050565b600061451c602683614c4d565b9150614527826158b7565b604082019050919050565b600061453f601f83614c4d565b915061454a82615906565b602082019050919050565b6000614562602f83614c4d565b915061456d8261592f565b604082019050919050565b6000614585602d83614c4d565b91506145908261597e565b604082019050919050565b60006145a8602283614c4d565b91506145b3826159cd565b604082019050919050565b6040820160008201516145d46000850182613feb565b5060208201516145e760208501826145fc565b50505050565b6145f681614e88565b82525050565b61460581614e92565b82525050565b60006146178284614009565b60148201915081905092915050565b600061463282856140a1565b915061463e82846140a1565b91508190509392505050565b6000614655826143d4565b9150819050919050565b60006020820190506146746000830184613ffa565b92915050565b600060808201905061468f6000830187613ffa565b61469c6020830186613ffa565b6146a960408301856145ed565b81810360608301526146bb818461402f565b905095945050505050565b60006020820190506146db6000830184614020565b92915050565b600060208201905081810360008301526146fb8184614068565b905092915050565b6000602082019050818103600083015261471c816140d2565b9050919050565b6000602082019050818103600083015261473c816140f5565b9050919050565b6000602082019050818103600083015261475c81614118565b9050919050565b6000602082019050818103600083015261477c8161413b565b9050919050565b6000602082019050818103600083015261479c8161415e565b9050919050565b600060208201905081810360008301526147bc81614181565b9050919050565b600060208201905081810360008301526147dc816141a4565b9050919050565b600060208201905081810360008301526147fc816141c7565b9050919050565b6000602082019050818103600083015261481c816141ea565b9050919050565b6000602082019050818103600083015261483c8161420d565b9050919050565b6000602082019050818103600083015261485c81614230565b9050919050565b6000602082019050818103600083015261487c81614253565b9050919050565b6000602082019050818103600083015261489c81614276565b9050919050565b600060208201905081810360008301526148bc81614299565b9050919050565b600060208201905081810360008301526148dc816142bc565b9050919050565b600060208201905081810360008301526148fc816142df565b9050919050565b6000602082019050818103600083015261491c81614302565b9050919050565b6000602082019050818103600083015261493c81614325565b9050919050565b6000602082019050818103600083015261495c81614348565b9050919050565b6000602082019050818103600083015261497c8161436b565b9050919050565b6000602082019050818103600083015261499c8161438e565b9050919050565b600060208201905081810360008301526149bc816143b1565b9050919050565b600060208201905081810360008301526149dc816143f7565b9050919050565b600060208201905081810360008301526149fc8161441a565b9050919050565b60006020820190508181036000830152614a1c8161443d565b9050919050565b60006020820190508181036000830152614a3c81614460565b9050919050565b60006020820190508181036000830152614a5c81614483565b9050919050565b60006020820190508181036000830152614a7c816144a6565b9050919050565b60006020820190508181036000830152614a9c816144c9565b9050919050565b60006020820190508181036000830152614abc816144ec565b9050919050565b60006020820190508181036000830152614adc8161450f565b9050919050565b60006020820190508181036000830152614afc81614532565b9050919050565b60006020820190508181036000830152614b1c81614555565b9050919050565b60006020820190508181036000830152614b3c81614578565b9050919050565b60006020820190508181036000830152614b5c8161459b565b9050919050565b6000604082019050614b7860008301846145be565b92915050565b6000602082019050614b9360008301846145ed565b92915050565b6000614ba3614bb4565b9050614baf8282614f44565b919050565b6000604051905090565b600067ffffffffffffffff821115614bd957614bd86150cf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c0557614c046150cf565b5b614c0e8261511c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c7482614e4c565b9150614c7f83614e4c565b9250826fffffffffffffffffffffffffffffffff03821115614ca457614ca3615013565b5b828201905092915050565b6000614cba82614e88565b9150614cc583614e88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cfa57614cf9615013565b5b828201905092915050565b6000614d1082614e88565b9150614d1b83614e88565b925082614d2b57614d2a615042565b5b828204905092915050565b6000614d4182614e88565b9150614d4c83614e88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8557614d84615013565b5b828202905092915050565b6000614d9b82614e4c565b9150614da683614e4c565b925082821015614db957614db8615013565b5b828203905092915050565b6000614dcf82614e88565b9150614dda83614e88565b925082821015614ded57614dec615013565b5b828203905092915050565b6000614e0382614e68565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614ed3578082015181840152602081019050614eb8565b83811115614ee2576000848401525b50505050565b6000614ef382614e88565b91506000821415614f0757614f06615013565b5b600182039050919050565b60006002820490506001821680614f2a57607f821691505b60208210811415614f3e57614f3d615071565b5b50919050565b614f4d8261511c565b810181811067ffffffffffffffff82111715614f6c57614f6b6150cf565b5b80604052505050565b6000614f8082614e88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fb357614fb2615013565b5b600182019050919050565b6000614fc982614fd0565b9050919050565b6000614fdb8261512d565b9050919050565b6000614fed82614e88565b9150614ff883614e88565b92508261500857615007615042565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f72656163686564207075626c69632073616c6520706572206d696e74206d617860008201527f20616d6f756e7400000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f72656163686564207075626c69632073616c65206d617820616d6f756e740000600082015250565b7f7265616368656420616c6c6f77206c697374207065722061646472657373206d60008201527f696e7420616d6f756e7400000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f616c6c6f774c6973742073616c6520686173206e6f7420626567756e20796574600082015250565b7f746f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615a2581614df8565b8114615a3057600080fd5b50565b615a3c81614e0a565b8114615a4757600080fd5b50565b615a5381614e16565b8114615a5e57600080fd5b50565b615a6a81614e20565b8114615a7557600080fd5b50565b615a8181614e88565b8114615a8c57600080fd5b5056fea264697066735822122037566125b719a97fe52b64b1adffa839fbd1cccf2cc3e8aeef42ed1e55df4ed964736f6c63430008070033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80638bc35c2f1161012e578063b6c693e5116100ab578063d7224ba01161006f578063d7224ba014610888578063dc33e681146108b3578063e985e9c5146108f0578063ec8bda8e1461092d578063f2fde38b146109495761023b565b8063b6c693e51461077d578063b88d4fde146107a8578063bb122299146107d1578063c5f77e161461080e578063c87b56dd1461084b5761023b565b8063a22cb465116100f2578063a22cb465146106cd578063a945bf80146106f6578063ac44600214610721578063b3ab66b014610738578063b423fe67146107545761023b565b80638bc35c2f146105e45780638da5cb5b1461060f5780639231ab2a1461063a57806395d89b41146106775780639dc74e63146106a25761023b565b8063300bc3a1116101bc57806355f804b31161018057806355f804b3146105015780636352211e1461052a57806370a0823114610567578063715018a6146105a457806384584d07146105bb5761023b565b8063300bc3a11461041c5780633ba5ae241461044557806342842e0e14610470578063499e8eec146104995780634f6ccce7146104c45761023b565b806318160ddd1161020357806318160ddd146103375780631a534faf1461036257806323b872dd1461038d5780632d20fb60146103b65780632f745c59146103df5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780631342ff4c1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613ebb565b610972565b60405161027491906146c6565b60405180910390f35b34801561028957600080fd5b50610292610abc565b60405161029f91906146e1565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613f62565b610b4e565b6040516102dc919061465f565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613e21565b610bd3565b005b34801561031a57600080fd5b5061033560048036038101906103309190613f62565b610cec565b005b34801561034357600080fd5b5061034c610ec3565b6040516103599190614b7e565b60405180910390f35b34801561036e57600080fd5b50610377610ecd565b60405161038491906146c6565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613d0b565b610ee4565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190613f62565b610ef4565b005b3480156103eb57600080fd5b5061040660048036038101906104019190613e21565b610fd2565b6040516104139190614b7e565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e9190613e61565b6111d0565b005b34801561045157600080fd5b5061045a611269565b6040516104679190614b7e565b60405180910390f35b34801561047c57600080fd5b5061049760048036038101906104929190613d0b565b61128d565b005b3480156104a557600080fd5b506104ae6112ad565b6040516104bb91906146c6565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613f62565b6112c4565b6040516104f89190614b7e565b60405180910390f35b34801561050d57600080fd5b5061052860048036038101906105239190613f15565b611317565b005b34801561053657600080fd5b50610551600480360381019061054c9190613f62565b6113a9565b60405161055e919061465f565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613c9e565b6113bf565b60405161059b9190614b7e565b60405180910390f35b3480156105b057600080fd5b506105b96114a8565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613e8e565b611530565b005b3480156105f057600080fd5b506105f96115b6565b6040516106069190614b7e565b60405180910390f35b34801561061b57600080fd5b506106246115da565b604051610631919061465f565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190613f62565b611603565b60405161066e9190614b63565b60405180910390f35b34801561068357600080fd5b5061068c61161b565b60405161069991906146e1565b60405180910390f35b3480156106ae57600080fd5b506106b76116ad565b6040516106c49190614b7e565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190613de1565b6116b3565b005b34801561070257600080fd5b5061070b611834565b6040516107189190614b7e565b60405180910390f35b34801561072d57600080fd5b5061073661183a565b005b610752600480360381019061074d9190613f62565b6119bb565b005b34801561076057600080fd5b5061077b60048036038101906107769190613e61565b611b63565b005b34801561078957600080fd5b50610792611bfc565b60405161079f91906146c6565b60405180910390f35b3480156107b457600080fd5b506107cf60048036038101906107ca9190613d5e565b611c0f565b005b3480156107dd57600080fd5b506107f860048036038101906107f39190613c9e565b611c6b565b6040516108059190614b7e565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190613c9e565b611c83565b60405161084291906146c6565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190613f62565b611ca3565b60405161087f91906146e1565b60405180910390f35b34801561089457600080fd5b5061089d611d4a565b6040516108aa9190614b7e565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613c9e565b611d50565b6040516108e79190614b7e565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613ccb565b611d62565b60405161092491906146c6565b60405180910390f35b61094760048036038101906109429190613f8f565b611df6565b005b34801561095557600080fd5b50610970600480360381019061096b9190613c9e565b6121c3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab55750610ab4826122bb565b5b9050919050565b606060028054610acb90614f12565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790614f12565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b6000610b5982612325565b610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f90614b23565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bde826113a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c46906149a3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c6e612333565b73ffffffffffffffffffffffffffffffffffffffff161480610c9d5750610c9c81610c97612333565b611d62565b5b610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390614863565b60405180910390fd5b610ce783838361233b565b505050565b610cf4612333565b73ffffffffffffffffffffffffffffffffffffffff16610d126115da565b73ffffffffffffffffffffffffffffffffffffffff1614610d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5f90614903565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000005dc81610d92610ec3565b610d9c9190614caf565b1115610ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd490614a83565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000582610e0b9190614d05565b905060005b81811015610e5557610e42337f00000000000000000000000000000000000000000000000000000000000000056123ed565b8080610e4d90614f75565b915050610e10565b5060007f000000000000000000000000000000000000000000000000000000000000000583610e849190614fe2565b14610ebf57610ebe337f000000000000000000000000000000000000000000000000000000000000000584610eb99190614fe2565b6123ed565b5b5050565b6000600154905090565b6000600c60009054906101000a900460ff16905090565b610eef83838361240b565b505050565b610efc612333565b73ffffffffffffffffffffffffffffffffffffffff16610f1a6115da565b73ffffffffffffffffffffffffffffffffffffffff1614610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6790614903565b60405180910390fd5b60026009541415610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad90614ae3565b60405180910390fd5b6002600981905550610fc7816129c4565b600160098190555050565b6000610fdd836113bf565b821061101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614703565b60405180910390fd5b6000611028610ec3565b905060008060005b8381101561118e576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461112257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561117a578684141561116b5781955050505050506111ca565b838061117690614f75565b9450505b50808061118690614f75565b915050611030565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614aa3565b60405180910390fd5b92915050565b6111d8612333565b73ffffffffffffffffffffffffffffffffffffffff166111f66115da565b73ffffffffffffffffffffffffffffffffffffffff161461124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390614903565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000581565b6112a883838360405180602001604052806000815250611c0f565b505050565b6000601160009054906101000a900460ff16905090565b60006112ce610ec3565b821061130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614783565b60405180910390fd5b819050919050565b61131f612333565b73ffffffffffffffffffffffffffffffffffffffff1661133d6115da565b73ffffffffffffffffffffffffffffffffffffffff1614611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90614903565b60405180910390fd5b8181600a91906113a49291906139df565b505050565b60006113b482612c52565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611427906148a3565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114b0612333565b73ffffffffffffffffffffffffffffffffffffffff166114ce6115da565b73ffffffffffffffffffffffffffffffffffffffff1614611524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151b90614903565b60405180910390fd5b61152e6000612e55565b565b611538612333565b73ffffffffffffffffffffffffffffffffffffffff166115566115da565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390614903565b60405180910390fd5b80600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000281565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61160b613a65565b61161482612c52565b9050919050565b60606003805461162a90614f12565b80601f016020809104026020016040519081016040528092919081815260200182805461165690614f12565b80156116a35780601f10611678576101008083540402835291602001916116a3565b820191906000526020600020905b81548152906001019060200180831161168657829003601f168201915b5050505050905090565b60135481565b6116bb612333565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090614943565b60405180910390fd5b8060076000611736612333565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e3612333565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182891906146c6565b60405180910390a35050565b60125481565b611842612333565b73ffffffffffffffffffffffffffffffffffffffff166118606115da565b73ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad90614903565b60405180910390fd5b600260095414156118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390614ae3565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161192a9061464a565b60006040518083038185875af1925050503d8060008114611967576040519150601f19603f3d011682016040523d82523d6000602084013e61196c565b606091505b50509050806119b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a7906149c3565b60405180910390fd5b506001600981905550565b601160009054906101000a900460ff16611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190614983565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000005dc81611a34610ec3565b611a3e9190614caf565b1115611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a76906148c3565b60405180910390fd5b806013541015611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb906147c3565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000005811115611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90614763565b60405180910390fd5b611b3133826123ed565b8060136000828254611b439190614dc4565b92505081905550611b6081601254611b5b9190614d36565b612f19565b50565b611b6b612333565b73ffffffffffffffffffffffffffffffffffffffff16611b896115da565b73ffffffffffffffffffffffffffffffffffffffff1614611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690614903565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b601160009054906101000a900460ff1681565b611c1a84848461240b565b611c2684848484612fba565b611c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5c906149e3565b60405180910390fd5b50505050565b60106020528060005260406000206000915090505481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6060611cae82612325565b611ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce490614923565b60405180910390fd5b6000611cf7613151565b90506000815111611d175760405180602001604052806000815250611d42565b80611d21846131e3565b604051602001611d32929190614626565b6040516020818303038152906040525b915050919050565b60085481565b6000611d5b82613344565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b90614843565b60405180910390fd5b600c60009054906101000a900460ff16611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa90614a63565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000005dc82611edd610ec3565b611ee79190614caf565b1115611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f906148c3565b60405180910390fd5b600033604051602001611f3b919061460b565b604051602081830303815290604052805190602001209050611f6082600e548361342d565b611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614823565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120ad576001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f0000000000000000000000000000000000000000000000000000000000000002601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561212f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612126906147e3565b60405180910390fd5b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461217e9190614dc4565b9250508190555061218f33846123ed565b82600d60008282546121a19190614dc4565b925050819055506121be83600b546121b99190614d36565b612f19565b505050565b6121cb612333565b73ffffffffffffffffffffffffffffffffffffffff166121e96115da565b73ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614903565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a690614723565b60405180910390fd5b6122b881612e55565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612407828260405180602001604052806000815250613444565b5050565b600061241682612c52565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661243d612333565b73ffffffffffffffffffffffffffffffffffffffff1614806124995750612462612333565b73ffffffffffffffffffffffffffffffffffffffff1661248184610b4e565b73ffffffffffffffffffffffffffffffffffffffff16145b806124b557506124b482600001516124af612333565b611d62565b5b9050806124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90614963565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612560906148e3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d0906147a3565b60405180910390fd5b6125e68585856001613924565b6125f6600084846000015161233b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166126649190614d90565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166127089190614c69565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461280e9190614caf565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129545761288481612325565b15612953576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129bc868686600161392a565b505050505050565b6000600854905060008211612a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0590614883565b60405180910390fd5b600060018383612a1e9190614caf565b612a289190614dc4565b905060017f00000000000000000000000000000000000000000000000000000000000005dc612a579190614dc4565b811115612a8e5760017f00000000000000000000000000000000000000000000000000000000000005dc612a8b9190614dc4565b90505b612a9781612325565b612ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acd90614ac3565b60405180910390fd5b60008290505b818111612c3957600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c26576000612b5982612c52565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b8080612c3190614f75565b915050612adc565b50600181612c479190614caf565b600881905550505050565b612c5a613a65565b612c6382612325565b612ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9990614743565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000058310612d065760017f000000000000000000000000000000000000000000000000000000000000000584612cf99190614dc4565b612d039190614caf565b90505b60008390505b818110612e14576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e0057809350505050612e50565b508080612e0c90614ee8565b915050612d0c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4790614b03565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80341015612f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5390614a03565b60405180910390fd5b80341115612fb7573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612f8a9190614dc4565b9081150290604051600060405180830381858888f19350505050158015612fb5573d6000803e3d6000fd5b505b50565b6000612fdb8473ffffffffffffffffffffffffffffffffffffffff16613930565b15613144578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613004612333565b8786866040518563ffffffff1660e01b8152600401613026949392919061467a565b602060405180830381600087803b15801561304057600080fd5b505af192505050801561307157506040513d601f19601f8201168201806040525081019061306e9190613ee8565b60015b6130f4573d80600081146130a1576040519150601f19603f3d011682016040523d82523d6000602084013e6130a6565b606091505b506000815114156130ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e3906149e3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613149565b600190505b949350505050565b6060600a805461316090614f12565b80601f016020809104026020016040519081016040528092919081815260200182805461318c90614f12565b80156131d95780601f106131ae576101008083540402835291602001916131d9565b820191906000526020600020905b8154815290600101906020018083116131bc57829003601f168201915b5050505050905090565b6060600082141561322b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061333f565b600082905060005b6000821461325d57808061324690614f75565b915050600a826132569190614d05565b9150613233565b60008167ffffffffffffffff811115613279576132786150cf565b5b6040519080825280601f01601f1916602001820160405280156132ab5781602001600182028036833780820191505090505b5090505b60008514613338576001826132c49190614dc4565b9150600a856132d39190614fe2565b60306132df9190614caf565b60f81b8183815181106132f5576132f46150a0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133319190614d05565b94506132af565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ac90614803565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008261343a8584613953565b1490509392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156134bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b290614a43565b60405180910390fd5b6134c481612325565b15613504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fb90614a23565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000005831115613567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355e90614b43565b60405180910390fd5b6135746000858386613924565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516136719190614c69565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136989190614c69565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561390757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138a76000888488612fba565b6138e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138dd906149e3565b60405180910390fd5b81806138f190614f75565b92505080806138ff90614f75565b915050613836565b508060018190555061391c600087858861392a565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b84518110156139bd57600085828151811061397a576139796150a0565b5b6020026020010151905080831161399c5761399583826139c8565b92506139a9565b6139a681846139c8565b92505b5080806139b590614f75565b91505061395c565b508091505092915050565b600082600052816020526040600020905092915050565b8280546139eb90614f12565b90600052602060002090601f016020900481019282613a0d5760008555613a54565b82601f10613a2657803560ff1916838001178555613a54565b82800160010185558215613a54579182015b82811115613a53578235825591602001919060010190613a38565b5b509050613a619190613a9f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613ab8576000816000905550600101613aa0565b5090565b6000613acf613aca84614bbe565b614b99565b90508083825260208201905082856020860282011115613af257613af1615108565b5b60005b85811015613b225781613b088882613bc6565b845260208401935060208301925050600181019050613af5565b5050509392505050565b6000613b3f613b3a84614bea565b614b99565b905082815260208101848484011115613b5b57613b5a61510d565b5b613b66848285614ea6565b509392505050565b600081359050613b7d81615a1c565b92915050565b600082601f830112613b9857613b97615103565b5b8135613ba8848260208601613abc565b91505092915050565b600081359050613bc081615a33565b92915050565b600081359050613bd581615a4a565b92915050565b600081359050613bea81615a61565b92915050565b600081519050613bff81615a61565b92915050565b600082601f830112613c1a57613c19615103565b5b8135613c2a848260208601613b2c565b91505092915050565b60008083601f840112613c4957613c48615103565b5b8235905067ffffffffffffffff811115613c6657613c656150fe565b5b602083019150836001820283011115613c8257613c81615108565b5b9250929050565b600081359050613c9881615a78565b92915050565b600060208284031215613cb457613cb3615117565b5b6000613cc284828501613b6e565b91505092915050565b60008060408385031215613ce257613ce1615117565b5b6000613cf085828601613b6e565b9250506020613d0185828601613b6e565b9150509250929050565b600080600060608486031215613d2457613d23615117565b5b6000613d3286828701613b6e565b9350506020613d4386828701613b6e565b9250506040613d5486828701613c89565b9150509250925092565b60008060008060808587031215613d7857613d77615117565b5b6000613d8687828801613b6e565b9450506020613d9787828801613b6e565b9350506040613da887828801613c89565b925050606085013567ffffffffffffffff811115613dc957613dc8615112565b5b613dd587828801613c05565b91505092959194509250565b60008060408385031215613df857613df7615117565b5b6000613e0685828601613b6e565b9250506020613e1785828601613bb1565b9150509250929050565b60008060408385031215613e3857613e37615117565b5b6000613e4685828601613b6e565b9250506020613e5785828601613c89565b9150509250929050565b600060208284031215613e7757613e76615117565b5b6000613e8584828501613bb1565b91505092915050565b600060208284031215613ea457613ea3615117565b5b6000613eb284828501613bc6565b91505092915050565b600060208284031215613ed157613ed0615117565b5b6000613edf84828501613bdb565b91505092915050565b600060208284031215613efe57613efd615117565b5b6000613f0c84828501613bf0565b91505092915050565b60008060208385031215613f2c57613f2b615117565b5b600083013567ffffffffffffffff811115613f4a57613f49615112565b5b613f5685828601613c33565b92509250509250929050565b600060208284031215613f7857613f77615117565b5b6000613f8684828501613c89565b91505092915050565b60008060408385031215613fa657613fa5615117565b5b6000613fb485828601613c89565b925050602083013567ffffffffffffffff811115613fd557613fd4615112565b5b613fe185828601613b83565b9150509250929050565b613ff481614df8565b82525050565b61400381614df8565b82525050565b61401a61401582614df8565b614fbe565b82525050565b61402981614e0a565b82525050565b600061403a82614c1b565b6140448185614c31565b9350614054818560208601614eb5565b61405d8161511c565b840191505092915050565b600061407382614c26565b61407d8185614c4d565b935061408d818560208601614eb5565b6140968161511c565b840191505092915050565b60006140ac82614c26565b6140b68185614c5e565b93506140c6818560208601614eb5565b80840191505092915050565b60006140df602283614c4d565b91506140ea8261513a565b604082019050919050565b6000614102602683614c4d565b915061410d82615189565b604082019050919050565b6000614125602a83614c4d565b9150614130826151d8565b604082019050919050565b6000614148602783614c4d565b915061415382615227565b604082019050919050565b600061416b602383614c4d565b915061417682615276565b604082019050919050565b600061418e602583614c4d565b9150614199826152c5565b604082019050919050565b60006141b1601e83614c4d565b91506141bc82615314565b602082019050919050565b60006141d4602a83614c4d565b91506141df8261533d565b604082019050919050565b60006141f7603183614c4d565b91506142028261538c565b604082019050919050565b600061421a601583614c4d565b9150614225826153db565b602082019050919050565b600061423d601e83614c4d565b915061424882615404565b602082019050919050565b6000614260603983614c4d565b915061426b8261542d565b604082019050919050565b6000614283601883614c4d565b915061428e8261547c565b602082019050919050565b60006142a6602b83614c4d565b91506142b1826154a5565b604082019050919050565b60006142c9601283614c4d565b91506142d4826154f4565b602082019050919050565b60006142ec602683614c4d565b91506142f78261551d565b604082019050919050565b600061430f602083614c4d565b915061431a8261556c565b602082019050919050565b6000614332602f83614c4d565b915061433d82615595565b604082019050919050565b6000614355601a83614c4d565b9150614360826155e4565b602082019050919050565b6000614378603283614c4d565b91506143838261560d565b604082019050919050565b600061439b601d83614c4d565b91506143a68261565c565b602082019050919050565b60006143be602283614c4d565b91506143c982615685565b604082019050919050565b60006143e1600083614c42565b91506143ec826156d4565b600082019050919050565b6000614404601083614c4d565b915061440f826156d7565b602082019050919050565b6000614427603383614c4d565b915061443282615700565b604082019050919050565b600061444a601683614c4d565b91506144558261574f565b602082019050919050565b600061446d601d83614c4d565b915061447882615778565b602082019050919050565b6000614490602183614c4d565b915061449b826157a1565b604082019050919050565b60006144b3602083614c4d565b91506144be826157f0565b602082019050919050565b60006144d6602783614c4d565b91506144e182615819565b604082019050919050565b60006144f9602e83614c4d565b915061450482615868565b604082019050919050565b600061451c602683614c4d565b9150614527826158b7565b604082019050919050565b600061453f601f83614c4d565b915061454a82615906565b602082019050919050565b6000614562602f83614c4d565b915061456d8261592f565b604082019050919050565b6000614585602d83614c4d565b91506145908261597e565b604082019050919050565b60006145a8602283614c4d565b91506145b3826159cd565b604082019050919050565b6040820160008201516145d46000850182613feb565b5060208201516145e760208501826145fc565b50505050565b6145f681614e88565b82525050565b61460581614e92565b82525050565b60006146178284614009565b60148201915081905092915050565b600061463282856140a1565b915061463e82846140a1565b91508190509392505050565b6000614655826143d4565b9150819050919050565b60006020820190506146746000830184613ffa565b92915050565b600060808201905061468f6000830187613ffa565b61469c6020830186613ffa565b6146a960408301856145ed565b81810360608301526146bb818461402f565b905095945050505050565b60006020820190506146db6000830184614020565b92915050565b600060208201905081810360008301526146fb8184614068565b905092915050565b6000602082019050818103600083015261471c816140d2565b9050919050565b6000602082019050818103600083015261473c816140f5565b9050919050565b6000602082019050818103600083015261475c81614118565b9050919050565b6000602082019050818103600083015261477c8161413b565b9050919050565b6000602082019050818103600083015261479c8161415e565b9050919050565b600060208201905081810360008301526147bc81614181565b9050919050565b600060208201905081810360008301526147dc816141a4565b9050919050565b600060208201905081810360008301526147fc816141c7565b9050919050565b6000602082019050818103600083015261481c816141ea565b9050919050565b6000602082019050818103600083015261483c8161420d565b9050919050565b6000602082019050818103600083015261485c81614230565b9050919050565b6000602082019050818103600083015261487c81614253565b9050919050565b6000602082019050818103600083015261489c81614276565b9050919050565b600060208201905081810360008301526148bc81614299565b9050919050565b600060208201905081810360008301526148dc816142bc565b9050919050565b600060208201905081810360008301526148fc816142df565b9050919050565b6000602082019050818103600083015261491c81614302565b9050919050565b6000602082019050818103600083015261493c81614325565b9050919050565b6000602082019050818103600083015261495c81614348565b9050919050565b6000602082019050818103600083015261497c8161436b565b9050919050565b6000602082019050818103600083015261499c8161438e565b9050919050565b600060208201905081810360008301526149bc816143b1565b9050919050565b600060208201905081810360008301526149dc816143f7565b9050919050565b600060208201905081810360008301526149fc8161441a565b9050919050565b60006020820190508181036000830152614a1c8161443d565b9050919050565b60006020820190508181036000830152614a3c81614460565b9050919050565b60006020820190508181036000830152614a5c81614483565b9050919050565b60006020820190508181036000830152614a7c816144a6565b9050919050565b60006020820190508181036000830152614a9c816144c9565b9050919050565b60006020820190508181036000830152614abc816144ec565b9050919050565b60006020820190508181036000830152614adc8161450f565b9050919050565b60006020820190508181036000830152614afc81614532565b9050919050565b60006020820190508181036000830152614b1c81614555565b9050919050565b60006020820190508181036000830152614b3c81614578565b9050919050565b60006020820190508181036000830152614b5c8161459b565b9050919050565b6000604082019050614b7860008301846145be565b92915050565b6000602082019050614b9360008301846145ed565b92915050565b6000614ba3614bb4565b9050614baf8282614f44565b919050565b6000604051905090565b600067ffffffffffffffff821115614bd957614bd86150cf565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c0557614c046150cf565b5b614c0e8261511c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c7482614e4c565b9150614c7f83614e4c565b9250826fffffffffffffffffffffffffffffffff03821115614ca457614ca3615013565b5b828201905092915050565b6000614cba82614e88565b9150614cc583614e88565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cfa57614cf9615013565b5b828201905092915050565b6000614d1082614e88565b9150614d1b83614e88565b925082614d2b57614d2a615042565b5b828204905092915050565b6000614d4182614e88565b9150614d4c83614e88565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8557614d84615013565b5b828202905092915050565b6000614d9b82614e4c565b9150614da683614e4c565b925082821015614db957614db8615013565b5b828203905092915050565b6000614dcf82614e88565b9150614dda83614e88565b925082821015614ded57614dec615013565b5b828203905092915050565b6000614e0382614e68565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015614ed3578082015181840152602081019050614eb8565b83811115614ee2576000848401525b50505050565b6000614ef382614e88565b91506000821415614f0757614f06615013565b5b600182039050919050565b60006002820490506001821680614f2a57607f821691505b60208210811415614f3e57614f3d615071565b5b50919050565b614f4d8261511c565b810181811067ffffffffffffffff82111715614f6c57614f6b6150cf565b5b80604052505050565b6000614f8082614e88565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fb357614fb2615013565b5b600182019050919050565b6000614fc982614fd0565b9050919050565b6000614fdb8261512d565b9050919050565b6000614fed82614e88565b9150614ff883614e88565b92508261500857615007615042565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f72656163686564207075626c69632073616c6520706572206d696e74206d617860008201527f20616d6f756e7400000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f72656163686564207075626c69632073616c65206d617820616d6f756e740000600082015250565b7f7265616368656420616c6c6f77206c697374207065722061646472657373206d60008201527f696e7420616d6f756e7400000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f616c6c6f774c6973742073616c6520686173206e6f7420626567756e20796574600082015250565b7f746f6f206d616e7920616c7265616479206d696e746564206265666f7265206460008201527f6576206d696e7400000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b615a2581614df8565b8114615a3057600080fd5b50565b615a3c81614e0a565b8114615a4757600080fd5b50565b615a5381614e16565b8114615a5e57600080fd5b50565b615a6a81614e20565b8114615a7557600080fd5b50565b615a8181614e88565b8114615a8c57600080fd5b5056fea264697066735822122037566125b719a97fe52b64b1adffa839fbd1cccf2cc3e8aeef42ed1e55df4ed964736f6c63430008070033

Deployed Bytecode Sourcemap

2030:4483:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4114:358:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5778:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7243:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6821:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2190:478:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2720:92:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5314:96:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8061:136:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3151:122:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3334:721:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5207:101:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5609:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8255:151:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6412:99:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2876:174:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2847:104:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5608:116:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4523:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;5111:90:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3964:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3396:149:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5926:96:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5524:40:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7502:269:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5475:43:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2957:188;;;;;;;;;;;;;:::i;:::-;;5662:635;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6303:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5433:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8464:300:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4109:51:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4056:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6080:377:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12734:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3279:111:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7829:178:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4168:937:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4114:358:11;4236:4;4278:25;4263:40;;;:11;:40;;;;:98;;;;4328:33;4313:48;;;:11;:48;;;;4263:98;:158;;;;4386:35;4371:50;;;:11;:50;;;;4263:158;:204;;;;4431:36;4455:11;4431:23;:36::i;:::-;4263:204;4250:217;;4114:358;;;:::o;5778:92::-;5832:13;5860:5;5853:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5778:92;:::o;7243:200::-;7311:7;7334:16;7342:7;7334;:16::i;:::-;7326:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7414:15;:24;7430:7;7414:24;;;;;;;;;;;;;;;;;;;;;7407:31;;7243:200;;;:::o;6821:369::-;6889:13;6905:24;6921:7;6905:15;:24::i;:::-;6889:40;;6949:5;6943:11;;:2;:11;;;;6935:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;7031:5;7015:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;7040:37;7057:5;7064:12;:10;:12::i;:::-;7040:16;:37::i;:::-;7015:62;7000:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;7157:28;7166:2;7170:7;7179:5;7157:8;:28::i;:::-;6883:307;6821:369;;:::o;2190:478:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:14:12::1;2295:8;2279:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;2258:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;2396:17;2427:12;2416:8;:23;;;;:::i;:::-;2396:43;;2454:9;2449:100;2473:9;2469:1;:13;2449:100;;;2503:35;2513:10;2525:12;2503:9;:35::i;:::-;2484:3;;;;;:::i;:::-;;;;2449:100;;;;2589:1;2573:12;2562:8;:23;;;;:::i;:::-;:28;2558:104;;2605:46;2615:10;2638:12;2627:8;:23;;;;:::i;:::-;2605:9;:46::i;:::-;2558:104;2248:420;2190:478:::0;:::o;2720:92:11:-;2773:7;2795:12;;2788:19;;2720:92;:::o;5314:96:12:-;5366:4;5388:15;;;;;;;;;;;5381:22;;5314:96;:::o;8061:136:11:-;8164:28;8174:4;8180:2;8184:7;8164:9;:28::i;:::-;8061:136;;;:::o;3151:122:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3238:28:12::2;3257:8;3238:18;:28::i;:::-;1701:1:1::1;2628:7;:22;;;;3151:122:12::0;:::o;3334:721:11:-;3439:7;3472:16;3482:5;3472:9;:16::i;:::-;3464:5;:24;3456:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3533:22;3558:13;:11;:13::i;:::-;3533:38;;3577:19;3606:25;3655:9;3650:339;3674:14;3670:1;:18;3650:339;;;3703:31;3737:11;:14;3749:1;3737:14;;;;;;;;;;;3703:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3789:1;3763:28;;:9;:14;;;:28;;;3759:87;;3823:9;:14;;;3803:34;;3759:87;3878:5;3857:26;;:17;:26;;;3853:130;;;3914:5;3899:11;:20;3895:57;;;3940:1;3933:8;;;;;;;;;3895:57;3961:13;;;;;:::i;:::-;;;;3853:130;3695:294;3690:3;;;;;:::i;:::-;;;;3650:339;;;;3994:56;;;;;;;;;;:::i;:::-;;;;;;;;3334:721;;;;;:::o;5207:101:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5295:6:12::1;5277:15;;:24;;;;;;;;;;;;;;;;;;5207:101:::0;:::o;5609:46::-;;;:::o;8255:151:11:-;8362:39;8379:4;8385:2;8389:7;8362:39;;;;;;;;;;;;:16;:39::i;:::-;8255:151;;;:::o;6412:99:12:-;6465:4;6488:16;;;;;;;;;;;6481:23;;6412:99;:::o;2876:174:11:-;2943:7;2974:13;:11;:13::i;:::-;2966:5;:21;2958:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3040:5;3033:12;;2876:174;;;:::o;2847:104:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2937:7:12::1;;2921:13;:23;;;;;;;:::i;:::-;;2847:104:::0;;:::o;5608:116:11:-;5672:7;5694:20;5706:7;5694:11;:20::i;:::-;:25;;;5687:32;;5608:116;;;:::o;4523:208::-;4587:7;4627:1;4610:19;;:5;:19;;;;4602:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4698:12;:19;4711:5;4698:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4690:36;;4683:43;;4523:208;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;5111:90:12:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5189:5:12::1;5176:10;:18;;;;5111:90:::0;:::o;3964:52::-;;;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;3396:149:12:-;3474:21;;:::i;:::-;3518:20;3530:7;3518:11;:20::i;:::-;3511:27;;3396:149;;;:::o;5926:96:11:-;5982:13;6010:7;6003:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5926:96;:::o;5524:40:12:-;;;;:::o;7502:269:11:-;7604:12;:10;:12::i;:::-;7592:24;;:8;:24;;;;7584:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7699:8;7654:18;:32;7673:12;:10;:12::i;:::-;7654:32;;;;;;;;;;;;;;;:42;7687:8;7654:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7747:8;7718:48;;7733:12;:10;:12::i;:::-;7718:48;;;7757:8;7718:48;;;;;;:::i;:::-;;;;;;;;7502:269;;:::o;5475:43:12:-;;;;:::o;2957:188::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3025:12:12::2;3043:10;:15;;3066:21;3043:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3024:68;;;3110:7;3102:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;3014:131;1701:1:1::1;2628:7;:22;;;;2957:188:12:o:0;5662:635::-;5748:16;;;;;;;;;;;5731:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;5870:14;5858:8;5842:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;5825:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;5974:8;5951:19;;:31;;5934:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;6074:17;6062:8;:29;;6045:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;6163:31;6173:10;6185:8;6163:9;:31::i;:::-;6227:8;6204:19;;:31;;;;;;;:::i;:::-;;;;;;;;6245:45;6281:8;6266:11;;6258:31;;;;:::i;:::-;6245:12;:45::i;:::-;5662:635;:::o;6303:103::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6393:6:12::1;6374:16;;:25;;;;;;;;;;;;;;;;;;6303:103:::0;:::o;5433:36::-;;;;;;;;;;;;;:::o;8464:300:11:-;8595:28;8605:4;8611:2;8615:7;8595:9;:28::i;:::-;8644:48;8667:4;8673:2;8677:7;8686:5;8644:22;:48::i;:::-;8629:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;8464:300;;;;:::o;4109:51:12:-;;;;;;;;;;;;;;;;;:::o;4056:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;6080:377:11:-;6173:13;6211:16;6219:7;6211;:16::i;:::-;6196:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;6297:21;6321:10;:8;:10::i;:::-;6297:34;;6374:1;6356:7;6350:21;:25;:102;;;;;;;;;;;;;;;;;6410:7;6419:18;:7;:16;:18::i;:::-;6393:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6350:102;6337:115;;;6080:377;;;:::o;12734:43::-;;;;:::o;3279:111:12:-;3337:7;3363:20;3377:5;3363:13;:20::i;:::-;3356:27;;3279:111;;;:::o;7829:178:11:-;7946:4;7967:18;:25;7986:5;7967:25;;;;;;;;;;;;;;;:35;7993:8;7967:35;;;;;;;;;;;;;;;;;;;;;;;;;7960:42;;7829:178;;;;:::o;4168:937:12:-;4281:10;4268:23;;:9;:23;;;4260:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4344:15;;;;;;;;;;;4336:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;4442:14;4430:8;4414:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;4406:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4489:12;4531:10;4514:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;4504:39;;;;;;4489:54;;4561:43;4580:5;4587:10;;4599:4;4561:18;:43::i;:::-;4553:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:15;:27;4672:10;4656:27;;;;;;;;;;;;;;;;;;;;;;;;;4652:159;;4728:4;4698:15;:27;4714:10;4698:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;4777:23;4746:16;:28;4763:10;4746:28;;;;;;;;;;;;;;;:54;;;;4652:159;4860:8;4828:16;:28;4845:10;4828:28;;;;;;;;;;;;;;;;:40;;4820:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;4957:8;4925:16;:28;4942:10;4925:28;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;4975:31;4985:10;4997:8;4975:9;:31::i;:::-;5039:8;5016:19;;:31;;;;;;;:::i;:::-;;;;;;;;5057:41;5089:8;5070:18;;:27;;;;:::i;:::-;5057:12;:41::i;:::-;4250:855;4168:937;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;829:155:9:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8994:103:11:-;9051:4;9080:12;;9070:7;:22;9063:29;;8994:103;;;:::o;640:96:7:-;693:7;719:10;712:17;;640:96;:::o;12565:165:11:-;12684:2;12657:15;:24;12673:7;12657:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12717:7;12713:2;12697:28;;12706:5;12697:28;;;;;;;;;;;;12565:165;;;:::o;9101:96::-;9165:27;9175:2;9179:8;9165:27;;;;;;;;;;;;:9;:27::i;:::-;9101:96;;:::o;10982:1484::-;11074:35;11112:20;11124:7;11112:11;:20::i;:::-;11074:58;;11139:22;11181:13;:18;;;11165:34;;:12;:10;:12::i;:::-;:34;;;:80;;;;11233:12;:10;:12::i;:::-;11209:36;;:20;11221:7;11209:11;:20::i;:::-;:36;;;11165:80;:140;;;;11255:50;11272:13;:18;;;11292:12;:10;:12::i;:::-;11255:16;:50::i;:::-;11165:140;11139:167;;11328:17;11313:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;11455:4;11433:26;;:13;:18;;;:26;;;11418:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;11541:1;11527:16;;:2;:16;;;;11519:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11592:43;11614:4;11620:2;11624:7;11633:1;11592:21;:43::i;:::-;11689:49;11706:1;11710:7;11719:13;:18;;;11689:8;:49::i;:::-;11775:1;11745:12;:18;11758:4;11745:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11810:1;11782:12;:16;11795:2;11782:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11840:43;;;;;;;;11855:2;11840:43;;;;;;11866:15;11840:43;;;;;11817:11;:20;11829:7;11817:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12107:19;12139:1;12129:7;:11;;;;:::i;:::-;12107:33;;12191:1;12150:43;;:11;:24;12162:11;12150:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;12146:229;;;12207:20;12215:11;12207:7;:20::i;:::-;12203:166;;;12266:94;;;;;;;;12292:13;:18;;;12266:94;;;;;;12322:13;:28;;;12266:94;;;;;12239:11;:24;12251:11;12239:24;;;;;;;;;;;:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12203:166;12146:229;12405:7;12401:2;12386:27;;12395:4;12386:27;;;;;;;;;;;;12419:42;12440:4;12446:2;12450:7;12459:1;12419:20;:42::i;:::-;11068:1398;;;10982:1484;;;:::o;12877:827::-;12938:25;12966:24;;12938:52;;13015:1;13004:8;:12;12996:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;13051:16;13101:1;13090:8;13070:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;13051:51;;13140:1;13123:14;:18;;;;:::i;:::-;13112:8;:29;13108:79;;;13179:1;13162:14;:18;;;;:::i;:::-;13151:29;;13108:79;13300:17;13308:8;13300:7;:17::i;:::-;13292:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13371:9;13383:17;13371:29;;13366:289;13407:8;13402:1;:13;13366:289;;13465:1;13434:33;;:11;:14;13446:1;13434:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;13430:219;;;13479:31;13513:14;13525:1;13513:11;:14::i;:::-;13479:48;;13554:86;;;;;;;;13580:9;:14;;;13554:86;;;;;;13606:9;:24;;;13554:86;;;;;13537:11;:14;13549:1;13537:14;;;;;;;;;;;:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13469:180;13430:219;13417:3;;;;;:::i;:::-;;;;13366:289;;;;13698:1;13687:8;:12;;;;:::i;:::-;13660:24;:39;;;;12932:772;;12877:827;:::o;4973:586::-;5046:21;;:::i;:::-;5085:16;5093:7;5085;:16::i;:::-;5077:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5155:26;5202:12;5191:7;:23;5187:91;;5270:1;5255:12;5245:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;5224:47;;5187:91;5289:12;5304:7;5289:22;;5284:207;5321:18;5313:4;:26;5284:207;;5357:31;5391:11;:17;5403:4;5391:17;;;;;;;;;;;5357:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5446:1;5420:28;;:9;:14;;;:28;;;5416:69;;5467:9;5460:16;;;;;;;5416:69;5349:142;5341:6;;;;;:::i;:::-;;;;5284:207;;;;5497:57;;;;;;;;;;:::i;:::-;;;;;;;;4973:586;;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;3551:219:12:-;3627:5;3614:9;:18;;3606:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3685:5;3673:9;:17;3669:95;;;3714:10;3706:28;;:47;3747:5;3735:9;:17;;;;:::i;:::-;3706:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3669:95;3551:219;:::o;14235:667:11:-;14367:4;14383:15;:2;:13;;;:15::i;:::-;14379:519;;;14436:2;14420:36;;;14457:12;:10;:12::i;:::-;14471:4;14477:7;14486:5;14420:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14408:452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14664:1;14647:6;:13;:18;14643:209;;;14679:61;;;;;;;;;;:::i;:::-;;;;;;;;14643:209;14822:6;14816:13;14807:6;14803:2;14799:15;14792:38;14408:452;14550:45;;;14540:55;;;:6;:55;;;;14533:62;;;;;14379:519;14887:4;14880:11;;14235:667;;;;;;;:::o;2729:112:12:-;2789:13;2821;2814:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2729:112;:::o;328:703:8:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;4735:234:11:-;4796:7;4843:1;4826:19;;:5;:19;;;;4811:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;4931:12;:19;4944:5;4931:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;4923:41;;4916:48;;4735:234;;;:::o;604:184:12:-;725:4;777;748:25;761:5;768:4;748:12;:25::i;:::-;:33;741:40;;604:184;;;;;:::o;9523:1239:11:-;9623:20;9646:12;;9623:35;;9686:1;9672:16;;:2;:16;;;;9664:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9861:21;9869:12;9861:7;:21::i;:::-;9860:22;9852:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;9942:12;9930:8;:24;;9922:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;10000:61;10030:1;10034:2;10038:12;10052:8;10000:21;:61::i;:::-;10068:30;10101:12;:16;10114:2;10101:16;;;;;;;;;;;;;;;10068:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10142:116;;;;;;;;10191:8;10161:11;:19;;;:39;;;;:::i;:::-;10142:116;;;;;;10243:8;10208:11;:24;;;:44;;;;:::i;:::-;10142:116;;;;;10123:12;:16;10136:2;10123:16;;;;;;;;;;;;;;;:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10292:43;;;;;;;;10307:2;10292:43;;;;;;10318:15;10292:43;;;;;10264:11;:25;10276:12;10264:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10342:20;10365:12;10342:35;;10389:9;10384:274;10408:8;10404:1;:12;10384:274;;;10461:12;10457:2;10436:38;;10453:1;10436:38;;;;;;;;;;;;10499:59;10530:1;10534:2;10538:12;10552:5;10499:22;:59::i;:::-;10482:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;10637:14;;;;;:::i;:::-;;;;10418:3;;;;;:::i;:::-;;;;10384:274;;;;10679:12;10664;:27;;;;10697:60;10726:1;10730:2;10734:12;10748:8;10697:20;:60::i;:::-;9617:1145;;;9523:1239;;;:::o;15350:136::-;;;;;:::o;15858:135::-;;;;;:::o;1175:320:6:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;1140:662:12:-;1223:7;1242:20;1265:4;1242:27;;1284:9;1279:488;1303:5;:12;1299:1;:16;1279:488;;;1336:20;1359:5;1365:1;1359:8;;;;;;;;:::i;:::-;;;;;;;;1336:31;;1401:12;1385;:28;1381:376;;1526:42;1541:12;1555;1526:14;:42::i;:::-;1511:57;;1381:376;;;1700:42;1715:12;1729;1700:14;:42::i;:::-;1685:57;;1381:376;1322:445;1317:3;;;;;:::i;:::-;;;;1279:488;;;;1783:12;1776:19;;;1140:662;;;;:::o;1808:218::-;1876:13;1937:1;1931:4;1924:15;1965:1;1959:4;1952:15;2005:4;1999;1989:21;1980:30;;1808:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:13:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:139::-;1891:5;1929:6;1916:20;1907:29;;1945:33;1972:5;1945:33;:::i;:::-;1845:139;;;;:::o;1990:137::-;2035:5;2073:6;2060:20;2051:29;;2089:32;2115:5;2089:32;:::i;:::-;1990:137;;;;:::o;2133:141::-;2189:5;2220:6;2214:13;2205:22;;2236:32;2262:5;2236:32;:::i;:::-;2133:141;;;;:::o;2293:338::-;2348:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:122;;2405:79;;:::i;:::-;2364:122;2522:6;2509:20;2547:78;2621:3;2613:6;2606:4;2598:6;2594:17;2547:78;:::i;:::-;2538:87;;2354:277;2293:338;;;;:::o;2651:553::-;2709:8;2719:6;2769:3;2762:4;2754:6;2750:17;2746:27;2736:122;;2777:79;;:::i;:::-;2736:122;2890:6;2877:20;2867:30;;2920:18;2912:6;2909:30;2906:117;;;2942:79;;:::i;:::-;2906:117;3056:4;3048:6;3044:17;3032:29;;3110:3;3102:4;3094:6;3090:17;3080:8;3076:32;3073:41;3070:128;;;3117:79;;:::i;:::-;3070:128;2651:553;;;;;:::o;3210:139::-;3256:5;3294:6;3281:20;3272:29;;3310:33;3337:5;3310:33;:::i;:::-;3210:139;;;;:::o;3355:329::-;3414:6;3463:2;3451:9;3442:7;3438:23;3434:32;3431:119;;;3469:79;;:::i;:::-;3431:119;3589:1;3614:53;3659:7;3650:6;3639:9;3635:22;3614:53;:::i;:::-;3604:63;;3560:117;3355:329;;;;:::o;3690:474::-;3758:6;3766;3815:2;3803:9;3794:7;3790:23;3786:32;3783:119;;;3821:79;;:::i;:::-;3783:119;3941:1;3966:53;4011:7;4002:6;3991:9;3987:22;3966:53;:::i;:::-;3956:63;;3912:117;4068:2;4094:53;4139:7;4130:6;4119:9;4115:22;4094:53;:::i;:::-;4084:63;;4039:118;3690:474;;;;;:::o;4170:619::-;4247:6;4255;4263;4312:2;4300:9;4291:7;4287:23;4283:32;4280:119;;;4318:79;;:::i;:::-;4280:119;4438:1;4463:53;4508:7;4499:6;4488:9;4484:22;4463:53;:::i;:::-;4453:63;;4409:117;4565:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;:::i;:::-;4581:63;;4536:118;4693:2;4719:53;4764:7;4755:6;4744:9;4740:22;4719:53;:::i;:::-;4709:63;;4664:118;4170:619;;;;;:::o;4795:943::-;4890:6;4898;4906;4914;4963:3;4951:9;4942:7;4938:23;4934:33;4931:120;;;4970:79;;:::i;:::-;4931:120;5090:1;5115:53;5160:7;5151:6;5140:9;5136:22;5115:53;:::i;:::-;5105:63;;5061:117;5217:2;5243:53;5288:7;5279:6;5268:9;5264:22;5243:53;:::i;:::-;5233:63;;5188:118;5345:2;5371:53;5416:7;5407:6;5396:9;5392:22;5371:53;:::i;:::-;5361:63;;5316:118;5501:2;5490:9;5486:18;5473:32;5532:18;5524:6;5521:30;5518:117;;;5554:79;;:::i;:::-;5518:117;5659:62;5713:7;5704:6;5693:9;5689:22;5659:62;:::i;:::-;5649:72;;5444:287;4795:943;;;;;;;:::o;5744:468::-;5809:6;5817;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:53;6062:7;6053:6;6042:9;6038:22;6017:53;:::i;:::-;6007:63;;5963:117;6119:2;6145:50;6187:7;6178:6;6167:9;6163:22;6145:50;:::i;:::-;6135:60;;6090:115;5744:468;;;;;:::o;6218:474::-;6286:6;6294;6343:2;6331:9;6322:7;6318:23;6314:32;6311:119;;;6349:79;;:::i;:::-;6311:119;6469:1;6494:53;6539:7;6530:6;6519:9;6515:22;6494:53;:::i;:::-;6484:63;;6440:117;6596:2;6622:53;6667:7;6658:6;6647:9;6643:22;6622:53;:::i;:::-;6612:63;;6567:118;6218:474;;;;;:::o;6698:323::-;6754:6;6803:2;6791:9;6782:7;6778:23;6774:32;6771:119;;;6809:79;;:::i;:::-;6771:119;6929:1;6954:50;6996:7;6987:6;6976:9;6972:22;6954:50;:::i;:::-;6944:60;;6900:114;6698:323;;;;:::o;7027:329::-;7086:6;7135:2;7123:9;7114:7;7110:23;7106:32;7103:119;;;7141:79;;:::i;:::-;7103:119;7261:1;7286:53;7331:7;7322:6;7311:9;7307:22;7286:53;:::i;:::-;7276:63;;7232:117;7027:329;;;;:::o;7362:327::-;7420:6;7469:2;7457:9;7448:7;7444:23;7440:32;7437:119;;;7475:79;;:::i;:::-;7437:119;7595:1;7620:52;7664:7;7655:6;7644:9;7640:22;7620:52;:::i;:::-;7610:62;;7566:116;7362:327;;;;:::o;7695:349::-;7764:6;7813:2;7801:9;7792:7;7788:23;7784:32;7781:119;;;7819:79;;:::i;:::-;7781:119;7939:1;7964:63;8019:7;8010:6;7999:9;7995:22;7964:63;:::i;:::-;7954:73;;7910:127;7695:349;;;;:::o;8050:529::-;8121:6;8129;8178:2;8166:9;8157:7;8153:23;8149:32;8146:119;;;8184:79;;:::i;:::-;8146:119;8332:1;8321:9;8317:17;8304:31;8362:18;8354:6;8351:30;8348:117;;;8384:79;;:::i;:::-;8348:117;8497:65;8554:7;8545:6;8534:9;8530:22;8497:65;:::i;:::-;8479:83;;;;8275:297;8050:529;;;;;:::o;8585:329::-;8644:6;8693:2;8681:9;8672:7;8668:23;8664:32;8661:119;;;8699:79;;:::i;:::-;8661:119;8819:1;8844:53;8889:7;8880:6;8869:9;8865:22;8844:53;:::i;:::-;8834:63;;8790:117;8585:329;;;;:::o;8920:684::-;9013:6;9021;9070:2;9058:9;9049:7;9045:23;9041:32;9038:119;;;9076:79;;:::i;:::-;9038:119;9196:1;9221:53;9266:7;9257:6;9246:9;9242:22;9221:53;:::i;:::-;9211:63;;9167:117;9351:2;9340:9;9336:18;9323:32;9382:18;9374:6;9371:30;9368:117;;;9404:79;;:::i;:::-;9368:117;9509:78;9579:7;9570:6;9559:9;9555:22;9509:78;:::i;:::-;9499:88;;9294:303;8920:684;;;;;:::o;9610:108::-;9687:24;9705:5;9687:24;:::i;:::-;9682:3;9675:37;9610:108;;:::o;9724:118::-;9811:24;9829:5;9811:24;:::i;:::-;9806:3;9799:37;9724:118;;:::o;9848:157::-;9953:45;9973:24;9991:5;9973:24;:::i;:::-;9953:45;:::i;:::-;9948:3;9941:58;9848:157;;:::o;10011:109::-;10092:21;10107:5;10092:21;:::i;:::-;10087:3;10080:34;10011:109;;:::o;10126:360::-;10212:3;10240:38;10272:5;10240:38;:::i;:::-;10294:70;10357:6;10352:3;10294:70;:::i;:::-;10287:77;;10373:52;10418:6;10413:3;10406:4;10399:5;10395:16;10373:52;:::i;:::-;10450:29;10472:6;10450:29;:::i;:::-;10445:3;10441:39;10434:46;;10216:270;10126:360;;;;:::o;10492:364::-;10580:3;10608:39;10641:5;10608:39;:::i;:::-;10663:71;10727:6;10722:3;10663:71;:::i;:::-;10656:78;;10743:52;10788:6;10783:3;10776:4;10769:5;10765:16;10743:52;:::i;:::-;10820:29;10842:6;10820:29;:::i;:::-;10815:3;10811:39;10804:46;;10584:272;10492:364;;;;:::o;10862:377::-;10968:3;10996:39;11029:5;10996:39;:::i;:::-;11051:89;11133:6;11128:3;11051:89;:::i;:::-;11044:96;;11149:52;11194:6;11189:3;11182:4;11175:5;11171:16;11149:52;:::i;:::-;11226:6;11221:3;11217:16;11210:23;;10972:267;10862:377;;;;:::o;11245:366::-;11387:3;11408:67;11472:2;11467:3;11408:67;:::i;:::-;11401:74;;11484:93;11573:3;11484:93;:::i;:::-;11602:2;11597:3;11593:12;11586:19;;11245:366;;;:::o;11617:::-;11759:3;11780:67;11844:2;11839:3;11780:67;:::i;:::-;11773:74;;11856:93;11945:3;11856:93;:::i;:::-;11974:2;11969:3;11965:12;11958:19;;11617:366;;;:::o;11989:::-;12131:3;12152:67;12216:2;12211:3;12152:67;:::i;:::-;12145:74;;12228:93;12317:3;12228:93;:::i;:::-;12346:2;12341:3;12337:12;12330:19;;11989:366;;;:::o;12361:::-;12503:3;12524:67;12588:2;12583:3;12524:67;:::i;:::-;12517:74;;12600:93;12689:3;12600:93;:::i;:::-;12718:2;12713:3;12709:12;12702:19;;12361:366;;;:::o;12733:::-;12875:3;12896:67;12960:2;12955:3;12896:67;:::i;:::-;12889:74;;12972:93;13061:3;12972:93;:::i;:::-;13090:2;13085:3;13081:12;13074:19;;12733:366;;;:::o;13105:::-;13247:3;13268:67;13332:2;13327:3;13268:67;:::i;:::-;13261:74;;13344:93;13433:3;13344:93;:::i;:::-;13462:2;13457:3;13453:12;13446:19;;13105:366;;;:::o;13477:::-;13619:3;13640:67;13704:2;13699:3;13640:67;:::i;:::-;13633:74;;13716:93;13805:3;13716:93;:::i;:::-;13834:2;13829:3;13825:12;13818:19;;13477:366;;;:::o;13849:::-;13991:3;14012:67;14076:2;14071:3;14012:67;:::i;:::-;14005:74;;14088:93;14177:3;14088:93;:::i;:::-;14206:2;14201:3;14197:12;14190:19;;13849:366;;;:::o;14221:::-;14363:3;14384:67;14448:2;14443:3;14384:67;:::i;:::-;14377:74;;14460:93;14549:3;14460:93;:::i;:::-;14578:2;14573:3;14569:12;14562:19;;14221:366;;;:::o;14593:::-;14735:3;14756:67;14820:2;14815:3;14756:67;:::i;:::-;14749:74;;14832:93;14921:3;14832:93;:::i;:::-;14950:2;14945:3;14941:12;14934:19;;14593:366;;;:::o;14965:::-;15107:3;15128:67;15192:2;15187:3;15128:67;:::i;:::-;15121:74;;15204:93;15293:3;15204:93;:::i;:::-;15322:2;15317:3;15313:12;15306:19;;14965:366;;;:::o;15337:::-;15479:3;15500:67;15564:2;15559:3;15500:67;:::i;:::-;15493:74;;15576:93;15665:3;15576:93;:::i;:::-;15694:2;15689:3;15685:12;15678:19;;15337:366;;;:::o;15709:::-;15851:3;15872:67;15936:2;15931:3;15872:67;:::i;:::-;15865:74;;15948:93;16037:3;15948:93;:::i;:::-;16066:2;16061:3;16057:12;16050:19;;15709:366;;;:::o;16081:::-;16223:3;16244:67;16308:2;16303:3;16244:67;:::i;:::-;16237:74;;16320:93;16409:3;16320:93;:::i;:::-;16438:2;16433:3;16429:12;16422:19;;16081:366;;;:::o;16453:::-;16595:3;16616:67;16680:2;16675:3;16616:67;:::i;:::-;16609:74;;16692:93;16781:3;16692:93;:::i;:::-;16810:2;16805:3;16801:12;16794:19;;16453:366;;;:::o;16825:::-;16967:3;16988:67;17052:2;17047:3;16988:67;:::i;:::-;16981:74;;17064:93;17153:3;17064:93;:::i;:::-;17182:2;17177:3;17173:12;17166:19;;16825:366;;;:::o;17197:::-;17339:3;17360:67;17424:2;17419:3;17360:67;:::i;:::-;17353:74;;17436:93;17525:3;17436:93;:::i;:::-;17554:2;17549:3;17545:12;17538:19;;17197:366;;;:::o;17569:::-;17711:3;17732:67;17796:2;17791:3;17732:67;:::i;:::-;17725:74;;17808:93;17897:3;17808:93;:::i;:::-;17926:2;17921:3;17917:12;17910:19;;17569:366;;;:::o;17941:::-;18083:3;18104:67;18168:2;18163:3;18104:67;:::i;:::-;18097:74;;18180:93;18269:3;18180:93;:::i;:::-;18298:2;18293:3;18289:12;18282:19;;17941:366;;;:::o;18313:::-;18455:3;18476:67;18540:2;18535:3;18476:67;:::i;:::-;18469:74;;18552:93;18641:3;18552:93;:::i;:::-;18670:2;18665:3;18661:12;18654:19;;18313:366;;;:::o;18685:::-;18827:3;18848:67;18912:2;18907:3;18848:67;:::i;:::-;18841:74;;18924:93;19013:3;18924:93;:::i;:::-;19042:2;19037:3;19033:12;19026:19;;18685:366;;;:::o;19057:::-;19199:3;19220:67;19284:2;19279:3;19220:67;:::i;:::-;19213:74;;19296:93;19385:3;19296:93;:::i;:::-;19414:2;19409:3;19405:12;19398:19;;19057:366;;;:::o;19429:398::-;19588:3;19609:83;19690:1;19685:3;19609:83;:::i;:::-;19602:90;;19701:93;19790:3;19701:93;:::i;:::-;19819:1;19814:3;19810:11;19803:18;;19429:398;;;:::o;19833:366::-;19975:3;19996:67;20060:2;20055:3;19996:67;:::i;:::-;19989:74;;20072:93;20161:3;20072:93;:::i;:::-;20190:2;20185:3;20181:12;20174:19;;19833:366;;;:::o;20205:::-;20347:3;20368:67;20432:2;20427:3;20368:67;:::i;:::-;20361:74;;20444:93;20533:3;20444:93;:::i;:::-;20562:2;20557:3;20553:12;20546:19;;20205:366;;;:::o;20577:::-;20719:3;20740:67;20804:2;20799:3;20740:67;:::i;:::-;20733:74;;20816:93;20905:3;20816:93;:::i;:::-;20934:2;20929:3;20925:12;20918:19;;20577:366;;;:::o;20949:::-;21091:3;21112:67;21176:2;21171:3;21112:67;:::i;:::-;21105:74;;21188:93;21277:3;21188:93;:::i;:::-;21306:2;21301:3;21297:12;21290:19;;20949:366;;;:::o;21321:::-;21463:3;21484:67;21548:2;21543:3;21484:67;:::i;:::-;21477:74;;21560:93;21649:3;21560:93;:::i;:::-;21678:2;21673:3;21669:12;21662:19;;21321:366;;;:::o;21693:::-;21835:3;21856:67;21920:2;21915:3;21856:67;:::i;:::-;21849:74;;21932:93;22021:3;21932:93;:::i;:::-;22050:2;22045:3;22041:12;22034:19;;21693:366;;;:::o;22065:::-;22207:3;22228:67;22292:2;22287:3;22228:67;:::i;:::-;22221:74;;22304:93;22393:3;22304:93;:::i;:::-;22422:2;22417:3;22413:12;22406:19;;22065:366;;;:::o;22437:::-;22579:3;22600:67;22664:2;22659:3;22600:67;:::i;:::-;22593:74;;22676:93;22765:3;22676:93;:::i;:::-;22794:2;22789:3;22785:12;22778:19;;22437:366;;;:::o;22809:::-;22951:3;22972:67;23036:2;23031:3;22972:67;:::i;:::-;22965:74;;23048:93;23137:3;23048:93;:::i;:::-;23166:2;23161:3;23157:12;23150:19;;22809:366;;;:::o;23181:::-;23323:3;23344:67;23408:2;23403:3;23344:67;:::i;:::-;23337:74;;23420:93;23509:3;23420:93;:::i;:::-;23538:2;23533:3;23529:12;23522:19;;23181:366;;;:::o;23553:::-;23695:3;23716:67;23780:2;23775:3;23716:67;:::i;:::-;23709:74;;23792:93;23881:3;23792:93;:::i;:::-;23910:2;23905:3;23901:12;23894:19;;23553:366;;;:::o;23925:::-;24067:3;24088:67;24152:2;24147:3;24088:67;:::i;:::-;24081:74;;24164:93;24253:3;24164:93;:::i;:::-;24282:2;24277:3;24273:12;24266:19;;23925:366;;;:::o;24297:::-;24439:3;24460:67;24524:2;24519:3;24460:67;:::i;:::-;24453:74;;24536:93;24625:3;24536:93;:::i;:::-;24654:2;24649:3;24645:12;24638:19;;24297:366;;;:::o;24739:527::-;24898:4;24893:3;24889:14;24985:4;24978:5;24974:16;24968:23;25004:63;25061:4;25056:3;25052:14;25038:12;25004:63;:::i;:::-;24913:164;25169:4;25162:5;25158:16;25152:23;25188:61;25243:4;25238:3;25234:14;25220:12;25188:61;:::i;:::-;25087:172;24867:399;24739:527;;:::o;25272:118::-;25359:24;25377:5;25359:24;:::i;:::-;25354:3;25347:37;25272:118;;:::o;25396:105::-;25471:23;25488:5;25471:23;:::i;:::-;25466:3;25459:36;25396:105;;:::o;25507:256::-;25619:3;25634:75;25705:3;25696:6;25634:75;:::i;:::-;25734:2;25729:3;25725:12;25718:19;;25754:3;25747:10;;25507:256;;;;:::o;25769:435::-;25949:3;25971:95;26062:3;26053:6;25971:95;:::i;:::-;25964:102;;26083:95;26174:3;26165:6;26083:95;:::i;:::-;26076:102;;26195:3;26188:10;;25769:435;;;;;:::o;26210:379::-;26394:3;26416:147;26559:3;26416:147;:::i;:::-;26409:154;;26580:3;26573:10;;26210:379;;;:::o;26595:222::-;26688:4;26726:2;26715:9;26711:18;26703:26;;26739:71;26807:1;26796:9;26792:17;26783:6;26739:71;:::i;:::-;26595:222;;;;:::o;26823:640::-;27018:4;27056:3;27045:9;27041:19;27033:27;;27070:71;27138:1;27127:9;27123:17;27114:6;27070:71;:::i;:::-;27151:72;27219:2;27208:9;27204:18;27195:6;27151:72;:::i;:::-;27233;27301:2;27290:9;27286:18;27277:6;27233:72;:::i;:::-;27352:9;27346:4;27342:20;27337:2;27326:9;27322:18;27315:48;27380:76;27451:4;27442:6;27380:76;:::i;:::-;27372:84;;26823:640;;;;;;;:::o;27469:210::-;27556:4;27594:2;27583:9;27579:18;27571:26;;27607:65;27669:1;27658:9;27654:17;27645:6;27607:65;:::i;:::-;27469:210;;;;:::o;27685:313::-;27798:4;27836:2;27825:9;27821:18;27813:26;;27885:9;27879:4;27875:20;27871:1;27860:9;27856:17;27849:47;27913:78;27986:4;27977:6;27913:78;:::i;:::-;27905:86;;27685:313;;;;:::o;28004:419::-;28170:4;28208:2;28197:9;28193:18;28185:26;;28257:9;28251:4;28247:20;28243:1;28232:9;28228:17;28221:47;28285:131;28411:4;28285:131;:::i;:::-;28277:139;;28004:419;;;:::o;28429:::-;28595:4;28633:2;28622:9;28618:18;28610:26;;28682:9;28676:4;28672:20;28668:1;28657:9;28653:17;28646:47;28710:131;28836:4;28710:131;:::i;:::-;28702:139;;28429:419;;;:::o;28854:::-;29020:4;29058:2;29047:9;29043:18;29035:26;;29107:9;29101:4;29097:20;29093:1;29082:9;29078:17;29071:47;29135:131;29261:4;29135:131;:::i;:::-;29127:139;;28854:419;;;:::o;29279:::-;29445:4;29483:2;29472:9;29468:18;29460:26;;29532:9;29526:4;29522:20;29518:1;29507:9;29503:17;29496:47;29560:131;29686:4;29560:131;:::i;:::-;29552:139;;29279:419;;;:::o;29704:::-;29870:4;29908:2;29897:9;29893:18;29885:26;;29957:9;29951:4;29947:20;29943:1;29932:9;29928:17;29921:47;29985:131;30111:4;29985:131;:::i;:::-;29977:139;;29704:419;;;:::o;30129:::-;30295:4;30333:2;30322:9;30318:18;30310:26;;30382:9;30376:4;30372:20;30368:1;30357:9;30353:17;30346:47;30410:131;30536:4;30410:131;:::i;:::-;30402:139;;30129:419;;;:::o;30554:::-;30720:4;30758:2;30747:9;30743:18;30735:26;;30807:9;30801:4;30797:20;30793:1;30782:9;30778:17;30771:47;30835:131;30961:4;30835:131;:::i;:::-;30827:139;;30554:419;;;:::o;30979:::-;31145:4;31183:2;31172:9;31168:18;31160:26;;31232:9;31226:4;31222:20;31218:1;31207:9;31203:17;31196:47;31260:131;31386:4;31260:131;:::i;:::-;31252:139;;30979:419;;;:::o;31404:::-;31570:4;31608:2;31597:9;31593:18;31585:26;;31657:9;31651:4;31647:20;31643:1;31632:9;31628:17;31621:47;31685:131;31811:4;31685:131;:::i;:::-;31677:139;;31404:419;;;:::o;31829:::-;31995:4;32033:2;32022:9;32018:18;32010:26;;32082:9;32076:4;32072:20;32068:1;32057:9;32053:17;32046:47;32110:131;32236:4;32110:131;:::i;:::-;32102:139;;31829:419;;;:::o;32254:::-;32420:4;32458:2;32447:9;32443:18;32435:26;;32507:9;32501:4;32497:20;32493:1;32482:9;32478:17;32471:47;32535:131;32661:4;32535:131;:::i;:::-;32527:139;;32254:419;;;:::o;32679:::-;32845:4;32883:2;32872:9;32868:18;32860:26;;32932:9;32926:4;32922:20;32918:1;32907:9;32903:17;32896:47;32960:131;33086:4;32960:131;:::i;:::-;32952:139;;32679:419;;;:::o;33104:::-;33270:4;33308:2;33297:9;33293:18;33285:26;;33357:9;33351:4;33347:20;33343:1;33332:9;33328:17;33321:47;33385:131;33511:4;33385:131;:::i;:::-;33377:139;;33104:419;;;:::o;33529:::-;33695:4;33733:2;33722:9;33718:18;33710:26;;33782:9;33776:4;33772:20;33768:1;33757:9;33753:17;33746:47;33810:131;33936:4;33810:131;:::i;:::-;33802:139;;33529:419;;;:::o;33954:::-;34120:4;34158:2;34147:9;34143:18;34135:26;;34207:9;34201:4;34197:20;34193:1;34182:9;34178:17;34171:47;34235:131;34361:4;34235:131;:::i;:::-;34227:139;;33954:419;;;:::o;34379:::-;34545:4;34583:2;34572:9;34568:18;34560:26;;34632:9;34626:4;34622:20;34618:1;34607:9;34603:17;34596:47;34660:131;34786:4;34660:131;:::i;:::-;34652:139;;34379:419;;;:::o;34804:::-;34970:4;35008:2;34997:9;34993:18;34985:26;;35057:9;35051:4;35047:20;35043:1;35032:9;35028:17;35021:47;35085:131;35211:4;35085:131;:::i;:::-;35077:139;;34804:419;;;:::o;35229:::-;35395:4;35433:2;35422:9;35418:18;35410:26;;35482:9;35476:4;35472:20;35468:1;35457:9;35453:17;35446:47;35510:131;35636:4;35510:131;:::i;:::-;35502:139;;35229:419;;;:::o;35654:::-;35820:4;35858:2;35847:9;35843:18;35835:26;;35907:9;35901:4;35897:20;35893:1;35882:9;35878:17;35871:47;35935:131;36061:4;35935:131;:::i;:::-;35927:139;;35654:419;;;:::o;36079:::-;36245:4;36283:2;36272:9;36268:18;36260:26;;36332:9;36326:4;36322:20;36318:1;36307:9;36303:17;36296:47;36360:131;36486:4;36360:131;:::i;:::-;36352:139;;36079:419;;;:::o;36504:::-;36670:4;36708:2;36697:9;36693:18;36685:26;;36757:9;36751:4;36747:20;36743:1;36732:9;36728:17;36721:47;36785:131;36911:4;36785:131;:::i;:::-;36777:139;;36504:419;;;:::o;36929:::-;37095:4;37133:2;37122:9;37118:18;37110:26;;37182:9;37176:4;37172:20;37168:1;37157:9;37153:17;37146:47;37210:131;37336:4;37210:131;:::i;:::-;37202:139;;36929:419;;;:::o;37354:::-;37520:4;37558:2;37547:9;37543:18;37535:26;;37607:9;37601:4;37597:20;37593:1;37582:9;37578:17;37571:47;37635:131;37761:4;37635:131;:::i;:::-;37627:139;;37354:419;;;:::o;37779:::-;37945:4;37983:2;37972:9;37968:18;37960:26;;38032:9;38026:4;38022:20;38018:1;38007:9;38003:17;37996:47;38060:131;38186:4;38060:131;:::i;:::-;38052:139;;37779:419;;;:::o;38204:::-;38370:4;38408:2;38397:9;38393:18;38385:26;;38457:9;38451:4;38447:20;38443:1;38432:9;38428:17;38421:47;38485:131;38611:4;38485:131;:::i;:::-;38477:139;;38204:419;;;:::o;38629:::-;38795:4;38833:2;38822:9;38818:18;38810:26;;38882:9;38876:4;38872:20;38868:1;38857:9;38853:17;38846:47;38910:131;39036:4;38910:131;:::i;:::-;38902:139;;38629:419;;;:::o;39054:::-;39220:4;39258:2;39247:9;39243:18;39235:26;;39307:9;39301:4;39297:20;39293:1;39282:9;39278:17;39271:47;39335:131;39461:4;39335:131;:::i;:::-;39327:139;;39054:419;;;:::o;39479:::-;39645:4;39683:2;39672:9;39668:18;39660:26;;39732:9;39726:4;39722:20;39718:1;39707:9;39703:17;39696:47;39760:131;39886:4;39760:131;:::i;:::-;39752:139;;39479:419;;;:::o;39904:::-;40070:4;40108:2;40097:9;40093:18;40085:26;;40157:9;40151:4;40147:20;40143:1;40132:9;40128:17;40121:47;40185:131;40311:4;40185:131;:::i;:::-;40177:139;;39904:419;;;:::o;40329:::-;40495:4;40533:2;40522:9;40518:18;40510:26;;40582:9;40576:4;40572:20;40568:1;40557:9;40553:17;40546:47;40610:131;40736:4;40610:131;:::i;:::-;40602:139;;40329:419;;;:::o;40754:::-;40920:4;40958:2;40947:9;40943:18;40935:26;;41007:9;41001:4;40997:20;40993:1;40982:9;40978:17;40971:47;41035:131;41161:4;41035:131;:::i;:::-;41027:139;;40754:419;;;:::o;41179:::-;41345:4;41383:2;41372:9;41368:18;41360:26;;41432:9;41426:4;41422:20;41418:1;41407:9;41403:17;41396:47;41460:131;41586:4;41460:131;:::i;:::-;41452:139;;41179:419;;;:::o;41604:::-;41770:4;41808:2;41797:9;41793:18;41785:26;;41857:9;41851:4;41847:20;41843:1;41832:9;41828:17;41821:47;41885:131;42011:4;41885:131;:::i;:::-;41877:139;;41604:419;;;:::o;42029:::-;42195:4;42233:2;42222:9;42218:18;42210:26;;42282:9;42276:4;42272:20;42268:1;42257:9;42253:17;42246:47;42310:131;42436:4;42310:131;:::i;:::-;42302:139;;42029:419;;;:::o;42454:::-;42620:4;42658:2;42647:9;42643:18;42635:26;;42707:9;42701:4;42697:20;42693:1;42682:9;42678:17;42671:47;42735:131;42861:4;42735:131;:::i;:::-;42727:139;;42454:419;;;:::o;42879:346::-;43034:4;43072:2;43061:9;43057:18;43049:26;;43085:133;43215:1;43204:9;43200:17;43191:6;43085:133;:::i;:::-;42879:346;;;;:::o;43231:222::-;43324:4;43362:2;43351:9;43347:18;43339:26;;43375:71;43443:1;43432:9;43428:17;43419:6;43375:71;:::i;:::-;43231:222;;;;:::o;43459:129::-;43493:6;43520:20;;:::i;:::-;43510:30;;43549:33;43577:4;43569:6;43549:33;:::i;:::-;43459:129;;;:::o;43594:75::-;43627:6;43660:2;43654:9;43644:19;;43594:75;:::o;43675:311::-;43752:4;43842:18;43834:6;43831:30;43828:56;;;43864:18;;:::i;:::-;43828:56;43914:4;43906:6;43902:17;43894:25;;43974:4;43968;43964:15;43956:23;;43675:311;;;:::o;43992:307::-;44053:4;44143:18;44135:6;44132:30;44129:56;;;44165:18;;:::i;:::-;44129:56;44203:29;44225:6;44203:29;:::i;:::-;44195:37;;44287:4;44281;44277:15;44269:23;;43992:307;;;:::o;44305:98::-;44356:6;44390:5;44384:12;44374:22;;44305:98;;;:::o;44409:99::-;44461:6;44495:5;44489:12;44479:22;;44409:99;;;:::o;44514:168::-;44597:11;44631:6;44626:3;44619:19;44671:4;44666:3;44662:14;44647:29;;44514:168;;;;:::o;44688:147::-;44789:11;44826:3;44811:18;;44688:147;;;;:::o;44841:169::-;44925:11;44959:6;44954:3;44947:19;44999:4;44994:3;44990:14;44975:29;;44841:169;;;;:::o;45016:148::-;45118:11;45155:3;45140:18;;45016:148;;;;:::o;45170:273::-;45210:3;45229:20;45247:1;45229:20;:::i;:::-;45224:25;;45263:20;45281:1;45263:20;:::i;:::-;45258:25;;45385:1;45349:34;45345:42;45342:1;45339:49;45336:75;;;45391:18;;:::i;:::-;45336:75;45435:1;45432;45428:9;45421:16;;45170:273;;;;:::o;45449:305::-;45489:3;45508:20;45526:1;45508:20;:::i;:::-;45503:25;;45542:20;45560:1;45542:20;:::i;:::-;45537:25;;45696:1;45628:66;45624:74;45621:1;45618:81;45615:107;;;45702:18;;:::i;:::-;45615:107;45746:1;45743;45739:9;45732:16;;45449:305;;;;:::o;45760:185::-;45800:1;45817:20;45835:1;45817:20;:::i;:::-;45812:25;;45851:20;45869:1;45851:20;:::i;:::-;45846:25;;45890:1;45880:35;;45895:18;;:::i;:::-;45880:35;45937:1;45934;45930:9;45925:14;;45760:185;;;;:::o;45951:348::-;45991:7;46014:20;46032:1;46014:20;:::i;:::-;46009:25;;46048:20;46066:1;46048:20;:::i;:::-;46043:25;;46236:1;46168:66;46164:74;46161:1;46158:81;46153:1;46146:9;46139:17;46135:105;46132:131;;;46243:18;;:::i;:::-;46132:131;46291:1;46288;46284:9;46273:20;;45951:348;;;;:::o;46305:191::-;46345:4;46365:20;46383:1;46365:20;:::i;:::-;46360:25;;46399:20;46417:1;46399:20;:::i;:::-;46394:25;;46438:1;46435;46432:8;46429:34;;;46443:18;;:::i;:::-;46429:34;46488:1;46485;46481:9;46473:17;;46305:191;;;;:::o;46502:::-;46542:4;46562:20;46580:1;46562:20;:::i;:::-;46557:25;;46596:20;46614:1;46596:20;:::i;:::-;46591:25;;46635:1;46632;46629:8;46626:34;;;46640:18;;:::i;:::-;46626:34;46685:1;46682;46678:9;46670:17;;46502:191;;;;:::o;46699:96::-;46736:7;46765:24;46783:5;46765:24;:::i;:::-;46754:35;;46699:96;;;:::o;46801:90::-;46835:7;46878:5;46871:13;46864:21;46853:32;;46801:90;;;:::o;46897:77::-;46934:7;46963:5;46952:16;;46897:77;;;:::o;46980:149::-;47016:7;47056:66;47049:5;47045:78;47034:89;;46980:149;;;:::o;47135:118::-;47172:7;47212:34;47205:5;47201:46;47190:57;;47135:118;;;:::o;47259:126::-;47296:7;47336:42;47329:5;47325:54;47314:65;;47259:126;;;:::o;47391:77::-;47428:7;47457:5;47446:16;;47391:77;;;:::o;47474:101::-;47510:7;47550:18;47543:5;47539:30;47528:41;;47474:101;;;:::o;47581:154::-;47665:6;47660:3;47655;47642:30;47727:1;47718:6;47713:3;47709:16;47702:27;47581:154;;;:::o;47741:307::-;47809:1;47819:113;47833:6;47830:1;47827:13;47819:113;;;47918:1;47913:3;47909:11;47903:18;47899:1;47894:3;47890:11;47883:39;47855:2;47852:1;47848:10;47843:15;;47819:113;;;47950:6;47947:1;47944:13;47941:101;;;48030:1;48021:6;48016:3;48012:16;48005:27;47941:101;47790:258;47741:307;;;:::o;48054:171::-;48093:3;48116:24;48134:5;48116:24;:::i;:::-;48107:33;;48162:4;48155:5;48152:15;48149:41;;;48170:18;;:::i;:::-;48149:41;48217:1;48210:5;48206:13;48199:20;;48054:171;;;:::o;48231:320::-;48275:6;48312:1;48306:4;48302:12;48292:22;;48359:1;48353:4;48349:12;48380:18;48370:81;;48436:4;48428:6;48424:17;48414:27;;48370:81;48498:2;48490:6;48487:14;48467:18;48464:38;48461:84;;;48517:18;;:::i;:::-;48461:84;48282:269;48231:320;;;:::o;48557:281::-;48640:27;48662:4;48640:27;:::i;:::-;48632:6;48628:40;48770:6;48758:10;48755:22;48734:18;48722:10;48719:34;48716:62;48713:88;;;48781:18;;:::i;:::-;48713:88;48821:10;48817:2;48810:22;48600:238;48557:281;;:::o;48844:233::-;48883:3;48906:24;48924:5;48906:24;:::i;:::-;48897:33;;48952:66;48945:5;48942:77;48939:103;;;49022:18;;:::i;:::-;48939:103;49069:1;49062:5;49058:13;49051:20;;48844:233;;;:::o;49083:100::-;49122:7;49151:26;49171:5;49151:26;:::i;:::-;49140:37;;49083:100;;;:::o;49189:94::-;49228:7;49257:20;49271:5;49257:20;:::i;:::-;49246:31;;49189:94;;;:::o;49289:176::-;49321:1;49338:20;49356:1;49338:20;:::i;:::-;49333:25;;49372:20;49390:1;49372:20;:::i;:::-;49367:25;;49411:1;49401:35;;49416:18;;:::i;:::-;49401:35;49457:1;49454;49450:9;49445:14;;49289:176;;;;:::o;49471:180::-;49519:77;49516:1;49509:88;49616:4;49613:1;49606:15;49640:4;49637:1;49630:15;49657:180;49705:77;49702:1;49695:88;49802:4;49799:1;49792:15;49826:4;49823:1;49816:15;49843:180;49891:77;49888:1;49881:88;49988:4;49985:1;49978:15;50012:4;50009:1;50002:15;50029:180;50077:77;50074:1;50067:88;50174:4;50171:1;50164:15;50198:4;50195:1;50188:15;50215:180;50263:77;50260:1;50253:88;50360:4;50357:1;50350:15;50384:4;50381:1;50374:15;50401:117;50510:1;50507;50500:12;50524:117;50633:1;50630;50623:12;50647:117;50756:1;50753;50746:12;50770:117;50879:1;50876;50869:12;50893:117;51002:1;50999;50992:12;51016:117;51125:1;51122;51115:12;51139:102;51180:6;51231:2;51227:7;51222:2;51215:5;51211:14;51207:28;51197:38;;51139:102;;;:::o;51247:94::-;51280:8;51328:5;51324:2;51320:14;51299:35;;51247:94;;;:::o;51347:221::-;51487:34;51483:1;51475:6;51471:14;51464:58;51556:4;51551:2;51543:6;51539:15;51532:29;51347:221;:::o;51574:225::-;51714:34;51710:1;51702:6;51698:14;51691:58;51783:8;51778:2;51770:6;51766:15;51759:33;51574:225;:::o;51805:229::-;51945:34;51941:1;51933:6;51929:14;51922:58;52014:12;52009:2;52001:6;51997:15;51990:37;51805:229;:::o;52040:226::-;52180:34;52176:1;52168:6;52164:14;52157:58;52249:9;52244:2;52236:6;52232:15;52225:34;52040:226;:::o;52272:222::-;52412:34;52408:1;52400:6;52396:14;52389:58;52481:5;52476:2;52468:6;52464:15;52457:30;52272:222;:::o;52500:224::-;52640:34;52636:1;52628:6;52624:14;52617:58;52709:7;52704:2;52696:6;52692:15;52685:32;52500:224;:::o;52730:180::-;52870:32;52866:1;52858:6;52854:14;52847:56;52730:180;:::o;52916:229::-;53056:34;53052:1;53044:6;53040:14;53033:58;53125:12;53120:2;53112:6;53108:15;53101:37;52916:229;:::o;53151:236::-;53291:34;53287:1;53279:6;53275:14;53268:58;53360:19;53355:2;53347:6;53343:15;53336:44;53151:236;:::o;53393:171::-;53533:23;53529:1;53521:6;53517:14;53510:47;53393:171;:::o;53570:180::-;53710:32;53706:1;53698:6;53694:14;53687:56;53570:180;:::o;53756:244::-;53896:34;53892:1;53884:6;53880:14;53873:58;53965:27;53960:2;53952:6;53948:15;53941:52;53756:244;:::o;54006:174::-;54146:26;54142:1;54134:6;54130:14;54123:50;54006:174;:::o;54186:230::-;54326:34;54322:1;54314:6;54310:14;54303:58;54395:13;54390:2;54382:6;54378:15;54371:38;54186:230;:::o;54422:168::-;54562:20;54558:1;54550:6;54546:14;54539:44;54422:168;:::o;54596:225::-;54736:34;54732:1;54724:6;54720:14;54713:58;54805:8;54800:2;54792:6;54788:15;54781:33;54596:225;:::o;54827:182::-;54967:34;54963:1;54955:6;54951:14;54944:58;54827:182;:::o;55015:234::-;55155:34;55151:1;55143:6;55139:14;55132:58;55224:17;55219:2;55211:6;55207:15;55200:42;55015:234;:::o;55255:176::-;55395:28;55391:1;55383:6;55379:14;55372:52;55255:176;:::o;55437:237::-;55577:34;55573:1;55565:6;55561:14;55554:58;55646:20;55641:2;55633:6;55629:15;55622:45;55437:237;:::o;55680:179::-;55820:31;55816:1;55808:6;55804:14;55797:55;55680:179;:::o;55865:221::-;56005:34;56001:1;55993:6;55989:14;55982:58;56074:4;56069:2;56061:6;56057:15;56050:29;55865:221;:::o;56092:114::-;;:::o;56212:166::-;56352:18;56348:1;56340:6;56336:14;56329:42;56212:166;:::o;56384:238::-;56524:34;56520:1;56512:6;56508:14;56501:58;56593:21;56588:2;56580:6;56576:15;56569:46;56384:238;:::o;56628:172::-;56768:24;56764:1;56756:6;56752:14;56745:48;56628:172;:::o;56806:179::-;56946:31;56942:1;56934:6;56930:14;56923:55;56806:179;:::o;56991:220::-;57131:34;57127:1;57119:6;57115:14;57108:58;57200:3;57195:2;57187:6;57183:15;57176:28;56991:220;:::o;57217:182::-;57357:34;57353:1;57345:6;57341:14;57334:58;57217:182;:::o;57405:226::-;57545:34;57541:1;57533:6;57529:14;57522:58;57614:9;57609:2;57601:6;57597:15;57590:34;57405:226;:::o;57637:233::-;57777:34;57773:1;57765:6;57761:14;57754:58;57846:16;57841:2;57833:6;57829:15;57822:41;57637:233;:::o;57876:225::-;58016:34;58012:1;58004:6;58000:14;57993:58;58085:8;58080:2;58072:6;58068:15;58061:33;57876:225;:::o;58107:181::-;58247:33;58243:1;58235:6;58231:14;58224:57;58107:181;:::o;58294:234::-;58434:34;58430:1;58422:6;58418:14;58411:58;58503:17;58498:2;58490:6;58486:15;58479:42;58294:234;:::o;58534:232::-;58674:34;58670:1;58662:6;58658:14;58651:58;58743:15;58738:2;58730:6;58726:15;58719:40;58534:232;:::o;58772:221::-;58912:34;58908:1;58900:6;58896:14;58889:58;58981:4;58976:2;58968:6;58964:15;58957:29;58772:221;:::o;58999:122::-;59072:24;59090:5;59072:24;:::i;:::-;59065:5;59062:35;59052:63;;59111:1;59108;59101:12;59052:63;58999:122;:::o;59127:116::-;59197:21;59212:5;59197:21;:::i;:::-;59190:5;59187:32;59177:60;;59233:1;59230;59223:12;59177:60;59127:116;:::o;59249:122::-;59322:24;59340:5;59322:24;:::i;:::-;59315:5;59312:35;59302:63;;59361:1;59358;59351:12;59302:63;59249:122;:::o;59377:120::-;59449:23;59466:5;59449:23;:::i;:::-;59442:5;59439:34;59429:62;;59487:1;59484;59477:12;59429:62;59377:120;:::o;59503:122::-;59576:24;59594:5;59576:24;:::i;:::-;59569:5;59566:35;59556:63;;59615:1;59612;59605:12;59556:63;59503:122;:::o

Swarm Source

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