ETH Price: $2,393.38 (-0.22%)

Token

Moonwaterbears (MOONWB)
 

Overview

Max Total Supply

97 MOONWB

Holders

73

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MOONWB
0x1c8fa44f3e2eb40d944cda6fc4985a3bec767faf
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:
Moonwaterbears

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-26
*/

//  ___ ___   ___    ___   ____   __    __   ____  ______    ___  ____   ____     ___   ____  ____    _____
// |   |   | /   \  /   \ |    \ |  |__|  | /    ||      |  /  _]|    \ |    \   /  _] /    ||    \  / ___/
// | _   _ ||     ||     ||  _  ||  |  |  ||  o  ||      | /  [_ |  D  )|  o  ) /  [_ |  o  ||  D  )(   \_ 
// |  \_/  ||  O  ||  O  ||  |  ||  |  |  ||     ||_|  |_||    _]|    / |     ||    _]|     ||    /  \__  |
// |   |   ||     ||     ||  |  ||  `  '  ||  _  |  |  |  |   [_ |    \ |  O  ||   [_ |  _  ||    \  /  \ |
// |   |   ||     ||     ||  |  | \      / |  |  |  |  |  |     ||  .  \|     ||     ||  |  ||  .  \ \    |
// |___|___| \___/  \___/ |__|__|  \_/\_/  |__|__|  |__|  |_____||__|\_||_____||_____||__|__||__|\_|  \___|                                                                                                                                                                                                                 
//
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

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

interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {

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

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

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

    function setApprovalForAll(address operator, bool _approved) external;

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);

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

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


abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

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

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

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

library Address {

    function isContract(address account) internal view returns (bool) {

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

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

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

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

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

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {

            if (returndata.length > 0) {

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

interface IERC721Metadata is IERC721 {

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

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

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

interface IERC721Receiver {

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    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())) : "";
    }

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

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

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

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        _approve(address(0), tokenId);

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

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

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

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

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

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

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

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

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; 
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }


        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

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

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        _allTokensIndex[lastTokenId] = tokenIndex;

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

contract ERC721Holder is IERC721Receiver {

    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

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

contract Moonwaterbears is ERC721A, ERC721Holder, Ownable, ReentrancyGuard{
    
    using Strings for uint256;
    
    uint public MAX_TOKENS = 5555;
    uint public MAX_TOKENS_IN_TX = 10;
    uint public PUBLIC_PRICE = 0.0079 ether;
    uint public freeMintRemaining = 1111;

    bool public mintStatus;
  
    string private _baseTokenURI;
    mapping(address => bool) private claimed;

    constructor() ERC721A("Moonwaterbears", "MOONWB", MAX_TOKENS_IN_TX, MAX_TOKENS)  {}

    function freeMint() public nonReentrant {
        require(mintStatus, "Mint is closed");
        require(totalSupply() < MAX_TOKENS, "Sale end");
        require(totalSupply() + 1 <= MAX_TOKENS, "Exceeds MAX limit");
        require(!isFreeClaimed(msg.sender), "Exceeds FREE MINT limit per address");
        require(freeMintRemaining > 0, "Exceeds FREE MINT limit");
        claimed[msg.sender] = true;
        freeMintRemaining = freeMintRemaining - 1;
        _safeMint(_msgSender(), 1);
    }

    function mint(uint256 _count) public payable nonReentrant {
        require(mintStatus, "Mint is closed");
        require(totalSupply() < MAX_TOKENS, "Sale end");
        require(totalSupply() + _count <= MAX_TOKENS, "Exceeds MAX limit");
        require(_count <= MAX_TOKENS_IN_TX, "Exceeds TX limit");
        require(msg.value == _count * PUBLIC_PRICE, "Value below price");
        _safeMint(_msgSender(), _count);
    }

    function _baseURI() internal view virtual override returns (string memory) {
      return _baseTokenURI;
    }
    
    function ownerMint(address _to, uint256 _count) public onlyOwner {
        require(totalSupply() < MAX_TOKENS, "Sale end");
        _safeMint(_to, _count);
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setMintStatus(bool _status) public onlyOwner {
        mintStatus = _status;
    }

    function isFreeClaimed(address _address) public view returns (bool) {
        return claimed[_address];
    }

    function withdrawAll() public payable onlyOwner{
      require(payable(msg.sender).send(address(this).balance));
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_IN_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","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":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isFreeClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setMintStatus","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":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526000805560006007556115b3600a55600a600b55661c110215b9c000600c55610457600d553480156200003657600080fd5b506040518060400160405280600e81526020017f4d6f6f6e776174657262656172730000000000000000000000000000000000008152506040518060400160405280600681526020017f4d4f4f4e57420000000000000000000000000000000000000000000000000000815250600b54600a5460008111620000ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000e690620003ae565b60405180910390fd5b6000821162000135576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012c9062000446565b60405180910390fd5b83600190805190602001906200014d92919062000277565b5082600290805190602001906200016692919062000277565b508160a081815250508060808181525050505050506200019b6200018f620001a960201b60201c565b620001b160201b60201c565b6001600981905550620004cd565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002859062000497565b90600052602060002090601f016020900481019282620002a95760008555620002f5565b82601f10620002c457805160ff1916838001178555620002f5565b82800160010185558215620002f5579182015b82811115620002f4578251825591602001919060010190620002d7565b5b50905062000304919062000308565b5090565b5b808211156200032357600081600090555060010162000309565b5090565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b600062000396602e8362000327565b9150620003a38262000338565b604082019050919050565b60006020820190508181036000830152620003c98162000387565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b60006200042e60278362000327565b91506200043b82620003d0565b604082019050919050565b6000602082019050818103600083015262000461816200041f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004b057607f821691505b60208210811415620004c757620004c662000468565b5b50919050565b60805160a05161491d620004fe6000396000818161231c0152818161234501526129d901526000505061491d6000f3fe6080604052600436106101ee5760003560e01c8063611f3f101161010d578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd146106cf578063d7224ba01461070c578063e985e9c514610737578063f2fde38b14610774578063f47c84c51461079d576101ee565b8063a0712d6814610624578063a22cb46514610640578063ab36e64d14610669578063b88d4fde146106a6576101ee565b8063853828b6116100dc578063853828b6146105995780638da5cb5b146105a357806395d89b41146105ce5780639da3f8fd146105f9576101ee565b8063611f3f10146104dd5780636352211e1461050857806370a0823114610545578063715018a614610582576101ee565b806323b872dd11610185578063484b973c11610154578063484b973c146104375780634f6ccce71461046057806355f804b31461049d5780635b70ea9f146104c6576101ee565b806323b872dd1461037d5780632f745c59146103a657806334d45514146103e357806342842e0e1461040e576101ee565b80630cb93d6b116101c15780630cb93d6b146102c1578063150b7a02146102ec57806318160ddd146103295780631f85e3ca14610354576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612f53565b6107c8565b6040516102279190612f9b565b60405180910390f35b34801561023c57600080fd5b50610245610912565b604051610252919061304f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906130a7565b6109a4565b60405161028f9190613115565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061315c565b610a29565b005b3480156102cd57600080fd5b506102d6610b42565b6040516102e391906131ab565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e91906132fb565b610b48565b604051610320919061338d565b60405180910390f35b34801561033557600080fd5b5061033e610b5c565b60405161034b91906131ab565b60405180910390f35b34801561036057600080fd5b5061037b600480360381019061037691906133d4565b610b65565b005b34801561038957600080fd5b506103a4600480360381019061039f9190613401565b610bfe565b005b3480156103b257600080fd5b506103cd60048036038101906103c8919061315c565b610c0e565b6040516103da91906131ab565b60405180910390f35b3480156103ef57600080fd5b506103f8610e0c565b60405161040591906131ab565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613401565b610e12565b005b34801561044357600080fd5b5061045e6004803603810190610459919061315c565b610e32565b005b34801561046c57600080fd5b50610487600480360381019061048291906130a7565b610f07565b60405161049491906131ab565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf91906134f5565b610f5a565b005b3480156104d257600080fd5b506104db610ff0565b005b3480156104e957600080fd5b506104f2611247565b6040516104ff91906131ab565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a91906130a7565b61124d565b60405161053c9190613115565b60405180910390f35b34801561055157600080fd5b5061056c6004803603810190610567919061353e565b611263565b60405161057991906131ab565b60405180910390f35b34801561058e57600080fd5b5061059761134c565b005b6105a16113d4565b005b3480156105af57600080fd5b506105b8611490565b6040516105c59190613115565b60405180910390f35b3480156105da57600080fd5b506105e36114ba565b6040516105f0919061304f565b60405180910390f35b34801561060557600080fd5b5061060e61154c565b60405161061b9190612f9b565b60405180910390f35b61063e600480360381019061063991906130a7565b61155f565b005b34801561064c57600080fd5b506106676004803603810190610662919061356b565b61174e565b005b34801561067557600080fd5b50610690600480360381019061068b919061353e565b6118cf565b60405161069d9190612f9b565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906132fb565b611925565b005b3480156106db57600080fd5b506106f660048036038101906106f191906130a7565b611981565b604051610703919061304f565b60405180910390f35b34801561071857600080fd5b50610721611a28565b60405161072e91906131ab565b60405180910390f35b34801561074357600080fd5b5061075e600480360381019061075991906135ab565b611a2e565b60405161076b9190612f9b565b60405180910390f35b34801561078057600080fd5b5061079b6004803603810190610796919061353e565b611ac2565b005b3480156107a957600080fd5b506107b2611bba565b6040516107bf91906131ab565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fb57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090b575061090a82611bc0565b5b9050919050565b6060600180546109219061361a565b80601f016020809104026020016040519081016040528092919081815260200182805461094d9061361a565b801561099a5780601f1061096f5761010080835404028352916020019161099a565b820191906000526020600020905b81548152906001019060200180831161097d57829003601f168201915b5050505050905090565b60006109af82611c2a565b6109ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e5906136be565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a348261124d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613750565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac4611c37565b73ffffffffffffffffffffffffffffffffffffffff161480610af35750610af281610aed611c37565b611a2e565b5b610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906137e2565b60405180910390fd5b610b3d838383611c3f565b505050565b600b5481565b600063150b7a0260e01b9050949350505050565b60008054905090565b610b6d611c37565b73ffffffffffffffffffffffffffffffffffffffff16610b8b611490565b73ffffffffffffffffffffffffffffffffffffffff1614610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd89061384e565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610c09838383611cf1565b505050565b6000610c1983611263565b8210610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c51906138e0565b60405180910390fd5b6000610c64610b5c565b905060008060005b83811015610dca576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db65786841415610da7578195505050505050610e06565b8380610db29061392f565b9450505b508080610dc29061392f565b915050610c6c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd906139ea565b60405180910390fd5b92915050565b600d5481565b610e2d83838360405180602001604052806000815250611925565b505050565b610e3a611c37565b73ffffffffffffffffffffffffffffffffffffffff16610e58611490565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea59061384e565b60405180910390fd5b600a54610eb9610b5c565b10610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613a56565b60405180910390fd5b610f0382826122aa565b5050565b6000610f11610b5c565b8210610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4990613ae8565b60405180910390fd5b819050919050565b610f62611c37565b73ffffffffffffffffffffffffffffffffffffffff16610f80611490565b73ffffffffffffffffffffffffffffffffffffffff1614610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd9061384e565b60405180910390fd5b80600f9080519060200190610fec929190612e0a565b5050565b60026009541415611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613b54565b60405180910390fd5b6002600981905550600e60009054906101000a900460ff1661108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490613bc0565b60405180910390fd5b600a54611098610b5c565b106110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613a56565b60405180910390fd5b600a5460016110e5610b5c565b6110ef9190613be0565b1115611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790613c82565b60405180910390fd5b611139336118cf565b15611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090613d14565b60405180910390fd5b6000600d54116111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590613d80565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d546112259190613da0565b600d8190555061123d611236611c37565b60016122aa565b6001600981905550565b600c5481565b6000611258826122c8565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb90613e46565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611354611c37565b73ffffffffffffffffffffffffffffffffffffffff16611372611490565b73ffffffffffffffffffffffffffffffffffffffff16146113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf9061384e565b60405180910390fd5b6113d260006124cb565b565b6113dc611c37565b73ffffffffffffffffffffffffffffffffffffffff166113fa611490565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061384e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061148e57600080fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546114c99061361a565b80601f01602080910402602001604051908101604052809291908181526020018280546114f59061361a565b80156115425780601f1061151757610100808354040283529160200191611542565b820191906000526020600020905b81548152906001019060200180831161152557829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b600260095414156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613b54565b60405180910390fd5b6002600981905550600e60009054906101000a900460ff166115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390613bc0565b60405180910390fd5b600a54611607610b5c565b10611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90613a56565b60405180910390fd5b600a5481611653610b5c565b61165d9190613be0565b111561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613c82565b60405180910390fd5b600b548111156116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90613eb2565b60405180910390fd5b600c54816116f19190613ed2565b3414611732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172990613f78565b60405180910390fd5b61174361173d611c37565b826122aa565b600160098190555050565b611756611c37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90613fe4565b60405180910390fd5b80600660006117d1611c37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661187e611c37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c39190612f9b565b60405180910390a35050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611930848484611cf1565b61193c84848484612591565b61197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614076565b60405180910390fd5b50505050565b606061198c82611c2a565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614108565b60405180910390fd5b60006119d5612719565b905060008151116119f55760405180602001604052806000815250611a20565b806119ff846127ab565b604051602001611a10929190614164565b6040516020818303038152906040525b915050919050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aca611c37565b73ffffffffffffffffffffffffffffffffffffffff16611ae8611490565b73ffffffffffffffffffffffffffffffffffffffff1614611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b359061384e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba5906141fa565b60405180910390fd5b611bb7816124cb565b50565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611cfc826122c8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611d23611c37565b73ffffffffffffffffffffffffffffffffffffffff161480611d7f5750611d48611c37565b73ffffffffffffffffffffffffffffffffffffffff16611d67846109a4565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d9b5750611d9a8260000151611d95611c37565b611a2e565b5b905080611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd49061428c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e469061431e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb6906143b0565b60405180910390fd5b611ecc858585600161290c565b611edc6000848460000151611c3f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f4a91906143ec565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fee9190614420565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120f49190613be0565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561223a5761216a81611c2a565b15612239576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122a28686866001612912565b505050505050565b6122c4828260405180602001604052806000815250612918565b5050565b6122d0612e90565b6122d982611c2a565b612318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230f906144d8565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000831061237c5760017f00000000000000000000000000000000000000000000000000000000000000008461236f9190613da0565b6123799190613be0565b90505b60008390505b81811061248a576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612476578093505050506124c6565b508080612482906144f8565b915050612382565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd90614594565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006125b28473ffffffffffffffffffffffffffffffffffffffff16612df7565b1561270c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125db611c37565b8786866040518563ffffffff1660e01b81526004016125fd9493929190614609565b6020604051808303816000875af192505050801561263957506040513d601f19601f82011682018060405250810190612636919061466a565b60015b6126bc573d8060008114612669576040519150601f19603f3d011682016040523d82523d6000602084013e61266e565b606091505b506000815114156126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614076565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612711565b600190505b949350505050565b6060600f80546127289061361a565b80601f01602080910402602001604051908101604052809291908181526020018280546127549061361a565b80156127a15780601f10612776576101008083540402835291602001916127a1565b820191906000526020600020905b81548152906001019060200180831161278457829003601f168201915b5050505050905090565b606060008214156127f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612907565b600082905060005b6000821461282557808061280e9061392f565b915050600a8261281e91906146c6565b91506127fb565b60008167ffffffffffffffff811115612841576128406131d0565b5b6040519080825280601f01601f1916602001820160405280156128735781602001600182028036833780820191505090505b5090505b600085146129005760018261288c9190613da0565b9150600a8561289b91906146f7565b60306128a79190613be0565b60f81b8183815181106128bd576128bc614728565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f991906146c6565b9450612877565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561298e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612985906147c9565b60405180910390fd5b61299781611c2a565b156129d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ce90614835565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a31906148c7565b60405180910390fd5b612a47600085838661290c565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b449190614420565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b6b9190614420565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612dda57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d7a6000888488612591565b612db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db090614076565b60405180910390fd5b8180612dc49061392f565b9250508080612dd29061392f565b915050612d09565b5080600081905550612def6000878588612912565b505050505050565b600080823b905060008111915050919050565b828054612e169061361a565b90600052602060002090601f016020900481019282612e385760008555612e7f565b82601f10612e5157805160ff1916838001178555612e7f565b82800160010185558215612e7f579182015b82811115612e7e578251825591602001919060010190612e63565b5b509050612e8c9190612eca565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612ee3576000816000905550600101612ecb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f3081612efb565b8114612f3b57600080fd5b50565b600081359050612f4d81612f27565b92915050565b600060208284031215612f6957612f68612ef1565b5b6000612f7784828501612f3e565b91505092915050565b60008115159050919050565b612f9581612f80565b82525050565b6000602082019050612fb06000830184612f8c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ff0578082015181840152602081019050612fd5565b83811115612fff576000848401525b50505050565b6000601f19601f8301169050919050565b600061302182612fb6565b61302b8185612fc1565b935061303b818560208601612fd2565b61304481613005565b840191505092915050565b600060208201905081810360008301526130698184613016565b905092915050565b6000819050919050565b61308481613071565b811461308f57600080fd5b50565b6000813590506130a18161307b565b92915050565b6000602082840312156130bd576130bc612ef1565b5b60006130cb84828501613092565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130ff826130d4565b9050919050565b61310f816130f4565b82525050565b600060208201905061312a6000830184613106565b92915050565b613139816130f4565b811461314457600080fd5b50565b60008135905061315681613130565b92915050565b6000806040838503121561317357613172612ef1565b5b600061318185828601613147565b925050602061319285828601613092565b9150509250929050565b6131a581613071565b82525050565b60006020820190506131c0600083018461319c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320882613005565b810181811067ffffffffffffffff82111715613227576132266131d0565b5b80604052505050565b600061323a612ee7565b905061324682826131ff565b919050565b600067ffffffffffffffff821115613266576132656131d0565b5b61326f82613005565b9050602081019050919050565b82818337600083830152505050565b600061329e6132998461324b565b613230565b9050828152602081018484840111156132ba576132b96131cb565b5b6132c584828561327c565b509392505050565b600082601f8301126132e2576132e16131c6565b5b81356132f284826020860161328b565b91505092915050565b6000806000806080858703121561331557613314612ef1565b5b600061332387828801613147565b945050602061333487828801613147565b935050604061334587828801613092565b925050606085013567ffffffffffffffff81111561336657613365612ef6565b5b613372878288016132cd565b91505092959194509250565b61338781612efb565b82525050565b60006020820190506133a2600083018461337e565b92915050565b6133b181612f80565b81146133bc57600080fd5b50565b6000813590506133ce816133a8565b92915050565b6000602082840312156133ea576133e9612ef1565b5b60006133f8848285016133bf565b91505092915050565b60008060006060848603121561341a57613419612ef1565b5b600061342886828701613147565b935050602061343986828701613147565b925050604061344a86828701613092565b9150509250925092565b600067ffffffffffffffff82111561346f5761346e6131d0565b5b61347882613005565b9050602081019050919050565b600061349861349384613454565b613230565b9050828152602081018484840111156134b4576134b36131cb565b5b6134bf84828561327c565b509392505050565b600082601f8301126134dc576134db6131c6565b5b81356134ec848260208601613485565b91505092915050565b60006020828403121561350b5761350a612ef1565b5b600082013567ffffffffffffffff81111561352957613528612ef6565b5b613535848285016134c7565b91505092915050565b60006020828403121561355457613553612ef1565b5b600061356284828501613147565b91505092915050565b6000806040838503121561358257613581612ef1565b5b600061359085828601613147565b92505060206135a1858286016133bf565b9150509250929050565b600080604083850312156135c2576135c1612ef1565b5b60006135d085828601613147565b92505060206135e185828601613147565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363257607f821691505b60208210811415613646576136456135eb565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006136a8602d83612fc1565b91506136b38261364c565b604082019050919050565b600060208201905081810360008301526136d78161369b565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061373a602283612fc1565b9150613745826136de565b604082019050919050565b600060208201905081810360008301526137698161372d565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006137cc603983612fc1565b91506137d782613770565b604082019050919050565b600060208201905081810360008301526137fb816137bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613838602083612fc1565b915061384382613802565b602082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006138ca602283612fc1565b91506138d58261386e565b604082019050919050565b600060208201905081810360008301526138f9816138bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061393a82613071565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561396d5761396c613900565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006139d4602e83612fc1565b91506139df82613978565b604082019050919050565b60006020820190508181036000830152613a03816139c7565b9050919050565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b6000613a40600883612fc1565b9150613a4b82613a0a565b602082019050919050565b60006020820190508181036000830152613a6f81613a33565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613ad2602383612fc1565b9150613add82613a76565b604082019050919050565b60006020820190508181036000830152613b0181613ac5565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b3e601f83612fc1565b9150613b4982613b08565b602082019050919050565b60006020820190508181036000830152613b6d81613b31565b9050919050565b7f4d696e7420697320636c6f736564000000000000000000000000000000000000600082015250565b6000613baa600e83612fc1565b9150613bb582613b74565b602082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b6000613beb82613071565b9150613bf683613071565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c2b57613c2a613900565b5b828201905092915050565b7f45786365656473204d4158206c696d6974000000000000000000000000000000600082015250565b6000613c6c601183612fc1565b9150613c7782613c36565b602082019050919050565b60006020820190508181036000830152613c9b81613c5f565b9050919050565b7f457863656564732046524545204d494e54206c696d697420706572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613cfe602383612fc1565b9150613d0982613ca2565b604082019050919050565b60006020820190508181036000830152613d2d81613cf1565b9050919050565b7f457863656564732046524545204d494e54206c696d6974000000000000000000600082015250565b6000613d6a601783612fc1565b9150613d7582613d34565b602082019050919050565b60006020820190508181036000830152613d9981613d5d565b9050919050565b6000613dab82613071565b9150613db683613071565b925082821015613dc957613dc8613900565b5b828203905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613e30602b83612fc1565b9150613e3b82613dd4565b604082019050919050565b60006020820190508181036000830152613e5f81613e23565b9050919050565b7f45786365656473205458206c696d697400000000000000000000000000000000600082015250565b6000613e9c601083612fc1565b9150613ea782613e66565b602082019050919050565b60006020820190508181036000830152613ecb81613e8f565b9050919050565b6000613edd82613071565b9150613ee883613071565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f2157613f20613900565b5b828202905092915050565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b6000613f62601183612fc1565b9150613f6d82613f2c565b602082019050919050565b60006020820190508181036000830152613f9181613f55565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613fce601a83612fc1565b9150613fd982613f98565b602082019050919050565b60006020820190508181036000830152613ffd81613fc1565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614060603383612fc1565b915061406b82614004565b604082019050919050565b6000602082019050818103600083015261408f81614053565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006140f2602f83612fc1565b91506140fd82614096565b604082019050919050565b60006020820190508181036000830152614121816140e5565b9050919050565b600081905092915050565b600061413e82612fb6565b6141488185614128565b9350614158818560208601612fd2565b80840191505092915050565b60006141708285614133565b915061417c8284614133565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141e4602683612fc1565b91506141ef82614188565b604082019050919050565b60006020820190508181036000830152614213816141d7565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614276603283612fc1565b91506142818261421a565b604082019050919050565b600060208201905081810360008301526142a581614269565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614308602683612fc1565b9150614313826142ac565b604082019050919050565b60006020820190508181036000830152614337816142fb565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061439a602583612fc1565b91506143a58261433e565b604082019050919050565b600060208201905081810360008301526143c98161438d565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006143f7826143d0565b9150614402836143d0565b92508282101561441557614414613900565b5b828203905092915050565b600061442b826143d0565b9150614436836143d0565b9250826fffffffffffffffffffffffffffffffff0382111561445b5761445a613900565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006144c2602a83612fc1565b91506144cd82614466565b604082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b600061450382613071565b9150600082141561451757614516613900565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061457e602f83612fc1565b915061458982614522565b604082019050919050565b600060208201905081810360008301526145ad81614571565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145db826145b4565b6145e581856145bf565b93506145f5818560208601612fd2565b6145fe81613005565b840191505092915050565b600060808201905061461e6000830187613106565b61462b6020830186613106565b614638604083018561319c565b818103606083015261464a81846145d0565b905095945050505050565b60008151905061466481612f27565b92915050565b6000602082840312156146805761467f612ef1565b5b600061468e84828501614655565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146d182613071565b91506146dc83613071565b9250826146ec576146eb614697565b5b828204905092915050565b600061470282613071565b915061470d83613071565b92508261471d5761471c614697565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b3602183612fc1565b91506147be82614757565b604082019050919050565b600060208201905081810360008301526147e2816147a6565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061481f601d83612fc1565b915061482a826147e9565b602082019050919050565b6000602082019050818103600083015261484e81614812565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006148b1602283612fc1565b91506148bc82614855565b604082019050919050565b600060208201905081810360008301526148e0816148a4565b905091905056fea2646970667358221220e4857ab6d89c5fef6be89b034e2366529b0428cb43cd1be7a880959c7b805c3564736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c8063611f3f101161010d578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd146106cf578063d7224ba01461070c578063e985e9c514610737578063f2fde38b14610774578063f47c84c51461079d576101ee565b8063a0712d6814610624578063a22cb46514610640578063ab36e64d14610669578063b88d4fde146106a6576101ee565b8063853828b6116100dc578063853828b6146105995780638da5cb5b146105a357806395d89b41146105ce5780639da3f8fd146105f9576101ee565b8063611f3f10146104dd5780636352211e1461050857806370a0823114610545578063715018a614610582576101ee565b806323b872dd11610185578063484b973c11610154578063484b973c146104375780634f6ccce71461046057806355f804b31461049d5780635b70ea9f146104c6576101ee565b806323b872dd1461037d5780632f745c59146103a657806334d45514146103e357806342842e0e1461040e576101ee565b80630cb93d6b116101c15780630cb93d6b146102c1578063150b7a02146102ec57806318160ddd146103295780631f85e3ca14610354576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612f53565b6107c8565b6040516102279190612f9b565b60405180910390f35b34801561023c57600080fd5b50610245610912565b604051610252919061304f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906130a7565b6109a4565b60405161028f9190613115565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061315c565b610a29565b005b3480156102cd57600080fd5b506102d6610b42565b6040516102e391906131ab565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e91906132fb565b610b48565b604051610320919061338d565b60405180910390f35b34801561033557600080fd5b5061033e610b5c565b60405161034b91906131ab565b60405180910390f35b34801561036057600080fd5b5061037b600480360381019061037691906133d4565b610b65565b005b34801561038957600080fd5b506103a4600480360381019061039f9190613401565b610bfe565b005b3480156103b257600080fd5b506103cd60048036038101906103c8919061315c565b610c0e565b6040516103da91906131ab565b60405180910390f35b3480156103ef57600080fd5b506103f8610e0c565b60405161040591906131ab565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613401565b610e12565b005b34801561044357600080fd5b5061045e6004803603810190610459919061315c565b610e32565b005b34801561046c57600080fd5b50610487600480360381019061048291906130a7565b610f07565b60405161049491906131ab565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf91906134f5565b610f5a565b005b3480156104d257600080fd5b506104db610ff0565b005b3480156104e957600080fd5b506104f2611247565b6040516104ff91906131ab565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a91906130a7565b61124d565b60405161053c9190613115565b60405180910390f35b34801561055157600080fd5b5061056c6004803603810190610567919061353e565b611263565b60405161057991906131ab565b60405180910390f35b34801561058e57600080fd5b5061059761134c565b005b6105a16113d4565b005b3480156105af57600080fd5b506105b8611490565b6040516105c59190613115565b60405180910390f35b3480156105da57600080fd5b506105e36114ba565b6040516105f0919061304f565b60405180910390f35b34801561060557600080fd5b5061060e61154c565b60405161061b9190612f9b565b60405180910390f35b61063e600480360381019061063991906130a7565b61155f565b005b34801561064c57600080fd5b506106676004803603810190610662919061356b565b61174e565b005b34801561067557600080fd5b50610690600480360381019061068b919061353e565b6118cf565b60405161069d9190612f9b565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906132fb565b611925565b005b3480156106db57600080fd5b506106f660048036038101906106f191906130a7565b611981565b604051610703919061304f565b60405180910390f35b34801561071857600080fd5b50610721611a28565b60405161072e91906131ab565b60405180910390f35b34801561074357600080fd5b5061075e600480360381019061075991906135ab565b611a2e565b60405161076b9190612f9b565b60405180910390f35b34801561078057600080fd5b5061079b6004803603810190610796919061353e565b611ac2565b005b3480156107a957600080fd5b506107b2611bba565b6040516107bf91906131ab565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108fb57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061090b575061090a82611bc0565b5b9050919050565b6060600180546109219061361a565b80601f016020809104026020016040519081016040528092919081815260200182805461094d9061361a565b801561099a5780601f1061096f5761010080835404028352916020019161099a565b820191906000526020600020905b81548152906001019060200180831161097d57829003601f168201915b5050505050905090565b60006109af82611c2a565b6109ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e5906136be565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a348261124d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613750565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac4611c37565b73ffffffffffffffffffffffffffffffffffffffff161480610af35750610af281610aed611c37565b611a2e565b5b610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906137e2565b60405180910390fd5b610b3d838383611c3f565b505050565b600b5481565b600063150b7a0260e01b9050949350505050565b60008054905090565b610b6d611c37565b73ffffffffffffffffffffffffffffffffffffffff16610b8b611490565b73ffffffffffffffffffffffffffffffffffffffff1614610be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd89061384e565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b610c09838383611cf1565b505050565b6000610c1983611263565b8210610c5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c51906138e0565b60405180910390fd5b6000610c64610b5c565b905060008060005b83811015610dca576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610db65786841415610da7578195505050505050610e06565b8380610db29061392f565b9450505b508080610dc29061392f565b915050610c6c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd906139ea565b60405180910390fd5b92915050565b600d5481565b610e2d83838360405180602001604052806000815250611925565b505050565b610e3a611c37565b73ffffffffffffffffffffffffffffffffffffffff16610e58611490565b73ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea59061384e565b60405180910390fd5b600a54610eb9610b5c565b10610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613a56565b60405180910390fd5b610f0382826122aa565b5050565b6000610f11610b5c565b8210610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4990613ae8565b60405180910390fd5b819050919050565b610f62611c37565b73ffffffffffffffffffffffffffffffffffffffff16610f80611490565b73ffffffffffffffffffffffffffffffffffffffff1614610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd9061384e565b60405180910390fd5b80600f9080519060200190610fec929190612e0a565b5050565b60026009541415611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613b54565b60405180910390fd5b6002600981905550600e60009054906101000a900460ff1661108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490613bc0565b60405180910390fd5b600a54611098610b5c565b106110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613a56565b60405180910390fd5b600a5460016110e5610b5c565b6110ef9190613be0565b1115611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112790613c82565b60405180910390fd5b611139336118cf565b15611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090613d14565b60405180910390fd5b6000600d54116111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590613d80565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d546112259190613da0565b600d8190555061123d611236611c37565b60016122aa565b6001600981905550565b600c5481565b6000611258826122c8565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb90613e46565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611354611c37565b73ffffffffffffffffffffffffffffffffffffffff16611372611490565b73ffffffffffffffffffffffffffffffffffffffff16146113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf9061384e565b60405180910390fd5b6113d260006124cb565b565b6113dc611c37565b73ffffffffffffffffffffffffffffffffffffffff166113fa611490565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061384e565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061148e57600080fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546114c99061361a565b80601f01602080910402602001604051908101604052809291908181526020018280546114f59061361a565b80156115425780601f1061151757610100808354040283529160200191611542565b820191906000526020600020905b81548152906001019060200180831161152557829003601f168201915b5050505050905090565b600e60009054906101000a900460ff1681565b600260095414156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c90613b54565b60405180910390fd5b6002600981905550600e60009054906101000a900460ff166115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390613bc0565b60405180910390fd5b600a54611607610b5c565b10611647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163e90613a56565b60405180910390fd5b600a5481611653610b5c565b61165d9190613be0565b111561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590613c82565b60405180910390fd5b600b548111156116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116da90613eb2565b60405180910390fd5b600c54816116f19190613ed2565b3414611732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172990613f78565b60405180910390fd5b61174361173d611c37565b826122aa565b600160098190555050565b611756611c37565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bb90613fe4565b60405180910390fd5b80600660006117d1611c37565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661187e611c37565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c39190612f9b565b60405180910390a35050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611930848484611cf1565b61193c84848484612591565b61197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614076565b60405180910390fd5b50505050565b606061198c82611c2a565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614108565b60405180910390fd5b60006119d5612719565b905060008151116119f55760405180602001604052806000815250611a20565b806119ff846127ab565b604051602001611a10929190614164565b6040516020818303038152906040525b915050919050565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611aca611c37565b73ffffffffffffffffffffffffffffffffffffffff16611ae8611490565b73ffffffffffffffffffffffffffffffffffffffff1614611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b359061384e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba5906141fa565b60405180910390fd5b611bb7816124cb565b50565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611cfc826122c8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611d23611c37565b73ffffffffffffffffffffffffffffffffffffffff161480611d7f5750611d48611c37565b73ffffffffffffffffffffffffffffffffffffffff16611d67846109a4565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d9b5750611d9a8260000151611d95611c37565b611a2e565b5b905080611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd49061428c565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e469061431e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb6906143b0565b60405180910390fd5b611ecc858585600161290c565b611edc6000848460000151611c3f565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f4a91906143ec565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fee9190614420565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120f49190613be0565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561223a5761216a81611c2a565b15612239576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122a28686866001612912565b505050505050565b6122c4828260405180602001604052806000815250612918565b5050565b6122d0612e90565b6122d982611c2a565b612318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230f906144d8565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a831061237c5760017f000000000000000000000000000000000000000000000000000000000000000a8461236f9190613da0565b6123799190613be0565b90505b60008390505b81811061248a576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612476578093505050506124c6565b508080612482906144f8565b915050612382565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd90614594565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006125b28473ffffffffffffffffffffffffffffffffffffffff16612df7565b1561270c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125db611c37565b8786866040518563ffffffff1660e01b81526004016125fd9493929190614609565b6020604051808303816000875af192505050801561263957506040513d601f19601f82011682018060405250810190612636919061466a565b60015b6126bc573d8060008114612669576040519150601f19603f3d011682016040523d82523d6000602084013e61266e565b606091505b506000815114156126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614076565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612711565b600190505b949350505050565b6060600f80546127289061361a565b80601f01602080910402602001604051908101604052809291908181526020018280546127549061361a565b80156127a15780601f10612776576101008083540402835291602001916127a1565b820191906000526020600020905b81548152906001019060200180831161278457829003601f168201915b5050505050905090565b606060008214156127f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612907565b600082905060005b6000821461282557808061280e9061392f565b915050600a8261281e91906146c6565b91506127fb565b60008167ffffffffffffffff811115612841576128406131d0565b5b6040519080825280601f01601f1916602001820160405280156128735781602001600182028036833780820191505090505b5090505b600085146129005760018261288c9190613da0565b9150600a8561289b91906146f7565b60306128a79190613be0565b60f81b8183815181106128bd576128bc614728565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f991906146c6565b9450612877565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561298e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612985906147c9565b60405180910390fd5b61299781611c2a565b156129d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ce90614835565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a831115612a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a31906148c7565b60405180910390fd5b612a47600085838661290c565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b449190614420565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b6b9190614420565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612dda57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d7a6000888488612591565b612db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db090614076565b60405180910390fd5b8180612dc49061392f565b9250508080612dd29061392f565b915050612d09565b5080600081905550612def6000878588612912565b505050505050565b600080823b905060008111915050919050565b828054612e169061361a565b90600052602060002090601f016020900481019282612e385760008555612e7f565b82601f10612e5157805160ff1916838001178555612e7f565b82800160010185558215612e7f579182015b82811115612e7e578251825591602001919060010190612e63565b5b509050612e8c9190612eca565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612ee3576000816000905550600101612ecb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f3081612efb565b8114612f3b57600080fd5b50565b600081359050612f4d81612f27565b92915050565b600060208284031215612f6957612f68612ef1565b5b6000612f7784828501612f3e565b91505092915050565b60008115159050919050565b612f9581612f80565b82525050565b6000602082019050612fb06000830184612f8c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ff0578082015181840152602081019050612fd5565b83811115612fff576000848401525b50505050565b6000601f19601f8301169050919050565b600061302182612fb6565b61302b8185612fc1565b935061303b818560208601612fd2565b61304481613005565b840191505092915050565b600060208201905081810360008301526130698184613016565b905092915050565b6000819050919050565b61308481613071565b811461308f57600080fd5b50565b6000813590506130a18161307b565b92915050565b6000602082840312156130bd576130bc612ef1565b5b60006130cb84828501613092565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130ff826130d4565b9050919050565b61310f816130f4565b82525050565b600060208201905061312a6000830184613106565b92915050565b613139816130f4565b811461314457600080fd5b50565b60008135905061315681613130565b92915050565b6000806040838503121561317357613172612ef1565b5b600061318185828601613147565b925050602061319285828601613092565b9150509250929050565b6131a581613071565b82525050565b60006020820190506131c0600083018461319c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320882613005565b810181811067ffffffffffffffff82111715613227576132266131d0565b5b80604052505050565b600061323a612ee7565b905061324682826131ff565b919050565b600067ffffffffffffffff821115613266576132656131d0565b5b61326f82613005565b9050602081019050919050565b82818337600083830152505050565b600061329e6132998461324b565b613230565b9050828152602081018484840111156132ba576132b96131cb565b5b6132c584828561327c565b509392505050565b600082601f8301126132e2576132e16131c6565b5b81356132f284826020860161328b565b91505092915050565b6000806000806080858703121561331557613314612ef1565b5b600061332387828801613147565b945050602061333487828801613147565b935050604061334587828801613092565b925050606085013567ffffffffffffffff81111561336657613365612ef6565b5b613372878288016132cd565b91505092959194509250565b61338781612efb565b82525050565b60006020820190506133a2600083018461337e565b92915050565b6133b181612f80565b81146133bc57600080fd5b50565b6000813590506133ce816133a8565b92915050565b6000602082840312156133ea576133e9612ef1565b5b60006133f8848285016133bf565b91505092915050565b60008060006060848603121561341a57613419612ef1565b5b600061342886828701613147565b935050602061343986828701613147565b925050604061344a86828701613092565b9150509250925092565b600067ffffffffffffffff82111561346f5761346e6131d0565b5b61347882613005565b9050602081019050919050565b600061349861349384613454565b613230565b9050828152602081018484840111156134b4576134b36131cb565b5b6134bf84828561327c565b509392505050565b600082601f8301126134dc576134db6131c6565b5b81356134ec848260208601613485565b91505092915050565b60006020828403121561350b5761350a612ef1565b5b600082013567ffffffffffffffff81111561352957613528612ef6565b5b613535848285016134c7565b91505092915050565b60006020828403121561355457613553612ef1565b5b600061356284828501613147565b91505092915050565b6000806040838503121561358257613581612ef1565b5b600061359085828601613147565b92505060206135a1858286016133bf565b9150509250929050565b600080604083850312156135c2576135c1612ef1565b5b60006135d085828601613147565b92505060206135e185828601613147565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061363257607f821691505b60208210811415613646576136456135eb565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006136a8602d83612fc1565b91506136b38261364c565b604082019050919050565b600060208201905081810360008301526136d78161369b565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061373a602283612fc1565b9150613745826136de565b604082019050919050565b600060208201905081810360008301526137698161372d565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006137cc603983612fc1565b91506137d782613770565b604082019050919050565b600060208201905081810360008301526137fb816137bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613838602083612fc1565b915061384382613802565b602082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006138ca602283612fc1565b91506138d58261386e565b604082019050919050565b600060208201905081810360008301526138f9816138bd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061393a82613071565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561396d5761396c613900565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006139d4602e83612fc1565b91506139df82613978565b604082019050919050565b60006020820190508181036000830152613a03816139c7565b9050919050565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b6000613a40600883612fc1565b9150613a4b82613a0a565b602082019050919050565b60006020820190508181036000830152613a6f81613a33565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613ad2602383612fc1565b9150613add82613a76565b604082019050919050565b60006020820190508181036000830152613b0181613ac5565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613b3e601f83612fc1565b9150613b4982613b08565b602082019050919050565b60006020820190508181036000830152613b6d81613b31565b9050919050565b7f4d696e7420697320636c6f736564000000000000000000000000000000000000600082015250565b6000613baa600e83612fc1565b9150613bb582613b74565b602082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b6000613beb82613071565b9150613bf683613071565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c2b57613c2a613900565b5b828201905092915050565b7f45786365656473204d4158206c696d6974000000000000000000000000000000600082015250565b6000613c6c601183612fc1565b9150613c7782613c36565b602082019050919050565b60006020820190508181036000830152613c9b81613c5f565b9050919050565b7f457863656564732046524545204d494e54206c696d697420706572206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613cfe602383612fc1565b9150613d0982613ca2565b604082019050919050565b60006020820190508181036000830152613d2d81613cf1565b9050919050565b7f457863656564732046524545204d494e54206c696d6974000000000000000000600082015250565b6000613d6a601783612fc1565b9150613d7582613d34565b602082019050919050565b60006020820190508181036000830152613d9981613d5d565b9050919050565b6000613dab82613071565b9150613db683613071565b925082821015613dc957613dc8613900565b5b828203905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613e30602b83612fc1565b9150613e3b82613dd4565b604082019050919050565b60006020820190508181036000830152613e5f81613e23565b9050919050565b7f45786365656473205458206c696d697400000000000000000000000000000000600082015250565b6000613e9c601083612fc1565b9150613ea782613e66565b602082019050919050565b60006020820190508181036000830152613ecb81613e8f565b9050919050565b6000613edd82613071565b9150613ee883613071565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f2157613f20613900565b5b828202905092915050565b7f56616c75652062656c6f77207072696365000000000000000000000000000000600082015250565b6000613f62601183612fc1565b9150613f6d82613f2c565b602082019050919050565b60006020820190508181036000830152613f9181613f55565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613fce601a83612fc1565b9150613fd982613f98565b602082019050919050565b60006020820190508181036000830152613ffd81613fc1565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614060603383612fc1565b915061406b82614004565b604082019050919050565b6000602082019050818103600083015261408f81614053565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006140f2602f83612fc1565b91506140fd82614096565b604082019050919050565b60006020820190508181036000830152614121816140e5565b9050919050565b600081905092915050565b600061413e82612fb6565b6141488185614128565b9350614158818560208601612fd2565b80840191505092915050565b60006141708285614133565b915061417c8284614133565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141e4602683612fc1565b91506141ef82614188565b604082019050919050565b60006020820190508181036000830152614213816141d7565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614276603283612fc1565b91506142818261421a565b604082019050919050565b600060208201905081810360008301526142a581614269565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614308602683612fc1565b9150614313826142ac565b604082019050919050565b60006020820190508181036000830152614337816142fb565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061439a602583612fc1565b91506143a58261433e565b604082019050919050565b600060208201905081810360008301526143c98161438d565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006143f7826143d0565b9150614402836143d0565b92508282101561441557614414613900565b5b828203905092915050565b600061442b826143d0565b9150614436836143d0565b9250826fffffffffffffffffffffffffffffffff0382111561445b5761445a613900565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006144c2602a83612fc1565b91506144cd82614466565b604082019050919050565b600060208201905081810360008301526144f1816144b5565b9050919050565b600061450382613071565b9150600082141561451757614516613900565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061457e602f83612fc1565b915061458982614522565b604082019050919050565b600060208201905081810360008301526145ad81614571565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006145db826145b4565b6145e581856145bf565b93506145f5818560208601612fd2565b6145fe81613005565b840191505092915050565b600060808201905061461e6000830187613106565b61462b6020830186613106565b614638604083018561319c565b818103606083015261464a81846145d0565b905095945050505050565b60008151905061466481612f27565b92915050565b6000602082840312156146805761467f612ef1565b5b600061468e84828501614655565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146d182613071565b91506146dc83613071565b9250826146ec576146eb614697565b5b828204905092915050565b600061470282613071565b915061470d83613071565b92508261471d5761471c614697565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006147b3602183612fc1565b91506147be82614757565b604082019050919050565b600060208201905081810360008301526147e2816147a6565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b600061481f601d83612fc1565b915061482a826147e9565b602082019050919050565b6000602082019050818103600083015261484e81614812565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006148b1602283612fc1565b91506148bc82614855565b604082019050919050565b600060208201905081810360008301526148e0816148a4565b905091905056fea2646970667358221220e4857ab6d89c5fef6be89b034e2366529b0428cb43cd1be7a880959c7b805c3564736f6c634300080c0033

Deployed Bytecode Sourcemap

39065:2204:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23899:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25625:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27150:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26713:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39226:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36253:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22460:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40924:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28000:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23091:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39312:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28205:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40642:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22623:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40814:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39565:505;;;;;;;;;;;;;:::i;:::-;;39266:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25448:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24325:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1737:94;;;;;;;;;;;;;:::i;:::-;;41144:120;;;:::i;:::-;;1514:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25780:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39357:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40078:432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27418:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41025:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28425:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25941:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32840:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27755:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39190:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23899:370;24026:4;24071:25;24056:40;;;:11;:40;;;;:99;;;;24122:33;24107:48;;;:11;:48;;;;24056:99;:160;;;;24181:35;24166:50;;;:11;:50;;;;24056:160;:207;;;;24227:36;24251:11;24227:23;:36::i;:::-;24056:207;24042:221;;23899:370;;;:::o;25625:94::-;25679:13;25708:5;25701:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25625:94;:::o;27150:204::-;27218:7;27242:16;27250:7;27242;:16::i;:::-;27234:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27324:15;:24;27340:7;27324:24;;;;;;;;;;;;;;;;;;;;;27317:31;;27150:204;;;:::o;26713:379::-;26782:13;26798:24;26814:7;26798:15;:24::i;:::-;26782:40;;26843:5;26837:11;;:2;:11;;;;26829:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26928:5;26912:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26937:37;26954:5;26961:12;:10;:12::i;:::-;26937:16;:37::i;:::-;26912:62;26896:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;27058:28;27067:2;27071:7;27080:5;27058:8;:28::i;:::-;26775:317;26713:379;;:::o;39226:33::-;;;;:::o;36253:207::-;36396:6;36422:30;;;36415:37;;36253:207;;;;;;:::o;22460:94::-;22513:7;22536:12;;22529:19;;22460:94;:::o;40924:93::-;1660:12;:10;:12::i;:::-;1649:23;;:7;:5;:7::i;:::-;:23;;;1641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41002:7:::1;40989:10;;:20;;;;;;;;;;;;;;;;;;40924:93:::0;:::o;28000:142::-;28108:28;28118:4;28124:2;28128:7;28108:9;:28::i;:::-;28000:142;;;:::o;23091:744::-;23200:7;23235:16;23245:5;23235:9;:16::i;:::-;23227:5;:24;23219:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;23297:22;23322:13;:11;:13::i;:::-;23297:38;;23342:19;23372:25;23422:9;23417:350;23441:14;23437:1;:18;23417:350;;;23471:31;23505:11;:14;23517:1;23505:14;;;;;;;;;;;23471:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23558:1;23532:28;;:9;:14;;;:28;;;23528:89;;23593:9;:14;;;23573:34;;23528:89;23650:5;23629:26;;:17;:26;;;23625:135;;;23687:5;23672:11;:20;23668:59;;;23714:1;23707:8;;;;;;;;;23668:59;23737:13;;;;;:::i;:::-;;;;23625:135;23462:305;23457:3;;;;;:::i;:::-;;;;23417:350;;;;23773:56;;;;;;;;;;:::i;:::-;;;;;;;;23091:744;;;;;:::o;39312:36::-;;;;:::o;28205:157::-;28317:39;28334:4;28340:2;28344:7;28317:39;;;;;;;;;;;;:16;:39::i;:::-;28205:157;;;:::o;40642:164::-;1660:12;:10;:12::i;:::-;1649:23;;:7;:5;:7::i;:::-;:23;;;1641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40742:10:::1;;40726:13;:11;:13::i;:::-;:26;40718:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;40776:22;40786:3;40791:6;40776:9;:22::i;:::-;40642:164:::0;;:::o;22623:177::-;22690:7;22722:13;:11;:13::i;:::-;22714:5;:21;22706:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22789:5;22782:12;;22623:177;;;:::o;40814:102::-;1660:12;:10;:12::i;:::-;1649:23;;:7;:5;:7::i;:::-;:23;;;1641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40901:7:::1;40885:13;:23;;;;;;;;;;;;:::i;:::-;;40814:102:::0;:::o;39565:505::-;38118:1;38716:7;;:19;;38708:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38118:1;38849:7;:18;;;;39624:10:::1;;;;;;;;;;;39616:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;39688:10;;39672:13;:11;:13::i;:::-;:26;39664:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;39751:10;;39746:1;39730:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:31;;39722:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39803:25;39817:10;39803:13;:25::i;:::-;39802:26;39794:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39907:1;39887:17;;:21;39879:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;39969:4;39947:7;:19;39955:10;39947:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;40024:1;40004:17;;:21;;;;:::i;:::-;39984:17;:41;;;;40036:26;40046:12;:10;:12::i;:::-;40060:1;40036:9;:26::i;:::-;38074:1:::0;39028:7;:22;;;;39565:505::o;39266:39::-;;;;:::o;25448:118::-;25512:7;25535:20;25547:7;25535:11;:20::i;:::-;:25;;;25528:32;;25448:118;;;:::o;24325:211::-;24389:7;24430:1;24413:19;;:5;:19;;;;24405:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;24502:12;:19;24515:5;24502:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24494:36;;24487:43;;24325:211;;;:::o;1737:94::-;1660:12;:10;:12::i;:::-;1649:23;;:7;:5;:7::i;:::-;:23;;;1641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1802:21:::1;1820:1;1802:9;:21::i;:::-;1737:94::o:0;41144:120::-;1660:12;:10;:12::i;:::-;1649:23;;:7;:5;:7::i;:::-;:23;;;1641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41216:10:::1;41208:24;;:47;41233:21;41208:47;;;;;;;;;;;;;;;;;;;;;;;41200:56;;;::::0;::::1;;41144:120::o:0;1514:87::-;1560:7;1587:6;;;;;;;;;;;1580:13;;1514:87;:::o;25780:98::-;25836:13;25865:7;25858:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25780:98;:::o;39357:22::-;;;;;;;;;;;;;:::o;40078:432::-;38118:1;38716:7;;:19;;38708:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38118:1;38849:7;:18;;;;40155:10:::1;;;;;;;;;;;40147:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;40219:10;;40203:13;:11;:13::i;:::-;:26;40195:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;40287:10;;40277:6;40261:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;40253:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;40348:16;;40338:6;:26;;40330:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40426:12;;40417:6;:21;;;;:::i;:::-;40404:9;:34;40396:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40471:31;40481:12;:10;:12::i;:::-;40495:6;40471:9;:31::i;:::-;38074:1:::0;39028:7;:22;;;;40078:432;:::o;27418:274::-;27521:12;:10;:12::i;:::-;27509:24;;:8;:24;;;;27501:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;27618:8;27573:18;:32;27592:12;:10;:12::i;:::-;27573:32;;;;;;;;;;;;;;;:42;27606:8;27573:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27667:8;27638:48;;27653:12;:10;:12::i;:::-;27638:48;;;27677:8;27638:48;;;;;;:::i;:::-;;;;;;;;27418:274;;:::o;41025:111::-;41087:4;41111:7;:17;41119:8;41111:17;;;;;;;;;;;;;;;;;;;;;;;;;41104:24;;41025:111;;;:::o;28425:311::-;28562:28;28572:4;28578:2;28582:7;28562:9;:28::i;:::-;28613:48;28636:4;28642:2;28646:7;28655:5;28613:22;:48::i;:::-;28597:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;28425:311;;;;:::o;25941:394::-;26039:13;26080:16;26088:7;26080;:16::i;:::-;26064:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;26170:21;26194:10;:8;:10::i;:::-;26170:34;;26249:1;26231:7;26225:21;:25;:104;;;;;;;;;;;;;;;;;26286:7;26295:18;:7;:16;:18::i;:::-;26269:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26225:104;26211:118;;;25941:394;;;:::o;32840:43::-;;;;:::o;27755:186::-;27877:4;27900:18;:25;27919:5;27900:25;;;;;;;;;;;;;;;:35;27926:8;27900:35;;;;;;;;;;;;;;;;;;;;;;;;;27893:42;;27755:186;;;;:::o;1839:192::-;1660:12;:10;:12::i;:::-;1649:23;;:7;:5;:7::i;:::-;:23;;;1641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1948:1:::1;1928:22;;:8;:22;;;;1920:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:19;2014:8;2004:9;:19::i;:::-;1839:192:::0;:::o;39190:29::-;;;;:::o;3857:157::-;3942:4;3981:25;3966:40;;;:11;:40;;;;3959:47;;3857:157;;;:::o;28975:105::-;29032:4;29062:12;;29052:7;:22;29045:29;;28975:105;;;:::o;1069:98::-;1122:7;1149:10;1142:17;;1069:98;:::o;32662:172::-;32786:2;32759:15;:24;32775:7;32759:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32820:7;32816:2;32800:28;;32809:5;32800:28;;;;;;;;;;;;32662:172;;;:::o;31027:1529::-;31124:35;31162:20;31174:7;31162:11;:20::i;:::-;31124:58;;31191:22;31233:13;:18;;;31217:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;31286:12;:10;:12::i;:::-;31262:36;;:20;31274:7;31262:11;:20::i;:::-;:36;;;31217:81;:142;;;;31309:50;31326:13;:18;;;31346:12;:10;:12::i;:::-;31309:16;:50::i;:::-;31217:142;31191:169;;31385:17;31369:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;31517:4;31495:26;;:13;:18;;;:26;;;31479:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;31606:1;31592:16;;:2;:16;;;;31584:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31659:43;31681:4;31687:2;31691:7;31700:1;31659:21;:43::i;:::-;31759:49;31776:1;31780:7;31789:13;:18;;;31759:8;:49::i;:::-;31847:1;31817:12;:18;31830:4;31817:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31883:1;31855:12;:16;31868:2;31855:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31914:43;;;;;;;;31929:2;31914:43;;;;;;31940:15;31914:43;;;;;31891:11;:20;31903:7;31891:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32185:19;32217:1;32207:7;:11;;;;:::i;:::-;32185:33;;32270:1;32229:43;;:11;:24;32241:11;32229:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;32225:236;;;32287:20;32295:11;32287:7;:20::i;:::-;32283:171;;;32347:97;;;;;;;;32374:13;:18;;;32347:97;;;;;;32405:13;:28;;;32347:97;;;;;32320:11;:24;32332:11;32320:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32283:171;32225:236;32493:7;32489:2;32474:27;;32483:4;32474:27;;;;;;;;;;;;32508:42;32529:4;32535:2;32539:7;32548:1;32508:20;:42::i;:::-;31117:1439;;;31027:1529;;;:::o;29086:98::-;29151:27;29161:2;29165:8;29151:27;;;;;;;;;;;;:9;:27::i;:::-;29086:98;;:::o;24788:606::-;24864:21;;:::i;:::-;24905:16;24913:7;24905;:16::i;:::-;24897:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24977:26;25025:12;25014:7;:23;25010:93;;25094:1;25079:12;25069:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;25048:47;;25010:93;25116:12;25131:7;25116:22;;25111:212;25148:18;25140:4;:26;25111:212;;25185:31;25219:11;:17;25231:4;25219:17;;;;;;;;;;;25185:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25275:1;25249:28;;:9;:14;;;:28;;;25245:71;;25297:9;25290:16;;;;;;;25245:71;25176:147;25168:6;;;;;:::i;:::-;;;;25111:212;;;;25331:57;;;;;;;;;;:::i;:::-;;;;;;;;24788:606;;;;:::o;2039:173::-;2095:16;2114:6;;;;;;;;;;;2095:25;;2140:8;2131:6;;:17;;;;;;;;;;;;;;;;;;2195:8;2164:40;;2185:8;2164:40;;;;;;;;;;;;2084:128;2039:173;:::o;34377:690::-;34514:4;34531:15;:2;:13;;;:15::i;:::-;34527:535;;;34586:2;34570:36;;;34607:12;:10;:12::i;:::-;34621:4;34627:7;34636:5;34570:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34557:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34818:1;34801:6;:13;:18;34797:215;;;34834:61;;;;;;;;;;:::i;:::-;;;;;;;;34797:215;34980:6;34974:13;34965:6;34961:2;34957:15;34950:38;34557:464;34702:45;;;34692:55;;;:6;:55;;;;34685:62;;;;;34527:535;35050:4;35043:11;;34377:690;;;;;;;:::o;40518:112::-;40578:13;40609;40602:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40518:112;:::o;4111:534::-;4167:13;4208:1;4199:5;:10;4195:53;;;4226:10;;;;;;;;;;;;;;;;;;;;;4195:53;4258:12;4273:5;4258:20;;4289:14;4314:78;4329:1;4321:4;:9;4314:78;;4347:8;;;;;:::i;:::-;;;;4378:2;4370:10;;;;;:::i;:::-;;;4314:78;;;4402:19;4434:6;4424:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4402:39;;4452:154;4468:1;4459:5;:10;4452:154;;4496:1;4486:11;;;;;:::i;:::-;;;4563:2;4555:5;:10;;;;:::i;:::-;4542:2;:24;;;;:::i;:::-;4529:39;;4512:6;4519;4512:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4592:2;4583:11;;;;;:::i;:::-;;;4452:154;;;4630:6;4616:21;;;;;4111:534;;;;:::o;35529:141::-;;;;;:::o;36056:140::-;;;;;:::o;29523:1272::-;29628:20;29651:12;;29628:35;;29692:1;29678:16;;:2;:16;;;;29670:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29869:21;29877:12;29869:7;:21::i;:::-;29868:22;29860:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;29951:12;29939:8;:24;;29931:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30011:61;30041:1;30045:2;30049:12;30063:8;30011:21;:61::i;:::-;30081:30;30114:12;:16;30127:2;30114:16;;;;;;;;;;;;;;;30081:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30156:119;;;;;;;;30206:8;30176:11;:19;;;:39;;;;:::i;:::-;30156:119;;;;;;30259:8;30224:11;:24;;;:44;;;;:::i;:::-;30156:119;;;;;30137:12;:16;30150:2;30137:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30310:43;;;;;;;;30325:2;30310:43;;;;;;30336:15;30310:43;;;;;30282:11;:25;30294:12;30282:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30362:20;30385:12;30362:35;;30411:9;30406:281;30430:8;30426:1;:12;30406:281;;;30484:12;30480:2;30459:38;;30476:1;30459:38;;;;;;;;;;;;30524:59;30555:1;30559:2;30563:12;30577:5;30524:22;:59::i;:::-;30506:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;30665:14;;;;;:::i;:::-;;;;30440:3;;;;;:::i;:::-;;;;30406:281;;;;30710:12;30695;:27;;;;30729:60;30758:1;30762:2;30766:12;30780:8;30729:20;:60::i;:::-;29621:1174;;;29523:1272;;;:::o;5484:198::-;5544:4;5563:12;5630:7;5618:20;5610:28;;5673:1;5666:4;:8;5659:15;;;5484:198;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:307::-;6205:4;6295:18;6287:6;6284:30;6281:56;;;6317:18;;:::i;:::-;6281:56;6355:29;6377:6;6355:29;:::i;:::-;6347:37;;6439:4;6433;6429:15;6421:23;;6144:307;;;:::o;6457:154::-;6541:6;6536:3;6531;6518:30;6603:1;6594:6;6589:3;6585:16;6578:27;6457:154;;;:::o;6617:410::-;6694:5;6719:65;6735:48;6776:6;6735:48;:::i;:::-;6719:65;:::i;:::-;6710:74;;6807:6;6800:5;6793:21;6845:4;6838:5;6834:16;6883:3;6874:6;6869:3;6865:16;6862:25;6859:112;;;6890:79;;:::i;:::-;6859:112;6980:41;7014:6;7009:3;7004;6980:41;:::i;:::-;6700:327;6617:410;;;;;:::o;7046:338::-;7101:5;7150:3;7143:4;7135:6;7131:17;7127:27;7117:122;;7158:79;;:::i;:::-;7117:122;7275:6;7262:20;7300:78;7374:3;7366:6;7359:4;7351:6;7347:17;7300:78;:::i;:::-;7291:87;;7107:277;7046:338;;;;:::o;7390:943::-;7485:6;7493;7501;7509;7558:3;7546:9;7537:7;7533:23;7529:33;7526:120;;;7565:79;;:::i;:::-;7526:120;7685:1;7710:53;7755:7;7746:6;7735:9;7731:22;7710:53;:::i;:::-;7700:63;;7656:117;7812:2;7838:53;7883:7;7874:6;7863:9;7859:22;7838:53;:::i;:::-;7828:63;;7783:118;7940:2;7966:53;8011:7;8002:6;7991:9;7987:22;7966:53;:::i;:::-;7956:63;;7911:118;8096:2;8085:9;8081:18;8068:32;8127:18;8119:6;8116:30;8113:117;;;8149:79;;:::i;:::-;8113:117;8254:62;8308:7;8299:6;8288:9;8284:22;8254:62;:::i;:::-;8244:72;;8039:287;7390:943;;;;;;;:::o;8339:115::-;8424:23;8441:5;8424:23;:::i;:::-;8419:3;8412:36;8339:115;;:::o;8460:218::-;8551:4;8589:2;8578:9;8574:18;8566:26;;8602:69;8668:1;8657:9;8653:17;8644:6;8602:69;:::i;:::-;8460:218;;;;:::o;8684:116::-;8754:21;8769:5;8754:21;:::i;:::-;8747:5;8744:32;8734:60;;8790:1;8787;8780:12;8734:60;8684:116;:::o;8806:133::-;8849:5;8887:6;8874:20;8865:29;;8903:30;8927:5;8903:30;:::i;:::-;8806:133;;;;:::o;8945:323::-;9001:6;9050:2;9038:9;9029:7;9025:23;9021:32;9018:119;;;9056:79;;:::i;:::-;9018:119;9176:1;9201:50;9243:7;9234:6;9223:9;9219:22;9201:50;:::i;:::-;9191:60;;9147:114;8945:323;;;;:::o;9274:619::-;9351:6;9359;9367;9416:2;9404:9;9395:7;9391:23;9387:32;9384:119;;;9422:79;;:::i;:::-;9384:119;9542:1;9567:53;9612:7;9603:6;9592:9;9588:22;9567:53;:::i;:::-;9557:63;;9513:117;9669:2;9695:53;9740:7;9731:6;9720:9;9716:22;9695:53;:::i;:::-;9685:63;;9640:118;9797:2;9823:53;9868:7;9859:6;9848:9;9844:22;9823:53;:::i;:::-;9813:63;;9768:118;9274:619;;;;;:::o;9899:308::-;9961:4;10051:18;10043:6;10040:30;10037:56;;;10073:18;;:::i;:::-;10037:56;10111:29;10133:6;10111:29;:::i;:::-;10103:37;;10195:4;10189;10185:15;10177:23;;9899:308;;;:::o;10213:412::-;10291:5;10316:66;10332:49;10374:6;10332:49;:::i;:::-;10316:66;:::i;:::-;10307:75;;10405:6;10398:5;10391:21;10443:4;10436:5;10432:16;10481:3;10472:6;10467:3;10463:16;10460:25;10457:112;;;10488:79;;:::i;:::-;10457:112;10578:41;10612:6;10607:3;10602;10578:41;:::i;:::-;10297:328;10213:412;;;;;:::o;10645:340::-;10701:5;10750:3;10743:4;10735:6;10731:17;10727:27;10717:122;;10758:79;;:::i;:::-;10717:122;10875:6;10862:20;10900:79;10975:3;10967:6;10960:4;10952:6;10948:17;10900:79;:::i;:::-;10891:88;;10707:278;10645:340;;;;:::o;10991:509::-;11060:6;11109:2;11097:9;11088:7;11084:23;11080:32;11077:119;;;11115:79;;:::i;:::-;11077:119;11263:1;11252:9;11248:17;11235:31;11293:18;11285:6;11282:30;11279:117;;;11315:79;;:::i;:::-;11279:117;11420:63;11475:7;11466:6;11455:9;11451:22;11420:63;:::i;:::-;11410:73;;11206:287;10991:509;;;;:::o;11506:329::-;11565:6;11614:2;11602:9;11593:7;11589:23;11585:32;11582:119;;;11620:79;;:::i;:::-;11582:119;11740:1;11765:53;11810:7;11801:6;11790:9;11786:22;11765:53;:::i;:::-;11755:63;;11711:117;11506:329;;;;:::o;11841:468::-;11906:6;11914;11963:2;11951:9;11942:7;11938:23;11934:32;11931:119;;;11969:79;;:::i;:::-;11931:119;12089:1;12114:53;12159:7;12150:6;12139:9;12135:22;12114:53;:::i;:::-;12104:63;;12060:117;12216:2;12242:50;12284:7;12275:6;12264:9;12260:22;12242:50;:::i;:::-;12232:60;;12187:115;11841:468;;;;;:::o;12315:474::-;12383:6;12391;12440:2;12428:9;12419:7;12415:23;12411:32;12408:119;;;12446:79;;:::i;:::-;12408:119;12566:1;12591:53;12636:7;12627:6;12616:9;12612:22;12591:53;:::i;:::-;12581:63;;12537:117;12693:2;12719:53;12764:7;12755:6;12744:9;12740:22;12719:53;:::i;:::-;12709:63;;12664:118;12315:474;;;;;:::o;12795:180::-;12843:77;12840:1;12833:88;12940:4;12937:1;12930:15;12964:4;12961:1;12954:15;12981:320;13025:6;13062:1;13056:4;13052:12;13042:22;;13109:1;13103:4;13099:12;13130:18;13120:81;;13186:4;13178:6;13174:17;13164:27;;13120:81;13248:2;13240:6;13237:14;13217:18;13214:38;13211:84;;;13267:18;;:::i;:::-;13211:84;13032:269;12981:320;;;:::o;13307:232::-;13447:34;13443:1;13435:6;13431:14;13424:58;13516:15;13511:2;13503:6;13499:15;13492:40;13307:232;:::o;13545:366::-;13687:3;13708:67;13772:2;13767:3;13708:67;:::i;:::-;13701:74;;13784:93;13873:3;13784:93;:::i;:::-;13902:2;13897:3;13893:12;13886:19;;13545:366;;;:::o;13917:419::-;14083:4;14121:2;14110:9;14106:18;14098:26;;14170:9;14164:4;14160:20;14156:1;14145:9;14141:17;14134:47;14198:131;14324:4;14198:131;:::i;:::-;14190:139;;13917:419;;;:::o;14342:221::-;14482:34;14478:1;14470:6;14466:14;14459:58;14551:4;14546:2;14538:6;14534:15;14527:29;14342:221;:::o;14569:366::-;14711:3;14732:67;14796:2;14791:3;14732:67;:::i;:::-;14725:74;;14808:93;14897:3;14808:93;:::i;:::-;14926:2;14921:3;14917:12;14910:19;;14569:366;;;:::o;14941:419::-;15107:4;15145:2;15134:9;15130:18;15122:26;;15194:9;15188:4;15184:20;15180:1;15169:9;15165:17;15158:47;15222:131;15348:4;15222:131;:::i;:::-;15214:139;;14941:419;;;:::o;15366:244::-;15506:34;15502:1;15494:6;15490:14;15483:58;15575:27;15570:2;15562:6;15558:15;15551:52;15366:244;:::o;15616:366::-;15758:3;15779:67;15843:2;15838:3;15779:67;:::i;:::-;15772:74;;15855:93;15944:3;15855:93;:::i;:::-;15973:2;15968:3;15964:12;15957:19;;15616:366;;;:::o;15988:419::-;16154:4;16192:2;16181:9;16177:18;16169:26;;16241:9;16235:4;16231:20;16227:1;16216:9;16212:17;16205:47;16269:131;16395:4;16269:131;:::i;:::-;16261:139;;15988:419;;;:::o;16413:182::-;16553:34;16549:1;16541:6;16537:14;16530:58;16413:182;:::o;16601:366::-;16743:3;16764:67;16828:2;16823:3;16764:67;:::i;:::-;16757:74;;16840:93;16929:3;16840:93;:::i;:::-;16958:2;16953:3;16949:12;16942:19;;16601:366;;;:::o;16973:419::-;17139:4;17177:2;17166:9;17162:18;17154:26;;17226:9;17220:4;17216:20;17212:1;17201:9;17197:17;17190:47;17254:131;17380:4;17254:131;:::i;:::-;17246:139;;16973:419;;;:::o;17398:221::-;17538:34;17534:1;17526:6;17522:14;17515:58;17607:4;17602:2;17594:6;17590:15;17583:29;17398:221;:::o;17625:366::-;17767:3;17788:67;17852:2;17847:3;17788:67;:::i;:::-;17781:74;;17864:93;17953:3;17864:93;:::i;:::-;17982:2;17977:3;17973:12;17966:19;;17625:366;;;:::o;17997:419::-;18163:4;18201:2;18190:9;18186:18;18178:26;;18250:9;18244:4;18240:20;18236:1;18225:9;18221:17;18214:47;18278:131;18404:4;18278:131;:::i;:::-;18270:139;;17997:419;;;:::o;18422:180::-;18470:77;18467:1;18460:88;18567:4;18564:1;18557:15;18591:4;18588:1;18581:15;18608:233;18647:3;18670:24;18688:5;18670:24;:::i;:::-;18661:33;;18716:66;18709:5;18706:77;18703:103;;;18786:18;;:::i;:::-;18703:103;18833:1;18826:5;18822:13;18815:20;;18608:233;;;:::o;18847:::-;18987:34;18983:1;18975:6;18971:14;18964:58;19056:16;19051:2;19043:6;19039:15;19032:41;18847:233;:::o;19086:366::-;19228:3;19249:67;19313:2;19308:3;19249:67;:::i;:::-;19242:74;;19325:93;19414:3;19325:93;:::i;:::-;19443:2;19438:3;19434:12;19427:19;;19086:366;;;:::o;19458:419::-;19624:4;19662:2;19651:9;19647:18;19639:26;;19711:9;19705:4;19701:20;19697:1;19686:9;19682:17;19675:47;19739:131;19865:4;19739:131;:::i;:::-;19731:139;;19458:419;;;:::o;19883:158::-;20023:10;20019:1;20011:6;20007:14;20000:34;19883:158;:::o;20047:365::-;20189:3;20210:66;20274:1;20269:3;20210:66;:::i;:::-;20203:73;;20285:93;20374:3;20285:93;:::i;:::-;20403:2;20398:3;20394:12;20387:19;;20047:365;;;:::o;20418:419::-;20584:4;20622:2;20611:9;20607:18;20599:26;;20671:9;20665:4;20661:20;20657:1;20646:9;20642:17;20635:47;20699:131;20825:4;20699:131;:::i;:::-;20691:139;;20418:419;;;:::o;20843:222::-;20983:34;20979:1;20971:6;20967:14;20960:58;21052:5;21047:2;21039:6;21035:15;21028:30;20843:222;:::o;21071:366::-;21213:3;21234:67;21298:2;21293:3;21234:67;:::i;:::-;21227:74;;21310:93;21399:3;21310:93;:::i;:::-;21428:2;21423:3;21419:12;21412:19;;21071:366;;;:::o;21443:419::-;21609:4;21647:2;21636:9;21632:18;21624:26;;21696:9;21690:4;21686:20;21682:1;21671:9;21667:17;21660:47;21724:131;21850:4;21724:131;:::i;:::-;21716:139;;21443:419;;;:::o;21868:181::-;22008:33;22004:1;21996:6;21992:14;21985:57;21868:181;:::o;22055:366::-;22197:3;22218:67;22282:2;22277:3;22218:67;:::i;:::-;22211:74;;22294:93;22383:3;22294:93;:::i;:::-;22412:2;22407:3;22403:12;22396:19;;22055:366;;;:::o;22427:419::-;22593:4;22631:2;22620:9;22616:18;22608:26;;22680:9;22674:4;22670:20;22666:1;22655:9;22651:17;22644:47;22708:131;22834:4;22708:131;:::i;:::-;22700:139;;22427:419;;;:::o;22852:164::-;22992:16;22988:1;22980:6;22976:14;22969:40;22852:164;:::o;23022:366::-;23164:3;23185:67;23249:2;23244:3;23185:67;:::i;:::-;23178:74;;23261:93;23350:3;23261:93;:::i;:::-;23379:2;23374:3;23370:12;23363:19;;23022:366;;;:::o;23394:419::-;23560:4;23598:2;23587:9;23583:18;23575:26;;23647:9;23641:4;23637:20;23633:1;23622:9;23618:17;23611:47;23675:131;23801:4;23675:131;:::i;:::-;23667:139;;23394:419;;;:::o;23819:305::-;23859:3;23878:20;23896:1;23878:20;:::i;:::-;23873:25;;23912:20;23930:1;23912:20;:::i;:::-;23907:25;;24066:1;23998:66;23994:74;23991:1;23988:81;23985:107;;;24072:18;;:::i;:::-;23985:107;24116:1;24113;24109:9;24102:16;;23819:305;;;;:::o;24130:167::-;24270:19;24266:1;24258:6;24254:14;24247:43;24130:167;:::o;24303:366::-;24445:3;24466:67;24530:2;24525:3;24466:67;:::i;:::-;24459:74;;24542:93;24631:3;24542:93;:::i;:::-;24660:2;24655:3;24651:12;24644:19;;24303:366;;;:::o;24675:419::-;24841:4;24879:2;24868:9;24864:18;24856:26;;24928:9;24922:4;24918:20;24914:1;24903:9;24899:17;24892:47;24956:131;25082:4;24956:131;:::i;:::-;24948:139;;24675:419;;;:::o;25100:222::-;25240:34;25236:1;25228:6;25224:14;25217:58;25309:5;25304:2;25296:6;25292:15;25285:30;25100:222;:::o;25328:366::-;25470:3;25491:67;25555:2;25550:3;25491:67;:::i;:::-;25484:74;;25567:93;25656:3;25567:93;:::i;:::-;25685:2;25680:3;25676:12;25669:19;;25328:366;;;:::o;25700:419::-;25866:4;25904:2;25893:9;25889:18;25881:26;;25953:9;25947:4;25943:20;25939:1;25928:9;25924:17;25917:47;25981:131;26107:4;25981:131;:::i;:::-;25973:139;;25700:419;;;:::o;26125:173::-;26265:25;26261:1;26253:6;26249:14;26242:49;26125:173;:::o;26304:366::-;26446:3;26467:67;26531:2;26526:3;26467:67;:::i;:::-;26460:74;;26543:93;26632:3;26543:93;:::i;:::-;26661:2;26656:3;26652:12;26645:19;;26304:366;;;:::o;26676:419::-;26842:4;26880:2;26869:9;26865:18;26857:26;;26929:9;26923:4;26919:20;26915:1;26904:9;26900:17;26893:47;26957:131;27083:4;26957:131;:::i;:::-;26949:139;;26676:419;;;:::o;27101:191::-;27141:4;27161:20;27179:1;27161:20;:::i;:::-;27156:25;;27195:20;27213:1;27195:20;:::i;:::-;27190:25;;27234:1;27231;27228:8;27225:34;;;27239:18;;:::i;:::-;27225:34;27284:1;27281;27277:9;27269:17;;27101:191;;;;:::o;27298:230::-;27438:34;27434:1;27426:6;27422:14;27415:58;27507:13;27502:2;27494:6;27490:15;27483:38;27298:230;:::o;27534:366::-;27676:3;27697:67;27761:2;27756:3;27697:67;:::i;:::-;27690:74;;27773:93;27862:3;27773:93;:::i;:::-;27891:2;27886:3;27882:12;27875:19;;27534:366;;;:::o;27906:419::-;28072:4;28110:2;28099:9;28095:18;28087:26;;28159:9;28153:4;28149:20;28145:1;28134:9;28130:17;28123:47;28187:131;28313:4;28187:131;:::i;:::-;28179:139;;27906:419;;;:::o;28331:166::-;28471:18;28467:1;28459:6;28455:14;28448:42;28331:166;:::o;28503:366::-;28645:3;28666:67;28730:2;28725:3;28666:67;:::i;:::-;28659:74;;28742:93;28831:3;28742:93;:::i;:::-;28860:2;28855:3;28851:12;28844:19;;28503:366;;;:::o;28875:419::-;29041:4;29079:2;29068:9;29064:18;29056:26;;29128:9;29122:4;29118:20;29114:1;29103:9;29099:17;29092:47;29156:131;29282:4;29156:131;:::i;:::-;29148:139;;28875:419;;;:::o;29300:348::-;29340:7;29363:20;29381:1;29363:20;:::i;:::-;29358:25;;29397:20;29415:1;29397:20;:::i;:::-;29392:25;;29585:1;29517:66;29513:74;29510:1;29507:81;29502:1;29495:9;29488:17;29484:105;29481:131;;;29592:18;;:::i;:::-;29481:131;29640:1;29637;29633:9;29622:20;;29300:348;;;;:::o;29654:167::-;29794:19;29790:1;29782:6;29778:14;29771:43;29654:167;:::o;29827:366::-;29969:3;29990:67;30054:2;30049:3;29990:67;:::i;:::-;29983:74;;30066:93;30155:3;30066:93;:::i;:::-;30184:2;30179:3;30175:12;30168:19;;29827:366;;;:::o;30199:419::-;30365:4;30403:2;30392:9;30388:18;30380:26;;30452:9;30446:4;30442:20;30438:1;30427:9;30423:17;30416:47;30480:131;30606:4;30480:131;:::i;:::-;30472:139;;30199:419;;;:::o;30624:176::-;30764:28;30760:1;30752:6;30748:14;30741:52;30624:176;:::o;30806:366::-;30948:3;30969:67;31033:2;31028:3;30969:67;:::i;:::-;30962:74;;31045:93;31134:3;31045:93;:::i;:::-;31163:2;31158:3;31154:12;31147:19;;30806:366;;;:::o;31178:419::-;31344:4;31382:2;31371:9;31367:18;31359:26;;31431:9;31425:4;31421:20;31417:1;31406:9;31402:17;31395:47;31459:131;31585:4;31459:131;:::i;:::-;31451:139;;31178:419;;;:::o;31603:238::-;31743:34;31739:1;31731:6;31727:14;31720:58;31812:21;31807:2;31799:6;31795:15;31788:46;31603:238;:::o;31847:366::-;31989:3;32010:67;32074:2;32069:3;32010:67;:::i;:::-;32003:74;;32086:93;32175:3;32086:93;:::i;:::-;32204:2;32199:3;32195:12;32188:19;;31847:366;;;:::o;32219:419::-;32385:4;32423:2;32412:9;32408:18;32400:26;;32472:9;32466:4;32462:20;32458:1;32447:9;32443:17;32436:47;32500:131;32626:4;32500:131;:::i;:::-;32492:139;;32219:419;;;:::o;32644:234::-;32784:34;32780:1;32772:6;32768:14;32761:58;32853:17;32848:2;32840:6;32836:15;32829:42;32644:234;:::o;32884:366::-;33026:3;33047:67;33111:2;33106:3;33047:67;:::i;:::-;33040:74;;33123:93;33212:3;33123:93;:::i;:::-;33241:2;33236:3;33232:12;33225:19;;32884:366;;;:::o;33256:419::-;33422:4;33460:2;33449:9;33445:18;33437:26;;33509:9;33503:4;33499:20;33495:1;33484:9;33480:17;33473:47;33537:131;33663:4;33537:131;:::i;:::-;33529:139;;33256:419;;;:::o;33681:148::-;33783:11;33820:3;33805:18;;33681:148;;;;:::o;33835:377::-;33941:3;33969:39;34002:5;33969:39;:::i;:::-;34024:89;34106:6;34101:3;34024:89;:::i;:::-;34017:96;;34122:52;34167:6;34162:3;34155:4;34148:5;34144:16;34122:52;:::i;:::-;34199:6;34194:3;34190:16;34183:23;;33945:267;33835:377;;;;:::o;34218:435::-;34398:3;34420:95;34511:3;34502:6;34420:95;:::i;:::-;34413:102;;34532:95;34623:3;34614:6;34532:95;:::i;:::-;34525:102;;34644:3;34637:10;;34218:435;;;;;:::o;34659:225::-;34799:34;34795:1;34787:6;34783:14;34776:58;34868:8;34863:2;34855:6;34851:15;34844:33;34659:225;:::o;34890:366::-;35032:3;35053:67;35117:2;35112:3;35053:67;:::i;:::-;35046:74;;35129:93;35218:3;35129:93;:::i;:::-;35247:2;35242:3;35238:12;35231:19;;34890:366;;;:::o;35262:419::-;35428:4;35466:2;35455:9;35451:18;35443:26;;35515:9;35509:4;35505:20;35501:1;35490:9;35486:17;35479:47;35543:131;35669:4;35543:131;:::i;:::-;35535:139;;35262:419;;;:::o;35687:237::-;35827:34;35823:1;35815:6;35811:14;35804:58;35896:20;35891:2;35883:6;35879:15;35872:45;35687:237;:::o;35930:366::-;36072:3;36093:67;36157:2;36152:3;36093:67;:::i;:::-;36086:74;;36169:93;36258:3;36169:93;:::i;:::-;36287:2;36282:3;36278:12;36271:19;;35930:366;;;:::o;36302:419::-;36468:4;36506:2;36495:9;36491:18;36483:26;;36555:9;36549:4;36545:20;36541:1;36530:9;36526:17;36519:47;36583:131;36709:4;36583:131;:::i;:::-;36575:139;;36302:419;;;:::o;36727:225::-;36867:34;36863:1;36855:6;36851:14;36844:58;36936:8;36931:2;36923:6;36919:15;36912:33;36727:225;:::o;36958:366::-;37100:3;37121:67;37185:2;37180:3;37121:67;:::i;:::-;37114:74;;37197:93;37286:3;37197:93;:::i;:::-;37315:2;37310:3;37306:12;37299:19;;36958:366;;;:::o;37330:419::-;37496:4;37534:2;37523:9;37519:18;37511:26;;37583:9;37577:4;37573:20;37569:1;37558:9;37554:17;37547:47;37611:131;37737:4;37611:131;:::i;:::-;37603:139;;37330:419;;;:::o;37755:224::-;37895:34;37891:1;37883:6;37879:14;37872:58;37964:7;37959:2;37951:6;37947:15;37940:32;37755:224;:::o;37985:366::-;38127:3;38148:67;38212:2;38207:3;38148:67;:::i;:::-;38141:74;;38224:93;38313:3;38224:93;:::i;:::-;38342:2;38337:3;38333:12;38326:19;;37985:366;;;:::o;38357:419::-;38523:4;38561:2;38550:9;38546:18;38538:26;;38610:9;38604:4;38600:20;38596:1;38585:9;38581:17;38574:47;38638:131;38764:4;38638:131;:::i;:::-;38630:139;;38357:419;;;:::o;38782:118::-;38819:7;38859:34;38852:5;38848:46;38837:57;;38782:118;;;:::o;38906:191::-;38946:4;38966:20;38984:1;38966:20;:::i;:::-;38961:25;;39000:20;39018:1;39000:20;:::i;:::-;38995:25;;39039:1;39036;39033:8;39030:34;;;39044:18;;:::i;:::-;39030:34;39089:1;39086;39082:9;39074:17;;38906:191;;;;:::o;39103:273::-;39143:3;39162:20;39180:1;39162:20;:::i;:::-;39157:25;;39196:20;39214:1;39196:20;:::i;:::-;39191:25;;39318:1;39282:34;39278:42;39275:1;39272:49;39269:75;;;39324:18;;:::i;:::-;39269:75;39368:1;39365;39361:9;39354:16;;39103:273;;;;:::o;39382:229::-;39522:34;39518:1;39510:6;39506:14;39499:58;39591:12;39586:2;39578:6;39574:15;39567:37;39382:229;:::o;39617:366::-;39759:3;39780:67;39844:2;39839:3;39780:67;:::i;:::-;39773:74;;39856:93;39945:3;39856:93;:::i;:::-;39974:2;39969:3;39965:12;39958:19;;39617:366;;;:::o;39989:419::-;40155:4;40193:2;40182:9;40178:18;40170:26;;40242:9;40236:4;40232:20;40228:1;40217:9;40213:17;40206:47;40270:131;40396:4;40270:131;:::i;:::-;40262:139;;39989:419;;;:::o;40414:171::-;40453:3;40476:24;40494:5;40476:24;:::i;:::-;40467:33;;40522:4;40515:5;40512:15;40509:41;;;40530:18;;:::i;:::-;40509:41;40577:1;40570:5;40566:13;40559:20;;40414:171;;;:::o;40591:234::-;40731:34;40727:1;40719:6;40715:14;40708:58;40800:17;40795:2;40787:6;40783:15;40776:42;40591:234;:::o;40831:366::-;40973:3;40994:67;41058:2;41053:3;40994:67;:::i;:::-;40987:74;;41070:93;41159:3;41070:93;:::i;:::-;41188:2;41183:3;41179:12;41172:19;;40831:366;;;:::o;41203:419::-;41369:4;41407:2;41396:9;41392:18;41384:26;;41456:9;41450:4;41446:20;41442:1;41431:9;41427:17;41420:47;41484:131;41610:4;41484:131;:::i;:::-;41476:139;;41203:419;;;:::o;41628:98::-;41679:6;41713:5;41707:12;41697:22;;41628:98;;;:::o;41732:168::-;41815:11;41849:6;41844:3;41837:19;41889:4;41884:3;41880:14;41865:29;;41732:168;;;;:::o;41906:360::-;41992:3;42020:38;42052:5;42020:38;:::i;:::-;42074:70;42137:6;42132:3;42074:70;:::i;:::-;42067:77;;42153:52;42198:6;42193:3;42186:4;42179:5;42175:16;42153:52;:::i;:::-;42230:29;42252:6;42230:29;:::i;:::-;42225:3;42221:39;42214:46;;41996:270;41906:360;;;;:::o;42272:640::-;42467:4;42505:3;42494:9;42490:19;42482:27;;42519:71;42587:1;42576:9;42572:17;42563:6;42519:71;:::i;:::-;42600:72;42668:2;42657:9;42653:18;42644:6;42600:72;:::i;:::-;42682;42750:2;42739:9;42735:18;42726:6;42682:72;:::i;:::-;42801:9;42795:4;42791:20;42786:2;42775:9;42771:18;42764:48;42829:76;42900:4;42891:6;42829:76;:::i;:::-;42821:84;;42272:640;;;;;;;:::o;42918:141::-;42974:5;43005:6;42999:13;42990:22;;43021:32;43047:5;43021:32;:::i;:::-;42918:141;;;;:::o;43065:349::-;43134:6;43183:2;43171:9;43162:7;43158:23;43154:32;43151:119;;;43189:79;;:::i;:::-;43151:119;43309:1;43334:63;43389:7;43380:6;43369:9;43365:22;43334:63;:::i;:::-;43324:73;;43280:127;43065:349;;;;:::o;43420:180::-;43468:77;43465:1;43458:88;43565:4;43562:1;43555:15;43589:4;43586:1;43579:15;43606:185;43646:1;43663:20;43681:1;43663:20;:::i;:::-;43658:25;;43697:20;43715:1;43697:20;:::i;:::-;43692:25;;43736:1;43726:35;;43741:18;;:::i;:::-;43726:35;43783:1;43780;43776:9;43771:14;;43606:185;;;;:::o;43797:176::-;43829:1;43846:20;43864:1;43846:20;:::i;:::-;43841:25;;43880:20;43898:1;43880:20;:::i;:::-;43875:25;;43919:1;43909:35;;43924:18;;:::i;:::-;43909:35;43965:1;43962;43958:9;43953:14;;43797:176;;;;:::o;43979:180::-;44027:77;44024:1;44017:88;44124:4;44121:1;44114:15;44148:4;44145:1;44138:15;44165:220;44305:34;44301:1;44293:6;44289:14;44282:58;44374:3;44369:2;44361:6;44357:15;44350:28;44165:220;:::o;44391:366::-;44533:3;44554:67;44618:2;44613:3;44554:67;:::i;:::-;44547:74;;44630:93;44719:3;44630:93;:::i;:::-;44748:2;44743:3;44739:12;44732:19;;44391:366;;;:::o;44763:419::-;44929:4;44967:2;44956:9;44952:18;44944:26;;45016:9;45010:4;45006:20;45002:1;44991:9;44987:17;44980:47;45044:131;45170:4;45044:131;:::i;:::-;45036:139;;44763:419;;;:::o;45188:179::-;45328:31;45324:1;45316:6;45312:14;45305:55;45188:179;:::o;45373:366::-;45515:3;45536:67;45600:2;45595:3;45536:67;:::i;:::-;45529:74;;45612:93;45701:3;45612:93;:::i;:::-;45730:2;45725:3;45721:12;45714:19;;45373:366;;;:::o;45745:419::-;45911:4;45949:2;45938:9;45934:18;45926:26;;45998:9;45992:4;45988:20;45984:1;45973:9;45969:17;45962:47;46026:131;46152:4;46026:131;:::i;:::-;46018:139;;45745:419;;;:::o;46170:221::-;46310:34;46306:1;46298:6;46294:14;46287:58;46379:4;46374:2;46366:6;46362:15;46355:29;46170:221;:::o;46397:366::-;46539:3;46560:67;46624:2;46619:3;46560:67;:::i;:::-;46553:74;;46636:93;46725:3;46636:93;:::i;:::-;46754:2;46749:3;46745:12;46738:19;;46397:366;;;:::o;46769:419::-;46935:4;46973:2;46962:9;46958:18;46950:26;;47022:9;47016:4;47012:20;47008:1;46997:9;46993:17;46986:47;47050:131;47176:4;47050:131;:::i;:::-;47042:139;;46769:419;;;:::o

Swarm Source

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