ETH Price: $3,324.20 (-4.41%)

Token

SUSHIUKI (UKI)
 

Overview

Max Total Supply

4,715 UKI

Holders

2,517

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
961010.eth
Balance
1 UKI
0xa98b080fB3460d59D54C62d77281e225EE4b31B9
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:
SUSHIUKI

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-15
*/

// File: utils/MerkleProof.sol



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;


/**
 * @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: token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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



pragma solidity ^0.8.0;


/**
 * @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: security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// File: 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: ERC721A.sol



pragma solidity ^0.8.0;









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

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

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

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

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

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

    uint256 updatedIndex = startTokenId;

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

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

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

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

    _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

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

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

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: SushiUKI.sol



pragma solidity ^0.8.0;






contract SUSHIUKI is Ownable, ERC721A, ReentrancyGuard {

    address public manageContract;

    function setManageContract(address contractAddress) public onlyOwner {
        manageContract = contractAddress;
    }

    function burningLab(uint256 tokenId, bytes32[] calldata proof) external callerIsUser {
        // burn
        transferFrom(msg.sender, address(0x000000000000000000000000000000000000dEaD), tokenId);
        UkiManager manager = UkiManager(manageContract);
        bool result = manager.burningLab(msg.sender, proof);
        require(result, "Burning lab failed");
    }

    enum MintType { Premium, Fam, Wl, Public }

    /**
     * @dev Config start time of each turn
     */
    mapping (MintType => uint32) public _startTimes;
    function setStartTimes(MintType mintType, uint32 startTime) external onlyOwner {
        _startTimes[mintType] = startTime;
    }
    function isSaleOn(MintType mintType) public view returns (bool) {
        if (_startTimes[mintType] == 0) {
            return false;
        }
        return block.timestamp >= _startTimes[mintType];
    }

    /**
     * @dev Config merkle root of each turn
     */
    mapping (MintType => bytes32) public _merkleRoots;
    function setMerkleRoot(MintType mintType, bytes32 merkleRoot) external onlyOwner {
        _merkleRoots[mintType] = merkleRoot;
    }
    function verifyProof(MintType mintType, bytes32[] memory _merkleProof) internal view returns (bool) {
        if (mintType == MintType.Public) {
            return true;
        }
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(_merkleProof, _merkleRoots[mintType], leaf);
    }

    function maxMintNumber(MintType mintType) public view returns (uint256) {
        uint maxMintNumberOfAddress;
        if (mintType == MintType.Public) {
            maxMintNumberOfAddress = 1;
        } else {
            maxMintNumberOfAddress = 3 - uint(mintType);
        }
        return maxMintNumberOfAddress - numberMinted(msg.sender);
    }

    constructor() ERC721A("SUSHIUKI", "UKI", 3, 5555) {
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function mint(MintType mintType, uint256 quantity, bytes32[] calldata proof) external callerIsUser {
        require(quantity > 0, "Number of tokens can not be less than or equal to 0");
        require(isSaleOn(mintType), "sale has not started yet");
        require(totalSupply() + quantity <= collectionSize, "reached max supply");
        require(
            quantity <= maxMintNumber(mintType),
            "can not mint this many"
        );
        if (mintType != MintType.Public) {
            require(verifyProof(mintType, proof), "Not in the whitelist");
        }
        _safeMint(msg.sender, quantity);
    }

    // metadata URI
    string private _baseTokenURI;

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

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

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

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

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

}

interface UkiManager {

    function burningLab(address owner, bytes32[] calldata proof) external returns (bool);

}

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":"enum SUSHIUKI.MintType","name":"","type":"uint8"}],"name":"_merkleRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum SUSHIUKI.MintType","name":"","type":"uint8"}],"name":"_startTimes","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"burningLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum SUSHIUKI.MintType","name":"mintType","type":"uint8"}],"name":"isSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manageContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum SUSHIUKI.MintType","name":"mintType","type":"uint8"}],"name":"maxMintNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum SUSHIUKI.MintType","name":"mintType","type":"uint8"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"address","name":"contractAddress","type":"address"}],"name":"setManageContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SUSHIUKI.MintType","name":"mintType","type":"uint8"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SUSHIUKI.MintType","name":"mintType","type":"uint8"},{"internalType":"uint32","name":"startTime","type":"uint32"}],"name":"setStartTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600060015560006008553480156200001b57600080fd5b506040518060400160405280600881526020017f5355534849554b490000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f554b49000000000000000000000000000000000000000000000000000000000081525060036115b3620000ad620000a16200018d60201b60201c565b6200019560201b60201c565b60008111620000f3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000ea90620003fb565b60405180910390fd5b6000821162000139576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200013090620003d9565b60405180910390fd5b83600290805190602001906200015192919062000259565b5082600390805190602001906200016a92919062000259565b508160a08181525050806080818152505050505050600160098190555062000493565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000267906200042e565b90600052602060002090601f0160209004810192826200028b5760008555620002d7565b82601f10620002a657805160ff1916838001178555620002d7565b82800160010185558215620002d7579182015b82811115620002d6578251825591602001919060010190620002b9565b5b509050620002e69190620002ea565b5090565b5b8082111562000305576000816000905550600101620002eb565b5090565b6000620003186027836200041d565b91507f455243373231413a206d61782062617463682073697a65206d7573742062652060008301527f6e6f6e7a65726f000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062000380602e836200041d565b91507f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008301527f6e6f6e7a65726f20737570706c790000000000000000000000000000000000006020830152604082019050919050565b60006020820190508181036000830152620003f48162000309565b9050919050565b60006020820190508181036000830152620004168162000371565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200044757607f821691505b602082108114156200045e576200045d62000464565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a051615512620004d5600039600081816128640152818161288d01526131f2015260008181611b29015281816125ec015261262001526155126000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063715018a61161011a5780639f57f5a0116100ad578063d7224ba01161007c578063d7224ba01461061f578063da39f8cf1461063d578063dc33e68114610659578063e985e9c514610689578063f2fde38b146106b957610206565b80639f57f5a014610587578063a22cb465146105b7578063b88d4fde146105d3578063c87b56dd146105ef57610206565b80638da5cb5b116100e95780638da5cb5b146104fd5780639231ab2a1461051b57806395d89b411461054b5780639cf843b01461056957610206565b8063715018a61461048b57806372b00677146104955780637354fc7e146104b1578063786899ed146104e157610206565b80632d20fb601161019d57806354d77e0e1161016c57806354d77e0e146103c357806355f804b3146103df578063590b2803146103fb5780636352211e1461042b57806370a082311461045b57610206565b80632d20fb601461032b5780632f745c591461034757806342842e0e146103775780634f6ccce71461039357610206565b80630a9cef32116101d95780630a9cef32146102a557806318160ddd146102d557806323b872dd146102f35780632b26fa841461030f57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613b4f565b6106d5565b6040516102329190614af1565b60405180910390f35b61024361081f565b6040516102509190614b27565b60405180910390f35b610273600480360381019061026e9190613cf3565b6108b1565b6040516102809190614a58565b60405180910390f35b6102a3600480360381019061029e9190613aea565b610936565b005b6102bf60048036038101906102ba9190613ba1565b610a4f565b6040516102cc9190614b0c565b60405180910390f35b6102dd610a67565b6040516102ea9190614f44565b60405180910390f35b61030d600480360381019061030891906139e4565b610a71565b005b61032960048036038101906103249190613d1c565b610a81565b005b61034560048036038101906103409190613cf3565b610bfd565b005b610361600480360381019061035c9190613aea565b610cdb565b60405161036e9190614f44565b60405180910390f35b610391600480360381019061038c91906139e4565b610ed9565b005b6103ad60048036038101906103a89190613cf3565b610ef9565b6040516103ba9190614f44565b60405180910390f35b6103dd60048036038101906103d89190613bca565b610f4c565b005b6103f960048036038101906103f49190613cae565b611054565b005b61041560048036038101906104109190613ba1565b6110e6565b6040516104229190614f5f565b60405180910390f35b61044560048036038101906104409190613cf3565b611109565b6040516104529190614a58565b60405180910390f35b6104756004803603810190610470919061397f565b61111f565b6040516104829190614f44565b60405180910390f35b610493611208565b005b6104af60048036038101906104aa9190613c72565b611290565b005b6104cb60048036038101906104c69190613ba1565b6113b2565b6040516104d89190614af1565b60405180910390f35b6104fb60048036038101906104f6919061397f565b611503565b005b6105056115c3565b6040516105129190614a58565b60405180910390f35b61053560048036038101906105309190613cf3565b6115ec565b6040516105429190614f29565b60405180910390f35b610553611604565b6040516105609190614b27565b60405180910390f35b610571611696565b60405161057e9190614a58565b60405180910390f35b6105a1600480360381019061059c9190613ba1565b6116bc565b6040516105ae9190614f44565b60405180910390f35b6105d160048036038101906105cc9190613aae565b6117a4565b005b6105ed60048036038101906105e89190613a33565b611925565b005b61060960048036038101906106049190613cf3565b611981565b6040516106169190614b27565b60405180910390f35b610627611a28565b6040516106349190614f44565b60405180910390f35b61065760048036038101906106529190613c06565b611a2e565b005b610673600480360381019061066e919061397f565b611cf9565b6040516106809190614f44565b60405180910390f35b6106a3600480360381019061069e91906139a8565b611d0b565b6040516106b09190614af1565b60405180910390f35b6106d360048036038101906106ce919061397f565b611d9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610818575061081782611e97565b5b9050919050565b60606002805461082e9061528e565b80601f016020809104026020016040519081016040528092919081815260200182805461085a9061528e565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b5050505050905090565b60006108bc82611f01565b6108fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f290614ee9565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094182611109565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a990614dc9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d1611f0f565b73ffffffffffffffffffffffffffffffffffffffff161480610a0057506109ff816109fa611f0f565b611d0b565b5b610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690614c89565b60405180910390fd5b610a4a838383611f17565b505050565b600c6020528060005260406000206000915090505481565b6000600154905090565b610a7c838383611fc9565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae690614c69565b60405180910390fd5b610afc3361dead85610a71565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16635231926a3386866040518463ffffffff1660e01b8152600401610b6293929190614abf565b602060405180830381600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb49190613b26565b905080610bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bed90614b89565b60405180910390fd5b5050505050565b610c05611f0f565b73ffffffffffffffffffffffffffffffffffffffff16610c236115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090614d29565b60405180910390fd5b60026009541415610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690614ea9565b60405180910390fd5b6002600981905550610cd081612582565b600160098190555050565b6000610ce68361111f565b8210610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90614b49565b60405180910390fd5b6000610d31610a67565b905060008060005b83811015610e97576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e2b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e835786841415610e74578195505050505050610ed3565b8380610e7f906152c0565b9450505b508080610e8f906152c0565b915050610d39565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614e69565b60405180910390fd5b92915050565b610ef483838360405180602001604052806000815250611925565b505050565b6000610f03610a67565b8210610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90614be9565b60405180910390fd5b819050919050565b610f54611f0f565b73ffffffffffffffffffffffffffffffffffffffff16610f726115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf90614d29565b60405180910390fd5b80600c6000846003811115611006577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381111561103e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020819055505050565b61105c611f0f565b73ffffffffffffffffffffffffffffffffffffffff1661107a6115c3565b73ffffffffffffffffffffffffffffffffffffffff16146110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790614d29565b60405180910390fd5b8181600d91906110e19291906136e9565b505050565b600b6020528060005260406000206000915054906101000a900463ffffffff1681565b600061111482612810565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790614cc9565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611210611f0f565b73ffffffffffffffffffffffffffffffffffffffff1661122e6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90614d29565b60405180910390fd5b61128e6000612a13565b565b611298611f0f565b73ffffffffffffffffffffffffffffffffffffffff166112b66115c3565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390614d29565b60405180910390fd5b80600b600084600381111561134a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115611382577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050565b600080600b60008460038111156113f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381111561142a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff16141561145e57600090506114fe565b600b600083600381111561149b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038111156114d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1642101590505b919050565b61150b611f0f565b73ffffffffffffffffffffffffffffffffffffffff166115296115c3565b73ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614d29565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115f461376f565b6115fd82612810565b9050919050565b6060600380546116139061528e565b80601f016020809104026020016040519081016040528092919081815260200182805461163f9061528e565b801561168c5780601f106116615761010080835404028352916020019161168c565b820191906000526020600020905b81548152906001019060200180831161166f57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003808111156116f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836003811115611731577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156117405760019050611788565b826003811115611779577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60036117859190615130565b90505b61179133611cf9565b8161179c9190615130565b915050919050565b6117ac611f0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190614d69565b60405180910390fd5b8060076000611827611f0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118d4611f0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119199190614af1565b60405180910390a35050565b611930848484611fc9565b61193c84848484612ad7565b61197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614de9565b60405180910390fd5b50505050565b606061198c82611f01565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614d49565b60405180910390fd5b60006119d5612c6e565b905060008151116119f55760405180602001604052806000815250611a20565b806119ff84612d00565b604051602001611a10929190614a34565b6040516020818303038152906040525b915050919050565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390614c69565b60405180910390fd5b60008311611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690614b69565b60405180910390fd5b611ae8846113b2565b611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90614c29565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083611b51610a67565b611b5b9190615075565b1115611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390614ce9565b60405180910390fd5b611ba5846116bc565b831115611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90614e49565b60405180910390fd5b600380811115611c20577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b846003811115611c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611ce957611ca984838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612ead565b611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90614da9565b60405180910390fd5b5b611cf33384612ff3565b50505050565b6000611d0482613011565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611da7611f0f565b73ffffffffffffffffffffffffffffffffffffffff16611dc56115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1290614d29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290614ba9565b60405180910390fd5b611e9481612a13565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611fd482612810565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ffb611f0f565b73ffffffffffffffffffffffffffffffffffffffff1614806120575750612020611f0f565b73ffffffffffffffffffffffffffffffffffffffff1661203f846108b1565b73ffffffffffffffffffffffffffffffffffffffff16145b806120735750612072826000015161206d611f0f565b611d0b565b5b9050806120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90614d89565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e90614d09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90614c09565b60405180910390fd5b6121a485858560016130fa565b6121b46000848460000151611f17565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661222291906150fc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166122c6919061502f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846123cc9190615075565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125125761244281611f01565b15612511576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257a8686866001613100565b505050505050565b60006008549050600082116125cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c390614ca9565b60405180910390fd5b6000600183836125dc9190615075565b6125e69190615130565b905060017f00000000000000000000000000000000000000000000000000000000000000006126159190615130565b81111561264c5760017f00000000000000000000000000000000000000000000000000000000000000006126499190615130565b90505b61265581611f01565b612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90614e89565b60405180910390fd5b60008290505b8181116127f757600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127e457600061271782612810565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b80806127ef906152c0565b91505061269a565b506001816128059190615075565b600881905550505050565b61281861376f565b61282182611f01565b612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614bc9565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106128c45760017f0000000000000000000000000000000000000000000000000000000000000000846128b79190615130565b6128c19190615075565b90505b60008390505b8181106129d2576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129be57809350505050612a0e565b5080806129ca90615264565b9150506128ca565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0590614ec9565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612af88473ffffffffffffffffffffffffffffffffffffffff16613106565b15612c61578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b21611f0f565b8786866040518563ffffffff1660e01b8152600401612b439493929190614a73565b602060405180830381600087803b158015612b5d57600080fd5b505af1925050508015612b8e57506040513d601f19601f82011682018060405250810190612b8b9190613b78565b60015b612c11573d8060008114612bbe576040519150601f19603f3d011682016040523d82523d6000602084013e612bc3565b606091505b50600081511415612c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0090614de9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c66565b600190505b949350505050565b6060600d8054612c7d9061528e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca99061528e565b8015612cf65780601f10612ccb57610100808354040283529160200191612cf6565b820191906000526020600020905b815481529060010190602001808311612cd957829003601f168201915b5050505050905090565b60606000821415612d48576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ea8565b600082905060005b60008214612d7a578080612d63906152c0565b915050600a82612d7391906150cb565b9150612d50565b60008167ffffffffffffffff811115612dbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dee5781602001600182028036833780820191505090505b5090505b60008514612ea157600182612e079190615130565b9150600a85612e169190615337565b6030612e229190615075565b60f81b818381518110612e5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e9a91906150cb565b9450612df2565b8093505050505b919050565b6000600380811115612ee8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836003811115612f21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612f305760019050612fed565b600033604051602001612f4391906149ed565b604051602081830303815290604052805190602001209050612fe983600c6000876003811115612f9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115612fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205483613119565b9150505b92915050565b61300d828260405180602001604052806000815250613130565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307990614c49565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b600080823b905060008111915050919050565b6000826131268584613610565b1490509392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319e90614e29565b60405180910390fd5b6131b081611f01565b156131f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e790614e09565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324a90614f09565b60405180910390fd5b61326060008583866130fa565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161335d919061502f565b6fffffffffffffffffffffffffffffffff168152602001858360200151613384919061502f565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156135f357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135936000888488612ad7565b6135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990614de9565b60405180910390fd5b81806135dd906152c0565b92505080806135eb906152c0565b915050613522565b50806001819055506136086000878588613100565b505050505050565b60008082905060005b84518110156136de57600085828151811061365d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161369e578281604051602001613681929190614a08565b6040516020818303038152906040528051906020012092506136ca565b80836040516020016136b1929190614a08565b6040516020818303038152906040528051906020012092505b5080806136d6906152c0565b915050613619565b508091505092915050565b8280546136f59061528e565b90600052602060002090601f016020900481019282613717576000855561375e565b82601f1061373057803560ff191683800117855561375e565b8280016001018555821561375e579182015b8281111561375d578235825591602001919060010190613742565b5b50905061376b91906137a9565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156137c25760008160009055506001016137aa565b5090565b60006137d96137d484614fab565b614f7a565b9050828152602081018484840111156137f157600080fd5b6137fc848285615222565b509392505050565b60008135905061381381615442565b92915050565b60008083601f84011261382b57600080fd5b8235905067ffffffffffffffff81111561384457600080fd5b60208301915083602082028301111561385c57600080fd5b9250929050565b60008135905061387281615459565b92915050565b60008151905061388781615459565b92915050565b60008135905061389c81615470565b92915050565b6000813590506138b181615487565b92915050565b6000815190506138c681615487565b92915050565b600082601f8301126138dd57600080fd5b81356138ed8482602086016137c6565b91505092915050565b6000813590506139058161549e565b92915050565b60008083601f84011261391d57600080fd5b8235905067ffffffffffffffff81111561393657600080fd5b60208301915083600182028301111561394e57600080fd5b9250929050565b600081359050613964816154ae565b92915050565b600081359050613979816154c5565b92915050565b60006020828403121561399157600080fd5b600061399f84828501613804565b91505092915050565b600080604083850312156139bb57600080fd5b60006139c985828601613804565b92505060206139da85828601613804565b9150509250929050565b6000806000606084860312156139f957600080fd5b6000613a0786828701613804565b9350506020613a1886828701613804565b9250506040613a2986828701613955565b9150509250925092565b60008060008060808587031215613a4957600080fd5b6000613a5787828801613804565b9450506020613a6887828801613804565b9350506040613a7987828801613955565b925050606085013567ffffffffffffffff811115613a9657600080fd5b613aa2878288016138cc565b91505092959194509250565b60008060408385031215613ac157600080fd5b6000613acf85828601613804565b9250506020613ae085828601613863565b9150509250929050565b60008060408385031215613afd57600080fd5b6000613b0b85828601613804565b9250506020613b1c85828601613955565b9150509250929050565b600060208284031215613b3857600080fd5b6000613b4684828501613878565b91505092915050565b600060208284031215613b6157600080fd5b6000613b6f848285016138a2565b91505092915050565b600060208284031215613b8a57600080fd5b6000613b98848285016138b7565b91505092915050565b600060208284031215613bb357600080fd5b6000613bc1848285016138f6565b91505092915050565b60008060408385031215613bdd57600080fd5b6000613beb858286016138f6565b9250506020613bfc8582860161388d565b9150509250929050565b60008060008060608587031215613c1c57600080fd5b6000613c2a878288016138f6565b9450506020613c3b87828801613955565b935050604085013567ffffffffffffffff811115613c5857600080fd5b613c6487828801613819565b925092505092959194509250565b60008060408385031215613c8557600080fd5b6000613c93858286016138f6565b9250506020613ca48582860161396a565b9150509250929050565b60008060208385031215613cc157600080fd5b600083013567ffffffffffffffff811115613cdb57600080fd5b613ce78582860161390b565b92509250509250929050565b600060208284031215613d0557600080fd5b6000613d1384828501613955565b91505092915050565b600080600060408486031215613d3157600080fd5b6000613d3f86828701613955565b935050602084013567ffffffffffffffff811115613d5c57600080fd5b613d6886828701613819565b92509250509250925092565b613d7d81615164565b82525050565b613d8c81615164565b82525050565b613da3613d9e82615164565b615309565b82525050565b6000613db58385614ff1565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613de457600080fd5b602083029250613df5838584615222565b82840190509392505050565b613e0a81615176565b82525050565b613e1981615182565b82525050565b613e30613e2b82615182565b61531b565b82525050565b6000613e4182614fdb565b613e4b8185615002565b9350613e5b818560208601615231565b613e6481615424565b840191505092915050565b6000613e7a82614fe6565b613e848185615013565b9350613e94818560208601615231565b613e9d81615424565b840191505092915050565b6000613eb382614fe6565b613ebd8185615024565b9350613ecd818560208601615231565b80840191505092915050565b6000613ee6602283615013565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f4c603383615013565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613fb2601283615013565b91507f4275726e696e67206c6162206661696c656400000000000000000000000000006000830152602082019050919050565b6000613ff2602683615013565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614058602a83615013565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006140be602383615013565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614124602583615013565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061418a601883615013565b91507f73616c6520686173206e6f7420737461727465642079657400000000000000006000830152602082019050919050565b60006141ca603183615013565b91507f455243373231413a206e756d626572206d696e74656420717565727920666f7260008301527f20746865207a65726f20616464726573730000000000000000000000000000006020830152604082019050919050565b6000614230601e83615013565b91507f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006000830152602082019050919050565b6000614270603983615013565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b60006142d6601883615013565b91507f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006000830152602082019050919050565b6000614316602b83615013565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b600061437c601283615013565b91507f72656163686564206d617820737570706c7900000000000000000000000000006000830152602082019050919050565b60006143bc602683615013565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614422602083615013565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614462602f83615013565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006144c8601a83615013565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000614508603283615013565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061456e601483615013565b91507f4e6f7420696e207468652077686974656c6973740000000000000000000000006000830152602082019050919050565b60006145ae602283615013565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614614603383615013565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b600061467a601d83615013565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006146ba602183615013565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614720601683615013565b91507f63616e206e6f74206d696e742074686973206d616e79000000000000000000006000830152602082019050919050565b6000614760602e83615013565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006147c6602683615013565b91507f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008301527f6c65616e757000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061482c601f83615013565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b600061486c602f83615013565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006148d2602d83615013565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614938602283615013565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516149a76000850182613d74565b5060208201516149ba60208501826149de565b50505050565b6149c9816151f4565b82525050565b6149d8816151fe565b82525050565b6149e78161520e565b82525050565b60006149f98284613d92565b60148201915081905092915050565b6000614a148285613e1f565b602082019150614a248284613e1f565b6020820191508190509392505050565b6000614a408285613ea8565b9150614a4c8284613ea8565b91508190509392505050565b6000602082019050614a6d6000830184613d83565b92915050565b6000608082019050614a886000830187613d83565b614a956020830186613d83565b614aa260408301856149c0565b8181036060830152614ab48184613e36565b905095945050505050565b6000604082019050614ad46000830186613d83565b8181036020830152614ae7818486613da9565b9050949350505050565b6000602082019050614b066000830184613e01565b92915050565b6000602082019050614b216000830184613e10565b92915050565b60006020820190508181036000830152614b418184613e6f565b905092915050565b60006020820190508181036000830152614b6281613ed9565b9050919050565b60006020820190508181036000830152614b8281613f3f565b9050919050565b60006020820190508181036000830152614ba281613fa5565b9050919050565b60006020820190508181036000830152614bc281613fe5565b9050919050565b60006020820190508181036000830152614be28161404b565b9050919050565b60006020820190508181036000830152614c02816140b1565b9050919050565b60006020820190508181036000830152614c2281614117565b9050919050565b60006020820190508181036000830152614c428161417d565b9050919050565b60006020820190508181036000830152614c62816141bd565b9050919050565b60006020820190508181036000830152614c8281614223565b9050919050565b60006020820190508181036000830152614ca281614263565b9050919050565b60006020820190508181036000830152614cc2816142c9565b9050919050565b60006020820190508181036000830152614ce281614309565b9050919050565b60006020820190508181036000830152614d028161436f565b9050919050565b60006020820190508181036000830152614d22816143af565b9050919050565b60006020820190508181036000830152614d4281614415565b9050919050565b60006020820190508181036000830152614d6281614455565b9050919050565b60006020820190508181036000830152614d82816144bb565b9050919050565b60006020820190508181036000830152614da2816144fb565b9050919050565b60006020820190508181036000830152614dc281614561565b9050919050565b60006020820190508181036000830152614de2816145a1565b9050919050565b60006020820190508181036000830152614e0281614607565b9050919050565b60006020820190508181036000830152614e228161466d565b9050919050565b60006020820190508181036000830152614e42816146ad565b9050919050565b60006020820190508181036000830152614e6281614713565b9050919050565b60006020820190508181036000830152614e8281614753565b9050919050565b60006020820190508181036000830152614ea2816147b9565b9050919050565b60006020820190508181036000830152614ec28161481f565b9050919050565b60006020820190508181036000830152614ee28161485f565b9050919050565b60006020820190508181036000830152614f02816148c5565b9050919050565b60006020820190508181036000830152614f228161492b565b9050919050565b6000604082019050614f3e6000830184614991565b92915050565b6000602082019050614f5960008301846149c0565b92915050565b6000602082019050614f7460008301846149cf565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614fa157614fa06153f5565b5b8060405250919050565b600067ffffffffffffffff821115614fc657614fc56153f5565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061503a826151b8565b9150615045836151b8565b9250826fffffffffffffffffffffffffffffffff0382111561506a57615069615368565b5b828201905092915050565b6000615080826151f4565b915061508b836151f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150c0576150bf615368565b5b828201905092915050565b60006150d6826151f4565b91506150e1836151f4565b9250826150f1576150f0615397565b5b828204905092915050565b6000615107826151b8565b9150615112836151b8565b92508282101561512557615124615368565b5b828203905092915050565b600061513b826151f4565b9150615146836151f4565b92508282101561515957615158615368565b5b828203905092915050565b600061516f826151d4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561524f578082015181840152602081019050615234565b8381111561525e576000848401525b50505050565b600061526f826151f4565b9150600082141561528357615282615368565b5b600182039050919050565b600060028204905060018216806152a657607f821691505b602082108114156152ba576152b96153c6565b5b50919050565b60006152cb826151f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152fe576152fd615368565b5b600182019050919050565b600061531482615325565b9050919050565b6000819050919050565b600061533082615435565b9050919050565b6000615342826151f4565b915061534d836151f4565b92508261535d5761535c615397565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61544b81615164565b811461545657600080fd5b50565b61546281615176565b811461546d57600080fd5b50565b61547981615182565b811461548457600080fd5b50565b6154908161518c565b811461549b57600080fd5b50565b600481106154ab57600080fd5b50565b6154b7816151f4565b81146154c257600080fd5b50565b6154ce816151fe565b81146154d957600080fd5b5056fea2646970667358221220c31ca847015640f69d509f5254dcea1e8f5154c88a1178579ac91fb97f5d309764736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c8063715018a61161011a5780639f57f5a0116100ad578063d7224ba01161007c578063d7224ba01461061f578063da39f8cf1461063d578063dc33e68114610659578063e985e9c514610689578063f2fde38b146106b957610206565b80639f57f5a014610587578063a22cb465146105b7578063b88d4fde146105d3578063c87b56dd146105ef57610206565b80638da5cb5b116100e95780638da5cb5b146104fd5780639231ab2a1461051b57806395d89b411461054b5780639cf843b01461056957610206565b8063715018a61461048b57806372b00677146104955780637354fc7e146104b1578063786899ed146104e157610206565b80632d20fb601161019d57806354d77e0e1161016c57806354d77e0e146103c357806355f804b3146103df578063590b2803146103fb5780636352211e1461042b57806370a082311461045b57610206565b80632d20fb601461032b5780632f745c591461034757806342842e0e146103775780634f6ccce71461039357610206565b80630a9cef32116101d95780630a9cef32146102a557806318160ddd146102d557806323b872dd146102f35780632b26fa841461030f57610206565b806301ffc9a71461020b57806306fdde031461023b578063081812fc14610259578063095ea7b314610289575b600080fd5b61022560048036038101906102209190613b4f565b6106d5565b6040516102329190614af1565b60405180910390f35b61024361081f565b6040516102509190614b27565b60405180910390f35b610273600480360381019061026e9190613cf3565b6108b1565b6040516102809190614a58565b60405180910390f35b6102a3600480360381019061029e9190613aea565b610936565b005b6102bf60048036038101906102ba9190613ba1565b610a4f565b6040516102cc9190614b0c565b60405180910390f35b6102dd610a67565b6040516102ea9190614f44565b60405180910390f35b61030d600480360381019061030891906139e4565b610a71565b005b61032960048036038101906103249190613d1c565b610a81565b005b61034560048036038101906103409190613cf3565b610bfd565b005b610361600480360381019061035c9190613aea565b610cdb565b60405161036e9190614f44565b60405180910390f35b610391600480360381019061038c91906139e4565b610ed9565b005b6103ad60048036038101906103a89190613cf3565b610ef9565b6040516103ba9190614f44565b60405180910390f35b6103dd60048036038101906103d89190613bca565b610f4c565b005b6103f960048036038101906103f49190613cae565b611054565b005b61041560048036038101906104109190613ba1565b6110e6565b6040516104229190614f5f565b60405180910390f35b61044560048036038101906104409190613cf3565b611109565b6040516104529190614a58565b60405180910390f35b6104756004803603810190610470919061397f565b61111f565b6040516104829190614f44565b60405180910390f35b610493611208565b005b6104af60048036038101906104aa9190613c72565b611290565b005b6104cb60048036038101906104c69190613ba1565b6113b2565b6040516104d89190614af1565b60405180910390f35b6104fb60048036038101906104f6919061397f565b611503565b005b6105056115c3565b6040516105129190614a58565b60405180910390f35b61053560048036038101906105309190613cf3565b6115ec565b6040516105429190614f29565b60405180910390f35b610553611604565b6040516105609190614b27565b60405180910390f35b610571611696565b60405161057e9190614a58565b60405180910390f35b6105a1600480360381019061059c9190613ba1565b6116bc565b6040516105ae9190614f44565b60405180910390f35b6105d160048036038101906105cc9190613aae565b6117a4565b005b6105ed60048036038101906105e89190613a33565b611925565b005b61060960048036038101906106049190613cf3565b611981565b6040516106169190614b27565b60405180910390f35b610627611a28565b6040516106349190614f44565b60405180910390f35b61065760048036038101906106529190613c06565b611a2e565b005b610673600480360381019061066e919061397f565b611cf9565b6040516106809190614f44565b60405180910390f35b6106a3600480360381019061069e91906139a8565b611d0b565b6040516106b09190614af1565b60405180910390f35b6106d360048036038101906106ce919061397f565b611d9f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610818575061081782611e97565b5b9050919050565b60606002805461082e9061528e565b80601f016020809104026020016040519081016040528092919081815260200182805461085a9061528e565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b5050505050905090565b60006108bc82611f01565b6108fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f290614ee9565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094182611109565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a990614dc9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d1611f0f565b73ffffffffffffffffffffffffffffffffffffffff161480610a0057506109ff816109fa611f0f565b611d0b565b5b610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690614c89565b60405180910390fd5b610a4a838383611f17565b505050565b600c6020528060005260406000206000915090505481565b6000600154905090565b610a7c838383611fc9565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae690614c69565b60405180910390fd5b610afc3361dead85610a71565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff16635231926a3386866040518463ffffffff1660e01b8152600401610b6293929190614abf565b602060405180830381600087803b158015610b7c57600080fd5b505af1158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb49190613b26565b905080610bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bed90614b89565b60405180910390fd5b5050505050565b610c05611f0f565b73ffffffffffffffffffffffffffffffffffffffff16610c236115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610c79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7090614d29565b60405180910390fd5b60026009541415610cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb690614ea9565b60405180910390fd5b6002600981905550610cd081612582565b600160098190555050565b6000610ce68361111f565b8210610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e90614b49565b60405180910390fd5b6000610d31610a67565b905060008060005b83811015610e97576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e2b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e835786841415610e74578195505050505050610ed3565b8380610e7f906152c0565b9450505b508080610e8f906152c0565b915050610d39565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614e69565b60405180910390fd5b92915050565b610ef483838360405180602001604052806000815250611925565b505050565b6000610f03610a67565b8210610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90614be9565b60405180910390fd5b819050919050565b610f54611f0f565b73ffffffffffffffffffffffffffffffffffffffff16610f726115c3565b73ffffffffffffffffffffffffffffffffffffffff1614610fc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbf90614d29565b60405180910390fd5b80600c6000846003811115611006577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381111561103e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8152602001908152602001600020819055505050565b61105c611f0f565b73ffffffffffffffffffffffffffffffffffffffff1661107a6115c3565b73ffffffffffffffffffffffffffffffffffffffff16146110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790614d29565b60405180910390fd5b8181600d91906110e19291906136e9565b505050565b600b6020528060005260406000206000915054906101000a900463ffffffff1681565b600061111482612810565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790614cc9565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611210611f0f565b73ffffffffffffffffffffffffffffffffffffffff1661122e6115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b90614d29565b60405180910390fd5b61128e6000612a13565b565b611298611f0f565b73ffffffffffffffffffffffffffffffffffffffff166112b66115c3565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390614d29565b60405180910390fd5b80600b600084600381111561134a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115611382577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505050565b600080600b60008460038111156113f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381111561142a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff16141561145e57600090506114fe565b600b600083600381111561149b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038111156114d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200190815260200160002060009054906101000a900463ffffffff1663ffffffff1642101590505b919050565b61150b611f0f565b73ffffffffffffffffffffffffffffffffffffffff166115296115c3565b73ffffffffffffffffffffffffffffffffffffffff161461157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614d29565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115f461376f565b6115fd82612810565b9050919050565b6060600380546116139061528e565b80601f016020809104026020016040519081016040528092919081815260200182805461163f9061528e565b801561168c5780601f106116615761010080835404028352916020019161168c565b820191906000526020600020905b81548152906001019060200180831161166f57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806003808111156116f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836003811115611731577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156117405760019050611788565b826003811115611779577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60036117859190615130565b90505b61179133611cf9565b8161179c9190615130565b915050919050565b6117ac611f0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190614d69565b60405180910390fd5b8060076000611827611f0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118d4611f0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119199190614af1565b60405180910390a35050565b611930848484611fc9565b61193c84848484612ad7565b61197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614de9565b60405180910390fd5b50505050565b606061198c82611f01565b6119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614d49565b60405180910390fd5b60006119d5612c6e565b905060008151116119f55760405180602001604052806000815250611a20565b806119ff84612d00565b604051602001611a10929190614a34565b6040516020818303038152906040525b915050919050565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9390614c69565b60405180910390fd5b60008311611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690614b69565b60405180910390fd5b611ae8846113b2565b611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90614c29565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000015b383611b51610a67565b611b5b9190615075565b1115611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390614ce9565b60405180910390fd5b611ba5846116bc565b831115611be7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bde90614e49565b60405180910390fd5b600380811115611c20577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b846003811115611c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611ce957611ca984838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612ead565b611ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdf90614da9565b60405180910390fd5b5b611cf33384612ff3565b50505050565b6000611d0482613011565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611da7611f0f565b73ffffffffffffffffffffffffffffffffffffffff16611dc56115c3565b73ffffffffffffffffffffffffffffffffffffffff1614611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1290614d29565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290614ba9565b60405180910390fd5b611e9481612a13565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611fd482612810565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ffb611f0f565b73ffffffffffffffffffffffffffffffffffffffff1614806120575750612020611f0f565b73ffffffffffffffffffffffffffffffffffffffff1661203f846108b1565b73ffffffffffffffffffffffffffffffffffffffff16145b806120735750612072826000015161206d611f0f565b611d0b565b5b9050806120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ac90614d89565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e90614d09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218e90614c09565b60405180910390fd5b6121a485858560016130fa565b6121b46000848460000151611f17565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661222291906150fc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166122c6919061502f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846123cc9190615075565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125125761244281611f01565b15612511576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461257a8686866001613100565b505050505050565b60006008549050600082116125cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c390614ca9565b60405180910390fd5b6000600183836125dc9190615075565b6125e69190615130565b905060017f00000000000000000000000000000000000000000000000000000000000015b36126159190615130565b81111561264c5760017f00000000000000000000000000000000000000000000000000000000000015b36126499190615130565b90505b61265581611f01565b612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90614e89565b60405180910390fd5b60008290505b8181116127f757600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127e457600061271782612810565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b80806127ef906152c0565b91505061269a565b506001816128059190615075565b600881905550505050565b61281861376f565b61282182611f01565b612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614bc9565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000383106128c45760017f0000000000000000000000000000000000000000000000000000000000000003846128b79190615130565b6128c19190615075565b90505b60008390505b8181106129d2576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129be57809350505050612a0e565b5080806129ca90615264565b9150506128ca565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0590614ec9565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612af88473ffffffffffffffffffffffffffffffffffffffff16613106565b15612c61578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b21611f0f565b8786866040518563ffffffff1660e01b8152600401612b439493929190614a73565b602060405180830381600087803b158015612b5d57600080fd5b505af1925050508015612b8e57506040513d601f19601f82011682018060405250810190612b8b9190613b78565b60015b612c11573d8060008114612bbe576040519150601f19603f3d011682016040523d82523d6000602084013e612bc3565b606091505b50600081511415612c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0090614de9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c66565b600190505b949350505050565b6060600d8054612c7d9061528e565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca99061528e565b8015612cf65780601f10612ccb57610100808354040283529160200191612cf6565b820191906000526020600020905b815481529060010190602001808311612cd957829003601f168201915b5050505050905090565b60606000821415612d48576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ea8565b600082905060005b60008214612d7a578080612d63906152c0565b915050600a82612d7391906150cb565b9150612d50565b60008167ffffffffffffffff811115612dbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612dee5781602001600182028036833780820191505090505b5090505b60008514612ea157600182612e079190615130565b9150600a85612e169190615337565b6030612e229190615075565b60f81b818381518110612e5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e9a91906150cb565b9450612df2565b8093505050505b919050565b6000600380811115612ee8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b836003811115612f21577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612f305760019050612fed565b600033604051602001612f4391906149ed565b604051602081830303815290604052805190602001209050612fe983600c6000876003811115612f9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811115612fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020019081526020016000205483613119565b9150505b92915050565b61300d828260405180602001604052806000815250613130565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307990614c49565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b600080823b905060008111915050919050565b6000826131268584613610565b1490509392505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319e90614e29565b60405180910390fd5b6131b081611f01565b156131f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e790614e09565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003831115613253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324a90614f09565b60405180910390fd5b61326060008583866130fa565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161335d919061502f565b6fffffffffffffffffffffffffffffffff168152602001858360200151613384919061502f565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156135f357818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135936000888488612ad7565b6135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990614de9565b60405180910390fd5b81806135dd906152c0565b92505080806135eb906152c0565b915050613522565b50806001819055506136086000878588613100565b505050505050565b60008082905060005b84518110156136de57600085828151811061365d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161369e578281604051602001613681929190614a08565b6040516020818303038152906040528051906020012092506136ca565b80836040516020016136b1929190614a08565b6040516020818303038152906040528051906020012092505b5080806136d6906152c0565b915050613619565b508091505092915050565b8280546136f59061528e565b90600052602060002090601f016020900481019282613717576000855561375e565b82601f1061373057803560ff191683800117855561375e565b8280016001018555821561375e579182015b8281111561375d578235825591602001919060010190613742565b5b50905061376b91906137a9565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156137c25760008160009055506001016137aa565b5090565b60006137d96137d484614fab565b614f7a565b9050828152602081018484840111156137f157600080fd5b6137fc848285615222565b509392505050565b60008135905061381381615442565b92915050565b60008083601f84011261382b57600080fd5b8235905067ffffffffffffffff81111561384457600080fd5b60208301915083602082028301111561385c57600080fd5b9250929050565b60008135905061387281615459565b92915050565b60008151905061388781615459565b92915050565b60008135905061389c81615470565b92915050565b6000813590506138b181615487565b92915050565b6000815190506138c681615487565b92915050565b600082601f8301126138dd57600080fd5b81356138ed8482602086016137c6565b91505092915050565b6000813590506139058161549e565b92915050565b60008083601f84011261391d57600080fd5b8235905067ffffffffffffffff81111561393657600080fd5b60208301915083600182028301111561394e57600080fd5b9250929050565b600081359050613964816154ae565b92915050565b600081359050613979816154c5565b92915050565b60006020828403121561399157600080fd5b600061399f84828501613804565b91505092915050565b600080604083850312156139bb57600080fd5b60006139c985828601613804565b92505060206139da85828601613804565b9150509250929050565b6000806000606084860312156139f957600080fd5b6000613a0786828701613804565b9350506020613a1886828701613804565b9250506040613a2986828701613955565b9150509250925092565b60008060008060808587031215613a4957600080fd5b6000613a5787828801613804565b9450506020613a6887828801613804565b9350506040613a7987828801613955565b925050606085013567ffffffffffffffff811115613a9657600080fd5b613aa2878288016138cc565b91505092959194509250565b60008060408385031215613ac157600080fd5b6000613acf85828601613804565b9250506020613ae085828601613863565b9150509250929050565b60008060408385031215613afd57600080fd5b6000613b0b85828601613804565b9250506020613b1c85828601613955565b9150509250929050565b600060208284031215613b3857600080fd5b6000613b4684828501613878565b91505092915050565b600060208284031215613b6157600080fd5b6000613b6f848285016138a2565b91505092915050565b600060208284031215613b8a57600080fd5b6000613b98848285016138b7565b91505092915050565b600060208284031215613bb357600080fd5b6000613bc1848285016138f6565b91505092915050565b60008060408385031215613bdd57600080fd5b6000613beb858286016138f6565b9250506020613bfc8582860161388d565b9150509250929050565b60008060008060608587031215613c1c57600080fd5b6000613c2a878288016138f6565b9450506020613c3b87828801613955565b935050604085013567ffffffffffffffff811115613c5857600080fd5b613c6487828801613819565b925092505092959194509250565b60008060408385031215613c8557600080fd5b6000613c93858286016138f6565b9250506020613ca48582860161396a565b9150509250929050565b60008060208385031215613cc157600080fd5b600083013567ffffffffffffffff811115613cdb57600080fd5b613ce78582860161390b565b92509250509250929050565b600060208284031215613d0557600080fd5b6000613d1384828501613955565b91505092915050565b600080600060408486031215613d3157600080fd5b6000613d3f86828701613955565b935050602084013567ffffffffffffffff811115613d5c57600080fd5b613d6886828701613819565b92509250509250925092565b613d7d81615164565b82525050565b613d8c81615164565b82525050565b613da3613d9e82615164565b615309565b82525050565b6000613db58385614ff1565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613de457600080fd5b602083029250613df5838584615222565b82840190509392505050565b613e0a81615176565b82525050565b613e1981615182565b82525050565b613e30613e2b82615182565b61531b565b82525050565b6000613e4182614fdb565b613e4b8185615002565b9350613e5b818560208601615231565b613e6481615424565b840191505092915050565b6000613e7a82614fe6565b613e848185615013565b9350613e94818560208601615231565b613e9d81615424565b840191505092915050565b6000613eb382614fe6565b613ebd8185615024565b9350613ecd818560208601615231565b80840191505092915050565b6000613ee6602283615013565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f4c603383615013565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613fb2601283615013565b91507f4275726e696e67206c6162206661696c656400000000000000000000000000006000830152602082019050919050565b6000613ff2602683615013565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614058602a83615013565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006140be602383615013565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614124602583615013565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061418a601883615013565b91507f73616c6520686173206e6f7420737461727465642079657400000000000000006000830152602082019050919050565b60006141ca603183615013565b91507f455243373231413a206e756d626572206d696e74656420717565727920666f7260008301527f20746865207a65726f20616464726573730000000000000000000000000000006020830152604082019050919050565b6000614230601e83615013565b91507f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006000830152602082019050919050565b6000614270603983615013565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b60006142d6601883615013565b91507f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006000830152602082019050919050565b6000614316602b83615013565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b600061437c601283615013565b91507f72656163686564206d617820737570706c7900000000000000000000000000006000830152602082019050919050565b60006143bc602683615013565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614422602083615013565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614462602f83615013565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006144c8601a83615013565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000614508603283615013565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061456e601483615013565b91507f4e6f7420696e207468652077686974656c6973740000000000000000000000006000830152602082019050919050565b60006145ae602283615013565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614614603383615013565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b600061467a601d83615013565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006146ba602183615013565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614720601683615013565b91507f63616e206e6f74206d696e742074686973206d616e79000000000000000000006000830152602082019050919050565b6000614760602e83615013565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006147c6602683615013565b91507f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008301527f6c65616e757000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061482c601f83615013565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b600061486c602f83615013565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006148d2602d83615013565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614938602283615013565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6040820160008201516149a76000850182613d74565b5060208201516149ba60208501826149de565b50505050565b6149c9816151f4565b82525050565b6149d8816151fe565b82525050565b6149e78161520e565b82525050565b60006149f98284613d92565b60148201915081905092915050565b6000614a148285613e1f565b602082019150614a248284613e1f565b6020820191508190509392505050565b6000614a408285613ea8565b9150614a4c8284613ea8565b91508190509392505050565b6000602082019050614a6d6000830184613d83565b92915050565b6000608082019050614a886000830187613d83565b614a956020830186613d83565b614aa260408301856149c0565b8181036060830152614ab48184613e36565b905095945050505050565b6000604082019050614ad46000830186613d83565b8181036020830152614ae7818486613da9565b9050949350505050565b6000602082019050614b066000830184613e01565b92915050565b6000602082019050614b216000830184613e10565b92915050565b60006020820190508181036000830152614b418184613e6f565b905092915050565b60006020820190508181036000830152614b6281613ed9565b9050919050565b60006020820190508181036000830152614b8281613f3f565b9050919050565b60006020820190508181036000830152614ba281613fa5565b9050919050565b60006020820190508181036000830152614bc281613fe5565b9050919050565b60006020820190508181036000830152614be28161404b565b9050919050565b60006020820190508181036000830152614c02816140b1565b9050919050565b60006020820190508181036000830152614c2281614117565b9050919050565b60006020820190508181036000830152614c428161417d565b9050919050565b60006020820190508181036000830152614c62816141bd565b9050919050565b60006020820190508181036000830152614c8281614223565b9050919050565b60006020820190508181036000830152614ca281614263565b9050919050565b60006020820190508181036000830152614cc2816142c9565b9050919050565b60006020820190508181036000830152614ce281614309565b9050919050565b60006020820190508181036000830152614d028161436f565b9050919050565b60006020820190508181036000830152614d22816143af565b9050919050565b60006020820190508181036000830152614d4281614415565b9050919050565b60006020820190508181036000830152614d6281614455565b9050919050565b60006020820190508181036000830152614d82816144bb565b9050919050565b60006020820190508181036000830152614da2816144fb565b9050919050565b60006020820190508181036000830152614dc281614561565b9050919050565b60006020820190508181036000830152614de2816145a1565b9050919050565b60006020820190508181036000830152614e0281614607565b9050919050565b60006020820190508181036000830152614e228161466d565b9050919050565b60006020820190508181036000830152614e42816146ad565b9050919050565b60006020820190508181036000830152614e6281614713565b9050919050565b60006020820190508181036000830152614e8281614753565b9050919050565b60006020820190508181036000830152614ea2816147b9565b9050919050565b60006020820190508181036000830152614ec28161481f565b9050919050565b60006020820190508181036000830152614ee28161485f565b9050919050565b60006020820190508181036000830152614f02816148c5565b9050919050565b60006020820190508181036000830152614f228161492b565b9050919050565b6000604082019050614f3e6000830184614991565b92915050565b6000602082019050614f5960008301846149c0565b92915050565b6000602082019050614f7460008301846149cf565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614fa157614fa06153f5565b5b8060405250919050565b600067ffffffffffffffff821115614fc657614fc56153f5565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061503a826151b8565b9150615045836151b8565b9250826fffffffffffffffffffffffffffffffff0382111561506a57615069615368565b5b828201905092915050565b6000615080826151f4565b915061508b836151f4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150c0576150bf615368565b5b828201905092915050565b60006150d6826151f4565b91506150e1836151f4565b9250826150f1576150f0615397565b5b828204905092915050565b6000615107826151b8565b9150615112836151b8565b92508282101561512557615124615368565b5b828203905092915050565b600061513b826151f4565b9150615146836151f4565b92508282101561515957615158615368565b5b828203905092915050565b600061516f826151d4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561524f578082015181840152602081019050615234565b8381111561525e576000848401525b50505050565b600061526f826151f4565b9150600082141561528357615282615368565b5b600182039050919050565b600060028204905060018216806152a657607f821691505b602082108114156152ba576152b96153c6565b5b50919050565b60006152cb826151f4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152fe576152fd615368565b5b600182019050919050565b600061531482615325565b9050919050565b6000819050919050565b600061533082615435565b9050919050565b6000615342826151f4565b915061534d836151f4565b92508261535d5761535c615397565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61544b81615164565b811461545657600080fd5b50565b61546281615176565b811461546d57600080fd5b50565b61547981615182565b811461548457600080fd5b50565b6154908161518c565b811461549b57600080fd5b50565b600481106154ab57600080fd5b50565b6154b7816151f4565b81146154c257600080fd5b50565b6154ce816151fe565b81146154d957600080fd5b5056fea2646970667358221220c31ca847015640f69d509f5254dcea1e8f5154c88a1178579ac91fb97f5d309764736f6c63430008000033

Deployed Bytecode Sourcemap

42567:3627:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27947:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29673:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31198:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30761:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43765:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26508:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32048:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42797:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45801:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27139:744;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32253:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26671:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43821:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45687:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43292:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29496:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28373:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41874:94;;;:::i;:::-;;43346:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43483:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42669:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41223:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46054:135;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29828:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42631:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44304:357;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31466:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32473:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29989:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36888:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44864:635;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45933:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31803:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42123:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27947:370;28074:4;28119:25;28104:40;;;:11;:40;;;;:99;;;;28170:33;28155:48;;;:11;:48;;;;28104:99;:160;;;;28229:35;28214:50;;;:11;:50;;;;28104:160;:207;;;;28275:36;28299:11;28275:23;:36::i;:::-;28104:207;28090:221;;27947:370;;;:::o;29673:94::-;29727:13;29756:5;29749:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29673:94;:::o;31198:204::-;31266:7;31290:16;31298:7;31290;:16::i;:::-;31282:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31372:15;:24;31388:7;31372:24;;;;;;;;;;;;;;;;;;;;;31365:31;;31198:204;;;:::o;30761:379::-;30830:13;30846:24;30862:7;30846:15;:24::i;:::-;30830:40;;30891:5;30885:11;;:2;:11;;;;30877:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30976:5;30960:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30985:37;31002:5;31009:12;:10;:12::i;:::-;30985:16;:37::i;:::-;30960:62;30944:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;31106:28;31115:2;31119:7;31128:5;31106:8;:28::i;:::-;30761:379;;;:::o;43765:49::-;;;;;;;;;;;;;;;;;:::o;26508:94::-;26561:7;26584:12;;26577:19;;26508:94;:::o;32048:142::-;32156:28;32166:4;32172:2;32176:7;32156:9;:28::i;:::-;32048:142;;;:::o;42797:375::-;44791:10;44778:23;;:9;:23;;;44770:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42910:86:::1;42923:10;42943:42;42988:7;42910:12;:86::i;:::-;43007:18;43039:14;;;;;;;;;;;43007:47;;43065:11;43079:7;:18;;;43098:10;43110:5;;43079:37;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43065:51;;43135:6;43127:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;44847:1;;42797:375:::0;;;:::o;45801:124::-;41454:12;:10;:12::i;:::-;41443:23;;:7;:5;:7::i;:::-;:23;;;41435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22447:1:::1;23043:7;;:19;;23035:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22447:1;23176:7;:18;;;;45889:28:::2;45908:8;45889:18;:28::i;:::-;22403:1:::1;23355:7;:22;;;;45801:124:::0;:::o;27139:744::-;27248:7;27283:16;27293:5;27283:9;:16::i;:::-;27275:5;:24;27267:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27345:22;27370:13;:11;:13::i;:::-;27345:38;;27390:19;27420:25;27470:9;27465:350;27489:14;27485:1;:18;27465:350;;;27519:31;27553:11;:14;27565:1;27553:14;;;;;;;;;;;27519:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27606:1;27580:28;;:9;:14;;;:28;;;27576:89;;27641:9;:14;;;27621:34;;27576:89;27698:5;27677:26;;:17;:26;;;27673:135;;;27735:5;27720:11;:20;27716:59;;;27762:1;27755:8;;;;;;;;;27716:59;27785:13;;;;;:::i;:::-;;;;27673:135;27465:350;27505:3;;;;;:::i;:::-;;;;27465:350;;;;27821:56;;;;;;;;;;:::i;:::-;;;;;;;;27139:744;;;;;:::o;32253:157::-;32365:39;32382:4;32388:2;32392:7;32365:39;;;;;;;;;;;;:16;:39::i;:::-;32253:157;;;:::o;26671:177::-;26738:7;26770:13;:11;:13::i;:::-;26762:5;:21;26754:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26837:5;26830:12;;26671:177;;;:::o;43821:135::-;41454:12;:10;:12::i;:::-;41443:23;;:7;:5;:7::i;:::-;:23;;;41435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43938:10:::1;43913:12;:22;43926:8;43913:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;;43821:135:::0;;:::o;45687:106::-;41454:12;:10;:12::i;:::-;41443:23;;:7;:5;:7::i;:::-;:23;;;41435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45778:7:::1;;45762:13;:23;;;;;;;:::i;:::-;;45687:106:::0;;:::o;43292:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;29496:118::-;29560:7;29583:20;29595:7;29583:11;:20::i;:::-;:25;;;29576:32;;29496:118;;;:::o;28373:211::-;28437:7;28478:1;28461:19;;:5;:19;;;;28453:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28550:12;:19;28563:5;28550:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28542:36;;28535:43;;28373:211;;;:::o;41874:94::-;41454:12;:10;:12::i;:::-;41443:23;;:7;:5;:7::i;:::-;:23;;;41435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41939:21:::1;41957:1;41939:9;:21::i;:::-;41874:94::o:0;43346:131::-;41454:12;:10;:12::i;:::-;41443:23;;:7;:5;:7::i;:::-;:23;;;41435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43460:9:::1;43436:11;:21;43448:8;43436:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;43346:131:::0;;:::o;43483:211::-;43541:4;43587:1;43562:11;:21;43574:8;43562:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;43558:71;;;43612:5;43605:12;;;;43558:71;43665:11;:21;43677:8;43665:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43646:40;;:15;:40;;43639:47;;43483:211;;;;:::o;42669:120::-;41454:12;:10;:12::i;:::-;41443:23;;:7;:5;:7::i;:::-;:23;;;41435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42766:15:::1;42749:14;;:32;;;;;;;;;;;;;;;;;;42669:120:::0;:::o;41223:87::-;41269:7;41296:6;;;;;;;;;;;41289:13;;41223:87;:::o;46054:135::-;46120:21;;:::i;:::-;46161:20;46173:7;46161:11;:20::i;:::-;46154:27;;46054:135;;;:::o;29828:98::-;29884:13;29913:7;29906:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29828:98;:::o;42631:29::-;;;;;;;;;;;;;:::o;44304:357::-;44367:7;44387:27;44441:15;44429:27;;;;;;;;;;;;;;;;:8;:27;;;;;;;;;;;;;;;;;44425:162;;;44498:1;44473:26;;44425:162;;;44566:8;44561:14;;;;;;;;;;;;;;;;44557:1;:18;;;;:::i;:::-;44532:43;;44425:162;44629:24;44642:10;44629:12;:24::i;:::-;44604:22;:49;;;;:::i;:::-;44597:56;;;44304:357;;;:::o;31466:274::-;31569:12;:10;:12::i;:::-;31557:24;;:8;:24;;;;31549:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31666:8;31621:18;:32;31640:12;:10;:12::i;:::-;31621:32;;;;;;;;;;;;;;;:42;31654:8;31621:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31715:8;31686:48;;31701:12;:10;:12::i;:::-;31686:48;;;31725:8;31686:48;;;;;;:::i;:::-;;;;;;;;31466:274;;:::o;32473:311::-;32610:28;32620:4;32626:2;32630:7;32610:9;:28::i;:::-;32661:48;32684:4;32690:2;32694:7;32703:5;32661:22;:48::i;:::-;32645:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;32473:311;;;;:::o;29989:394::-;30087:13;30128:16;30136:7;30128;:16::i;:::-;30112:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;30218:21;30242:10;:8;:10::i;:::-;30218:34;;30297:1;30279:7;30273:21;:25;:104;;;;;;;;;;;;;;;;;30334:7;30343:18;:7;:16;:18::i;:::-;30317:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30273:104;30259:118;;;29989:394;;;:::o;36888:43::-;;;;:::o;44864:635::-;44791:10;44778:23;;:9;:23;;;44770:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44993:1:::1;44982:8;:12;44974:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45069:18;45078:8;45069;:18::i;:::-;45061:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45163:14;45151:8;45135:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;45127:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45245:23;45259:8;45245:13;:23::i;:::-;45233:8;:35;;45211:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;45345:15;45333:27:::0;::::1;;;;;;;;;;;;;;;:8;:27;;;;;;;;;;;;;;;;;45329:121;;45385:28;45397:8;45407:5;;45385:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;:28::i;:::-;45377:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;45329:121;45460:31;45470:10;45482:8;45460:9;:31::i;:::-;44864:635:::0;;;;:::o;45933:113::-;45991:7;46018:20;46032:5;46018:13;:20::i;:::-;46011:27;;45933:113;;;:::o;31803:186::-;31925:4;31948:18;:25;31967:5;31948:25;;;;;;;;;;;;;;;:35;31974:8;31948:35;;;;;;;;;;;;;;;;;;;;;;;;;31941:42;;31803:186;;;;:::o;42123:192::-;41454:12;:10;:12::i;:::-;41443:23;;:7;:5;:7::i;:::-;:23;;;41435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42232:1:::1;42212:22;;:8;:22;;;;42204:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42288:19;42298:8;42288:9;:19::i;:::-;42123:192:::0;:::o;14115:157::-;14200:4;14239:25;14224:40;;;:11;:40;;;;14217:47;;14115:157;;;:::o;33023:105::-;33080:4;33110:12;;33100:7;:22;33093:29;;33023:105;;;:::o;23990:98::-;24043:7;24070:10;24063:17;;23990:98;:::o;36710:172::-;36834:2;36807:15;:24;36823:7;36807:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36868:7;36864:2;36848:28;;36857:5;36848:28;;;;;;;;;;;;36710:172;;;:::o;35075:1529::-;35172:35;35210:20;35222:7;35210:11;:20::i;:::-;35172:58;;35239:22;35281:13;:18;;;35265:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;35334:12;:10;:12::i;:::-;35310:36;;:20;35322:7;35310:11;:20::i;:::-;:36;;;35265:81;:142;;;;35357:50;35374:13;:18;;;35394:12;:10;:12::i;:::-;35357:16;:50::i;:::-;35265:142;35239:169;;35433:17;35417:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;35565:4;35543:26;;:13;:18;;;:26;;;35527:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;35654:1;35640:16;;:2;:16;;;;35632:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35707:43;35729:4;35735:2;35739:7;35748:1;35707:21;:43::i;:::-;35807:49;35824:1;35828:7;35837:13;:18;;;35807:8;:49::i;:::-;35895:1;35865:12;:18;35878:4;35865:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35931:1;35903:12;:16;35916:2;35903:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35962:43;;;;;;;;35977:2;35962:43;;;;;;35988:15;35962:43;;;;;35939:11;:20;35951:7;35939:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36233:19;36265:1;36255:7;:11;;;;:::i;:::-;36233:33;;36318:1;36277:43;;:11;:24;36289:11;36277:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36273:236;;;36335:20;36343:11;36335:7;:20::i;:::-;36331:171;;;36395:97;;;;;;;;36422:13;:18;;;36395:97;;;;;;36453:13;:28;;;36395:97;;;;;36368:11;:24;36380:11;36368:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36331:171;36273:236;36541:7;36537:2;36522:27;;36531:4;36522:27;;;;;;;;;;;;36556:42;36577:4;36583:2;36587:7;36596:1;36556:20;:42::i;:::-;35075:1529;;;;;;:::o;37036:846::-;37098:25;37126:24;;37098:52;;37176:1;37165:8;:12;37157:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;37213:16;37263:1;37252:8;37232:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;37213:51;;37303:1;37286:14;:18;;;;:::i;:::-;37275:8;:29;37271:81;;;37343:1;37326:14;:18;;;;:::i;:::-;37315:29;;37271:81;37467:17;37475:8;37467:7;:17::i;:::-;37459:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37539:9;37551:17;37539:29;;37534:297;37575:8;37570:1;:13;37534:297;;37634:1;37603:33;;:11;:14;37615:1;37603:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;37599:225;;;37649:31;37683:14;37695:1;37683:11;:14::i;:::-;37649:48;;37725:89;;;;;;;;37752:9;:14;;;37725:89;;;;;;37779:9;:24;;;37725:89;;;;;37708:11;:14;37720:1;37708:14;;;;;;;;;;;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37599:225;;37585:3;;;;;:::i;:::-;;;;37534:297;;;;37875:1;37864:8;:12;;;;:::i;:::-;37837:24;:39;;;;37036:846;;;:::o;28836:606::-;28912:21;;:::i;:::-;28953:16;28961:7;28953;:16::i;:::-;28945:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29025:26;29073:12;29062:7;:23;29058:93;;29142:1;29127:12;29117:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;29096:47;;29058:93;29164:12;29179:7;29164:22;;29159:212;29196:18;29188:4;:26;29159:212;;29233:31;29267:11;:17;29279:4;29267:17;;;;;;;;;;;29233:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29323:1;29297:28;;:9;:14;;;:28;;;29293:71;;29345:9;29338:16;;;;;;;29293:71;29159:212;29216:6;;;;;:::i;:::-;;;;29159:212;;;;29379:57;;;;;;;;;;:::i;:::-;;;;;;;;28836:606;;;;:::o;42323:173::-;42379:16;42398:6;;;;;;;;;;;42379:25;;42424:8;42415:6;;:17;;;;;;;;;;;;;;;;;;42479:8;42448:40;;42469:8;42448:40;;;;;;;;;;;;42323:173;;:::o;38425:690::-;38562:4;38579:15;:2;:13;;;:15::i;:::-;38575:535;;;38634:2;38618:36;;;38655:12;:10;:12::i;:::-;38669:4;38675:7;38684:5;38618:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38605:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38866:1;38849:6;:13;:18;38845:215;;;38882:61;;;;;;;;;;:::i;:::-;;;;;;;;38845:215;39028:6;39022:13;39013:6;39009:2;39005:15;38998:38;38605:464;38750:45;;;38740:55;;;:6;:55;;;;38733:62;;;;;38575:535;39098:4;39091:11;;38425:690;;;;;;;:::o;45565:114::-;45625:13;45658;45651:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45565:114;:::o;1971:723::-;2027:13;2257:1;2248:5;:10;2244:53;;;2275:10;;;;;;;;;;;;;;;;;;;;;2244:53;2307:12;2322:5;2307:20;;2338:14;2363:78;2378:1;2370:4;:9;2363:78;;2396:8;;;;;:::i;:::-;;;;2427:2;2419:10;;;;;:::i;:::-;;;2363:78;;;2451:19;2483:6;2473:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2451:39;;2501:154;2517:1;2508:5;:10;2501:154;;2545:1;2535:11;;;;;:::i;:::-;;;2612:2;2604:5;:10;;;;:::i;:::-;2591:2;:24;;;;:::i;:::-;2578:39;;2561:6;2568;2561:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2641:2;2632:11;;;;;:::i;:::-;;;2501:154;;;2679:6;2665:21;;;;;1971:723;;;;:::o;43962:334::-;44056:4;44089:15;44077:27;;;;;;;;;;;;;;;;:8;:27;;;;;;;;;;;;;;;;;44073:71;;;44128:4;44121:11;;;;44073:71;44154:12;44196:10;44179:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;44169:39;;;;;;44154:54;;44226:62;44245:12;44259;:22;44272:8;44259:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44283:4;44226:18;:62::i;:::-;44219:69;;;43962:334;;;;;:::o;33134:98::-;33199:27;33209:2;33213:8;33199:27;;;;;;;;;;;;:9;:27::i;:::-;33134:98;;:::o;28590:240::-;28651:7;28700:1;28683:19;;:5;:19;;;;28667:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;28791:12;:19;28804:5;28791:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;28783:41;;28776:48;;28590:240;;;:::o;39577:141::-;;;;;:::o;40104:140::-;;;;;:::o;4470:387::-;4530:4;4738:12;4805:7;4793:20;4785:28;;4848:1;4841:4;:8;4834:15;;;4470:387;;;:::o;426:190::-;551:4;604;575:25;588:5;595:4;575:12;:25::i;:::-;:33;568:40;;426:190;;;;;:::o;33571:1272::-;33676:20;33699:12;;33676:35;;33740:1;33726:16;;:2;:16;;;;33718:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33917:21;33925:12;33917:7;:21::i;:::-;33916:22;33908:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33999:12;33987:8;:24;;33979:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34059:61;34089:1;34093:2;34097:12;34111:8;34059:21;:61::i;:::-;34129:30;34162:12;:16;34175:2;34162:16;;;;;;;;;;;;;;;34129:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34204:119;;;;;;;;34254:8;34224:11;:19;;;:39;;;;:::i;:::-;34204:119;;;;;;34307:8;34272:11;:24;;;:44;;;;:::i;:::-;34204:119;;;;;34185:12;:16;34198:2;34185:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34358:43;;;;;;;;34373:2;34358:43;;;;;;34384:15;34358:43;;;;;34330:11;:25;34342:12;34330:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34410:20;34433:12;34410:35;;34459:9;34454:281;34478:8;34474:1;:12;34454:281;;;34532:12;34528:2;34507:38;;34524:1;34507:38;;;;;;;;;;;;34572:59;34603:1;34607:2;34611:12;34625:5;34572:22;:59::i;:::-;34554:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;34713:14;;;;;:::i;:::-;;;;34488:3;;;;;:::i;:::-;;;;34454:281;;;;34758:12;34743;:27;;;;34777:60;34806:1;34810:2;34814:12;34828:8;34777:20;:60::i;:::-;33571:1272;;;;;;:::o;978:701::-;1061:7;1081:20;1104:4;1081:27;;1124:9;1119:523;1143:5;:12;1139:1;:16;1119:523;;;1177:20;1200:5;1206:1;1200:8;;;;;;;;;;;;;;;;;;;;;;1177:31;;1243:12;1227;:28;1223:408;;1397:12;1411;1380:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1370:55;;;;;;1355:70;;1223:408;;;1587:12;1601;1570:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1560:55;;;;;;1545:70;;1223:408;1119:523;1157:3;;;;;:::i;:::-;;;;1119:523;;;;1659:12;1652:19;;;978:701;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;517:367::-;;;650:3;643:4;635:6;631:17;627:27;617:2;;668:1;665;658:12;617:2;704:6;691:20;681:30;;734:18;726:6;723:30;720:2;;;766:1;763;756:12;720:2;803:4;795:6;791:17;779:29;;857:3;849:4;841:6;837:17;827:8;823:32;820:41;817:2;;;874:1;871;864:12;817:2;607:277;;;;;:::o;890:133::-;;971:6;958:20;949:29;;987:30;1011:5;987:30;:::i;:::-;939:84;;;;:::o;1029:137::-;;1114:6;1108:13;1099:22;;1130:30;1154:5;1130:30;:::i;:::-;1089:77;;;;:::o;1172:139::-;;1256:6;1243:20;1234:29;;1272:33;1299:5;1272:33;:::i;:::-;1224:87;;;;:::o;1317:137::-;;1400:6;1387:20;1378:29;;1416:32;1442:5;1416:32;:::i;:::-;1368:86;;;;:::o;1460:141::-;;1547:6;1541:13;1532:22;;1563:32;1589:5;1563:32;:::i;:::-;1522:79;;;;:::o;1620:271::-;;1724:3;1717:4;1709:6;1705:17;1701:27;1691:2;;1742:1;1739;1732:12;1691:2;1782:6;1769:20;1807:78;1881:3;1873:6;1866:4;1858:6;1854:17;1807:78;:::i;:::-;1798:87;;1681:210;;;;;:::o;1897:165::-;;1994:6;1981:20;1972:29;;2010:46;2050:5;2010:46;:::i;:::-;1962:100;;;;:::o;2082:352::-;;;2200:3;2193:4;2185:6;2181:17;2177:27;2167:2;;2218:1;2215;2208:12;2167:2;2254:6;2241:20;2231:30;;2284:18;2276:6;2273:30;2270:2;;;2316:1;2313;2306:12;2270:2;2353:4;2345:6;2341:17;2329:29;;2407:3;2399:4;2391:6;2387:17;2377:8;2373:32;2370:41;2367:2;;;2424:1;2421;2414:12;2367:2;2157:277;;;;;:::o;2440:139::-;;2524:6;2511:20;2502:29;;2540:33;2567:5;2540:33;:::i;:::-;2492:87;;;;:::o;2585:137::-;;2668:6;2655:20;2646:29;;2684:32;2710:5;2684:32;:::i;:::-;2636:86;;;;:::o;2728:262::-;;2836:2;2824:9;2815:7;2811:23;2807:32;2804:2;;;2852:1;2849;2842:12;2804:2;2895:1;2920:53;2965:7;2956:6;2945:9;2941:22;2920:53;:::i;:::-;2910:63;;2866:117;2794:196;;;;:::o;2996:407::-;;;3121:2;3109:9;3100:7;3096:23;3092:32;3089:2;;;3137:1;3134;3127:12;3089:2;3180:1;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;:::i;:::-;3195:63;;3151:117;3307:2;3333:53;3378:7;3369:6;3358:9;3354:22;3333:53;:::i;:::-;3323:63;;3278:118;3079:324;;;;;:::o;3409:552::-;;;;3551:2;3539:9;3530:7;3526:23;3522:32;3519:2;;;3567:1;3564;3557:12;3519:2;3610:1;3635:53;3680:7;3671:6;3660:9;3656:22;3635:53;:::i;:::-;3625:63;;3581:117;3737:2;3763:53;3808:7;3799:6;3788:9;3784:22;3763:53;:::i;:::-;3753:63;;3708:118;3865:2;3891:53;3936:7;3927:6;3916:9;3912:22;3891:53;:::i;:::-;3881:63;;3836:118;3509:452;;;;;:::o;3967:809::-;;;;;4135:3;4123:9;4114:7;4110:23;4106:33;4103:2;;;4152:1;4149;4142:12;4103:2;4195:1;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4166:117;4322:2;4348:53;4393:7;4384:6;4373:9;4369:22;4348:53;:::i;:::-;4338:63;;4293:118;4450:2;4476:53;4521:7;4512:6;4501:9;4497:22;4476:53;:::i;:::-;4466:63;;4421:118;4606:2;4595:9;4591:18;4578:32;4637:18;4629:6;4626:30;4623:2;;;4669:1;4666;4659:12;4623:2;4697:62;4751:7;4742:6;4731:9;4727:22;4697:62;:::i;:::-;4687:72;;4549:220;4093:683;;;;;;;:::o;4782:401::-;;;4904:2;4892:9;4883:7;4879:23;4875:32;4872:2;;;4920:1;4917;4910:12;4872:2;4963:1;4988:53;5033:7;5024:6;5013:9;5009:22;4988:53;:::i;:::-;4978:63;;4934:117;5090:2;5116:50;5158:7;5149:6;5138:9;5134:22;5116:50;:::i;:::-;5106:60;;5061:115;4862:321;;;;;:::o;5189:407::-;;;5314:2;5302:9;5293:7;5289:23;5285:32;5282:2;;;5330:1;5327;5320:12;5282:2;5373:1;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5344:117;5500:2;5526:53;5571:7;5562:6;5551:9;5547:22;5526:53;:::i;:::-;5516:63;;5471:118;5272:324;;;;;:::o;5602:278::-;;5718:2;5706:9;5697:7;5693:23;5689:32;5686:2;;;5734:1;5731;5724:12;5686:2;5777:1;5802:61;5855:7;5846:6;5835:9;5831:22;5802:61;:::i;:::-;5792:71;;5748:125;5676:204;;;;:::o;5886:260::-;;5993:2;5981:9;5972:7;5968:23;5964:32;5961:2;;;6009:1;6006;5999:12;5961:2;6052:1;6077:52;6121:7;6112:6;6101:9;6097:22;6077:52;:::i;:::-;6067:62;;6023:116;5951:195;;;;:::o;6152:282::-;;6270:2;6258:9;6249:7;6245:23;6241:32;6238:2;;;6286:1;6283;6276:12;6238:2;6329:1;6354:63;6409:7;6400:6;6389:9;6385:22;6354:63;:::i;:::-;6344:73;;6300:127;6228:206;;;;:::o;6440:288::-;;6561:2;6549:9;6540:7;6536:23;6532:32;6529:2;;;6577:1;6574;6567:12;6529:2;6620:1;6645:66;6703:7;6694:6;6683:9;6679:22;6645:66;:::i;:::-;6635:76;;6591:130;6519:209;;;;:::o;6734:433::-;;;6872:2;6860:9;6851:7;6847:23;6843:32;6840:2;;;6888:1;6885;6878:12;6840:2;6931:1;6956:66;7014:7;7005:6;6994:9;6990:22;6956:66;:::i;:::-;6946:76;;6902:130;7071:2;7097:53;7142:7;7133:6;7122:9;7118:22;7097:53;:::i;:::-;7087:63;;7042:118;6830:337;;;;;:::o;7173:741::-;;;;;7363:2;7351:9;7342:7;7338:23;7334:32;7331:2;;;7379:1;7376;7369:12;7331:2;7422:1;7447:66;7505:7;7496:6;7485:9;7481:22;7447:66;:::i;:::-;7437:76;;7393:130;7562:2;7588:53;7633:7;7624:6;7613:9;7609:22;7588:53;:::i;:::-;7578:63;;7533:118;7718:2;7707:9;7703:18;7690:32;7749:18;7741:6;7738:30;7735:2;;;7781:1;7778;7771:12;7735:2;7817:80;7889:7;7880:6;7869:9;7865:22;7817:80;:::i;:::-;7799:98;;;;7661:246;7321:593;;;;;;;:::o;7920:431::-;;;8057:2;8045:9;8036:7;8032:23;8028:32;8025:2;;;8073:1;8070;8063:12;8025:2;8116:1;8141:66;8199:7;8190:6;8179:9;8175:22;8141:66;:::i;:::-;8131:76;;8087:130;8256:2;8282:52;8326:7;8317:6;8306:9;8302:22;8282:52;:::i;:::-;8272:62;;8227:117;8015:336;;;;;:::o;8357:395::-;;;8485:2;8473:9;8464:7;8460:23;8456:32;8453:2;;;8501:1;8498;8491:12;8453:2;8572:1;8561:9;8557:17;8544:31;8602:18;8594:6;8591:30;8588:2;;;8634:1;8631;8624:12;8588:2;8670:65;8727:7;8718:6;8707:9;8703:22;8670:65;:::i;:::-;8652:83;;;;8515:230;8443:309;;;;;:::o;8758:262::-;;8866:2;8854:9;8845:7;8841:23;8837:32;8834:2;;;8882:1;8879;8872:12;8834:2;8925:1;8950:53;8995:7;8986:6;8975:9;8971:22;8950:53;:::i;:::-;8940:63;;8896:117;8824:196;;;;:::o;9026:570::-;;;;9186:2;9174:9;9165:7;9161:23;9157:32;9154:2;;;9202:1;9199;9192:12;9154:2;9245:1;9270:53;9315:7;9306:6;9295:9;9291:22;9270:53;:::i;:::-;9260:63;;9216:117;9400:2;9389:9;9385:18;9372:32;9431:18;9423:6;9420:30;9417:2;;;9463:1;9460;9453:12;9417:2;9499:80;9571:7;9562:6;9551:9;9547:22;9499:80;:::i;:::-;9481:98;;;;9343:246;9144:452;;;;;:::o;9602:108::-;9679:24;9697:5;9679:24;:::i;:::-;9674:3;9667:37;9657:53;;:::o;9716:118::-;9803:24;9821:5;9803:24;:::i;:::-;9798:3;9791:37;9781:53;;:::o;9840:157::-;9945:45;9965:24;9983:5;9965:24;:::i;:::-;9945:45;:::i;:::-;9940:3;9933:58;9923:74;;:::o;10033:470::-;;10182:86;10261:6;10256:3;10182:86;:::i;:::-;10175:93;;10292:66;10284:6;10281:78;10278:2;;;10372:1;10369;10362:12;10278:2;10407:4;10399:6;10395:17;10385:27;;10422:43;10458:6;10453:3;10446:5;10422:43;:::i;:::-;10490:6;10485:3;10481:16;10474:23;;10165:338;;;;;:::o;10509:109::-;10590:21;10605:5;10590:21;:::i;:::-;10585:3;10578:34;10568:50;;:::o;10624:118::-;10711:24;10729:5;10711:24;:::i;:::-;10706:3;10699:37;10689:53;;:::o;10748:157::-;10853:45;10873:24;10891:5;10873:24;:::i;:::-;10853:45;:::i;:::-;10848:3;10841:58;10831:74;;:::o;10911:360::-;;11025:38;11057:5;11025:38;:::i;:::-;11079:70;11142:6;11137:3;11079:70;:::i;:::-;11072:77;;11158:52;11203:6;11198:3;11191:4;11184:5;11180:16;11158:52;:::i;:::-;11235:29;11257:6;11235:29;:::i;:::-;11230:3;11226:39;11219:46;;11001:270;;;;;:::o;11277:364::-;;11393:39;11426:5;11393:39;:::i;:::-;11448:71;11512:6;11507:3;11448:71;:::i;:::-;11441:78;;11528:52;11573:6;11568:3;11561:4;11554:5;11550:16;11528:52;:::i;:::-;11605:29;11627:6;11605:29;:::i;:::-;11600:3;11596:39;11589:46;;11369:272;;;;;:::o;11647:377::-;;11781:39;11814:5;11781:39;:::i;:::-;11836:89;11918:6;11913:3;11836:89;:::i;:::-;11829:96;;11934:52;11979:6;11974:3;11967:4;11960:5;11956:16;11934:52;:::i;:::-;12011:6;12006:3;12002:16;11995:23;;11757:267;;;;;:::o;12030:366::-;;12193:67;12257:2;12252:3;12193:67;:::i;:::-;12186:74;;12290:34;12286:1;12281:3;12277:11;12270:55;12356:4;12351:2;12346:3;12342:12;12335:26;12387:2;12382:3;12378:12;12371:19;;12176:220;;;:::o;12402:383::-;;12565:67;12629:2;12624:3;12565:67;:::i;:::-;12558:74;;12662:34;12658:1;12653:3;12649:11;12642:55;12728:21;12723:2;12718:3;12714:12;12707:43;12776:2;12771:3;12767:12;12760:19;;12548:237;;;:::o;12791:316::-;;12954:67;13018:2;13013:3;12954:67;:::i;:::-;12947:74;;13051:20;13047:1;13042:3;13038:11;13031:41;13098:2;13093:3;13089:12;13082:19;;12937:170;;;:::o;13113:370::-;;13276:67;13340:2;13335:3;13276:67;:::i;:::-;13269:74;;13373:34;13369:1;13364:3;13360:11;13353:55;13439:8;13434:2;13429:3;13425:12;13418:30;13474:2;13469:3;13465:12;13458:19;;13259:224;;;:::o;13489:374::-;;13652:67;13716:2;13711:3;13652:67;:::i;:::-;13645:74;;13749:34;13745:1;13740:3;13736:11;13729:55;13815:12;13810:2;13805:3;13801:12;13794:34;13854:2;13849:3;13845:12;13838:19;;13635:228;;;:::o;13869:367::-;;14032:67;14096:2;14091:3;14032:67;:::i;:::-;14025:74;;14129:34;14125:1;14120:3;14116:11;14109:55;14195:5;14190:2;14185:3;14181:12;14174:27;14227:2;14222:3;14218:12;14211:19;;14015:221;;;:::o;14242:369::-;;14405:67;14469:2;14464:3;14405:67;:::i;:::-;14398:74;;14502:34;14498:1;14493:3;14489:11;14482:55;14568:7;14563:2;14558:3;14554:12;14547:29;14602:2;14597:3;14593:12;14586:19;;14388:223;;;:::o;14617:322::-;;14780:67;14844:2;14839:3;14780:67;:::i;:::-;14773:74;;14877:26;14873:1;14868:3;14864:11;14857:47;14930:2;14925:3;14921:12;14914:19;;14763:176;;;:::o;14945:381::-;;15108:67;15172:2;15167:3;15108:67;:::i;:::-;15101:74;;15205:34;15201:1;15196:3;15192:11;15185:55;15271:19;15266:2;15261:3;15257:12;15250:41;15317:2;15312:3;15308:12;15301:19;;15091:235;;;:::o;15332:328::-;;15495:67;15559:2;15554:3;15495:67;:::i;:::-;15488:74;;15592:32;15588:1;15583:3;15579:11;15572:53;15651:2;15646:3;15642:12;15635:19;;15478:182;;;:::o;15666:389::-;;15829:67;15893:2;15888:3;15829:67;:::i;:::-;15822:74;;15926:34;15922:1;15917:3;15913:11;15906:55;15992:27;15987:2;15982:3;15978:12;15971:49;16046:2;16041:3;16037:12;16030:19;;15812:243;;;:::o;16061:322::-;;16224:67;16288:2;16283:3;16224:67;:::i;:::-;16217:74;;16321:26;16317:1;16312:3;16308:11;16301:47;16374:2;16369:3;16365:12;16358:19;;16207:176;;;:::o;16389:375::-;;16552:67;16616:2;16611:3;16552:67;:::i;:::-;16545:74;;16649:34;16645:1;16640:3;16636:11;16629:55;16715:13;16710:2;16705:3;16701:12;16694:35;16755:2;16750:3;16746:12;16739:19;;16535:229;;;:::o;16770:316::-;;16933:67;16997:2;16992:3;16933:67;:::i;:::-;16926:74;;17030:20;17026:1;17021:3;17017:11;17010:41;17077:2;17072:3;17068:12;17061:19;;16916:170;;;:::o;17092:370::-;;17255:67;17319:2;17314:3;17255:67;:::i;:::-;17248:74;;17352:34;17348:1;17343:3;17339:11;17332:55;17418:8;17413:2;17408:3;17404:12;17397:30;17453:2;17448:3;17444:12;17437:19;;17238:224;;;:::o;17468:330::-;;17631:67;17695:2;17690:3;17631:67;:::i;:::-;17624:74;;17728:34;17724:1;17719:3;17715:11;17708:55;17789:2;17784:3;17780:12;17773:19;;17614:184;;;:::o;17804:379::-;;17967:67;18031:2;18026:3;17967:67;:::i;:::-;17960:74;;18064:34;18060:1;18055:3;18051:11;18044:55;18130:17;18125:2;18120:3;18116:12;18109:39;18174:2;18169:3;18165:12;18158:19;;17950:233;;;:::o;18189:324::-;;18352:67;18416:2;18411:3;18352:67;:::i;:::-;18345:74;;18449:28;18445:1;18440:3;18436:11;18429:49;18504:2;18499:3;18495:12;18488:19;;18335:178;;;:::o;18519:382::-;;18682:67;18746:2;18741:3;18682:67;:::i;:::-;18675:74;;18779:34;18775:1;18770:3;18766:11;18759:55;18845:20;18840:2;18835:3;18831:12;18824:42;18892:2;18887:3;18883:12;18876:19;;18665:236;;;:::o;18907:318::-;;19070:67;19134:2;19129:3;19070:67;:::i;:::-;19063:74;;19167:22;19163:1;19158:3;19154:11;19147:43;19216:2;19211:3;19207:12;19200:19;;19053:172;;;:::o;19231:366::-;;19394:67;19458:2;19453:3;19394:67;:::i;:::-;19387:74;;19491:34;19487:1;19482:3;19478:11;19471:55;19557:4;19552:2;19547:3;19543:12;19536:26;19588:2;19583:3;19579:12;19572:19;;19377:220;;;:::o;19603:383::-;;19766:67;19830:2;19825:3;19766:67;:::i;:::-;19759:74;;19863:34;19859:1;19854:3;19850:11;19843:55;19929:21;19924:2;19919:3;19915:12;19908:43;19977:2;19972:3;19968:12;19961:19;;19749:237;;;:::o;19992:327::-;;20155:67;20219:2;20214:3;20155:67;:::i;:::-;20148:74;;20252:31;20248:1;20243:3;20239:11;20232:52;20310:2;20305:3;20301:12;20294:19;;20138:181;;;:::o;20325:365::-;;20488:67;20552:2;20547:3;20488:67;:::i;:::-;20481:74;;20585:34;20581:1;20576:3;20572:11;20565:55;20651:3;20646:2;20641:3;20637:12;20630:25;20681:2;20676:3;20672:12;20665:19;;20471:219;;;:::o;20696:320::-;;20859:67;20923:2;20918:3;20859:67;:::i;:::-;20852:74;;20956:24;20952:1;20947:3;20943:11;20936:45;21007:2;21002:3;20998:12;20991:19;;20842:174;;;:::o;21022:378::-;;21185:67;21249:2;21244:3;21185:67;:::i;:::-;21178:74;;21282:34;21278:1;21273:3;21269:11;21262:55;21348:16;21343:2;21338:3;21334:12;21327:38;21391:2;21386:3;21382:12;21375:19;;21168:232;;;:::o;21406:370::-;;21569:67;21633:2;21628:3;21569:67;:::i;:::-;21562:74;;21666:34;21662:1;21657:3;21653:11;21646:55;21732:8;21727:2;21722:3;21718:12;21711:30;21767:2;21762:3;21758:12;21751:19;;21552:224;;;:::o;21782:329::-;;21945:67;22009:2;22004:3;21945:67;:::i;:::-;21938:74;;22042:33;22038:1;22033:3;22029:11;22022:54;22102:2;22097:3;22093:12;22086:19;;21928:183;;;:::o;22117:379::-;;22280:67;22344:2;22339:3;22280:67;:::i;:::-;22273:74;;22377:34;22373:1;22368:3;22364:11;22357:55;22443:17;22438:2;22433:3;22429:12;22422:39;22487:2;22482:3;22478:12;22471:19;;22263:233;;;:::o;22502:377::-;;22665:67;22729:2;22724:3;22665:67;:::i;:::-;22658:74;;22762:34;22758:1;22753:3;22749:11;22742:55;22828:15;22823:2;22818:3;22814:12;22807:37;22870:2;22865:3;22861:12;22854:19;;22648:231;;;:::o;22885:366::-;;23048:67;23112:2;23107:3;23048:67;:::i;:::-;23041:74;;23145:34;23141:1;23136:3;23132:11;23125:55;23211:4;23206:2;23201:3;23197:12;23190:26;23242:2;23237:3;23233:12;23226:19;;23031:220;;;:::o;23327:527::-;23486:4;23481:3;23477:14;23573:4;23566:5;23562:16;23556:23;23592:63;23649:4;23644:3;23640:14;23626:12;23592:63;:::i;:::-;23501:164;23757:4;23750:5;23746:16;23740:23;23776:61;23831:4;23826:3;23822:14;23808:12;23776:61;:::i;:::-;23675:172;23455:399;;;:::o;23860:118::-;23947:24;23965:5;23947:24;:::i;:::-;23942:3;23935:37;23925:53;;:::o;23984:115::-;24069:23;24086:5;24069:23;:::i;:::-;24064:3;24057:36;24047:52;;:::o;24105:105::-;24180:23;24197:5;24180:23;:::i;:::-;24175:3;24168:36;24158:52;;:::o;24216:256::-;;24343:75;24414:3;24405:6;24343:75;:::i;:::-;24443:2;24438:3;24434:12;24427:19;;24463:3;24456:10;;24332:140;;;;:::o;24478:397::-;;24633:75;24704:3;24695:6;24633:75;:::i;:::-;24733:2;24728:3;24724:12;24717:19;;24746:75;24817:3;24808:6;24746:75;:::i;:::-;24846:2;24841:3;24837:12;24830:19;;24866:3;24859:10;;24622:253;;;;;:::o;24881:435::-;;25083:95;25174:3;25165:6;25083:95;:::i;:::-;25076:102;;25195:95;25286:3;25277:6;25195:95;:::i;:::-;25188:102;;25307:3;25300:10;;25065:251;;;;;:::o;25322:222::-;;25453:2;25442:9;25438:18;25430:26;;25466:71;25534:1;25523:9;25519:17;25510:6;25466:71;:::i;:::-;25420:124;;;;:::o;25550:640::-;;25783:3;25772:9;25768:19;25760:27;;25797:71;25865:1;25854:9;25850:17;25841:6;25797:71;:::i;:::-;25878:72;25946:2;25935:9;25931:18;25922:6;25878:72;:::i;:::-;25960;26028:2;26017:9;26013:18;26004:6;25960:72;:::i;:::-;26079:9;26073:4;26069:20;26064:2;26053:9;26049:18;26042:48;26107:76;26178:4;26169:6;26107:76;:::i;:::-;26099:84;;25750:440;;;;;;;:::o;26196:503::-;;26415:2;26404:9;26400:18;26392:26;;26428:71;26496:1;26485:9;26481:17;26472:6;26428:71;:::i;:::-;26546:9;26540:4;26536:20;26531:2;26520:9;26516:18;26509:48;26574:118;26687:4;26678:6;26670;26574:118;:::i;:::-;26566:126;;26382:317;;;;;;:::o;26705:210::-;;26830:2;26819:9;26815:18;26807:26;;26843:65;26905:1;26894:9;26890:17;26881:6;26843:65;:::i;:::-;26797:118;;;;:::o;26921:222::-;;27052:2;27041:9;27037:18;27029:26;;27065:71;27133:1;27122:9;27118:17;27109:6;27065:71;:::i;:::-;27019:124;;;;:::o;27149:313::-;;27300:2;27289:9;27285:18;27277:26;;27349:9;27343:4;27339:20;27335:1;27324:9;27320:17;27313:47;27377:78;27450:4;27441:6;27377:78;:::i;:::-;27369:86;;27267:195;;;;:::o;27468:419::-;;27672:2;27661:9;27657:18;27649:26;;27721:9;27715:4;27711:20;27707:1;27696:9;27692:17;27685:47;27749:131;27875:4;27749:131;:::i;:::-;27741:139;;27639:248;;;:::o;27893:419::-;;28097:2;28086:9;28082:18;28074:26;;28146:9;28140:4;28136:20;28132:1;28121:9;28117:17;28110:47;28174:131;28300:4;28174:131;:::i;:::-;28166:139;;28064:248;;;:::o;28318:419::-;;28522:2;28511:9;28507:18;28499:26;;28571:9;28565:4;28561:20;28557:1;28546:9;28542:17;28535:47;28599:131;28725:4;28599:131;:::i;:::-;28591:139;;28489:248;;;:::o;28743:419::-;;28947:2;28936:9;28932:18;28924:26;;28996:9;28990:4;28986:20;28982:1;28971:9;28967:17;28960:47;29024:131;29150:4;29024:131;:::i;:::-;29016:139;;28914:248;;;:::o;29168:419::-;;29372:2;29361:9;29357:18;29349:26;;29421:9;29415:4;29411:20;29407:1;29396:9;29392:17;29385:47;29449:131;29575:4;29449:131;:::i;:::-;29441:139;;29339:248;;;:::o;29593:419::-;;29797:2;29786:9;29782:18;29774:26;;29846:9;29840:4;29836:20;29832:1;29821:9;29817:17;29810:47;29874:131;30000:4;29874:131;:::i;:::-;29866:139;;29764:248;;;:::o;30018:419::-;;30222:2;30211:9;30207:18;30199:26;;30271:9;30265:4;30261:20;30257:1;30246:9;30242:17;30235:47;30299:131;30425:4;30299:131;:::i;:::-;30291:139;;30189:248;;;:::o;30443:419::-;;30647:2;30636:9;30632:18;30624:26;;30696:9;30690:4;30686:20;30682:1;30671:9;30667:17;30660:47;30724:131;30850:4;30724:131;:::i;:::-;30716:139;;30614:248;;;:::o;30868:419::-;;31072:2;31061:9;31057:18;31049:26;;31121:9;31115:4;31111:20;31107:1;31096:9;31092:17;31085:47;31149:131;31275:4;31149:131;:::i;:::-;31141:139;;31039:248;;;:::o;31293:419::-;;31497:2;31486:9;31482:18;31474:26;;31546:9;31540:4;31536:20;31532:1;31521:9;31517:17;31510:47;31574:131;31700:4;31574:131;:::i;:::-;31566:139;;31464:248;;;:::o;31718:419::-;;31922:2;31911:9;31907:18;31899:26;;31971:9;31965:4;31961:20;31957:1;31946:9;31942:17;31935:47;31999:131;32125:4;31999:131;:::i;:::-;31991:139;;31889:248;;;:::o;32143:419::-;;32347:2;32336:9;32332:18;32324:26;;32396:9;32390:4;32386:20;32382:1;32371:9;32367:17;32360:47;32424:131;32550:4;32424:131;:::i;:::-;32416:139;;32314:248;;;:::o;32568:419::-;;32772:2;32761:9;32757:18;32749:26;;32821:9;32815:4;32811:20;32807:1;32796:9;32792:17;32785:47;32849:131;32975:4;32849:131;:::i;:::-;32841:139;;32739:248;;;:::o;32993:419::-;;33197:2;33186:9;33182:18;33174:26;;33246:9;33240:4;33236:20;33232:1;33221:9;33217:17;33210:47;33274:131;33400:4;33274:131;:::i;:::-;33266:139;;33164:248;;;:::o;33418:419::-;;33622:2;33611:9;33607:18;33599:26;;33671:9;33665:4;33661:20;33657:1;33646:9;33642:17;33635:47;33699:131;33825:4;33699:131;:::i;:::-;33691:139;;33589:248;;;:::o;33843:419::-;;34047:2;34036:9;34032:18;34024:26;;34096:9;34090:4;34086:20;34082:1;34071:9;34067:17;34060:47;34124:131;34250:4;34124:131;:::i;:::-;34116:139;;34014:248;;;:::o;34268:419::-;;34472:2;34461:9;34457:18;34449:26;;34521:9;34515:4;34511:20;34507:1;34496:9;34492:17;34485:47;34549:131;34675:4;34549:131;:::i;:::-;34541:139;;34439:248;;;:::o;34693:419::-;;34897:2;34886:9;34882:18;34874:26;;34946:9;34940:4;34936:20;34932:1;34921:9;34917:17;34910:47;34974:131;35100:4;34974:131;:::i;:::-;34966:139;;34864:248;;;:::o;35118:419::-;;35322:2;35311:9;35307:18;35299:26;;35371:9;35365:4;35361:20;35357:1;35346:9;35342:17;35335:47;35399:131;35525:4;35399:131;:::i;:::-;35391:139;;35289:248;;;:::o;35543:419::-;;35747:2;35736:9;35732:18;35724:26;;35796:9;35790:4;35786:20;35782:1;35771:9;35767:17;35760:47;35824:131;35950:4;35824:131;:::i;:::-;35816:139;;35714:248;;;:::o;35968:419::-;;36172:2;36161:9;36157:18;36149:26;;36221:9;36215:4;36211:20;36207:1;36196:9;36192:17;36185:47;36249:131;36375:4;36249:131;:::i;:::-;36241:139;;36139:248;;;:::o;36393:419::-;;36597:2;36586:9;36582:18;36574:26;;36646:9;36640:4;36636:20;36632:1;36621:9;36617:17;36610:47;36674:131;36800:4;36674:131;:::i;:::-;36666:139;;36564:248;;;:::o;36818:419::-;;37022:2;37011:9;37007:18;36999:26;;37071:9;37065:4;37061:20;37057:1;37046:9;37042:17;37035:47;37099:131;37225:4;37099:131;:::i;:::-;37091:139;;36989:248;;;:::o;37243:419::-;;37447:2;37436:9;37432:18;37424:26;;37496:9;37490:4;37486:20;37482:1;37471:9;37467:17;37460:47;37524:131;37650:4;37524:131;:::i;:::-;37516:139;;37414:248;;;:::o;37668:419::-;;37872:2;37861:9;37857:18;37849:26;;37921:9;37915:4;37911:20;37907:1;37896:9;37892:17;37885:47;37949:131;38075:4;37949:131;:::i;:::-;37941:139;;37839:248;;;:::o;38093:419::-;;38297:2;38286:9;38282:18;38274:26;;38346:9;38340:4;38336:20;38332:1;38321:9;38317:17;38310:47;38374:131;38500:4;38374:131;:::i;:::-;38366:139;;38264:248;;;:::o;38518:419::-;;38722:2;38711:9;38707:18;38699:26;;38771:9;38765:4;38761:20;38757:1;38746:9;38742:17;38735:47;38799:131;38925:4;38799:131;:::i;:::-;38791:139;;38689:248;;;:::o;38943:419::-;;39147:2;39136:9;39132:18;39124:26;;39196:9;39190:4;39186:20;39182:1;39171:9;39167:17;39160:47;39224:131;39350:4;39224:131;:::i;:::-;39216:139;;39114:248;;;:::o;39368:419::-;;39572:2;39561:9;39557:18;39549:26;;39621:9;39615:4;39611:20;39607:1;39596:9;39592:17;39585:47;39649:131;39775:4;39649:131;:::i;:::-;39641:139;;39539:248;;;:::o;39793:419::-;;39997:2;39986:9;39982:18;39974:26;;40046:9;40040:4;40036:20;40032:1;40021:9;40017:17;40010:47;40074:131;40200:4;40074:131;:::i;:::-;40066:139;;39964:248;;;:::o;40218:419::-;;40422:2;40411:9;40407:18;40399:26;;40471:9;40465:4;40461:20;40457:1;40446:9;40442:17;40435:47;40499:131;40625:4;40499:131;:::i;:::-;40491:139;;40389:248;;;:::o;40643:346::-;;40836:2;40825:9;40821:18;40813:26;;40849:133;40979:1;40968:9;40964:17;40955:6;40849:133;:::i;:::-;40803:186;;;;:::o;40995:222::-;;41126:2;41115:9;41111:18;41103:26;;41139:71;41207:1;41196:9;41192:17;41183:6;41139:71;:::i;:::-;41093:124;;;;:::o;41223:218::-;;41352:2;41341:9;41337:18;41329:26;;41365:69;41431:1;41420:9;41416:17;41407:6;41365:69;:::i;:::-;41319:122;;;;:::o;41447:283::-;;41513:2;41507:9;41497:19;;41555:4;41547:6;41543:17;41662:6;41650:10;41647:22;41626:18;41614:10;41611:34;41608:62;41605:2;;;41673:18;;:::i;:::-;41605:2;41713:10;41709:2;41702:22;41487:243;;;;:::o;41736:331::-;;41887:18;41879:6;41876:30;41873:2;;;41909:18;;:::i;:::-;41873:2;41994:4;41990:9;41983:4;41975:6;41971:17;41967:33;41959:41;;42055:4;42049;42045:15;42037:23;;41802:265;;;:::o;42073:98::-;;42158:5;42152:12;42142:22;;42131:40;;;:::o;42177:99::-;;42263:5;42257:12;42247:22;;42236:40;;;:::o;42282:184::-;;42415:6;42410:3;42403:19;42455:4;42450:3;42446:14;42431:29;;42393:73;;;;:::o;42472:168::-;;42589:6;42584:3;42577:19;42629:4;42624:3;42620:14;42605:29;;42567:73;;;;:::o;42646:169::-;;42764:6;42759:3;42752:19;42804:4;42799:3;42795:14;42780:29;;42742:73;;;;:::o;42821:148::-;;42960:3;42945:18;;42935:34;;;;:::o;42975:273::-;;43034:20;43052:1;43034:20;:::i;:::-;43029:25;;43068:20;43086:1;43068:20;:::i;:::-;43063:25;;43190:1;43154:34;43150:42;43147:1;43144:49;43141:2;;;43196:18;;:::i;:::-;43141:2;43240:1;43237;43233:9;43226:16;;43019:229;;;;:::o;43254:305::-;;43313:20;43331:1;43313:20;:::i;:::-;43308:25;;43347:20;43365:1;43347:20;:::i;:::-;43342:25;;43501:1;43433:66;43429:74;43426:1;43423:81;43420:2;;;43507:18;;:::i;:::-;43420:2;43551:1;43548;43544:9;43537:16;;43298:261;;;;:::o;43565:185::-;;43622:20;43640:1;43622:20;:::i;:::-;43617:25;;43656:20;43674:1;43656:20;:::i;:::-;43651:25;;43695:1;43685:2;;43700:18;;:::i;:::-;43685:2;43742:1;43739;43735:9;43730:14;;43607:143;;;;:::o;43756:191::-;;43816:20;43834:1;43816:20;:::i;:::-;43811:25;;43850:20;43868:1;43850:20;:::i;:::-;43845:25;;43889:1;43886;43883:8;43880:2;;;43894:18;;:::i;:::-;43880:2;43939:1;43936;43932:9;43924:17;;43801:146;;;;:::o;43953:191::-;;44013:20;44031:1;44013:20;:::i;:::-;44008:25;;44047:20;44065:1;44047:20;:::i;:::-;44042:25;;44086:1;44083;44080:8;44077:2;;;44091:18;;:::i;:::-;44077:2;44136:1;44133;44129:9;44121:17;;43998:146;;;;:::o;44150:96::-;;44216:24;44234:5;44216:24;:::i;:::-;44205:35;;44195:51;;;:::o;44252:90::-;;44329:5;44322:13;44315:21;44304:32;;44294:48;;;:::o;44348:77::-;;44414:5;44403:16;;44393:32;;;:::o;44431:149::-;;44507:66;44500:5;44496:78;44485:89;;44475:105;;;:::o;44586:118::-;;44663:34;44656:5;44652:46;44641:57;;44631:73;;;:::o;44710:126::-;;44787:42;44780:5;44776:54;44765:65;;44755:81;;;:::o;44842:77::-;;44908:5;44897:16;;44887:32;;;:::o;44925:93::-;;45001:10;44994:5;44990:22;44979:33;;44969:49;;;:::o;45024:101::-;;45100:18;45093:5;45089:30;45078:41;;45068:57;;;:::o;45131:154::-;45215:6;45210:3;45205;45192:30;45277:1;45268:6;45263:3;45259:16;45252:27;45182:103;;;:::o;45291:307::-;45359:1;45369:113;45383:6;45380:1;45377:13;45369:113;;;45468:1;45463:3;45459:11;45453:18;45449:1;45444:3;45440:11;45433:39;45405:2;45402:1;45398:10;45393:15;;45369:113;;;45500:6;45497:1;45494:13;45491:2;;;45580:1;45571:6;45566:3;45562:16;45555:27;45491:2;45340:258;;;;:::o;45604:171::-;;45666:24;45684:5;45666:24;:::i;:::-;45657:33;;45712:4;45705:5;45702:15;45699:2;;;45720:18;;:::i;:::-;45699:2;45767:1;45760:5;45756:13;45749:20;;45647:128;;;:::o;45781:320::-;;45862:1;45856:4;45852:12;45842:22;;45909:1;45903:4;45899:12;45930:18;45920:2;;45986:4;45978:6;45974:17;45964:27;;45920:2;46048;46040:6;46037:14;46017:18;46014:38;46011:2;;;46067:18;;:::i;:::-;46011:2;45832:269;;;;:::o;46107:233::-;;46169:24;46187:5;46169:24;:::i;:::-;46160:33;;46215:66;46208:5;46205:77;46202:2;;;46285:18;;:::i;:::-;46202:2;46332:1;46325:5;46321:13;46314:20;;46150:190;;;:::o;46346:100::-;;46414:26;46434:5;46414:26;:::i;:::-;46403:37;;46393:53;;;:::o;46452:79::-;;46520:5;46509:16;;46499:32;;;:::o;46537:94::-;;46605:20;46619:5;46605:20;:::i;:::-;46594:31;;46584:47;;;:::o;46637:176::-;;46686:20;46704:1;46686:20;:::i;:::-;46681:25;;46720:20;46738:1;46720:20;:::i;:::-;46715:25;;46759:1;46749:2;;46764:18;;:::i;:::-;46749:2;46805:1;46802;46798:9;46793:14;;46671:142;;;;:::o;46819:180::-;46867:77;46864:1;46857:88;46964:4;46961:1;46954:15;46988:4;46985:1;46978:15;47005:180;47053:77;47050:1;47043:88;47150:4;47147:1;47140:15;47174:4;47171:1;47164:15;47191:180;47239:77;47236:1;47229:88;47336:4;47333:1;47326:15;47360:4;47357:1;47350:15;47377:180;47425:77;47422:1;47415:88;47522:4;47519:1;47512:15;47546:4;47543:1;47536:15;47563:102;;47655:2;47651:7;47646:2;47639:5;47635:14;47631:28;47621:38;;47611:54;;;:::o;47671:94::-;;47752:5;47748:2;47744:14;47723:35;;47713:52;;;:::o;47771:122::-;47844:24;47862:5;47844:24;:::i;:::-;47837:5;47834:35;47824:2;;47883:1;47880;47873:12;47824:2;47814:79;:::o;47899:116::-;47969:21;47984:5;47969:21;:::i;:::-;47962:5;47959:32;47949:2;;48005:1;48002;47995:12;47949:2;47939:76;:::o;48021:122::-;48094:24;48112:5;48094:24;:::i;:::-;48087:5;48084:35;48074:2;;48133:1;48130;48123:12;48074:2;48064:79;:::o;48149:120::-;48221:23;48238:5;48221:23;:::i;:::-;48214:5;48211:34;48201:2;;48259:1;48256;48249:12;48201:2;48191:78;:::o;48275:112::-;48361:1;48354:5;48351:12;48341:2;;48377:1;48374;48367:12;48341:2;48331:56;:::o;48393:122::-;48466:24;48484:5;48466:24;:::i;:::-;48459:5;48456:35;48446:2;;48505:1;48502;48495:12;48446:2;48436:79;:::o;48521:120::-;48593:23;48610:5;48593:23;:::i;:::-;48586:5;48583:34;48573:2;;48631:1;48628;48621:12;48573:2;48563:78;:::o

Swarm Source

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