ETH Price: $3,429.95 (+2.57%)

Token

Rebirth Access Card (RCARD)
 

Overview

Max Total Supply

30 RCARD

Holders

29

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 RCARD
0x14749F4430bD42EB952F9411565183622c1d1304
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:
RebirthAccessCards

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 15: accesscard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;

import "./ERC721X.sol";
import "./Ownable.sol";
import "./MerkleProof.sol";
import "./SafeMath.sol";
import "./Counters.sol";

contract RebirthAccessCards is ERC721X, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private tokenIds;
    uint256 public totalMintAmount = 2500;
    uint256 public maxMintAmountPerUser = 1;
    uint256 public pricePerNft = 0.1 ether;
    string public baseTokenURI =
        "https://rebirthaccesscards.mypinata.cloud/ipfs/QmeFDkP173UXvLHcfDoX3gyqGBMjg3fpTJXQPDcGGP6NAG/";
    mapping(address => uint256) mintedTokens; //  userAddress => tokenId
    mapping(address => uint16) mintedAmountPerUser; // userAddress => tokenAmount
    address[] keysOfMintedTokens; //  keys of mintedTokens
    address[] keysOfMintedAmountPerUser; //  keys of mintedAmountPerUser
    address[] whitelist;
    bool useWhitelist = false;

    constructor() ERC721X("Rebirth Access Card", "RCARD") {}

    function clearData() external onlyOwner {
        delete totalMintAmount;
        delete maxMintAmountPerUser;
        delete pricePerNft;
        delete baseTokenURI;

        for (uint256 i = 0; i < keysOfMintedTokens.length; i++) {
            delete mintedTokens[keysOfMintedTokens[i]];
        }

        for (uint256 i = 0; i < keysOfMintedAmountPerUser.length; i++) {
            delete mintedAmountPerUser[keysOfMintedAmountPerUser[i]];
        }

        delete keysOfMintedTokens;
        delete keysOfMintedAmountPerUser;
        delete whitelist;
    }

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

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

    function setTotalMintAmount(uint256 _totalMintAmount) external onlyOwner {
        totalMintAmount = _totalMintAmount;
    }

    function setMaxMintAmountPerUser(uint256 _maxMintAmountPerUser)
        external
        onlyOwner
    {
        maxMintAmountPerUser = _maxMintAmountPerUser;
    }

    function setPricePerNft(uint256 _pricePerNft) external onlyOwner {
        pricePerNft = _pricePerNft;
    }

    function setWhitelist(address[] memory _whitelist) external onlyOwner {
        whitelist = _whitelist;
    }

    function setUseWhitelist(bool _useWhitelist) external onlyOwner {
        useWhitelist = _useWhitelist;
    }

    function isExistedInWhitelist(address _userAddress)
        internal
        view
        returns (bool)
    {
        for (uint256 i = 0; i < whitelist.length; i++) {
            if (whitelist[i] == _userAddress) {
                return true;
            }
        }

        return false;
    }

    function mint(uint256 mintAmount) public payable {
        if (useWhitelist) {
            require(
                isExistedInWhitelist(msg.sender),
                "You aren't currently in the whitelist"
            );
        }

        require(msg.sender == tx.origin, "mint from contract not allowed");
        require(
            mintAmount > 0 && mintAmount <= maxMintAmountPerUser,
            "A wallet can mint 1 NFTs max"
        );

        if (mintedAmountPerUser[msg.sender] > 0) {
            require(
                mintedAmountPerUser[msg.sender] + mintAmount <=
                    maxMintAmountPerUser,
                string(
                    abi.encodePacked(
                        "You can mint ",
                        (maxMintAmountPerUser -
                            mintedAmountPerUser[msg.sender]),
                        " NFTs more."
                    )
                )
            );
        }

        require(msg.value >= pricePerNft * mintAmount, "incorrect price");

        for (uint16 i = 0; i < mintAmount; i++) {
            require(
                tokenIds.current() < totalMintAmount,
                "All NFTs are minted"
            );

            if (mintedAmountPerUser[msg.sender] > 0) {
                mintedAmountPerUser[msg.sender] += 1;
            } else {
                mintedAmountPerUser[msg.sender] = 1;
                keysOfMintedAmountPerUser.push(msg.sender);
            }

            mintedTokens[msg.sender] = tokenIds.current();
            keysOfMintedTokens.push(msg.sender);

            _mint(msg.sender, false);
            tokenIds.increment();
        }
    }

    function withdraw() external {
        payable(0xE6E64F0eA4DaB594c5B6381260d0FA58ea276906).transfer(address(this).balance);
    }
}

File 2 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

File 4 of 15: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 6 of 15: ERC721X.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension and the Enumerable extension
 *
 * @dev Only allows token IDs are minted serially starting from token ID 1
 *
 * @dev Does not support burning tokens or in any way changing the ownership of a token
 *      to address(0)
 */
contract ERC721X is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
  using Address for address;
  using Strings for uint256;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

  // Mapping 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 Returns next token ID to be mint
   */
  uint256 public nextId = 1;

  /**
   * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. It
   *      also sets a `maxTotalSupply` variable to cap the tokens to ever be created
   */
  constructor(string memory name_, string memory symbol_) {
    _name = name_;
    _symbol = symbol_;
  }

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

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

    uint256 count = 0;

    for(uint256 i = 1; _exists(i); i++) {
      if(_owners[i] == owner) {
        count++;
        if(_owners[i + 1] == address(0) && _exists(i + 1)) count++;
      }
    }

    return count;
  }

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

    return _owners[tokenId] != address(0) ? _owners[tokenId] : _owners[tokenId - 1];
  }

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

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

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

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

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

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

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

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public virtual override {
    _setApprovalForAll(_msgSender(), operator, approved);
  }

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

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

    _transfer(from, to, tokenId);
  }

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

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

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

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

  /**
   * @dev Safely mints the token with next consecutive ID and transfers it to `to`. Setting
   *      `amount` to `true` will mint another nft.
   *
   * Requirements:
   *
   * - `tokenId` must not exist.
   * - `maxTotalSupply` maximum total supply has not been reached
   * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(address to, bool amount) internal virtual {
    _safeMint(to, amount, "");
  }

  /**
   * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
   * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
   */
  function _safeMint(
    address to,
    bool amount,
    bytes memory _data
  ) internal virtual {
    _mint(to, amount);

    uint256 n = !amount ? 1 : 2;

    for(uint256 i = 0; i < n; i++) {
      require(
        _checkOnERC721Received(address(0), to, nextId - i - 1, _data),
        "ERC721X: transfer to non ERC721Receiver implementer"
      );
    }
  }

  /**
   * @dev Mints the token with next consecutive ID and transfers it to `to`. Setting
   *      `amount` to `true` will mint another nft.
   *
   * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `maxTotalSupply` maximum total supply has not been reached
   *
   * Emits a {Transfer} event.
   */
  function _mint(address to, bool amount) internal virtual {
    // The below calculations do not depend on user input and
    // are very hard to overflow (nextId must be >= 2^256-2 for
    // that to happen) so using `unchecked` as a means of saving
    // gas is safe here
    unchecked {
      require(to != address(0), "ERC721X: mint to the zero address");

      uint256 n = !amount ? 1 : 2;

      _owners[nextId] = to;

      for(uint256 i = 0; i < n; i++) {
        _beforeTokenTransfer(address(0), to, nextId + i);
        emit Transfer(address(0), to, nextId + i);
      }

      nextId += n;
    }
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual {
    // The below calculations are very hard to overflow (nextId must
    // be = 2^256-1 for that to happen) so using `unchecked` as
    // a means of saving gas is safe here
    unchecked {
      require(
        ownerOf(tokenId) == from,
        "ERC721X: transfer of token that is not own"
      );
      require(to != address(0), "ERC721X: transfer to the zero address");

      _beforeTokenTransfer(from, to, tokenId);

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

      if(_owners[tokenId] == address(0)) {
        _owners[tokenId] = to;
      } else {
        _owners[tokenId] = to;

        if(_owners[tokenId + 1] == address(0)) {
          _owners[tokenId + 1] = from;
        }
      }

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

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

  /**
   * @dev Approve `operator` to operate on all of `owner` tokens
   *
   * Emits a {ApprovalForAll} event.
   */
  function _setApprovalForAll(
    address owner,
    address operator,
    bool approved
  ) internal virtual {
    require(owner != operator, "ERC721X: approve to caller");
    _operatorApprovals[owner][operator] = approved;
    emit ApprovalForAll(owner, operator, approved);
  }

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

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

  /**
   * @dev See {IEnumerableERC721-totalSupply}.
   */
  function totalSupply() override external view returns (uint256) {
    return nextId - 1;
  }

  /**
   * @dev See {IEnumerableERC721-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) override external view returns (uint256) {
    require(_exists(index + 1), "ERC721X: global index out of bounds");

    return index + 1;
  }

  /**
   * @dev See {IEnumerableERC721-tokenOfOwnerByIndex}.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index) override external view returns (uint256) {
    require(owner != address(0), "ERC721X: balance query for the zero address");

    uint256 count = 0;
    uint256 i = 1;

    for(; _exists(i) && count < index + 1; i++) {
      if(_owners[i] == owner) {
        count++;
        if(_owners[i + 1] == address(0) && count < index + 1 && _exists(i + 1)) {
          count++;
          i++;
        }
      }
    }

    if(count == index + 1) return i - 1;
    else revert("ERC721X: owner index out of bounds");
  }
}

File 7 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 15: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 15: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 13 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 14 of 15: SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerNft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_maxMintAmountPerUser","type":"uint256"}],"name":"setMaxMintAmountPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pricePerNft","type":"uint256"}],"name":"setPricePerNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalMintAmount","type":"uint256"}],"name":"setTotalMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useWhitelist","type":"bool"}],"name":"setUseWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"name":"setWhitelist","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":"totalMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260016005556109c4600855600160095567016345785d8a0000600a556040518060800160405280605e815260200162004950605e9139600b9080519060200190620000519291906200020f565b506000601160006101000a81548160ff0219169083151502179055503480156200007a57600080fd5b506040518060400160405280601381526020017f52656269727468204163636573732043617264000000000000000000000000008152506040518060400160405280600581526020017f52434152440000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ff9291906200020f565b508060019080519060200190620001189291906200020f565b5050506200013b6200012f6200014160201b60201c565b6200014960201b60201c565b62000324565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021d90620002bf565b90600052602060002090601f0160209004810192826200024157600085556200028d565b82601f106200025c57805160ff19168380011785556200028d565b828001600101855582156200028d579182015b828111156200028c5782518255916020019190600101906200026f565b5b5090506200029c9190620002a0565b5090565b5b80821115620002bb576000816000905550600101620002a1565b5090565b60006002820490506001821680620002d857607f821691505b60208210811415620002ef57620002ee620002f5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61461c80620003346000396000f3fe6080604052600436106101ee5760003560e01c80637b21768b1161010d578063be5ffb99116100a0578063d547cfb71161006f578063d547cfb7146106c6578063e985e9c5146106f1578063f2fde38b1461072e578063f421764814610757578063fe3165c714610780576101ee565b8063be5ffb991461060a578063bee0f34014610633578063c87b56dd1461065e578063d00453411461069b576101ee565b8063a22cb465116100dc578063a22cb46514610578578063b39b8afa146105a1578063b88d4fde146105ca578063b9e7a439146105f3576101ee565b80637b21768b146104dd5780638da5cb5b1461050657806395d89b4114610531578063a0712d681461055c576101ee565b80633ccfd60b1161018557806361b8ce8c1161015457806361b8ce8c146104215780636352211e1461044c57806370a0823114610489578063715018a6146104c6576101ee565b80633ccfd60b1461037b57806342842e0e146103925780634f6ccce7146103bb57806355f804b3146103f8576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780632b205dc9146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906131da565b6107ab565b6040516102279190613785565b60405180910390f35b34801561023c57600080fd5b506102456108f5565b60405161025291906137a0565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613271565b610987565b60405161028f919061371e565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613134565b610a0c565b005b3480156102cd57600080fd5b506102d6610b24565b6040516102e39190613a82565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e919061302e565b610b3a565b005b34801561032157600080fd5b5061033c600480360381019061033791906131b1565b610b9a565b005b34801561034a57600080fd5b5061036560048036038101906103609190613134565b610bbf565b6040516103729190613a82565b60405180910390f35b34801561038757600080fd5b50610390610e16565b005b34801561039e57600080fd5b506103b960048036038101906103b4919061302e565b610e73565b005b3480156103c757600080fd5b506103e260048036038101906103dd9190613271565b610e93565b6040516103ef9190613a82565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a919061322c565b610efd565b005b34801561042d57600080fd5b50610436610f1b565b6040516104439190613a82565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613271565b610f21565b604051610480919061371e565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612fc9565b611054565b6040516104bd9190613a82565b60405180910390f35b3480156104d257600080fd5b506104db61120e565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613271565b611222565b005b34801561051257600080fd5b5061051b611234565b604051610528919061371e565b60405180910390f35b34801561053d57600080fd5b5061054661125e565b60405161055391906137a0565b60405180910390f35b61057660048036038101906105719190613271565b6112f0565b005b34801561058457600080fd5b5061059f600480360381019061059a91906130f8565b6118a7565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190613271565b6118bd565b005b3480156105d657600080fd5b506105f160048036038101906105ec919061307d565b6118cf565b005b3480156105ff57600080fd5b50610608611931565b005b34801561061657600080fd5b50610631600480360381019061062c9190613271565b611b28565b005b34801561063f57600080fd5b50610648611b3a565b6040516106559190613a82565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613271565b611b40565b60405161069291906137a0565b60405180910390f35b3480156106a757600080fd5b506106b0611be7565b6040516106bd9190613a82565b60405180910390f35b3480156106d257600080fd5b506106db611bed565b6040516106e891906137a0565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190612ff2565b611c7b565b6040516107259190613785565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190612fc9565b611d0f565b005b34801561076357600080fd5b5061077e60048036038101906107799190613170565b611d93565b005b34801561078c57600080fd5b50610795611db5565b6040516107a29190613a82565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108de57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ee57506108ed82611dbb565b5b9050919050565b60606000805461090490613d73565b80601f016020809104026020016040519081016040528092919081815260200182805461093090613d73565b801561097d5780601f106109525761010080835404028352916020019161097d565b820191906000526020600020905b81548152906001019060200180831161096057829003601f168201915b5050505050905090565b600061099282611e25565b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906139a2565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1782610f21565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f90613802565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa7611e3f565b73ffffffffffffffffffffffffffffffffffffffff161480610ad65750610ad581610ad0611e3f565b611c7b565b5b610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c906139c2565b60405180910390fd5b610b1f8383611e47565b505050565b60006001600554610b359190613c7b565b905090565b610b4b610b45611e3f565b82611f00565b610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906138e2565b60405180910390fd5b610b95838383611fde565b505050565b610ba261230d565b80601160006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790613882565b60405180910390fd5b600080600190505b610c4181611e25565b8015610c585750600184610c559190613b9a565b82105b15610dab578473ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d98578180610ccf90613e01565b925050600073ffffffffffffffffffffffffffffffffffffffff1660026000600184610cfb9190613b9a565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015610d585750600184610d559190613b9a565b82105b8015610d755750610d74600182610d6f9190613b9a565b611e25565b5b15610d97578180610d8590613e01565b9250508080610d9390613e01565b9150505b5b8080610da390613e01565b915050610c38565b600184610db89190613b9a565b821415610dd557600181610dcc9190613c7b565b92505050610e10565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790613a62565b60405180910390fd5b92915050565b73e6e64f0ea4dab594c5b6381260d0fa58ea27690673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e70573d6000803e3d6000fd5b50565b610e8e838383604051806020016040528060008152506118cf565b505050565b6000610eaa600183610ea59190613b9a565b611e25565b610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee0906138c2565b60405180910390fd5b600182610ef69190613b9a565b9050919050565b610f0561230d565b8181600b9190610f16929190612c8a565b505050565b60055481565b6000610f2c82611e25565b610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6290613822565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110185760026000600184610fe49190613c7b565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661104d565b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90613882565b60405180910390fd5b600080600190505b6110d681611e25565b15611204578373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111f157818061114d90613e01565b925050600073ffffffffffffffffffffffffffffffffffffffff16600260006001846111799190613b9a565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156111dc57506111db6001826111d69190613b9a565b611e25565b5b156111f05781806111ec90613e01565b9250505b5b80806111fc90613e01565b9150506110cd565b5080915050919050565b61121661230d565b611220600061238b565b565b61122a61230d565b8060088190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461126d90613d73565b80601f016020809104026020016040519081016040528092919081815260200182805461129990613d73565b80156112e65780601f106112bb576101008083540402835291602001916112e6565b820191906000526020600020905b8154815290600101906020018083116112c957829003601f168201915b5050505050905090565b601160009054906101000a900460ff161561134e5761130e33612451565b61134d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611344906137e2565b60405180910390fd5b5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b3906137c2565b60405180910390fd5b6000811180156113ce57506009548111155b61140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613982565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16111561158a5760095481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff166114c79190613b9a565b1115600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff166009546115289190613c7b565b60405160200161153891906136ed565b60405160208183030381529060405290611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f91906137a0565b60405180910390fd5b505b80600a546115989190613c21565b3410156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190613a42565b60405180910390fd5b60005b818161ffff1610156118a3576008546115f66007612526565b10611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906139e2565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16111561170c576001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900461ffff166116ed9190613b62565b92506101000a81548161ffff021916908361ffff1602179055506117cb565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550600f339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6117d56007612526565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611886336000612534565b61189060076126ad565b808061189b90613dd6565b9150506115dd565b5050565b6118b96118b2611e3f565b83836126c3565b5050565b6118c561230d565b8060098190555050565b6118e06118da611e3f565b83611f00565b61191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906138e2565b60405180910390fd5b61192b84848484612830565b50505050565b61193961230d565b600860009055600960009055600a60009055600b60006119599190612d10565b60005b600e80549050811015611a2357600c6000600e83815481106119a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558080611a1b90613e01565b91505061195c565b5060005b600f80549050811015611afb57600d6000600f8381548110611a72577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549061ffff02191690558080611af390613e01565b915050611a27565b50600e6000611b0a9190612d50565b600f6000611b189190612d50565b60106000611b269190612d50565b565b611b3061230d565b80600a8190555050565b60095481565b6060611b4b82611e25565b611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8190613962565b60405180910390fd5b6000611b9461288c565b90506000815111611bb45760405180602001604052806000815250611bdf565b80611bbe8461291e565b604051602001611bcf9291906136c9565b6040516020818303038152906040525b915050919050565b60085481565b600b8054611bfa90613d73565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2690613d73565b8015611c735780601f10611c4857610100808354040283529160200191611c73565b820191906000526020600020905b815481529060010190602001808311611c5657829003601f168201915b505050505081565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d1761230d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90613842565b60405180910390fd5b611d908161238b565b50565b611d9b61230d565b8060109080519060200190611db1929190612d71565b5050565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808214158015611e38575060055482105b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611eba83610f21565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f0b82611e25565b611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f41906138a2565b60405180910390fd5b6000611f5583610f21565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc457508373ffffffffffffffffffffffffffffffffffffffff16611fac84610987565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fd55750611fd48185611c7b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ffe82610f21565b73ffffffffffffffffffffffffffffffffffffffff1614612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204b90613862565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb90613a22565b60405180910390fd5b6120cf838383612acb565b6120da600082611e47565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561219957816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122ad565b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff166002600060018401815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122ac57826002600060018401815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612315611e3f565b73ffffffffffffffffffffffffffffffffffffffff16612333611234565b73ffffffffffffffffffffffffffffffffffffffff1614612389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238090613942565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b60108054905081101561251b578273ffffffffffffffffffffffffffffffffffffffff16601082815481106124b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612508576001915050612521565b808061251390613e01565b915050612459565b50600090505b919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90613922565b60405180910390fd5b600081156125b35760026125b6565b60015b60ff1690508260026000600554815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b818110156126975761262a6000858360055401612acb565b80600554018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48080600101915050612612565b5080600560008282540192505081905550505050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272990613902565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128239190613785565b60405180910390a3505050565b61283b848484611fde565b61284784848484612ad0565b612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d90613a02565b60405180910390fd5b50505050565b6060600b805461289b90613d73565b80601f01602080910402602001604051908101604052809291908181526020018280546128c790613d73565b80156129145780601f106128e957610100808354040283529160200191612914565b820191906000526020600020905b8154815290600101906020018083116128f757829003601f168201915b5050505050905090565b60606000821415612966576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ac6565b600082905060005b6000821461299857808061298190613e01565b915050600a826129919190613bf0565b915061296e565b60008167ffffffffffffffff8111156129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a0c5781602001600182028036833780820191505090505b5090505b60008514612abf57600182612a259190613c7b565b9150600a85612a349190613e54565b6030612a409190613b9a565b60f81b818381518110612a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab89190613bf0565b9450612a10565b8093505050505b919050565b505050565b6000612af18473ffffffffffffffffffffffffffffffffffffffff16612c67565b15612c5a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b1a611e3f565b8786866040518563ffffffff1660e01b8152600401612b3c9493929190613739565b602060405180830381600087803b158015612b5657600080fd5b505af1925050508015612b8757506040513d601f19601f82011682018060405250810190612b849190613203565b60015b612c0a573d8060008114612bb7576040519150601f19603f3d011682016040523d82523d6000602084013e612bbc565b606091505b50600081511415612c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf990613a02565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c5f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612c9690613d73565b90600052602060002090601f016020900481019282612cb85760008555612cff565b82601f10612cd157803560ff1916838001178555612cff565b82800160010185558215612cff579182015b82811115612cfe578235825591602001919060010190612ce3565b5b509050612d0c9190612dfb565b5090565b508054612d1c90613d73565b6000825580601f10612d2e5750612d4d565b601f016020900490600052602060002090810190612d4c9190612dfb565b5b50565b5080546000825590600052602060002090810190612d6e9190612dfb565b50565b828054828255906000526020600020908101928215612dea579160200282015b82811115612de95782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612d91565b5b509050612df79190612dfb565b5090565b5b80821115612e14576000816000905550600101612dfc565b5090565b6000612e2b612e2684613ac2565b613a9d565b90508083825260208201905082856020860282011115612e4a57600080fd5b60005b85811015612e7a5781612e608882612ec2565b845260208401935060208301925050600181019050612e4d565b5050509392505050565b6000612e97612e9284613aee565b613a9d565b905082815260208101848484011115612eaf57600080fd5b612eba848285613d31565b509392505050565b600081359050612ed18161458a565b92915050565b600082601f830112612ee857600080fd5b8135612ef8848260208601612e18565b91505092915050565b600081359050612f10816145a1565b92915050565b600081359050612f25816145b8565b92915050565b600081519050612f3a816145b8565b92915050565b600082601f830112612f5157600080fd5b8135612f61848260208601612e84565b91505092915050565b60008083601f840112612f7c57600080fd5b8235905067ffffffffffffffff811115612f9557600080fd5b602083019150836001820283011115612fad57600080fd5b9250929050565b600081359050612fc3816145cf565b92915050565b600060208284031215612fdb57600080fd5b6000612fe984828501612ec2565b91505092915050565b6000806040838503121561300557600080fd5b600061301385828601612ec2565b925050602061302485828601612ec2565b9150509250929050565b60008060006060848603121561304357600080fd5b600061305186828701612ec2565b935050602061306286828701612ec2565b925050604061307386828701612fb4565b9150509250925092565b6000806000806080858703121561309357600080fd5b60006130a187828801612ec2565b94505060206130b287828801612ec2565b93505060406130c387828801612fb4565b925050606085013567ffffffffffffffff8111156130e057600080fd5b6130ec87828801612f40565b91505092959194509250565b6000806040838503121561310b57600080fd5b600061311985828601612ec2565b925050602061312a85828601612f01565b9150509250929050565b6000806040838503121561314757600080fd5b600061315585828601612ec2565b925050602061316685828601612fb4565b9150509250929050565b60006020828403121561318257600080fd5b600082013567ffffffffffffffff81111561319c57600080fd5b6131a884828501612ed7565b91505092915050565b6000602082840312156131c357600080fd5b60006131d184828501612f01565b91505092915050565b6000602082840312156131ec57600080fd5b60006131fa84828501612f16565b91505092915050565b60006020828403121561321557600080fd5b600061322384828501612f2b565b91505092915050565b6000806020838503121561323f57600080fd5b600083013567ffffffffffffffff81111561325957600080fd5b61326585828601612f6a565b92509250509250929050565b60006020828403121561328357600080fd5b600061329184828501612fb4565b91505092915050565b6132a381613caf565b82525050565b6132b281613cc1565b82525050565b60006132c382613b1f565b6132cd8185613b35565b93506132dd818560208601613d40565b6132e681613f41565b840191505092915050565b60006132fc82613b2a565b6133068185613b46565b9350613316818560208601613d40565b61331f81613f41565b840191505092915050565b600061333582613b2a565b61333f8185613b57565b935061334f818560208601613d40565b80840191505092915050565b6000613368601e83613b46565b915061337382613f52565b602082019050919050565b600061338b602583613b46565b915061339682613f7b565b604082019050919050565b60006133ae602283613b46565b91506133b982613fca565b604082019050919050565b60006133d1602a83613b46565b91506133dc82614019565b604082019050919050565b60006133f4602683613b46565b91506133ff82614068565b604082019050919050565b6000613417602a83613b46565b9150613422826140b7565b604082019050919050565b600061343a600d83613b57565b915061344582614106565b600d82019050919050565b600061345d602b83613b46565b91506134688261412f565b604082019050919050565b6000613480602d83613b46565b915061348b8261417e565b604082019050919050565b60006134a3602383613b46565b91506134ae826141cd565b604082019050919050565b60006134c6603283613b46565b91506134d18261421c565b604082019050919050565b60006134e9601a83613b46565b91506134f48261426b565b602082019050919050565b600061350c602183613b46565b915061351782614294565b604082019050919050565b600061352f602083613b46565b915061353a826142e3565b602082019050919050565b6000613552602f83613b46565b915061355d8261430c565b604082019050919050565b6000613575600b83613b57565b91506135808261435b565b600b82019050919050565b6000613598601c83613b46565b91506135a382614384565b602082019050919050565b60006135bb602d83613b46565b91506135c6826143ad565b604082019050919050565b60006135de603983613b46565b91506135e9826143fc565b604082019050919050565b6000613601601383613b46565b915061360c8261444b565b602082019050919050565b6000613624603383613b46565b915061362f82614474565b604082019050919050565b6000613647602583613b46565b9150613652826144c3565b604082019050919050565b600061366a600f83613b46565b915061367582614512565b602082019050919050565b600061368d602283613b46565b91506136988261453b565b604082019050919050565b6136ac81613d27565b82525050565b6136c36136be82613d27565b613e4a565b82525050565b60006136d5828561332a565b91506136e1828461332a565b91508190509392505050565b60006136f88261342d565b915061370482846136b2565b60208201915061371382613568565b915081905092915050565b6000602082019050613733600083018461329a565b92915050565b600060808201905061374e600083018761329a565b61375b602083018661329a565b61376860408301856136a3565b818103606083015261377a81846132b8565b905095945050505050565b600060208201905061379a60008301846132a9565b92915050565b600060208201905081810360008301526137ba81846132f1565b905092915050565b600060208201905081810360008301526137db8161335b565b9050919050565b600060208201905081810360008301526137fb8161337e565b9050919050565b6000602082019050818103600083015261381b816133a1565b9050919050565b6000602082019050818103600083015261383b816133c4565b9050919050565b6000602082019050818103600083015261385b816133e7565b9050919050565b6000602082019050818103600083015261387b8161340a565b9050919050565b6000602082019050818103600083015261389b81613450565b9050919050565b600060208201905081810360008301526138bb81613473565b9050919050565b600060208201905081810360008301526138db81613496565b9050919050565b600060208201905081810360008301526138fb816134b9565b9050919050565b6000602082019050818103600083015261391b816134dc565b9050919050565b6000602082019050818103600083015261393b816134ff565b9050919050565b6000602082019050818103600083015261395b81613522565b9050919050565b6000602082019050818103600083015261397b81613545565b9050919050565b6000602082019050818103600083015261399b8161358b565b9050919050565b600060208201905081810360008301526139bb816135ae565b9050919050565b600060208201905081810360008301526139db816135d1565b9050919050565b600060208201905081810360008301526139fb816135f4565b9050919050565b60006020820190508181036000830152613a1b81613617565b9050919050565b60006020820190508181036000830152613a3b8161363a565b9050919050565b60006020820190508181036000830152613a5b8161365d565b9050919050565b60006020820190508181036000830152613a7b81613680565b9050919050565b6000602082019050613a9760008301846136a3565b92915050565b6000613aa7613ab8565b9050613ab38282613da5565b919050565b6000604051905090565b600067ffffffffffffffff821115613add57613adc613f12565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b0957613b08613f12565b5b613b1282613f41565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6d82613cf9565b9150613b7883613cf9565b92508261ffff03821115613b8f57613b8e613e85565b5b828201905092915050565b6000613ba582613d27565b9150613bb083613d27565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613be557613be4613e85565b5b828201905092915050565b6000613bfb82613d27565b9150613c0683613d27565b925082613c1657613c15613eb4565b5b828204905092915050565b6000613c2c82613d27565b9150613c3783613d27565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c7057613c6f613e85565b5b828202905092915050565b6000613c8682613d27565b9150613c9183613d27565b925082821015613ca457613ca3613e85565b5b828203905092915050565b6000613cba82613d07565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d5e578082015181840152602081019050613d43565b83811115613d6d576000848401525b50505050565b60006002820490506001821680613d8b57607f821691505b60208210811415613d9f57613d9e613ee3565b5b50919050565b613dae82613f41565b810181811067ffffffffffffffff82111715613dcd57613dcc613f12565b5b80604052505050565b6000613de182613cf9565b915061ffff821415613df657613df5613e85565b5b600182019050919050565b6000613e0c82613d27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3f57613e3e613e85565b5b600182019050919050565b6000819050919050565b6000613e5f82613d27565b9150613e6a83613d27565b925082613e7a57613e79613eb4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6d696e742066726f6d20636f6e7472616374206e6f7420616c6c6f7765640000600082015250565b7f596f75206172656e27742063757272656e746c7920696e20746865207768697460008201527f656c697374000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a207472616e73666572206f6620746f6b656e20746861742060008201527f6973206e6f74206f776e00000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742000000000000000000000000000000000000000600082015250565b7f455243373231583a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231583a206f70657261746f7220717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231583a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231583a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231583a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f204e465473206d6f72652e000000000000000000000000000000000000000000600082015250565b7f412077616c6c65742063616e206d696e742031204e465473206d617800000000600082015250565b7f455243373231583a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231583a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f416c6c204e46547320617265206d696e74656400000000000000000000000000600082015250565b7f455243373231583a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231583a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f696e636f72726563742070726963650000000000000000000000000000000000600082015250565b7f455243373231583a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b61459381613caf565b811461459e57600080fd5b50565b6145aa81613cc1565b81146145b557600080fd5b50565b6145c181613ccd565b81146145cc57600080fd5b50565b6145d881613d27565b81146145e357600080fd5b5056fea264697066735822122065ef19a2d937de208e2e702f6ea016384826fde3bd808d08f9a9b0496a9671ec64736f6c6343000801003368747470733a2f2f7265626972746861636365737363617264732e6d7970696e6174612e636c6f75642f697066732f516d6546446b503137335558764c486366446f583367797147424d6a67336670544a5851504463474750364e41472f

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80637b21768b1161010d578063be5ffb99116100a0578063d547cfb71161006f578063d547cfb7146106c6578063e985e9c5146106f1578063f2fde38b1461072e578063f421764814610757578063fe3165c714610780576101ee565b8063be5ffb991461060a578063bee0f34014610633578063c87b56dd1461065e578063d00453411461069b576101ee565b8063a22cb465116100dc578063a22cb46514610578578063b39b8afa146105a1578063b88d4fde146105ca578063b9e7a439146105f3576101ee565b80637b21768b146104dd5780638da5cb5b1461050657806395d89b4114610531578063a0712d681461055c576101ee565b80633ccfd60b1161018557806361b8ce8c1161015457806361b8ce8c146104215780636352211e1461044c57806370a0823114610489578063715018a6146104c6576101ee565b80633ccfd60b1461037b57806342842e0e146103925780634f6ccce7146103bb57806355f804b3146103f8576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780632b205dc9146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a600480360381019061021591906131da565b6107ab565b6040516102279190613785565b60405180910390f35b34801561023c57600080fd5b506102456108f5565b60405161025291906137a0565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613271565b610987565b60405161028f919061371e565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190613134565b610a0c565b005b3480156102cd57600080fd5b506102d6610b24565b6040516102e39190613a82565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e919061302e565b610b3a565b005b34801561032157600080fd5b5061033c600480360381019061033791906131b1565b610b9a565b005b34801561034a57600080fd5b5061036560048036038101906103609190613134565b610bbf565b6040516103729190613a82565b60405180910390f35b34801561038757600080fd5b50610390610e16565b005b34801561039e57600080fd5b506103b960048036038101906103b4919061302e565b610e73565b005b3480156103c757600080fd5b506103e260048036038101906103dd9190613271565b610e93565b6040516103ef9190613a82565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a919061322c565b610efd565b005b34801561042d57600080fd5b50610436610f1b565b6040516104439190613a82565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613271565b610f21565b604051610480919061371e565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab9190612fc9565b611054565b6040516104bd9190613a82565b60405180910390f35b3480156104d257600080fd5b506104db61120e565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613271565b611222565b005b34801561051257600080fd5b5061051b611234565b604051610528919061371e565b60405180910390f35b34801561053d57600080fd5b5061054661125e565b60405161055391906137a0565b60405180910390f35b61057660048036038101906105719190613271565b6112f0565b005b34801561058457600080fd5b5061059f600480360381019061059a91906130f8565b6118a7565b005b3480156105ad57600080fd5b506105c860048036038101906105c39190613271565b6118bd565b005b3480156105d657600080fd5b506105f160048036038101906105ec919061307d565b6118cf565b005b3480156105ff57600080fd5b50610608611931565b005b34801561061657600080fd5b50610631600480360381019061062c9190613271565b611b28565b005b34801561063f57600080fd5b50610648611b3a565b6040516106559190613a82565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613271565b611b40565b60405161069291906137a0565b60405180910390f35b3480156106a757600080fd5b506106b0611be7565b6040516106bd9190613a82565b60405180910390f35b3480156106d257600080fd5b506106db611bed565b6040516106e891906137a0565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190612ff2565b611c7b565b6040516107259190613785565b60405180910390f35b34801561073a57600080fd5b5061075560048036038101906107509190612fc9565b611d0f565b005b34801561076357600080fd5b5061077e60048036038101906107799190613170565b611d93565b005b34801561078c57600080fd5b50610795611db5565b6040516107a29190613a82565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108de57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108ee57506108ed82611dbb565b5b9050919050565b60606000805461090490613d73565b80601f016020809104026020016040519081016040528092919081815260200182805461093090613d73565b801561097d5780601f106109525761010080835404028352916020019161097d565b820191906000526020600020905b81548152906001019060200180831161096057829003601f168201915b5050505050905090565b600061099282611e25565b6109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906139a2565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1782610f21565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f90613802565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa7611e3f565b73ffffffffffffffffffffffffffffffffffffffff161480610ad65750610ad581610ad0611e3f565b611c7b565b5b610b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0c906139c2565b60405180910390fd5b610b1f8383611e47565b505050565b60006001600554610b359190613c7b565b905090565b610b4b610b45611e3f565b82611f00565b610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906138e2565b60405180910390fd5b610b95838383611fde565b505050565b610ba261230d565b80601160006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2790613882565b60405180910390fd5b600080600190505b610c4181611e25565b8015610c585750600184610c559190613b9a565b82105b15610dab578473ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d98578180610ccf90613e01565b925050600073ffffffffffffffffffffffffffffffffffffffff1660026000600184610cfb9190613b9a565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015610d585750600184610d559190613b9a565b82105b8015610d755750610d74600182610d6f9190613b9a565b611e25565b5b15610d97578180610d8590613e01565b9250508080610d9390613e01565b9150505b5b8080610da390613e01565b915050610c38565b600184610db89190613b9a565b821415610dd557600181610dcc9190613c7b565b92505050610e10565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790613a62565b60405180910390fd5b92915050565b73e6e64f0ea4dab594c5b6381260d0fa58ea27690673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e70573d6000803e3d6000fd5b50565b610e8e838383604051806020016040528060008152506118cf565b505050565b6000610eaa600183610ea59190613b9a565b611e25565b610ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee0906138c2565b60405180910390fd5b600182610ef69190613b9a565b9050919050565b610f0561230d565b8181600b9190610f16929190612c8a565b505050565b60055481565b6000610f2c82611e25565b610f6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6290613822565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110185760026000600184610fe49190613c7b565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661104d565b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90613882565b60405180910390fd5b600080600190505b6110d681611e25565b15611204578373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156111f157818061114d90613e01565b925050600073ffffffffffffffffffffffffffffffffffffffff16600260006001846111799190613b9a565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156111dc57506111db6001826111d69190613b9a565b611e25565b5b156111f05781806111ec90613e01565b9250505b5b80806111fc90613e01565b9150506110cd565b5080915050919050565b61121661230d565b611220600061238b565b565b61122a61230d565b8060088190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461126d90613d73565b80601f016020809104026020016040519081016040528092919081815260200182805461129990613d73565b80156112e65780601f106112bb576101008083540402835291602001916112e6565b820191906000526020600020905b8154815290600101906020018083116112c957829003601f168201915b5050505050905090565b601160009054906101000a900460ff161561134e5761130e33612451565b61134d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611344906137e2565b60405180910390fd5b5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b3906137c2565b60405180910390fd5b6000811180156113ce57506009548111155b61140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490613982565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16111561158a5760095481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff166114c79190613b9a565b1115600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff166009546115289190613c7b565b60405160200161153891906136ed565b60405160208183030381529060405290611588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157f91906137a0565b60405180910390fd5b505b80600a546115989190613c21565b3410156115da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d190613a42565b60405180910390fd5b60005b818161ffff1610156118a3576008546115f66007612526565b10611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d906139e2565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900461ffff1661ffff16111561170c576001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900461ffff166116ed9190613b62565b92506101000a81548161ffff021916908361ffff1602179055506117cb565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548161ffff021916908361ffff160217905550600f339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6117d56007612526565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600e339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611886336000612534565b61189060076126ad565b808061189b90613dd6565b9150506115dd565b5050565b6118b96118b2611e3f565b83836126c3565b5050565b6118c561230d565b8060098190555050565b6118e06118da611e3f565b83611f00565b61191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906138e2565b60405180910390fd5b61192b84848484612830565b50505050565b61193961230d565b600860009055600960009055600a60009055600b60006119599190612d10565b60005b600e80549050811015611a2357600c6000600e83815481106119a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558080611a1b90613e01565b91505061195c565b5060005b600f80549050811015611afb57600d6000600f8381548110611a72577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549061ffff02191690558080611af390613e01565b915050611a27565b50600e6000611b0a9190612d50565b600f6000611b189190612d50565b60106000611b269190612d50565b565b611b3061230d565b80600a8190555050565b60095481565b6060611b4b82611e25565b611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8190613962565b60405180910390fd5b6000611b9461288c565b90506000815111611bb45760405180602001604052806000815250611bdf565b80611bbe8461291e565b604051602001611bcf9291906136c9565b6040516020818303038152906040525b915050919050565b60085481565b600b8054611bfa90613d73565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2690613d73565b8015611c735780601f10611c4857610100808354040283529160200191611c73565b820191906000526020600020905b815481529060010190602001808311611c5657829003601f168201915b505050505081565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d1761230d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90613842565b60405180910390fd5b611d908161238b565b50565b611d9b61230d565b8060109080519060200190611db1929190612d71565b5050565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808214158015611e38575060055482105b9050919050565b600033905090565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611eba83610f21565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f0b82611e25565b611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f41906138a2565b60405180910390fd5b6000611f5583610f21565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fc457508373ffffffffffffffffffffffffffffffffffffffff16611fac84610987565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fd55750611fd48185611c7b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ffe82610f21565b73ffffffffffffffffffffffffffffffffffffffff1614612054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204b90613862565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bb90613a22565b60405180910390fd5b6120cf838383612acb565b6120da600082611e47565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561219957816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122ad565b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff166002600060018401815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122ac57826002600060018401815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612315611e3f565b73ffffffffffffffffffffffffffffffffffffffff16612333611234565b73ffffffffffffffffffffffffffffffffffffffff1614612389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238090613942565b60405180910390fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b60108054905081101561251b578273ffffffffffffffffffffffffffffffffffffffff16601082815481106124b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612508576001915050612521565b808061251390613e01565b915050612459565b50600090505b919050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259b90613922565b60405180910390fd5b600081156125b35760026125b6565b60015b60ff1690508260026000600554815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b818110156126975761262a6000858360055401612acb565b80600554018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48080600101915050612612565b5080600560008282540192505081905550505050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272990613902565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128239190613785565b60405180910390a3505050565b61283b848484611fde565b61284784848484612ad0565b612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d90613a02565b60405180910390fd5b50505050565b6060600b805461289b90613d73565b80601f01602080910402602001604051908101604052809291908181526020018280546128c790613d73565b80156129145780601f106128e957610100808354040283529160200191612914565b820191906000526020600020905b8154815290600101906020018083116128f757829003601f168201915b5050505050905090565b60606000821415612966576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ac6565b600082905060005b6000821461299857808061298190613e01565b915050600a826129919190613bf0565b915061296e565b60008167ffffffffffffffff8111156129da577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a0c5781602001600182028036833780820191505090505b5090505b60008514612abf57600182612a259190613c7b565b9150600a85612a349190613e54565b6030612a409190613b9a565b60f81b818381518110612a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab89190613bf0565b9450612a10565b8093505050505b919050565b505050565b6000612af18473ffffffffffffffffffffffffffffffffffffffff16612c67565b15612c5a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b1a611e3f565b8786866040518563ffffffff1660e01b8152600401612b3c9493929190613739565b602060405180830381600087803b158015612b5657600080fd5b505af1925050508015612b8757506040513d601f19601f82011682018060405250810190612b849190613203565b60015b612c0a573d8060008114612bb7576040519150601f19603f3d011682016040523d82523d6000602084013e612bbc565b606091505b50600081511415612c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf990613a02565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c5f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612c9690613d73565b90600052602060002090601f016020900481019282612cb85760008555612cff565b82601f10612cd157803560ff1916838001178555612cff565b82800160010185558215612cff579182015b82811115612cfe578235825591602001919060010190612ce3565b5b509050612d0c9190612dfb565b5090565b508054612d1c90613d73565b6000825580601f10612d2e5750612d4d565b601f016020900490600052602060002090810190612d4c9190612dfb565b5b50565b5080546000825590600052602060002090810190612d6e9190612dfb565b50565b828054828255906000526020600020908101928215612dea579160200282015b82811115612de95782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612d91565b5b509050612df79190612dfb565b5090565b5b80821115612e14576000816000905550600101612dfc565b5090565b6000612e2b612e2684613ac2565b613a9d565b90508083825260208201905082856020860282011115612e4a57600080fd5b60005b85811015612e7a5781612e608882612ec2565b845260208401935060208301925050600181019050612e4d565b5050509392505050565b6000612e97612e9284613aee565b613a9d565b905082815260208101848484011115612eaf57600080fd5b612eba848285613d31565b509392505050565b600081359050612ed18161458a565b92915050565b600082601f830112612ee857600080fd5b8135612ef8848260208601612e18565b91505092915050565b600081359050612f10816145a1565b92915050565b600081359050612f25816145b8565b92915050565b600081519050612f3a816145b8565b92915050565b600082601f830112612f5157600080fd5b8135612f61848260208601612e84565b91505092915050565b60008083601f840112612f7c57600080fd5b8235905067ffffffffffffffff811115612f9557600080fd5b602083019150836001820283011115612fad57600080fd5b9250929050565b600081359050612fc3816145cf565b92915050565b600060208284031215612fdb57600080fd5b6000612fe984828501612ec2565b91505092915050565b6000806040838503121561300557600080fd5b600061301385828601612ec2565b925050602061302485828601612ec2565b9150509250929050565b60008060006060848603121561304357600080fd5b600061305186828701612ec2565b935050602061306286828701612ec2565b925050604061307386828701612fb4565b9150509250925092565b6000806000806080858703121561309357600080fd5b60006130a187828801612ec2565b94505060206130b287828801612ec2565b93505060406130c387828801612fb4565b925050606085013567ffffffffffffffff8111156130e057600080fd5b6130ec87828801612f40565b91505092959194509250565b6000806040838503121561310b57600080fd5b600061311985828601612ec2565b925050602061312a85828601612f01565b9150509250929050565b6000806040838503121561314757600080fd5b600061315585828601612ec2565b925050602061316685828601612fb4565b9150509250929050565b60006020828403121561318257600080fd5b600082013567ffffffffffffffff81111561319c57600080fd5b6131a884828501612ed7565b91505092915050565b6000602082840312156131c357600080fd5b60006131d184828501612f01565b91505092915050565b6000602082840312156131ec57600080fd5b60006131fa84828501612f16565b91505092915050565b60006020828403121561321557600080fd5b600061322384828501612f2b565b91505092915050565b6000806020838503121561323f57600080fd5b600083013567ffffffffffffffff81111561325957600080fd5b61326585828601612f6a565b92509250509250929050565b60006020828403121561328357600080fd5b600061329184828501612fb4565b91505092915050565b6132a381613caf565b82525050565b6132b281613cc1565b82525050565b60006132c382613b1f565b6132cd8185613b35565b93506132dd818560208601613d40565b6132e681613f41565b840191505092915050565b60006132fc82613b2a565b6133068185613b46565b9350613316818560208601613d40565b61331f81613f41565b840191505092915050565b600061333582613b2a565b61333f8185613b57565b935061334f818560208601613d40565b80840191505092915050565b6000613368601e83613b46565b915061337382613f52565b602082019050919050565b600061338b602583613b46565b915061339682613f7b565b604082019050919050565b60006133ae602283613b46565b91506133b982613fca565b604082019050919050565b60006133d1602a83613b46565b91506133dc82614019565b604082019050919050565b60006133f4602683613b46565b91506133ff82614068565b604082019050919050565b6000613417602a83613b46565b9150613422826140b7565b604082019050919050565b600061343a600d83613b57565b915061344582614106565b600d82019050919050565b600061345d602b83613b46565b91506134688261412f565b604082019050919050565b6000613480602d83613b46565b915061348b8261417e565b604082019050919050565b60006134a3602383613b46565b91506134ae826141cd565b604082019050919050565b60006134c6603283613b46565b91506134d18261421c565b604082019050919050565b60006134e9601a83613b46565b91506134f48261426b565b602082019050919050565b600061350c602183613b46565b915061351782614294565b604082019050919050565b600061352f602083613b46565b915061353a826142e3565b602082019050919050565b6000613552602f83613b46565b915061355d8261430c565b604082019050919050565b6000613575600b83613b57565b91506135808261435b565b600b82019050919050565b6000613598601c83613b46565b91506135a382614384565b602082019050919050565b60006135bb602d83613b46565b91506135c6826143ad565b604082019050919050565b60006135de603983613b46565b91506135e9826143fc565b604082019050919050565b6000613601601383613b46565b915061360c8261444b565b602082019050919050565b6000613624603383613b46565b915061362f82614474565b604082019050919050565b6000613647602583613b46565b9150613652826144c3565b604082019050919050565b600061366a600f83613b46565b915061367582614512565b602082019050919050565b600061368d602283613b46565b91506136988261453b565b604082019050919050565b6136ac81613d27565b82525050565b6136c36136be82613d27565b613e4a565b82525050565b60006136d5828561332a565b91506136e1828461332a565b91508190509392505050565b60006136f88261342d565b915061370482846136b2565b60208201915061371382613568565b915081905092915050565b6000602082019050613733600083018461329a565b92915050565b600060808201905061374e600083018761329a565b61375b602083018661329a565b61376860408301856136a3565b818103606083015261377a81846132b8565b905095945050505050565b600060208201905061379a60008301846132a9565b92915050565b600060208201905081810360008301526137ba81846132f1565b905092915050565b600060208201905081810360008301526137db8161335b565b9050919050565b600060208201905081810360008301526137fb8161337e565b9050919050565b6000602082019050818103600083015261381b816133a1565b9050919050565b6000602082019050818103600083015261383b816133c4565b9050919050565b6000602082019050818103600083015261385b816133e7565b9050919050565b6000602082019050818103600083015261387b8161340a565b9050919050565b6000602082019050818103600083015261389b81613450565b9050919050565b600060208201905081810360008301526138bb81613473565b9050919050565b600060208201905081810360008301526138db81613496565b9050919050565b600060208201905081810360008301526138fb816134b9565b9050919050565b6000602082019050818103600083015261391b816134dc565b9050919050565b6000602082019050818103600083015261393b816134ff565b9050919050565b6000602082019050818103600083015261395b81613522565b9050919050565b6000602082019050818103600083015261397b81613545565b9050919050565b6000602082019050818103600083015261399b8161358b565b9050919050565b600060208201905081810360008301526139bb816135ae565b9050919050565b600060208201905081810360008301526139db816135d1565b9050919050565b600060208201905081810360008301526139fb816135f4565b9050919050565b60006020820190508181036000830152613a1b81613617565b9050919050565b60006020820190508181036000830152613a3b8161363a565b9050919050565b60006020820190508181036000830152613a5b8161365d565b9050919050565b60006020820190508181036000830152613a7b81613680565b9050919050565b6000602082019050613a9760008301846136a3565b92915050565b6000613aa7613ab8565b9050613ab38282613da5565b919050565b6000604051905090565b600067ffffffffffffffff821115613add57613adc613f12565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b0957613b08613f12565b5b613b1282613f41565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b6d82613cf9565b9150613b7883613cf9565b92508261ffff03821115613b8f57613b8e613e85565b5b828201905092915050565b6000613ba582613d27565b9150613bb083613d27565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613be557613be4613e85565b5b828201905092915050565b6000613bfb82613d27565b9150613c0683613d27565b925082613c1657613c15613eb4565b5b828204905092915050565b6000613c2c82613d27565b9150613c3783613d27565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c7057613c6f613e85565b5b828202905092915050565b6000613c8682613d27565b9150613c9183613d27565b925082821015613ca457613ca3613e85565b5b828203905092915050565b6000613cba82613d07565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d5e578082015181840152602081019050613d43565b83811115613d6d576000848401525b50505050565b60006002820490506001821680613d8b57607f821691505b60208210811415613d9f57613d9e613ee3565b5b50919050565b613dae82613f41565b810181811067ffffffffffffffff82111715613dcd57613dcc613f12565b5b80604052505050565b6000613de182613cf9565b915061ffff821415613df657613df5613e85565b5b600182019050919050565b6000613e0c82613d27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3f57613e3e613e85565b5b600182019050919050565b6000819050919050565b6000613e5f82613d27565b9150613e6a83613d27565b925082613e7a57613e79613eb4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f6d696e742066726f6d20636f6e7472616374206e6f7420616c6c6f7765640000600082015250565b7f596f75206172656e27742063757272656e746c7920696e20746865207768697460008201527f656c697374000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a207472616e73666572206f6620746f6b656e20746861742060008201527f6973206e6f74206f776e00000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742000000000000000000000000000000000000000600082015250565b7f455243373231583a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231583a206f70657261746f7220717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231583a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231583a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231583a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231583a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f204e465473206d6f72652e000000000000000000000000000000000000000000600082015250565b7f412077616c6c65742063616e206d696e742031204e465473206d617800000000600082015250565b7f455243373231583a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231583a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f416c6c204e46547320617265206d696e74656400000000000000000000000000600082015250565b7f455243373231583a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231583a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f696e636f72726563742070726963650000000000000000000000000000000000600082015250565b7f455243373231583a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b61459381613caf565b811461459e57600080fd5b50565b6145aa81613cc1565b81146145b557600080fd5b50565b6145c181613ccd565b81146145cc57600080fd5b50565b6145d881613d27565b81146145e357600080fd5b5056fea264697066735822122065ef19a2d937de208e2e702f6ea016384826fde3bd808d08f9a9b0496a9671ec64736f6c63430008010033

Deployed Bytecode Sourcemap

184:4374:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1630:336:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2753:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4149:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3734:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13494:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4831:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2353:109:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13899:566:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4427:129:14;;;;;;;;;;;;;:::i;:::-;;5192:159:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13650:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1715:103:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1243:25:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2450:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2017:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:11;;;;;;;;;;;;;:::i;:::-;;:124:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2901:96:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2771:1650:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4416:147:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1954:164:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5409:293:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1028:564:14;;;;;;;;;;;;;:::i;:::-;;2124:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;394:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3055:315:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;351:37:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;483:133;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4621:156:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2074:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2238:109:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;439:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1630:336:4;1732:4;1772:25;1757:40;;;:11;:40;;;;:98;;;;1822:33;1807:48;;;:11;:48;;;;1757:98;:158;;;;1880:35;1865:50;;;:11;:50;;;;1757:158;:204;;;;1925:36;1949:11;1925:23;:36::i;:::-;1757:204;1744:217;;1630:336;;;:::o;2753:92::-;2807:13;2835:5;2828:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2753:92;:::o;4149:208::-;4225:7;4248:16;4256:7;4248;:16::i;:::-;4240:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;4328:15;:24;4344:7;4328:24;;;;;;;;;;;;;;;;;;;;;4321:31;;4149:208;;;:::o;3734:362::-;3810:13;3826:16;3834:7;3826;:16::i;:::-;3810:32;;3862:5;3856:11;;:2;:11;;;;3848:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3944:5;3928:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3953:37;3970:5;3977:12;:10;:12::i;:::-;3953:16;:37::i;:::-;3928:62;3913:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;4070:21;4079:2;4083:7;4070:8;:21::i;:::-;3734:362;;;:::o;13494:92::-;13549:7;13580:1;13571:6;;:10;;;;:::i;:::-;13564:17;;13494:92;:::o;4831:303::-;4998:41;5017:12;:10;:12::i;:::-;5031:7;4998:18;:41::i;:::-;4990:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;5101:28;5111:4;5117:2;5121:7;5101:9;:28::i;:::-;4831:303;;;:::o;2353:109:14:-;1087:13:11;:11;:13::i;:::-;2442::14::1;2427:12;;:28;;;;;;;;;;;;;;;;;;2353:109:::0;:::o;13899:566:4:-;13990:7;14030:1;14013:19;;:5;:19;;;;14005:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;14087:13;14110:9;14122:1;14110:13;;14130:234;14136:10;14144:1;14136:7;:10::i;:::-;:31;;;;;14166:1;14158:5;:9;;;;:::i;:::-;14150:5;:17;14136:31;14130:234;;;14199:5;14185:19;;:7;:10;14193:1;14185:10;;;;;;;;;;;;;;;;;;;;;:19;;;14182:176;;;14216:7;;;;;:::i;:::-;;;;14262:1;14236:28;;:7;:14;14248:1;14244;:5;;;;:::i;:::-;14236:14;;;;;;;;;;;;;;;;;;;;;:28;;;:49;;;;;14284:1;14276:5;:9;;;;:::i;:::-;14268:5;:17;14236:49;:67;;;;;14289:14;14301:1;14297;:5;;;;:::i;:::-;14289:7;:14::i;:::-;14236:67;14233:117;;;14317:7;;;;;:::i;:::-;;;;14336:3;;;;;:::i;:::-;;;;14233:117;14182:176;14169:3;;;;;:::i;:::-;;;;14130:234;;;14390:1;14382:5;:9;;;;:::i;:::-;14373:5;:18;14370:90;;;14404:1;14400;:5;;;;:::i;:::-;14393:12;;;;;;14370:90;14416:44;;;;;;;;;;:::i;:::-;;;;;;;;13899:566;;;;;:::o;4427:129:14:-;4474:42;4466:60;;:83;4527:21;4466:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4427:129::o;5192:159:4:-;5307:39;5324:4;5330:2;5334:7;5307:39;;;;;;;;;;;;:16;:39::i;:::-;5192:159;;;:::o;13650:178::-;13719:7;13742:18;13758:1;13750:5;:9;;;;:::i;:::-;13742:7;:18::i;:::-;13734:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;13822:1;13814:5;:9;;;;:::i;:::-;13807:16;;13650:178;;;:::o;1715:103:14:-;1087:13:11;:11;:13::i;:::-;1804:7:14::1;;1789:12;:22;;;;;;;:::i;:::-;;1715:103:::0;;:::o;1243:25:4:-;;;;:::o;2450:249::-;2522:7;2545:16;2553:7;2545;:16::i;:::-;2537:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2650:1;2622:30;;:7;:16;2630:7;2622:16;;;;;;;;;;;;;;;;;;;;;:30;;;;:72;;2674:7;:20;2692:1;2682:7;:11;;;;:::i;:::-;2674:20;;;;;;;;;;;;;;;;;;;;;2622:72;;;2655:7;:16;2663:7;2655:16;;;;;;;;;;;;;;;;;;;;;2622:72;2615:79;;2450:249;;;:::o;2017:384::-;2089:7;2129:1;2112:19;;:5;:19;;;;2104:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2186:13;2214:9;2226:1;2214:13;;2210:168;2229:10;2237:1;2229:7;:10::i;:::-;2210:168;;;2271:5;2257:19;;:7;:10;2265:1;2257:10;;;;;;;;;;;;;;;;;;;;;:19;;;2254:118;;;2288:7;;;;;:::i;:::-;;;;2334:1;2308:28;;:7;:14;2320:1;2316;:5;;;;:::i;:::-;2308:14;;;;;;;;;;;;;;;;;;;;;:28;;;:46;;;;;2340:14;2352:1;2348;:5;;;;:::i;:::-;2340:7;:14::i;:::-;2308:46;2305:58;;;2356:7;;;;;:::i;:::-;;;;2305:58;2254:118;2241:3;;;;;:::i;:::-;;;;2210:168;;;;2391:5;2384:12;;;2017:384;;;:::o;1824:101:11:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;:124:14:-;1087:13:11;:11;:13::i;:::-;1925:16:14::1;1907:15;:34;;;;1824:124:::0;:::o;1194:85:11:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2901:96:4:-;2957:13;2985:7;2978:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2901:96;:::o;2771:1650:14:-;2834:12;;;;;;;;;;;2830:171;;;2887:32;2908:10;2887:20;:32::i;:::-;2862:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;2830:171;3033:9;3019:23;;:10;:23;;;3011:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3121:1;3108:10;:14;:52;;;;;3140:20;;3126:10;:34;;3108:52;3087:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;3263:1;3229:19;:31;3249:10;3229:31;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;3225:485;;;3373:20;;3339:10;3305:19;:31;3325:10;3305:31;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;;:::i;:::-;:88;;3574:19;:31;3594:10;3574:31;;;;;;;;;;;;;;;;;;;;;;;;;3523:82;;:20;;:82;;;;:::i;:::-;3439:228;;;;;;;;:::i;:::-;;;;;;;;;;;;;3280:419;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;3225:485;3755:10;3741:11;;:24;;;;:::i;:::-;3728:9;:37;;3720:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;3801:8;3796:619;3819:10;3815:1;:14;;;3796:619;;;3896:15;;3875:18;:8;:16;:18::i;:::-;:36;3850:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;4017:1;3983:19;:31;4003:10;3983:31;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;3979:244;;;4073:1;4038:19;:31;4058:10;4038:31;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3979:244;;;4147:1;4113:19;:31;4133:10;4113:31;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;4166:25;4197:10;4166:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3979:244;4264:18;:8;:16;:18::i;:::-;4237:12;:24;4250:10;4237:24;;;;;;;;;;;;;;;:45;;;;4296:18;4320:10;4296:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4346:24;4352:10;4364:5;4346;:24::i;:::-;4384:20;:8;:18;:20::i;:::-;3831:3;;;;;:::i;:::-;;;;3796:619;;;;2771:1650;:::o;4416:147:4:-;4506:52;4525:12;:10;:12::i;:::-;4539:8;4549;4506:18;:52::i;:::-;4416:147;;:::o;1954:164:14:-;1087:13:11;:11;:13::i;:::-;2090:21:14::1;2067:20;:44;;;;1954:164:::0;:::o;5409:293:4:-;5556:41;5575:12;:10;:12::i;:::-;5589:7;5556:18;:41::i;:::-;5548:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;5658:39;5672:4;5678:2;5682:7;5691:5;5658:13;:39::i;:::-;5409:293;;;;:::o;1028:564:14:-;1087:13:11;:11;:13::i;:::-;1085:15:14::1;1078:22;;;1117:20;1110:27;;;1154:11;1147:18;;;1182:12;;1175:19;;;;:::i;:::-;1210:9;1205:123;1229:18;:25;;;;1225:1;:29;1205:123;;;1282:12;:35;1295:18;1314:1;1295:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1282:35;;;;;;;;;;;;;;;1275:42;;;1256:3;;;;;:::i;:::-;;;;1205:123;;;;1343:9;1338:144;1362:25;:32;;;;1358:1;:36;1338:144;;;1422:19;:49;1442:25;1468:1;1442:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1422:49;;;;;;;;;;;;;;;;1415:56;;;;;;;;;;;1396:3;;;;;:::i;:::-;;;;1338:144;;;;1499:18;;1492:25;;;;:::i;:::-;1534;;1527:32;;;;:::i;:::-;1576:9;;1569:16;;;;:::i;:::-;1028:564::o:0;2124:108::-;1087:13:11;:11;:13::i;:::-;2213:12:14::1;2199:11;:26;;;;2124:108:::0;:::o;394:39::-;;;;:::o;3055:315:4:-;3128:13;3157:16;3165:7;3157;:16::i;:::-;3149:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3232:21;3256:10;:8;:10::i;:::-;3232:34;;3303:1;3285:7;3279:21;:25;:86;;;;;;;;;;;;;;;;;3331:7;3340:18;:7;:16;:18::i;:::-;3314:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3279:86;3272:93;;;3055:315;;;:::o;351:37:14:-;;;;:::o;483:133::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4621:156:4:-;4718:4;4737:18;:25;4756:5;4737:25;;;;;;;;;;;;;;;:35;4763:8;4737:35;;;;;;;;;;;;;;;;;;;;;;;;;4730:42;;4621:156;;;;:::o;2074:198:11:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;;;2154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;2238:109:14:-;1087:13:11;:11;:13::i;:::-;2330:10:14::1;2318:9;:22;;;;;;;;;;;;:::i;:::-;;2238:109:::0;:::o;439:38::-;;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7036:121:4:-;7101:4;7131:1;7120:7;:12;;:32;;;;;7146:6;;7136:7;:16;7120:32;7113:39;;7036:121;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11060:154:4:-;11157:2;11130:15;:24;11146:7;11130:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11201:7;11197:2;11170:39;;11179:16;11187:7;11179;:16::i;:::-;11170:39;;;;;;;;;;;;11060:154;;:::o;7299:324::-;7392:4;7412:16;7420:7;7412;:16::i;:::-;7404:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7484:13;7500:16;7508:7;7500;:16::i;:::-;7484:32;;7541:5;7530:16;;:7;:16;;;:51;;;;7574:7;7550:31;;:20;7562:7;7550:11;:20::i;:::-;:31;;;7530:51;:87;;;;7585:32;7602:5;7609:7;7585:16;:32::i;:::-;7530:87;7522:96;;;7299:324;;;;:::o;10075:886::-;10406:4;10386:24;;:16;10394:7;10386;:16::i;:::-;:24;;;10369:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;10502:1;10488:16;;:2;:16;;;;10480:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;10555:39;10576:4;10582:2;10586:7;10555:20;:39::i;:::-;10652:29;10669:1;10673:7;10652:8;:29::i;:::-;10721:1;10693:30;;:7;:16;10701:7;10693:16;;;;;;;;;;;;;;;;;;;;;:30;;;10690:220;;;10754:2;10735:7;:16;10743:7;10735:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10690:220;;;10800:2;10781:7;:16;10789:7;10781:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10848:1;10816:34;;:7;:20;10834:1;10824:7;:11;10816:20;;;;;;;;;;;;;;;;;;;;;:34;;;10813:89;;;10887:4;10864:7;:20;10882:1;10872:7;:11;10864:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;10813:89;10690:220;10942:7;10938:2;10923:27;;10932:4;10923:27;;;;;;;;;;;;10075:886;;;:::o;1352:130:11:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;2426:187::-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2426:187;;:::o;2468:297:14:-;2567:4;2592:9;2604:1;2592:13;;2587:149;2611:9;:16;;;;2607:1;:20;2587:149;;;2668:12;2652:28;;:9;2662:1;2652:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;2648:78;;;2707:4;2700:11;;;;;2648:78;2629:3;;;;;:::i;:::-;;;;2587:149;;;;2753:5;2746:12;;2468:297;;;;:::o;827:112:2:-;892:7;918;:14;;;911:21;;827:112;;;:::o;9164:611:4:-;9482:1;9468:16;;:2;:16;;;;9460:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9531:9;9544:6;9543:7;:15;;9557:1;9543:15;;;9553:1;9543:15;9531:27;;;;9585:2;9567:7;:15;9575:6;;9567:15;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;9600:9;9596:149;9619:1;9615;:5;9596:149;;;9637:48;9666:1;9670:2;9683:1;9674:6;;:10;9637:20;:48::i;:::-;9734:1;9725:6;;:10;9721:2;9700:36;;9717:1;9700:36;;;;;;;;;;;;9622:3;;;;;;;9596:149;;;;9763:1;9753:6;;:11;;;;;;;;;;;9164:611;;;:::o;945:123:2:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;11337:280:4:-;11469:8;11460:17;;:5;:17;;;;11452:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;11552:8;11514:18;:25;11533:5;11514:25;;;;;;;;;;;;;;;:35;11540:8;11514:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11593:8;11571:41;;11586:5;11571:41;;;11603:8;11571:41;;;;;;:::i;:::-;;;;;;;;11337:280;;;:::o;6526:::-;6655:28;6665:4;6671:2;6675:7;6655:9;:28::i;:::-;6697:48;6720:4;6726:2;6730:7;6739:5;6697:22;:48::i;:::-;6689:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;6526:280;;;;:::o;1598:111:14:-;1658:13;1690:12;1683:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:111;:::o;392:703:13:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;13323:108:4:-;;;;:::o;12148:649::-;12280:4;12296:15;:2;:13;;;:15::i;:::-;12292:501;;;12341:2;12325:36;;;12362:12;:10;:12::i;:::-;12376:4;12382:7;12391:5;12325:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12321:434;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12559:1;12542:6;:13;:18;12538:209;;;12574:61;;;;;;;;;;:::i;:::-;;;;;;;;12538:209;12717:6;12711:13;12702:6;12698:2;12694:15;12687:38;12321:434;12449:41;;;12439:51;;;:6;:51;;;;12432:58;;;;;12292:501;12782:4;12775:11;;12148:649;;;;;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:15:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:139::-;;1086:6;1073:20;1064:29;;1102:33;1129:5;1102:33;:::i;:::-;1054:87;;;;:::o;1164:303::-;;1284:3;1277:4;1269:6;1265:17;1261:27;1251:2;;1302:1;1299;1292:12;1251:2;1342:6;1329:20;1367:94;1457:3;1449:6;1442:4;1434:6;1430:17;1367:94;:::i;:::-;1358:103;;1241:226;;;;;:::o;1473:133::-;;1554:6;1541:20;1532:29;;1570:30;1594:5;1570:30;:::i;:::-;1522:84;;;;:::o;1612:137::-;;1695:6;1682:20;1673:29;;1711:32;1737:5;1711:32;:::i;:::-;1663:86;;;;:::o;1755:141::-;;1842:6;1836:13;1827:22;;1858:32;1884:5;1858:32;:::i;:::-;1817:79;;;;:::o;1915:271::-;;2019:3;2012:4;2004:6;2000:17;1996:27;1986:2;;2037:1;2034;2027:12;1986:2;2077:6;2064:20;2102:78;2176:3;2168:6;2161:4;2153:6;2149:17;2102:78;:::i;:::-;2093:87;;1976:210;;;;;:::o;2206:352::-;;;2324:3;2317:4;2309:6;2305:17;2301:27;2291:2;;2342:1;2339;2332:12;2291:2;2378:6;2365:20;2355:30;;2408:18;2400:6;2397:30;2394:2;;;2440:1;2437;2430:12;2394:2;2477:4;2469:6;2465:17;2453:29;;2531:3;2523:4;2515:6;2511:17;2501:8;2497:32;2494:41;2491:2;;;2548:1;2545;2538:12;2491:2;2281:277;;;;;:::o;2564:139::-;;2648:6;2635:20;2626:29;;2664:33;2691:5;2664:33;:::i;:::-;2616:87;;;;:::o;2709:262::-;;2817:2;2805:9;2796:7;2792:23;2788:32;2785:2;;;2833:1;2830;2823:12;2785:2;2876:1;2901:53;2946:7;2937:6;2926:9;2922:22;2901:53;:::i;:::-;2891:63;;2847:117;2775:196;;;;:::o;2977:407::-;;;3102:2;3090:9;3081:7;3077:23;3073:32;3070:2;;;3118:1;3115;3108:12;3070:2;3161:1;3186:53;3231:7;3222:6;3211:9;3207:22;3186:53;:::i;:::-;3176:63;;3132:117;3288:2;3314:53;3359:7;3350:6;3339:9;3335:22;3314:53;:::i;:::-;3304:63;;3259:118;3060:324;;;;;:::o;3390:552::-;;;;3532:2;3520:9;3511:7;3507:23;3503:32;3500:2;;;3548:1;3545;3538:12;3500:2;3591:1;3616:53;3661:7;3652:6;3641:9;3637:22;3616:53;:::i;:::-;3606:63;;3562:117;3718:2;3744:53;3789:7;3780:6;3769:9;3765:22;3744:53;:::i;:::-;3734:63;;3689:118;3846:2;3872:53;3917:7;3908:6;3897:9;3893:22;3872:53;:::i;:::-;3862:63;;3817:118;3490:452;;;;;:::o;3948:809::-;;;;;4116:3;4104:9;4095:7;4091:23;4087:33;4084:2;;;4133:1;4130;4123:12;4084:2;4176:1;4201:53;4246:7;4237:6;4226:9;4222:22;4201:53;:::i;:::-;4191:63;;4147:117;4303:2;4329:53;4374:7;4365:6;4354:9;4350:22;4329:53;:::i;:::-;4319:63;;4274:118;4431:2;4457:53;4502:7;4493:6;4482:9;4478:22;4457:53;:::i;:::-;4447:63;;4402:118;4587:2;4576:9;4572:18;4559:32;4618:18;4610:6;4607:30;4604:2;;;4650:1;4647;4640:12;4604:2;4678:62;4732:7;4723:6;4712:9;4708:22;4678:62;:::i;:::-;4668:72;;4530:220;4074:683;;;;;;;:::o;4763:401::-;;;4885:2;4873:9;4864:7;4860:23;4856:32;4853:2;;;4901:1;4898;4891:12;4853:2;4944:1;4969:53;5014:7;5005:6;4994:9;4990:22;4969:53;:::i;:::-;4959:63;;4915:117;5071:2;5097:50;5139:7;5130:6;5119:9;5115:22;5097:50;:::i;:::-;5087:60;;5042:115;4843:321;;;;;:::o;5170:407::-;;;5295:2;5283:9;5274:7;5270:23;5266:32;5263:2;;;5311:1;5308;5301:12;5263:2;5354:1;5379:53;5424:7;5415:6;5404:9;5400:22;5379:53;:::i;:::-;5369:63;;5325:117;5481:2;5507:53;5552:7;5543:6;5532:9;5528:22;5507:53;:::i;:::-;5497:63;;5452:118;5253:324;;;;;:::o;5583:405::-;;5716:2;5704:9;5695:7;5691:23;5687:32;5684:2;;;5732:1;5729;5722:12;5684:2;5803:1;5792:9;5788:17;5775:31;5833:18;5825:6;5822:30;5819:2;;;5865:1;5862;5855:12;5819:2;5893:78;5963:7;5954:6;5943:9;5939:22;5893:78;:::i;:::-;5883:88;;5746:235;5674:314;;;;:::o;5994:256::-;;6099:2;6087:9;6078:7;6074:23;6070:32;6067:2;;;6115:1;6112;6105:12;6067:2;6158:1;6183:50;6225:7;6216:6;6205:9;6201:22;6183:50;:::i;:::-;6173:60;;6129:114;6057:193;;;;:::o;6256:260::-;;6363:2;6351:9;6342:7;6338:23;6334:32;6331:2;;;6379:1;6376;6369:12;6331:2;6422:1;6447:52;6491:7;6482:6;6471:9;6467:22;6447:52;:::i;:::-;6437:62;;6393:116;6321:195;;;;:::o;6522:282::-;;6640:2;6628:9;6619:7;6615:23;6611:32;6608:2;;;6656:1;6653;6646:12;6608:2;6699:1;6724:63;6779:7;6770:6;6759:9;6755:22;6724:63;:::i;:::-;6714:73;;6670:127;6598:206;;;;:::o;6810:395::-;;;6938:2;6926:9;6917:7;6913:23;6909:32;6906:2;;;6954:1;6951;6944:12;6906:2;7025:1;7014:9;7010:17;6997:31;7055:18;7047:6;7044:30;7041:2;;;7087:1;7084;7077:12;7041:2;7123:65;7180:7;7171:6;7160:9;7156:22;7123:65;:::i;:::-;7105:83;;;;6968:230;6896:309;;;;;:::o;7211:262::-;;7319:2;7307:9;7298:7;7294:23;7290:32;7287:2;;;7335:1;7332;7325:12;7287:2;7378:1;7403:53;7448:7;7439:6;7428:9;7424:22;7403:53;:::i;:::-;7393:63;;7349:117;7277:196;;;;:::o;7479:118::-;7566:24;7584:5;7566:24;:::i;:::-;7561:3;7554:37;7544:53;;:::o;7603:109::-;7684:21;7699:5;7684:21;:::i;:::-;7679:3;7672:34;7662:50;;:::o;7718:360::-;;7832:38;7864:5;7832:38;:::i;:::-;7886:70;7949:6;7944:3;7886:70;:::i;:::-;7879:77;;7965:52;8010:6;8005:3;7998:4;7991:5;7987:16;7965:52;:::i;:::-;8042:29;8064:6;8042:29;:::i;:::-;8037:3;8033:39;8026:46;;7808:270;;;;;:::o;8084:364::-;;8200:39;8233:5;8200:39;:::i;:::-;8255:71;8319:6;8314:3;8255:71;:::i;:::-;8248:78;;8335:52;8380:6;8375:3;8368:4;8361:5;8357:16;8335:52;:::i;:::-;8412:29;8434:6;8412:29;:::i;:::-;8407:3;8403:39;8396:46;;8176:272;;;;;:::o;8454:377::-;;8588:39;8621:5;8588:39;:::i;:::-;8643:89;8725:6;8720:3;8643:89;:::i;:::-;8636:96;;8741:52;8786:6;8781:3;8774:4;8767:5;8763:16;8741:52;:::i;:::-;8818:6;8813:3;8809:16;8802:23;;8564:267;;;;;:::o;8837:366::-;;9000:67;9064:2;9059:3;9000:67;:::i;:::-;8993:74;;9076:93;9165:3;9076:93;:::i;:::-;9194:2;9189:3;9185:12;9178:19;;8983:220;;;:::o;9209:366::-;;9372:67;9436:2;9431:3;9372:67;:::i;:::-;9365:74;;9448:93;9537:3;9448:93;:::i;:::-;9566:2;9561:3;9557:12;9550:19;;9355:220;;;:::o;9581:366::-;;9744:67;9808:2;9803:3;9744:67;:::i;:::-;9737:74;;9820:93;9909:3;9820:93;:::i;:::-;9938:2;9933:3;9929:12;9922:19;;9727:220;;;:::o;9953:366::-;;10116:67;10180:2;10175:3;10116:67;:::i;:::-;10109:74;;10192:93;10281:3;10192:93;:::i;:::-;10310:2;10305:3;10301:12;10294:19;;10099:220;;;:::o;10325:366::-;;10488:67;10552:2;10547:3;10488:67;:::i;:::-;10481:74;;10564:93;10653:3;10564:93;:::i;:::-;10682:2;10677:3;10673:12;10666:19;;10471:220;;;:::o;10697:366::-;;10860:67;10924:2;10919:3;10860:67;:::i;:::-;10853:74;;10936:93;11025:3;10936:93;:::i;:::-;11054:2;11049:3;11045:12;11038:19;;10843:220;;;:::o;11069:402::-;;11250:85;11332:2;11327:3;11250:85;:::i;:::-;11243:92;;11344:93;11433:3;11344:93;:::i;:::-;11462:2;11457:3;11453:12;11446:19;;11233:238;;;:::o;11477:366::-;;11640:67;11704:2;11699:3;11640:67;:::i;:::-;11633:74;;11716:93;11805:3;11716:93;:::i;:::-;11834:2;11829:3;11825:12;11818:19;;11623:220;;;:::o;11849:366::-;;12012:67;12076:2;12071:3;12012:67;:::i;:::-;12005:74;;12088:93;12177:3;12088:93;:::i;:::-;12206:2;12201:3;12197:12;12190:19;;11995:220;;;:::o;12221:366::-;;12384:67;12448:2;12443:3;12384:67;:::i;:::-;12377:74;;12460:93;12549:3;12460:93;:::i;:::-;12578:2;12573:3;12569:12;12562:19;;12367:220;;;:::o;12593:366::-;;12756:67;12820:2;12815:3;12756:67;:::i;:::-;12749:74;;12832:93;12921:3;12832:93;:::i;:::-;12950:2;12945:3;12941:12;12934:19;;12739:220;;;:::o;12965:366::-;;13128:67;13192:2;13187:3;13128:67;:::i;:::-;13121:74;;13204:93;13293:3;13204:93;:::i;:::-;13322:2;13317:3;13313:12;13306:19;;13111:220;;;:::o;13337:366::-;;13500:67;13564:2;13559:3;13500:67;:::i;:::-;13493:74;;13576:93;13665:3;13576:93;:::i;:::-;13694:2;13689:3;13685:12;13678:19;;13483:220;;;:::o;13709:366::-;;13872:67;13936:2;13931:3;13872:67;:::i;:::-;13865:74;;13948:93;14037:3;13948:93;:::i;:::-;14066:2;14061:3;14057:12;14050:19;;13855:220;;;:::o;14081:366::-;;14244:67;14308:2;14303:3;14244:67;:::i;:::-;14237:74;;14320:93;14409:3;14320:93;:::i;:::-;14438:2;14433:3;14429:12;14422:19;;14227:220;;;:::o;14453:402::-;;14634:85;14716:2;14711:3;14634:85;:::i;:::-;14627:92;;14728:93;14817:3;14728:93;:::i;:::-;14846:2;14841:3;14837:12;14830:19;;14617:238;;;:::o;14861:366::-;;15024:67;15088:2;15083:3;15024:67;:::i;:::-;15017:74;;15100:93;15189:3;15100:93;:::i;:::-;15218:2;15213:3;15209:12;15202:19;;15007:220;;;:::o;15233:366::-;;15396:67;15460:2;15455:3;15396:67;:::i;:::-;15389:74;;15472:93;15561:3;15472:93;:::i;:::-;15590:2;15585:3;15581:12;15574:19;;15379:220;;;:::o;15605:366::-;;15768:67;15832:2;15827:3;15768:67;:::i;:::-;15761:74;;15844:93;15933:3;15844:93;:::i;:::-;15962:2;15957:3;15953:12;15946:19;;15751:220;;;:::o;15977:366::-;;16140:67;16204:2;16199:3;16140:67;:::i;:::-;16133:74;;16216:93;16305:3;16216:93;:::i;:::-;16334:2;16329:3;16325:12;16318:19;;16123:220;;;:::o;16349:366::-;;16512:67;16576:2;16571:3;16512:67;:::i;:::-;16505:74;;16588:93;16677:3;16588:93;:::i;:::-;16706:2;16701:3;16697:12;16690:19;;16495:220;;;:::o;16721:366::-;;16884:67;16948:2;16943:3;16884:67;:::i;:::-;16877:74;;16960:93;17049:3;16960:93;:::i;:::-;17078:2;17073:3;17069:12;17062:19;;16867:220;;;:::o;17093:366::-;;17256:67;17320:2;17315:3;17256:67;:::i;:::-;17249:74;;17332:93;17421:3;17332:93;:::i;:::-;17450:2;17445:3;17441:12;17434:19;;17239:220;;;:::o;17465:366::-;;17628:67;17692:2;17687:3;17628:67;:::i;:::-;17621:74;;17704:93;17793:3;17704:93;:::i;:::-;17822:2;17817:3;17813:12;17806:19;;17611:220;;;:::o;17837:118::-;17924:24;17942:5;17924:24;:::i;:::-;17919:3;17912:37;17902:53;;:::o;17961:157::-;18066:45;18086:24;18104:5;18086:24;:::i;:::-;18066:45;:::i;:::-;18061:3;18054:58;18044:74;;:::o;18124:435::-;;18326:95;18417:3;18408:6;18326:95;:::i;:::-;18319:102;;18438:95;18529:3;18520:6;18438:95;:::i;:::-;18431:102;;18550:3;18543:10;;18308:251;;;;;:::o;18565:788::-;;18901:148;19045:3;18901:148;:::i;:::-;18894:155;;19059:75;19130:3;19121:6;19059:75;:::i;:::-;19159:2;19154:3;19150:12;19143:19;;19179:148;19323:3;19179:148;:::i;:::-;19172:155;;19344:3;19337:10;;18883:470;;;;:::o;19359:222::-;;19490:2;19479:9;19475:18;19467:26;;19503:71;19571:1;19560:9;19556:17;19547:6;19503:71;:::i;:::-;19457:124;;;;:::o;19587:640::-;;19820:3;19809:9;19805:19;19797:27;;19834:71;19902:1;19891:9;19887:17;19878:6;19834:71;:::i;:::-;19915:72;19983:2;19972:9;19968:18;19959:6;19915:72;:::i;:::-;19997;20065:2;20054:9;20050:18;20041:6;19997:72;:::i;:::-;20116:9;20110:4;20106:20;20101:2;20090:9;20086:18;20079:48;20144:76;20215:4;20206:6;20144:76;:::i;:::-;20136:84;;19787:440;;;;;;;:::o;20233:210::-;;20358:2;20347:9;20343:18;20335:26;;20371:65;20433:1;20422:9;20418:17;20409:6;20371:65;:::i;:::-;20325:118;;;;:::o;20449:313::-;;20600:2;20589:9;20585:18;20577:26;;20649:9;20643:4;20639:20;20635:1;20624:9;20620:17;20613:47;20677:78;20750:4;20741:6;20677:78;:::i;:::-;20669:86;;20567:195;;;;:::o;20768:419::-;;20972:2;20961:9;20957:18;20949:26;;21021:9;21015:4;21011:20;21007:1;20996:9;20992:17;20985:47;21049:131;21175:4;21049:131;:::i;:::-;21041:139;;20939:248;;;:::o;21193:419::-;;21397:2;21386:9;21382:18;21374:26;;21446:9;21440:4;21436:20;21432:1;21421:9;21417:17;21410:47;21474:131;21600:4;21474:131;:::i;:::-;21466:139;;21364:248;;;:::o;21618:419::-;;21822:2;21811:9;21807:18;21799:26;;21871:9;21865:4;21861:20;21857:1;21846:9;21842:17;21835:47;21899:131;22025:4;21899:131;:::i;:::-;21891:139;;21789:248;;;:::o;22043:419::-;;22247:2;22236:9;22232:18;22224:26;;22296:9;22290:4;22286:20;22282:1;22271:9;22267:17;22260:47;22324:131;22450:4;22324:131;:::i;:::-;22316:139;;22214:248;;;:::o;22468:419::-;;22672:2;22661:9;22657:18;22649:26;;22721:9;22715:4;22711:20;22707:1;22696:9;22692:17;22685:47;22749:131;22875:4;22749:131;:::i;:::-;22741:139;;22639:248;;;:::o;22893:419::-;;23097:2;23086:9;23082:18;23074:26;;23146:9;23140:4;23136:20;23132:1;23121:9;23117:17;23110:47;23174:131;23300:4;23174:131;:::i;:::-;23166:139;;23064:248;;;:::o;23318:419::-;;23522:2;23511:9;23507:18;23499:26;;23571:9;23565:4;23561:20;23557:1;23546:9;23542:17;23535:47;23599:131;23725:4;23599:131;:::i;:::-;23591:139;;23489:248;;;:::o;23743:419::-;;23947:2;23936:9;23932:18;23924:26;;23996:9;23990:4;23986:20;23982:1;23971:9;23967:17;23960:47;24024:131;24150:4;24024:131;:::i;:::-;24016:139;;23914:248;;;:::o;24168:419::-;;24372:2;24361:9;24357:18;24349:26;;24421:9;24415:4;24411:20;24407:1;24396:9;24392:17;24385:47;24449:131;24575:4;24449:131;:::i;:::-;24441:139;;24339:248;;;:::o;24593:419::-;;24797:2;24786:9;24782:18;24774:26;;24846:9;24840:4;24836:20;24832:1;24821:9;24817:17;24810:47;24874:131;25000:4;24874:131;:::i;:::-;24866:139;;24764:248;;;:::o;25018:419::-;;25222:2;25211:9;25207:18;25199:26;;25271:9;25265:4;25261:20;25257:1;25246:9;25242:17;25235:47;25299:131;25425:4;25299:131;:::i;:::-;25291:139;;25189:248;;;:::o;25443:419::-;;25647:2;25636:9;25632:18;25624:26;;25696:9;25690:4;25686:20;25682:1;25671:9;25667:17;25660:47;25724:131;25850:4;25724:131;:::i;:::-;25716:139;;25614:248;;;:::o;25868:419::-;;26072:2;26061:9;26057:18;26049:26;;26121:9;26115:4;26111:20;26107:1;26096:9;26092:17;26085:47;26149:131;26275:4;26149:131;:::i;:::-;26141:139;;26039:248;;;:::o;26293:419::-;;26497:2;26486:9;26482:18;26474:26;;26546:9;26540:4;26536:20;26532:1;26521:9;26517:17;26510:47;26574:131;26700:4;26574:131;:::i;:::-;26566:139;;26464:248;;;:::o;26718:419::-;;26922:2;26911:9;26907:18;26899:26;;26971:9;26965:4;26961:20;26957:1;26946:9;26942:17;26935:47;26999:131;27125:4;26999:131;:::i;:::-;26991:139;;26889:248;;;:::o;27143:419::-;;27347:2;27336:9;27332:18;27324:26;;27396:9;27390:4;27386:20;27382:1;27371:9;27367:17;27360:47;27424:131;27550:4;27424:131;:::i;:::-;27416:139;;27314:248;;;:::o;27568:419::-;;27772:2;27761:9;27757:18;27749:26;;27821:9;27815:4;27811:20;27807:1;27796:9;27792:17;27785:47;27849:131;27975:4;27849:131;:::i;:::-;27841:139;;27739:248;;;:::o;27993:419::-;;28197:2;28186:9;28182:18;28174:26;;28246:9;28240:4;28236:20;28232:1;28221:9;28217:17;28210:47;28274:131;28400:4;28274:131;:::i;:::-;28266:139;;28164:248;;;:::o;28418:419::-;;28622:2;28611:9;28607:18;28599:26;;28671:9;28665:4;28661:20;28657:1;28646:9;28642:17;28635:47;28699:131;28825:4;28699:131;:::i;:::-;28691:139;;28589:248;;;:::o;28843:419::-;;29047:2;29036:9;29032:18;29024:26;;29096:9;29090:4;29086:20;29082:1;29071:9;29067:17;29060:47;29124:131;29250:4;29124:131;:::i;:::-;29116:139;;29014:248;;;:::o;29268:419::-;;29472:2;29461:9;29457:18;29449:26;;29521:9;29515:4;29511:20;29507:1;29496:9;29492:17;29485:47;29549:131;29675:4;29549:131;:::i;:::-;29541:139;;29439:248;;;:::o;29693:419::-;;29897:2;29886:9;29882:18;29874:26;;29946:9;29940:4;29936:20;29932:1;29921:9;29917:17;29910:47;29974:131;30100:4;29974:131;:::i;:::-;29966:139;;29864:248;;;:::o;30118:222::-;;30249:2;30238:9;30234:18;30226:26;;30262:71;30330:1;30319:9;30315:17;30306:6;30262:71;:::i;:::-;30216:124;;;;:::o;30346:129::-;;30407:20;;:::i;:::-;30397:30;;30436:33;30464:4;30456:6;30436:33;:::i;:::-;30387:88;;;:::o;30481:75::-;;30547:2;30541:9;30531:19;;30521:35;:::o;30562:311::-;;30729:18;30721:6;30718:30;30715:2;;;30751:18;;:::i;:::-;30715:2;30801:4;30793:6;30789:17;30781:25;;30861:4;30855;30851:15;30843:23;;30644:229;;;:::o;30879:307::-;;31030:18;31022:6;31019:30;31016:2;;;31052:18;;:::i;:::-;31016:2;31090:29;31112:6;31090:29;:::i;:::-;31082:37;;31174:4;31168;31164:15;31156:23;;30945:241;;;:::o;31192:98::-;;31277:5;31271:12;31261:22;;31250:40;;;:::o;31296:99::-;;31382:5;31376:12;31366:22;;31355:40;;;:::o;31401:168::-;;31518:6;31513:3;31506:19;31558:4;31553:3;31549:14;31534:29;;31496:73;;;;:::o;31575:169::-;;31693:6;31688:3;31681:19;31733:4;31728:3;31724:14;31709:29;;31671:73;;;;:::o;31750:148::-;;31889:3;31874:18;;31864:34;;;;:::o;31904:242::-;;31962:19;31979:1;31962:19;:::i;:::-;31957:24;;31995:19;32012:1;31995:19;:::i;:::-;31990:24;;32088:1;32080:6;32076:14;32073:1;32070:21;32067:2;;;32094:18;;:::i;:::-;32067:2;32138:1;32135;32131:9;32124:16;;31947:199;;;;:::o;32152:305::-;;32211:20;32229:1;32211:20;:::i;:::-;32206:25;;32245:20;32263:1;32245:20;:::i;:::-;32240:25;;32399:1;32331:66;32327:74;32324:1;32321:81;32318:2;;;32405:18;;:::i;:::-;32318:2;32449:1;32446;32442:9;32435:16;;32196:261;;;;:::o;32463:185::-;;32520:20;32538:1;32520:20;:::i;:::-;32515:25;;32554:20;32572:1;32554:20;:::i;:::-;32549:25;;32593:1;32583:2;;32598:18;;:::i;:::-;32583:2;32640:1;32637;32633:9;32628:14;;32505:143;;;;:::o;32654:348::-;;32717:20;32735:1;32717:20;:::i;:::-;32712:25;;32751:20;32769:1;32751:20;:::i;:::-;32746:25;;32939:1;32871:66;32867:74;32864:1;32861:81;32856:1;32849:9;32842:17;32838:105;32835:2;;;32946:18;;:::i;:::-;32835:2;32994:1;32991;32987:9;32976:20;;32702:300;;;;:::o;33008:191::-;;33068:20;33086:1;33068:20;:::i;:::-;33063:25;;33102:20;33120:1;33102:20;:::i;:::-;33097:25;;33141:1;33138;33135:8;33132:2;;;33146:18;;:::i;:::-;33132:2;33191:1;33188;33184:9;33176:17;;33053:146;;;;:::o;33205:96::-;;33271:24;33289:5;33271:24;:::i;:::-;33260:35;;33250:51;;;:::o;33307:90::-;;33384:5;33377:13;33370:21;33359:32;;33349:48;;;:::o;33403:149::-;;33479:66;33472:5;33468:78;33457:89;;33447:105;;;:::o;33558:89::-;;33634:6;33627:5;33623:18;33612:29;;33602:45;;;:::o;33653:126::-;;33730:42;33723:5;33719:54;33708:65;;33698:81;;;:::o;33785:77::-;;33851:5;33840:16;;33830:32;;;:::o;33868:154::-;33952:6;33947:3;33942;33929:30;34014:1;34005:6;34000:3;33996:16;33989:27;33919:103;;;:::o;34028:307::-;34096:1;34106:113;34120:6;34117:1;34114:13;34106:113;;;34205:1;34200:3;34196:11;34190:18;34186:1;34181:3;34177:11;34170:39;34142:2;34139:1;34135:10;34130:15;;34106:113;;;34237:6;34234:1;34231:13;34228:2;;;34317:1;34308:6;34303:3;34299:16;34292:27;34228:2;34077:258;;;;:::o;34341:320::-;;34422:1;34416:4;34412:12;34402:22;;34469:1;34463:4;34459:12;34490:18;34480:2;;34546:4;34538:6;34534:17;34524:27;;34480:2;34608;34600:6;34597:14;34577:18;34574:38;34571:2;;;34627:18;;:::i;:::-;34571:2;34392:269;;;;:::o;34667:281::-;34750:27;34772:4;34750:27;:::i;:::-;34742:6;34738:40;34880:6;34868:10;34865:22;34844:18;34832:10;34829:34;34826:62;34823:2;;;34891:18;;:::i;:::-;34823:2;34931:10;34927:2;34920:22;34710:238;;;:::o;34954:171::-;;35015:23;35032:5;35015:23;:::i;:::-;35006:32;;35060:6;35053:5;35050:17;35047:2;;;35070:18;;:::i;:::-;35047:2;35117:1;35110:5;35106:13;35099:20;;34996:129;;;:::o;35131:233::-;;35193:24;35211:5;35193:24;:::i;:::-;35184:33;;35239:66;35232:5;35229:77;35226:2;;;35309:18;;:::i;:::-;35226:2;35356:1;35349:5;35345:13;35338:20;;35174:190;;;:::o;35370:79::-;;35438:5;35427:16;;35417:32;;;:::o;35455:176::-;;35504:20;35522:1;35504:20;:::i;:::-;35499:25;;35538:20;35556:1;35538:20;:::i;:::-;35533:25;;35577:1;35567:2;;35582:18;;:::i;:::-;35567:2;35623:1;35620;35616:9;35611:14;;35489:142;;;;:::o;35637:180::-;35685:77;35682:1;35675:88;35782:4;35779:1;35772:15;35806:4;35803:1;35796:15;35823:180;35871:77;35868:1;35861:88;35968:4;35965:1;35958:15;35992:4;35989:1;35982:15;36009:180;36057:77;36054:1;36047:88;36154:4;36151:1;36144:15;36178:4;36175:1;36168:15;36195:180;36243:77;36240:1;36233:88;36340:4;36337:1;36330:15;36364:4;36361:1;36354:15;36381:102;;36473:2;36469:7;36464:2;36457:5;36453:14;36449:28;36439:38;;36429:54;;;:::o;36489:180::-;36629:32;36625:1;36617:6;36613:14;36606:56;36595:74;:::o;36675:224::-;36815:34;36811:1;36803:6;36799:14;36792:58;36884:7;36879:2;36871:6;36867:15;36860:32;36781:118;:::o;36905:221::-;37045:34;37041:1;37033:6;37029:14;37022:58;37114:4;37109:2;37101:6;37097:15;37090:29;37011:115;:::o;37132:229::-;37272:34;37268:1;37260:6;37256:14;37249:58;37341:12;37336:2;37328:6;37324:15;37317:37;37238:123;:::o;37367:225::-;37507:34;37503:1;37495:6;37491:14;37484:58;37576:8;37571:2;37563:6;37559:15;37552:33;37473:119;:::o;37598:229::-;37738:34;37734:1;37726:6;37722:14;37715:58;37807:12;37802:2;37794:6;37790:15;37783:37;37704:123;:::o;37833:163::-;37973:15;37969:1;37961:6;37957:14;37950:39;37939:57;:::o;38002:230::-;38142:34;38138:1;38130:6;38126:14;38119:58;38211:13;38206:2;38198:6;38194:15;38187:38;38108:124;:::o;38238:232::-;38378:34;38374:1;38366:6;38362:14;38355:58;38447:15;38442:2;38434:6;38430:15;38423:40;38344:126;:::o;38476:222::-;38616:34;38612:1;38604:6;38600:14;38593:58;38685:5;38680:2;38672:6;38668:15;38661:30;38582:116;:::o;38704:237::-;38844:34;38840:1;38832:6;38828:14;38821:58;38913:20;38908:2;38900:6;38896:15;38889:45;38810:131;:::o;38947:176::-;39087:28;39083:1;39075:6;39071:14;39064:52;39053:70;:::o;39129:220::-;39269:34;39265:1;39257:6;39253:14;39246:58;39338:3;39333:2;39325:6;39321:15;39314:28;39235:114;:::o;39355:182::-;39495:34;39491:1;39483:6;39479:14;39472:58;39461:76;:::o;39543:234::-;39683:34;39679:1;39671:6;39667:14;39660:58;39752:17;39747:2;39739:6;39735:15;39728:42;39649:128;:::o;39783:161::-;39923:13;39919:1;39911:6;39907:14;39900:37;39889:55;:::o;39950:178::-;40090:30;40086:1;40078:6;40074:14;40067:54;40056:72;:::o;40134:232::-;40274:34;40270:1;40262:6;40258:14;40251:58;40343:15;40338:2;40330:6;40326:15;40319:40;40240:126;:::o;40372:244::-;40512:34;40508:1;40500:6;40496:14;40489:58;40581:27;40576:2;40568:6;40564:15;40557:52;40478:138;:::o;40622:169::-;40762:21;40758:1;40750:6;40746:14;40739:45;40728:63;:::o;40797:238::-;40937:34;40933:1;40925:6;40921:14;40914:58;41006:21;41001:2;40993:6;40989:15;40982:46;40903:132;:::o;41041:224::-;41181:34;41177:1;41169:6;41165:14;41158:58;41250:7;41245:2;41237:6;41233:15;41226:32;41147:118;:::o;41271:165::-;41411:17;41407:1;41399:6;41395:14;41388:41;41377:59;:::o;41442:221::-;41582:34;41578:1;41570:6;41566:14;41559:58;41651:4;41646:2;41638:6;41634:15;41627:29;41548:115;:::o;41669:122::-;41742:24;41760:5;41742:24;:::i;:::-;41735:5;41732:35;41722:2;;41781:1;41778;41771:12;41722:2;41712:79;:::o;41797:116::-;41867:21;41882:5;41867:21;:::i;:::-;41860:5;41857:32;41847:2;;41903:1;41900;41893:12;41847:2;41837:76;:::o;41919:120::-;41991:23;42008:5;41991:23;:::i;:::-;41984:5;41981:34;41971:2;;42029:1;42026;42019:12;41971:2;41961:78;:::o;42045:122::-;42118:24;42136:5;42118:24;:::i;:::-;42111:5;42108:35;42098:2;;42157:1;42154;42147:12;42098:2;42088:79;:::o

Swarm Source

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