ETH Price: $3,113.45 (+1.39%)
Gas: 5 Gwei

Token

CoffeeCentral (CoffeeCentral)
 

Overview

Max Total Supply

269 CoffeeCentral

Holders

128

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
403yyc.eth
Balance
1 CoffeeCentral
0x705b1ac7614c8b5f454ae3df200c028b3740a59f
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:
CoffeeCentral

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-12
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0;

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
  function onERC721Received(
    address operator,
    address from,
    uint256 id,
    bytes calldata data
  ) external returns (bytes4);
}
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.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);
}

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

// OpenZeppelin Contracts v4.4.1 (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;
}
// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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);
}
// OpenZeppelin Contracts v4.4.1 (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);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// OpenZeppelin Contracts v4.4.1 (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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

contract CoffeeCentral is ReentrancyGuard, Ownable, ERC721A{


    using Strings for uint256;
    using SafeMath for uint256;

    bytes32 public merkleRoot;

    uint256 constant public maxNFT = 3333;
 
    address payable private community = payable(0xbA7aF85144e6b291d573C54844F2b72131e321EE);  //31%
    address payable private papa = payable(0xB64c5058C3D395F074EBF78a19c9b556885369B4);  //15%
    address payable private sonny = payable(0x87c56882216A3Ae8d2A1530b1A413dA144a721C1); //15%
    address payable private zee = payable(0xBFe37A45B9DDd6ff170FF15090d35BFE6eCCb475); //2.5%
    address payable private reid = payable(0x840D6cf4A07C3e2D1A8a814194805e18f3451528); //5.5%
    address payable private artist = payable(0x54FFEDEc1a91A58799eB11914ec0f1B20579A014); //15% 
    address payable private dev = payable(0xc98205d77a98be4378D56165959A990Da8c30735);  //16%

    mapping(address => uint256 ) public presaleClaim;

   
    bool public activePublic;
    bool public activePresale;

    uint256 public constant whiteListPrice = 25000000000000000;
    uint256 public constant publicPrice = 35000000000000000;

    string private _prefixURI;

    event Activate(bool activepresale,bool activepublic);
    event SetMerkleRoot(bytes32 merkleRoot);

    /* royalties */
    uint256 private _royaltyBps;
    address payable private _royaltyRecipient;

    bytes4 private constant _INTERFACE_ID_ROYALTIES = 0xbb3bafd6; //bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6
    bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; //bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;

    constructor(bytes32 _merkleRoot) ERC721A("CoffeeCentral", "CoffeeCentral", 10, 3333){

        _royaltyRecipient = payable(msg.sender);
        _royaltyBps = 250;
        merkleRoot = _merkleRoot;
        _prefixURI = "https://ipfs.io/ipfs/";
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;

        emit SetMerkleRoot(merkleRoot);
    }

    /**
     * @dev Activate mint
     */
    function activate(bool _activePresale, bool _activePublic) external onlyOwner{

        activePublic = _activePublic;
        activePresale = _activePresale;

        emit Activate(activePresale,activePublic);
    }


    function setPrefixURI(string calldata uri) external onlyOwner {
        _prefixURI = uri;
    }

    function tokenURI(uint256 tokenId) public view override returns(string memory) {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");
        return string(abi.encodePacked(_prefixURI, tokenId.toString()));
    }

    function PresaleMint(
        uint256 amount,
        bytes32[] calldata merkleProof
    ) public payable nonReentrant {

        require(msg.sender == tx.origin, "NOT EOA");

        require(activePresale && !activePublic,"InactivePresale");

        require(amount > 0 && amount <= 5, "Bad amount");
        require(whiteListPrice.mul(amount) <= msg.value, "Ether value sent is not correct");
        require(totalSupply() + amount <= maxNFT, "Too many Claimed");
        require(presaleClaim[msg.sender] + amount <= 5, "Too many Presale Claimed");

        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(merkleProof, merkleRoot, node),
            "MerkleDistributor: Invalid proof."
        );

        presaleClaim[msg.sender]  += amount;

        _safeMint(msg.sender, amount);
    }


    function publicMint(uint256 amount) public payable nonReentrant{

        require(msg.sender == tx.origin, "NOT EOA");

        require(!activePresale && activePublic, "InactivePublic");

        require(amount > 0 && amount <= 10, "bad amount");
        require(publicPrice.mul(amount) <= msg.value, "Ether value sent is not correct");
        require(totalSupply() + amount <= maxNFT, "Too many Claimed");

        _safeMint(msg.sender, amount);
    }

    function giftMint(address[] memory _addrs, uint[] memory _amount) public onlyOwner{
        uint totalQuantity = 0;
        
        for(uint i = 0; i < _addrs.length; i ++){
            totalQuantity += _amount[i];
        }

        require( totalSupply() + totalQuantity <= maxNFT, "Max Limit");

        for(uint i = 0; i < _addrs.length; i ++){
            _safeMint(_addrs[i], _amount[i]);
        }
    }


    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) {
        return ERC721A.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES
               || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE;
    }

     /**
     * ROYALTIES implem: check EIP-2981 https://eips.ethereum.org/EIPS/eip-2981
     **/

    function updateRoyalties(address payable recipient, uint256 bps) external onlyOwner {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function getRoyalties(uint256) external view returns (address payable[] memory recipients, uint256[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return (recipients, bps);
    }

    function getFeeRecipients(uint256) external view returns (address payable[] memory recipients) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
        }
        return recipients;
    }

    function getFeeBps(uint256) external view returns (uint[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, value*_royaltyBps/10000);
    }

    function sendFund(address Addr, uint256 Share) internal {
          (bool success, ) = Addr.call{value: Share}("");
          require(success, "Withdrawal failed"); 
    }

    function withdraw() external onlyOwner {
       require(address(this).balance > 0, "No balance to withdraw");
        
        uint papaShare = address(this).balance.mul(15000).div(100000);
        uint sonnyShare = address(this).balance.mul(15000).div(100000);
        uint artistShare = address(this).balance.mul(15000).div(100000);
        uint zeeShare = address(this).balance.mul(2500).div(100000);
        uint reidShare = address(this).balance.mul(5500).div(100000);
        uint devShare = address(this).balance.mul(16000).div(100000);
    
        sendFund(papa, papaShare);
        sendFund(sonny, sonnyShare);
        sendFund(artist, artistShare);
        sendFund(zee, zeeShare);
        sendFund(reid, reidShare);
        sendFund(dev, devShare);

        sendFund(community, address(this).balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"activepresale","type":"bool"},{"indexed":false,"internalType":"bool","name":"activepublic","type":"bool"}],"name":"Activate","type":"event"},{"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":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"SetMerkleRoot","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"PresaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_activePresale","type":"bool"},{"internalType":"bool","name":"_activePublic","type":"bool"}],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activePresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"giftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"","type":"address"}],"name":"presaleClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setPrefixURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260006002819055600955600b80546001600160a01b031990811673ba7af85144e6b291d573c54844f2b72131e321ee17909155600c8054821673b64c5058c3d395f074ebf78a19c9b556885369b4179055600d805482167387c56882216a3ae8d2a1530b1a413da144a721c1179055600e8054821673bfe37a45b9ddd6ff170ff15090d35bfe6eccb475179055600f8054821673840d6cf4a07c3e2d1a8a814194805e18f34515281790556010805482167354ffedec1a91a58799eb11914ec0f1b20579a0141790556011805490911673c98205d77a98be4378d56165959a990da8c30735179055348015620000f957600080fd5b5060405162003534380380620035348339810160408190526200011c91620003d2565b604080518082018252600d8082526c10dbd999995950d95b9d1c985b609a1b6020808401829052845180860190955291845290830152600160005590600a610d056200016833620002da565b60008111620001d55760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002375760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620001cc565b83516200024c9060039060208701906200032c565b508251620002629060049060208601906200032c565b5060a0919091526080525050601680546001600160a01b0319163317905560fa6015908155600a829055604080518082019091528181527f68747470733a2f2f697066732e696f2f697066732f0000000000000000000000602091909101908152620002d291601491906200032c565b505062000429565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200033a90620003ec565b90600052602060002090601f0160209004810192826200035e5760008555620003a9565b82601f106200037957805160ff1916838001178555620003a9565b82800160010185558215620003a9579182015b82811115620003a95782518255916020019190600101906200038c565b50620003b7929150620003bb565b5090565b5b80821115620003b75760008155600101620003bc565b600060208284031215620003e557600080fd5b5051919050565b600181811c908216806200040157607f821691505b602082108114156200042357634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516130da6200045a60003960008181611f9601528181611fc001526123ef0152600050506130da6000f3fe6080604052600436106102305760003560e01c80636ea5d1781161012e578063b3e47ba3116100ab578063d7224ba01161006f578063d7224ba0146106a7578063e456b01c146106bd578063e985e9c5146106d3578063eb1909b51461071c578063f2fde38b1461073657600080fd5b8063b3e47ba3146105ed578063b88d4fde1461060c578063b9c4d9fb1461062c578063bb3bafd614610659578063c87b56dd1461068757600080fd5b806395d89b41116100f257806395d89b411461055d578063a22cb46514610572578063a7abc12414610592578063a945bf80146105b2578063b2c94ee6146105cd57600080fd5b80636ea5d178146104ca57806370a08231146104ea578063715018a61461050a5780637cb647591461051f5780638da5cb5b1461053f57600080fd5b80632eb4a7ab116101bc5780634f6ccce7116101805780634f6ccce71461043c5780636352211e1461045c57806364bfaaf71461047c578063685756851461048f5780636c2f5acd146104aa57600080fd5b80632eb4a7ab146103a45780632f745c59146103ba57806338f9d571146103da5780633ccfd60b1461040757806342842e0e1461041c57600080fd5b80630ebd4c7f116102035780630ebd4c7f146102e657806318160ddd1461031357806323b872dd146103325780632a55205a146103525780632db115441461039157600080fd5b806301ffc9a71461023557806306fdde031461026a578063081812fc1461028c578063095ea7b3146102c4575b600080fd5b34801561024157600080fd5b50610255610250366004612a4d565b610756565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061027f6107b8565b6040516102619190612d85565b34801561029857600080fd5b506102ac6102a7366004612a34565b61084a565b6040516001600160a01b039091168152602001610261565b3480156102d057600080fd5b506102e46102df3660046127b0565b6108da565b005b3480156102f257600080fd5b50610306610301366004612a34565b6109f2565b6040516102619190612d72565b34801561031f57600080fd5b506002545b604051908152602001610261565b34801561033e57600080fd5b506102e461034d366004612815565b610a4e565b34801561035e57600080fd5b5061037261036d366004612b78565b610a59565b604080516001600160a01b039093168352602083019190915201610261565b6102e461039f366004612a34565b610a93565b3480156103b057600080fd5b50610324600a5481565b3480156103c657600080fd5b506103246103d53660046127b0565b610c8f565b3480156103e657600080fd5b506103246103f5366004612793565b60126020526000908152604090205481565b34801561041357600080fd5b506102e4610e08565b34801561042857600080fd5b506102e4610437366004612815565b610fae565b34801561044857600080fd5b50610324610457366004612a34565b610fc9565b34801561046857600080fd5b506102ac610477366004612a34565b611032565b6102e461048a366004612af9565b611044565b34801561049b57600080fd5b506103246658d15e1762800081565b3480156104b657600080fd5b506102e46104c53660046127b0565b6113a5565b3480156104d657600080fd5b506102e46104e536600461294f565b6113f5565b3480156104f657600080fd5b50610324610505366004612793565b611517565b34801561051657600080fd5b506102e46115a8565b34801561052b57600080fd5b506102e461053a366004612a34565b6115de565b34801561054b57600080fd5b506001546001600160a01b03166102ac565b34801561056957600080fd5b5061027f611643565b34801561057e57600080fd5b506102e461058d36600461291a565b611652565b34801561059e57600080fd5b506102e46105ad366004612a18565b611717565b3480156105be57600080fd5b50610324667c58508723800081565b3480156105d957600080fd5b506102e46105e8366004612a87565b6117ac565b3480156105f957600080fd5b5060135461025590610100900460ff1681565b34801561061857600080fd5b506102e4610627366004612856565b6117e2565b34801561063857600080fd5b5061064c610647366004612a34565b611815565b6040516102619190612d3a565b34801561066557600080fd5b50610679610674366004612a34565b61188e565b604051610261929190612d4d565b34801561069357600080fd5b5061027f6106a2366004612a34565b611942565b3480156106b357600080fd5b5061032460095481565b3480156106c957600080fd5b50610324610d0581565b3480156106df57600080fd5b506102556106ee3660046127dc565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561072857600080fd5b506013546102559060ff1681565b34801561074257600080fd5b506102e4610751366004612793565b61199d565b600061076182611a38565b8061077c57506001600160e01b03198216635d9dd7eb60e11b145b8061079757506001600160e01b0319821663152a902d60e11b145b806107b257506001600160e01b03198216632dde656160e21b145b92915050565b6060600380546107c790612fb7565b80601f01602080910402602001604051908101604052809291908181526020018280546107f390612fb7565b80156108405780601f1061081557610100808354040283529160200191610840565b820191906000526020600020905b81548152906001019060200180831161082357829003601f168201915b5050505050905090565b6000610857826002541190565b6108be5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006108e582611032565b9050806001600160a01b0316836001600160a01b031614156109545760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108b5565b336001600160a01b0382161480610970575061097081336106ee565b6109e25760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108b5565b6109ed838383611aa3565b505050565b6016546060906001600160a01b031615610a4957604080516001808252818301909252906020808301908036833701905050905060155481600081518110610a3c57610a3c61304d565b6020026020010181815250505b919050565b6109ed838383611aff565b60165460155460009182916001600160a01b039091169061271090610a7e9086612f16565b610a889190612f02565b915091509250929050565b60026000541415610ae65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b5565b6002600055333214610b245760405162461bcd60e51b81526020600482015260076024820152664e4f5420454f4160c81b60448201526064016108b5565b601354610100900460ff16158015610b3e575060135460ff165b610b7b5760405162461bcd60e51b815260206004820152600e60248201526d496e6163746976655075626c696360901b60448201526064016108b5565b600081118015610b8c5750600a8111155b610bc55760405162461bcd60e51b815260206004820152600a60248201526918985908185b5bdd5b9d60b21b60448201526064016108b5565b34610bd7667c58508723800083611e83565b1115610c255760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016108b5565b610d0581610c3260025490565b610c3c9190612eea565b1115610c7d5760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4810db185a5b595960821b60448201526064016108b5565b610c873382611e96565b506001600055565b6000610c9a83611517565b8210610cf35760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108b5565b6000610cfe60025490565b905060008060005b83811015610da8576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610d5957805192505b876001600160a01b0316836001600160a01b03161415610d955786841415610d87575093506107b292505050565b83610d9181612ff2565b9450505b5080610da081612ff2565b915050610d06565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108b5565b6001546001600160a01b03163314610e325760405162461bcd60e51b81526004016108b590612de2565b60004711610e7b5760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016108b5565b6000610e96620186a0610e9047613a98611e83565b90611eb4565b90506000610ead620186a0610e9047613a98611e83565b90506000610ec4620186a0610e9047613a98611e83565b90506000610edb620186a0610e90476109c4611e83565b90506000610ef2620186a0610e904761157c611e83565b90506000610f09620186a0610e9047613e80611e83565b600c54909150610f22906001600160a01b031687611ec0565b600d54610f38906001600160a01b031686611ec0565b601054610f4e906001600160a01b031685611ec0565b600e54610f64906001600160a01b031684611ec0565b600f54610f7a906001600160a01b031683611ec0565b601154610f90906001600160a01b031682611ec0565b600b54610fa6906001600160a01b031647611ec0565b505050505050565b6109ed838383604051806020016040528060008152506117e2565b6000610fd460025490565b821061102e5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108b5565b5090565b600061103d82611f57565b5192915050565b600260005414156110975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b5565b60026000553332146110d55760405162461bcd60e51b81526020600482015260076024820152664e4f5420454f4160c81b60448201526064016108b5565b601354610100900460ff1680156110ef575060135460ff16155b61112d5760405162461bcd60e51b815260206004820152600f60248201526e496e61637469766550726573616c6560881b60448201526064016108b5565b60008311801561113e575060058311155b6111775760405162461bcd60e51b815260206004820152600a60248201526910985908185b5bdd5b9d60b21b60448201526064016108b5565b346111896658d15e1762800085611e83565b11156111d75760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016108b5565b610d05836111e460025490565b6111ee9190612eea565b111561122f5760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4810db185a5b595960821b60448201526064016108b5565b3360009081526012602052604090205460059061124d908590612eea565b111561129b5760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e792050726573616c6520436c61696d6564000000000000000060448201526064016108b5565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061131583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506120be565b61136b5760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b60648201526084016108b5565b336000908152601260205260408120805486929061138a908490612eea565b9091555061139a90503385611e96565b505060016000555050565b6001546001600160a01b031633146113cf5760405162461bcd60e51b81526004016108b590612de2565b601680546001600160a01b0319166001600160a01b039390931692909217909155601555565b6001546001600160a01b0316331461141f5760405162461bcd60e51b81526004016108b590612de2565b6000805b83518110156114655782818151811061143e5761143e61304d565b6020026020010151826114519190612eea565b91508061145d81612ff2565b915050611423565b50610d058161147360025490565b61147d9190612eea565b11156114b75760405162461bcd60e51b815260206004820152600960248201526813585e08131a5b5a5d60ba1b60448201526064016108b5565b60005b8351811015611511576114ff8482815181106114d8576114d861304d565b60200260200101518483815181106114f2576114f261304d565b6020026020010151611e96565b8061150981612ff2565b9150506114ba565b50505050565b60006001600160a01b0382166115835760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108b5565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6001546001600160a01b031633146115d25760405162461bcd60e51b81526004016108b590612de2565b6115dc60006120d4565b565b6001546001600160a01b031633146116085760405162461bcd60e51b81526004016108b590612de2565b600a8190556040518181527f914960aef5e033ce5cae8a7992d4b7a6f0f9741227b66acb67c605b7019f8a469060200160405180910390a150565b6060600480546107c790612fb7565b6001600160a01b0382163314156116ab5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108b5565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001546001600160a01b031633146117415760405162461bcd60e51b81526004016108b590612de2565b6013805461ffff191682151561ff00191617610100841515810291909117918290556040805160ff92840483161515815291909216151560208201527ff6962bb7d59cfbc1f5b7288cf68707b8a6a9d76dc51fbd98a1aeb236e7ba384b910160405180910390a15050565b6001546001600160a01b031633146117d65760405162461bcd60e51b81526004016108b590612de2565b6109ed60148383612681565b6117ed848484611aff565b6117f984848484612126565b6115115760405162461bcd60e51b81526004016108b590612e17565b6016546060906001600160a01b031615610a49576040805160018082528183019092529060208083019080368337505060165482519293506001600160a01b0316918391506000906118695761186961304d565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b60165460609081906001600160a01b03161561193d576040805160018082528183019092529060208083019080368337505060165482519294506001600160a01b0316918491506000906118e4576118e461304d565b6001600160a01b0392909216602092830291909101820152604080516001808252818301909252918281019080368337019050509050601554816000815181106119305761193061304d565b6020026020010181815250505b915091565b606061194f826002541190565b61196b5760405162461bcd60e51b81526004016108b590612d98565b601461197683612234565b604051602001611987929190612c56565b6040516020818303038152906040529050919050565b6001546001600160a01b031633146119c75760405162461bcd60e51b81526004016108b590612de2565b6001600160a01b038116611a2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b5565b611a35816120d4565b50565b60006001600160e01b031982166380ac58cd60e01b1480611a6957506001600160e01b03198216635b5e139f60e01b145b80611a8457506001600160e01b0319821663780e9d6360e01b145b806107b257506301ffc9a760e01b6001600160e01b03198316146107b2565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b0a82611f57565b80519091506000906001600160a01b0316336001600160a01b03161480611b41575033611b368461084a565b6001600160a01b0316145b80611b5357508151611b5390336106ee565b905080611bbd5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108b5565b846001600160a01b031682600001516001600160a01b031614611c315760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108b5565b6001600160a01b038416611c955760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108b5565b611ca56000848460000151611aa3565b6001600160a01b0385166000908152600660205260408120805460019290611cd79084906001600160801b0316612f35565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d2391859116612ebf565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611dab846001612eea565b6000818152600560205260409020549091506001600160a01b0316611e3d57611dd5816002541190565b15611e3d5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fa6565b6000611e8f8284612f16565b9392505050565b611eb0828260405180602001604052806000815250612332565b5050565b6000611e8f8284612f02565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f0d576040519150601f19603f3d011682016040523d82523d6000602084013e611f12565b606091505b50509050806109ed5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016108b5565b6040805180820190915260008082526020820152611f76826002541190565b611f925760405162461bcd60e51b81526004016108b590612d98565b60007f00000000000000000000000000000000000000000000000000000000000000008310611ff357611fe57f000000000000000000000000000000000000000000000000000000000000000084612f5d565b611ff0906001612eea565b90505b825b81811061205d576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561204a57949350505050565b508061205581612fa0565b915050611ff5565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108b5565b6000826120cb858461260d565b14949350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561222857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061216a903390899088908890600401612cfd565b602060405180830381600087803b15801561218457600080fd5b505af19250505080156121b4575060408051601f3d908101601f191682019092526121b191810190612a6a565b60015b61220e573d8080156121e2576040519150601f19603f3d011682016040523d82523d6000602084013e6121e7565b606091505b5080516122065760405162461bcd60e51b81526004016108b590612e17565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061222c565b5060015b949350505050565b6060816122585750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612282578061226c81612ff2565b915061227b9050600a83612f02565b915061225c565b60008167ffffffffffffffff81111561229d5761229d613063565b6040519080825280601f01601f1916602001820160405280156122c7576020820181803683370190505b5090505b841561222c576122dc600183612f5d565b91506122e9600a8661300d565b6122f4906030612eea565b60f81b8183815181106123095761230961304d565b60200101906001600160f81b031916908160001a90535061232b600a86612f02565b94506122cb565b6002546001600160a01b0384166123955760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108b5565b6123a0816002541190565b156123ed5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108b5565b7f00000000000000000000000000000000000000000000000000000000000000008311156124685760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108b5565b6001600160a01b0384166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906124c4908790612ebf565b6001600160801b031681526020018583602001516124e29190612ebf565b6001600160801b039081169091526001600160a01b0380881660008181526006602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156126025760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125c66000888488612126565b6125e25760405162461bcd60e51b81526004016108b590612e17565b816125ec81612ff2565b92505080806125fa90612ff2565b915050612579565b506002819055610fa6565b600081815b845181101561267957600085828151811061262f5761262f61304d565b602002602001015190508083116126555760008381526020829052604090209250612666565b600081815260208490526040902092505b508061267181612ff2565b915050612612565b509392505050565b82805461268d90612fb7565b90600052602060002090601f0160209004810192826126af57600085556126f5565b82601f106126c85782800160ff198235161785556126f5565b828001600101855582156126f5579182015b828111156126f55782358255916020019190600101906126da565b5061102e9291505b8082111561102e57600081556001016126fd565b600082601f83011261272257600080fd5b8135602061273761273283612e9b565b612e6a565b80838252828201915082860187848660051b890101111561275757600080fd5b60005b858110156127765781358452928401929084019060010161275a565b5090979650505050505050565b80358015158114610a4957600080fd5b6000602082840312156127a557600080fd5b8135611e8f81613079565b600080604083850312156127c357600080fd5b82356127ce81613079565b946020939093013593505050565b600080604083850312156127ef57600080fd5b82356127fa81613079565b9150602083013561280a81613079565b809150509250929050565b60008060006060848603121561282a57600080fd5b833561283581613079565b9250602084013561284581613079565b929592945050506040919091013590565b6000806000806080858703121561286c57600080fd5b843561287781613079565b935060208581013561288881613079565b935060408601359250606086013567ffffffffffffffff808211156128ac57600080fd5b818801915088601f8301126128c057600080fd5b8135818111156128d2576128d2613063565b6128e4601f8201601f19168501612e6a565b915080825289848285010111156128fa57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561292d57600080fd5b823561293881613079565b915061294660208401612783565b90509250929050565b6000806040838503121561296257600080fd5b823567ffffffffffffffff8082111561297a57600080fd5b818501915085601f83011261298e57600080fd5b8135602061299e61273283612e9b565b8083825282820191508286018a848660051b89010111156129be57600080fd5b600096505b848710156129ea5780356129d681613079565b8352600196909601959183019183016129c3565b5096505086013592505080821115612a0157600080fd5b50612a0e85828601612711565b9150509250929050565b60008060408385031215612a2b57600080fd5b61293883612783565b600060208284031215612a4657600080fd5b5035919050565b600060208284031215612a5f57600080fd5b8135611e8f8161308e565b600060208284031215612a7c57600080fd5b8151611e8f8161308e565b60008060208385031215612a9a57600080fd5b823567ffffffffffffffff80821115612ab257600080fd5b818501915085601f830112612ac657600080fd5b813581811115612ad557600080fd5b866020828501011115612ae757600080fd5b60209290920196919550909350505050565b600080600060408486031215612b0e57600080fd5b83359250602084013567ffffffffffffffff80821115612b2d57600080fd5b818601915086601f830112612b4157600080fd5b813581811115612b5057600080fd5b8760208260051b8501011115612b6557600080fd5b6020830194508093505050509250925092565b60008060408385031215612b8b57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015612bd35781516001600160a01b031687529582019590820190600101612bae565b509495945050505050565b600081518084526020808501945080840160005b83811015612bd357815187529582019590820190600101612bf2565b60008151808452612c26816020860160208601612f74565b601f01601f19169290920160200192915050565b60008151612c4c818560208601612f74565b9290920192915050565b600080845481600182811c915080831680612c7257607f831692505b6020808410821415612c9257634e487b7160e01b86526022600452602486fd5b818015612ca65760018114612cb757612ce4565b60ff19861689528489019650612ce4565b60008b81526020902060005b86811015612cdc5781548b820152908501908301612cc3565b505084890196505b505050505050612cf48185612c3a565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3090830184612c0e565b9695505050505050565b602081526000611e8f6020830184612b9a565b604081526000612d606040830185612b9a565b8281036020840152612cf48185612bde565b602081526000611e8f6020830184612bde565b602081526000611e8f6020830184612c0e565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e9357612e93613063565b604052919050565b600067ffffffffffffffff821115612eb557612eb5613063565b5060051b60200190565b60006001600160801b03808316818516808303821115612ee157612ee1613021565b01949350505050565b60008219821115612efd57612efd613021565b500190565b600082612f1157612f11613037565b500490565b6000816000190483118215151615612f3057612f30613021565b500290565b60006001600160801b0383811690831681811015612f5557612f55613021565b039392505050565b600082821015612f6f57612f6f613021565b500390565b60005b83811015612f8f578181015183820152602001612f77565b838111156115115750506000910152565b600081612faf57612faf613021565b506000190190565b600181811c90821680612fcb57607f821691505b60208210811415612fec57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561300657613006613021565b5060010190565b60008261301c5761301c613037565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a3557600080fd5b6001600160e01b031981168114611a3557600080fdfea26469706673582212209d4c1bebdb2f44df9769da6bb9173596452107870593bbb69ab324da3498ea5164736f6c63430008070033c4252599d0b2fe3e1f903fd51526b3f724033b626214ed002a8506ce11dffe48

Deployed Bytecode

0x6080604052600436106102305760003560e01c80636ea5d1781161012e578063b3e47ba3116100ab578063d7224ba01161006f578063d7224ba0146106a7578063e456b01c146106bd578063e985e9c5146106d3578063eb1909b51461071c578063f2fde38b1461073657600080fd5b8063b3e47ba3146105ed578063b88d4fde1461060c578063b9c4d9fb1461062c578063bb3bafd614610659578063c87b56dd1461068757600080fd5b806395d89b41116100f257806395d89b411461055d578063a22cb46514610572578063a7abc12414610592578063a945bf80146105b2578063b2c94ee6146105cd57600080fd5b80636ea5d178146104ca57806370a08231146104ea578063715018a61461050a5780637cb647591461051f5780638da5cb5b1461053f57600080fd5b80632eb4a7ab116101bc5780634f6ccce7116101805780634f6ccce71461043c5780636352211e1461045c57806364bfaaf71461047c578063685756851461048f5780636c2f5acd146104aa57600080fd5b80632eb4a7ab146103a45780632f745c59146103ba57806338f9d571146103da5780633ccfd60b1461040757806342842e0e1461041c57600080fd5b80630ebd4c7f116102035780630ebd4c7f146102e657806318160ddd1461031357806323b872dd146103325780632a55205a146103525780632db115441461039157600080fd5b806301ffc9a71461023557806306fdde031461026a578063081812fc1461028c578063095ea7b3146102c4575b600080fd5b34801561024157600080fd5b50610255610250366004612a4d565b610756565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061027f6107b8565b6040516102619190612d85565b34801561029857600080fd5b506102ac6102a7366004612a34565b61084a565b6040516001600160a01b039091168152602001610261565b3480156102d057600080fd5b506102e46102df3660046127b0565b6108da565b005b3480156102f257600080fd5b50610306610301366004612a34565b6109f2565b6040516102619190612d72565b34801561031f57600080fd5b506002545b604051908152602001610261565b34801561033e57600080fd5b506102e461034d366004612815565b610a4e565b34801561035e57600080fd5b5061037261036d366004612b78565b610a59565b604080516001600160a01b039093168352602083019190915201610261565b6102e461039f366004612a34565b610a93565b3480156103b057600080fd5b50610324600a5481565b3480156103c657600080fd5b506103246103d53660046127b0565b610c8f565b3480156103e657600080fd5b506103246103f5366004612793565b60126020526000908152604090205481565b34801561041357600080fd5b506102e4610e08565b34801561042857600080fd5b506102e4610437366004612815565b610fae565b34801561044857600080fd5b50610324610457366004612a34565b610fc9565b34801561046857600080fd5b506102ac610477366004612a34565b611032565b6102e461048a366004612af9565b611044565b34801561049b57600080fd5b506103246658d15e1762800081565b3480156104b657600080fd5b506102e46104c53660046127b0565b6113a5565b3480156104d657600080fd5b506102e46104e536600461294f565b6113f5565b3480156104f657600080fd5b50610324610505366004612793565b611517565b34801561051657600080fd5b506102e46115a8565b34801561052b57600080fd5b506102e461053a366004612a34565b6115de565b34801561054b57600080fd5b506001546001600160a01b03166102ac565b34801561056957600080fd5b5061027f611643565b34801561057e57600080fd5b506102e461058d36600461291a565b611652565b34801561059e57600080fd5b506102e46105ad366004612a18565b611717565b3480156105be57600080fd5b50610324667c58508723800081565b3480156105d957600080fd5b506102e46105e8366004612a87565b6117ac565b3480156105f957600080fd5b5060135461025590610100900460ff1681565b34801561061857600080fd5b506102e4610627366004612856565b6117e2565b34801561063857600080fd5b5061064c610647366004612a34565b611815565b6040516102619190612d3a565b34801561066557600080fd5b50610679610674366004612a34565b61188e565b604051610261929190612d4d565b34801561069357600080fd5b5061027f6106a2366004612a34565b611942565b3480156106b357600080fd5b5061032460095481565b3480156106c957600080fd5b50610324610d0581565b3480156106df57600080fd5b506102556106ee3660046127dc565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561072857600080fd5b506013546102559060ff1681565b34801561074257600080fd5b506102e4610751366004612793565b61199d565b600061076182611a38565b8061077c57506001600160e01b03198216635d9dd7eb60e11b145b8061079757506001600160e01b0319821663152a902d60e11b145b806107b257506001600160e01b03198216632dde656160e21b145b92915050565b6060600380546107c790612fb7565b80601f01602080910402602001604051908101604052809291908181526020018280546107f390612fb7565b80156108405780601f1061081557610100808354040283529160200191610840565b820191906000526020600020905b81548152906001019060200180831161082357829003601f168201915b5050505050905090565b6000610857826002541190565b6108be5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006108e582611032565b9050806001600160a01b0316836001600160a01b031614156109545760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108b5565b336001600160a01b0382161480610970575061097081336106ee565b6109e25760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108b5565b6109ed838383611aa3565b505050565b6016546060906001600160a01b031615610a4957604080516001808252818301909252906020808301908036833701905050905060155481600081518110610a3c57610a3c61304d565b6020026020010181815250505b919050565b6109ed838383611aff565b60165460155460009182916001600160a01b039091169061271090610a7e9086612f16565b610a889190612f02565b915091509250929050565b60026000541415610ae65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b5565b6002600055333214610b245760405162461bcd60e51b81526020600482015260076024820152664e4f5420454f4160c81b60448201526064016108b5565b601354610100900460ff16158015610b3e575060135460ff165b610b7b5760405162461bcd60e51b815260206004820152600e60248201526d496e6163746976655075626c696360901b60448201526064016108b5565b600081118015610b8c5750600a8111155b610bc55760405162461bcd60e51b815260206004820152600a60248201526918985908185b5bdd5b9d60b21b60448201526064016108b5565b34610bd7667c58508723800083611e83565b1115610c255760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016108b5565b610d0581610c3260025490565b610c3c9190612eea565b1115610c7d5760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4810db185a5b595960821b60448201526064016108b5565b610c873382611e96565b506001600055565b6000610c9a83611517565b8210610cf35760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108b5565b6000610cfe60025490565b905060008060005b83811015610da8576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610d5957805192505b876001600160a01b0316836001600160a01b03161415610d955786841415610d87575093506107b292505050565b83610d9181612ff2565b9450505b5080610da081612ff2565b915050610d06565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108b5565b6001546001600160a01b03163314610e325760405162461bcd60e51b81526004016108b590612de2565b60004711610e7b5760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016108b5565b6000610e96620186a0610e9047613a98611e83565b90611eb4565b90506000610ead620186a0610e9047613a98611e83565b90506000610ec4620186a0610e9047613a98611e83565b90506000610edb620186a0610e90476109c4611e83565b90506000610ef2620186a0610e904761157c611e83565b90506000610f09620186a0610e9047613e80611e83565b600c54909150610f22906001600160a01b031687611ec0565b600d54610f38906001600160a01b031686611ec0565b601054610f4e906001600160a01b031685611ec0565b600e54610f64906001600160a01b031684611ec0565b600f54610f7a906001600160a01b031683611ec0565b601154610f90906001600160a01b031682611ec0565b600b54610fa6906001600160a01b031647611ec0565b505050505050565b6109ed838383604051806020016040528060008152506117e2565b6000610fd460025490565b821061102e5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108b5565b5090565b600061103d82611f57565b5192915050565b600260005414156110975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108b5565b60026000553332146110d55760405162461bcd60e51b81526020600482015260076024820152664e4f5420454f4160c81b60448201526064016108b5565b601354610100900460ff1680156110ef575060135460ff16155b61112d5760405162461bcd60e51b815260206004820152600f60248201526e496e61637469766550726573616c6560881b60448201526064016108b5565b60008311801561113e575060058311155b6111775760405162461bcd60e51b815260206004820152600a60248201526910985908185b5bdd5b9d60b21b60448201526064016108b5565b346111896658d15e1762800085611e83565b11156111d75760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016108b5565b610d05836111e460025490565b6111ee9190612eea565b111561122f5760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4810db185a5b595960821b60448201526064016108b5565b3360009081526012602052604090205460059061124d908590612eea565b111561129b5760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e792050726573616c6520436c61696d6564000000000000000060448201526064016108b5565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061131583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506120be565b61136b5760405162461bcd60e51b815260206004820152602160248201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666044820152601760f91b60648201526084016108b5565b336000908152601260205260408120805486929061138a908490612eea565b9091555061139a90503385611e96565b505060016000555050565b6001546001600160a01b031633146113cf5760405162461bcd60e51b81526004016108b590612de2565b601680546001600160a01b0319166001600160a01b039390931692909217909155601555565b6001546001600160a01b0316331461141f5760405162461bcd60e51b81526004016108b590612de2565b6000805b83518110156114655782818151811061143e5761143e61304d565b6020026020010151826114519190612eea565b91508061145d81612ff2565b915050611423565b50610d058161147360025490565b61147d9190612eea565b11156114b75760405162461bcd60e51b815260206004820152600960248201526813585e08131a5b5a5d60ba1b60448201526064016108b5565b60005b8351811015611511576114ff8482815181106114d8576114d861304d565b60200260200101518483815181106114f2576114f261304d565b6020026020010151611e96565b8061150981612ff2565b9150506114ba565b50505050565b60006001600160a01b0382166115835760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108b5565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6001546001600160a01b031633146115d25760405162461bcd60e51b81526004016108b590612de2565b6115dc60006120d4565b565b6001546001600160a01b031633146116085760405162461bcd60e51b81526004016108b590612de2565b600a8190556040518181527f914960aef5e033ce5cae8a7992d4b7a6f0f9741227b66acb67c605b7019f8a469060200160405180910390a150565b6060600480546107c790612fb7565b6001600160a01b0382163314156116ab5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108b5565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6001546001600160a01b031633146117415760405162461bcd60e51b81526004016108b590612de2565b6013805461ffff191682151561ff00191617610100841515810291909117918290556040805160ff92840483161515815291909216151560208201527ff6962bb7d59cfbc1f5b7288cf68707b8a6a9d76dc51fbd98a1aeb236e7ba384b910160405180910390a15050565b6001546001600160a01b031633146117d65760405162461bcd60e51b81526004016108b590612de2565b6109ed60148383612681565b6117ed848484611aff565b6117f984848484612126565b6115115760405162461bcd60e51b81526004016108b590612e17565b6016546060906001600160a01b031615610a49576040805160018082528183019092529060208083019080368337505060165482519293506001600160a01b0316918391506000906118695761186961304d565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b60165460609081906001600160a01b03161561193d576040805160018082528183019092529060208083019080368337505060165482519294506001600160a01b0316918491506000906118e4576118e461304d565b6001600160a01b0392909216602092830291909101820152604080516001808252818301909252918281019080368337019050509050601554816000815181106119305761193061304d565b6020026020010181815250505b915091565b606061194f826002541190565b61196b5760405162461bcd60e51b81526004016108b590612d98565b601461197683612234565b604051602001611987929190612c56565b6040516020818303038152906040529050919050565b6001546001600160a01b031633146119c75760405162461bcd60e51b81526004016108b590612de2565b6001600160a01b038116611a2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108b5565b611a35816120d4565b50565b60006001600160e01b031982166380ac58cd60e01b1480611a6957506001600160e01b03198216635b5e139f60e01b145b80611a8457506001600160e01b0319821663780e9d6360e01b145b806107b257506301ffc9a760e01b6001600160e01b03198316146107b2565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b0a82611f57565b80519091506000906001600160a01b0316336001600160a01b03161480611b41575033611b368461084a565b6001600160a01b0316145b80611b5357508151611b5390336106ee565b905080611bbd5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108b5565b846001600160a01b031682600001516001600160a01b031614611c315760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108b5565b6001600160a01b038416611c955760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108b5565b611ca56000848460000151611aa3565b6001600160a01b0385166000908152600660205260408120805460019290611cd79084906001600160801b0316612f35565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d2391859116612ebf565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611dab846001612eea565b6000818152600560205260409020549091506001600160a01b0316611e3d57611dd5816002541190565b15611e3d5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fa6565b6000611e8f8284612f16565b9392505050565b611eb0828260405180602001604052806000815250612332565b5050565b6000611e8f8284612f02565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f0d576040519150601f19603f3d011682016040523d82523d6000602084013e611f12565b606091505b50509050806109ed5760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016108b5565b6040805180820190915260008082526020820152611f76826002541190565b611f925760405162461bcd60e51b81526004016108b590612d98565b60007f000000000000000000000000000000000000000000000000000000000000000a8310611ff357611fe57f000000000000000000000000000000000000000000000000000000000000000a84612f5d565b611ff0906001612eea565b90505b825b81811061205d576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561204a57949350505050565b508061205581612fa0565b915050611ff5565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108b5565b6000826120cb858461260d565b14949350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561222857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061216a903390899088908890600401612cfd565b602060405180830381600087803b15801561218457600080fd5b505af19250505080156121b4575060408051601f3d908101601f191682019092526121b191810190612a6a565b60015b61220e573d8080156121e2576040519150601f19603f3d011682016040523d82523d6000602084013e6121e7565b606091505b5080516122065760405162461bcd60e51b81526004016108b590612e17565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061222c565b5060015b949350505050565b6060816122585750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612282578061226c81612ff2565b915061227b9050600a83612f02565b915061225c565b60008167ffffffffffffffff81111561229d5761229d613063565b6040519080825280601f01601f1916602001820160405280156122c7576020820181803683370190505b5090505b841561222c576122dc600183612f5d565b91506122e9600a8661300d565b6122f4906030612eea565b60f81b8183815181106123095761230961304d565b60200101906001600160f81b031916908160001a90535061232b600a86612f02565b94506122cb565b6002546001600160a01b0384166123955760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108b5565b6123a0816002541190565b156123ed5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108b5565b7f000000000000000000000000000000000000000000000000000000000000000a8311156124685760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108b5565b6001600160a01b0384166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906124c4908790612ebf565b6001600160801b031681526020018583602001516124e29190612ebf565b6001600160801b039081169091526001600160a01b0380881660008181526006602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156126025760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125c66000888488612126565b6125e25760405162461bcd60e51b81526004016108b590612e17565b816125ec81612ff2565b92505080806125fa90612ff2565b915050612579565b506002819055610fa6565b600081815b845181101561267957600085828151811061262f5761262f61304d565b602002602001015190508083116126555760008381526020829052604090209250612666565b600081815260208490526040902092505b508061267181612ff2565b915050612612565b509392505050565b82805461268d90612fb7565b90600052602060002090601f0160209004810192826126af57600085556126f5565b82601f106126c85782800160ff198235161785556126f5565b828001600101855582156126f5579182015b828111156126f55782358255916020019190600101906126da565b5061102e9291505b8082111561102e57600081556001016126fd565b600082601f83011261272257600080fd5b8135602061273761273283612e9b565b612e6a565b80838252828201915082860187848660051b890101111561275757600080fd5b60005b858110156127765781358452928401929084019060010161275a565b5090979650505050505050565b80358015158114610a4957600080fd5b6000602082840312156127a557600080fd5b8135611e8f81613079565b600080604083850312156127c357600080fd5b82356127ce81613079565b946020939093013593505050565b600080604083850312156127ef57600080fd5b82356127fa81613079565b9150602083013561280a81613079565b809150509250929050565b60008060006060848603121561282a57600080fd5b833561283581613079565b9250602084013561284581613079565b929592945050506040919091013590565b6000806000806080858703121561286c57600080fd5b843561287781613079565b935060208581013561288881613079565b935060408601359250606086013567ffffffffffffffff808211156128ac57600080fd5b818801915088601f8301126128c057600080fd5b8135818111156128d2576128d2613063565b6128e4601f8201601f19168501612e6a565b915080825289848285010111156128fa57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561292d57600080fd5b823561293881613079565b915061294660208401612783565b90509250929050565b6000806040838503121561296257600080fd5b823567ffffffffffffffff8082111561297a57600080fd5b818501915085601f83011261298e57600080fd5b8135602061299e61273283612e9b565b8083825282820191508286018a848660051b89010111156129be57600080fd5b600096505b848710156129ea5780356129d681613079565b8352600196909601959183019183016129c3565b5096505086013592505080821115612a0157600080fd5b50612a0e85828601612711565b9150509250929050565b60008060408385031215612a2b57600080fd5b61293883612783565b600060208284031215612a4657600080fd5b5035919050565b600060208284031215612a5f57600080fd5b8135611e8f8161308e565b600060208284031215612a7c57600080fd5b8151611e8f8161308e565b60008060208385031215612a9a57600080fd5b823567ffffffffffffffff80821115612ab257600080fd5b818501915085601f830112612ac657600080fd5b813581811115612ad557600080fd5b866020828501011115612ae757600080fd5b60209290920196919550909350505050565b600080600060408486031215612b0e57600080fd5b83359250602084013567ffffffffffffffff80821115612b2d57600080fd5b818601915086601f830112612b4157600080fd5b813581811115612b5057600080fd5b8760208260051b8501011115612b6557600080fd5b6020830194508093505050509250925092565b60008060408385031215612b8b57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015612bd35781516001600160a01b031687529582019590820190600101612bae565b509495945050505050565b600081518084526020808501945080840160005b83811015612bd357815187529582019590820190600101612bf2565b60008151808452612c26816020860160208601612f74565b601f01601f19169290920160200192915050565b60008151612c4c818560208601612f74565b9290920192915050565b600080845481600182811c915080831680612c7257607f831692505b6020808410821415612c9257634e487b7160e01b86526022600452602486fd5b818015612ca65760018114612cb757612ce4565b60ff19861689528489019650612ce4565b60008b81526020902060005b86811015612cdc5781548b820152908501908301612cc3565b505084890196505b505050505050612cf48185612c3a565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3090830184612c0e565b9695505050505050565b602081526000611e8f6020830184612b9a565b604081526000612d606040830185612b9a565b8281036020840152612cf48185612bde565b602081526000611e8f6020830184612bde565b602081526000611e8f6020830184612c0e565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612e9357612e93613063565b604052919050565b600067ffffffffffffffff821115612eb557612eb5613063565b5060051b60200190565b60006001600160801b03808316818516808303821115612ee157612ee1613021565b01949350505050565b60008219821115612efd57612efd613021565b500190565b600082612f1157612f11613037565b500490565b6000816000190483118215151615612f3057612f30613021565b500290565b60006001600160801b0383811690831681811015612f5557612f55613021565b039392505050565b600082821015612f6f57612f6f613021565b500390565b60005b83811015612f8f578181015183820152602001612f77565b838111156115115750506000910152565b600081612faf57612faf613021565b506000190190565b600181811c90821680612fcb57607f821691505b60208210811415612fec57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561300657613006613021565b5060010190565b60008261301c5761301c613037565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611a3557600080fd5b6001600160e01b031981168114611a3557600080fdfea26469706673582212209d4c1bebdb2f44df9769da6bb9173596452107870593bbb69ab324da3498ea5164736f6c63430008070033

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

c4252599d0b2fe3e1f903fd51526b3f724033b626214ed002a8506ce11dffe48

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0xc4252599d0b2fe3e1f903fd51526b3f724033b626214ed002a8506ce11dffe48

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : c4252599d0b2fe3e1f903fd51526b3f724033b626214ed002a8506ce11dffe48


Deployed Bytecode Sourcemap

51432:7368:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56074:322;;;;;;;;;;-1:-1:-1;56074:322:0;;;;;:::i;:::-;;:::i;:::-;;;13124:14:1;;13117:22;13099:41;;13087:2;13072:18;56074:322:0;;;;;;;;24323:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25848:204::-;;;;;;;;;;-1:-1:-1;25848:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11093:32:1;;;11075:51;;11063:2;11048:18;25848:204:0;10929:203:1;25411:379:0;;;;;;;;;;-1:-1:-1;25411:379:0;;;;;:::i;:::-;;:::i;:::-;;57372:232;;;;;;;;;;-1:-1:-1;57372:232:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21158:94::-;;;;;;;;;;-1:-1:-1;21234:12:0;;21158:94;;;13570:25:1;;;13558:2;13543:18;21158:94:0;13424:177:1;26698:142:0;;;;;;;;;;-1:-1:-1;26698:142:0;;;;;:::i;:::-;;:::i;57612:156::-;;;;;;;;;;-1:-1:-1;57612:156:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;11822:32:1;;;11804:51;;11886:2;11871:18;;11864:34;;;;11777:18;57612:156:0;11630:274:1;55105:464:0;;;;;;:::i;:::-;;:::i;51569:25::-;;;;;;;;;;;;;;;;21789:744;;;;;;;;;;-1:-1:-1;21789:744:0;;;;;:::i;:::-;;:::i;52329:48::-;;;;;;;;;;-1:-1:-1;52329:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;57958:837;;;;;;;;;;;;;:::i;26903:157::-;;;;;;;;;;-1:-1:-1;26903:157:0;;;;;:::i;:::-;;:::i;21321:177::-;;;;;;;;;;-1:-1:-1;21321:177:0;;;;;:::i;:::-;;:::i;24146:118::-;;;;;;;;;;-1:-1:-1;24146:118:0;;;;;:::i;:::-;;:::i;54226:869::-;;;;;;:::i;:::-;;:::i;52456:58::-;;;;;;;;;;;;52497:17;52456:58;;56507:160;;;;;;;;;;-1:-1:-1;56507:160:0;;;;;:::i;:::-;;:::i;55577:423::-;;;;;;;;;;-1:-1:-1;55577:423:0;;;;;:::i;:::-;;:::i;23023:211::-;;;;;;;;;;-1:-1:-1;23023:211:0;;;;;:::i;:::-;;:::i;39245:103::-;;;;;;;;;;;;;:::i;53437:149::-;;;;;;;;;;-1:-1:-1;53437:149:0;;;;;:::i;:::-;;:::i;38594:87::-;;;;;;;;;;-1:-1:-1;38667:6:0;;-1:-1:-1;;;;;38667:6:0;38594:87;;24478:98;;;;;;;;;;;;;:::i;26116:274::-;;;;;;;;;;-1:-1:-1;26116:274:0;;;;;:::i;:::-;;:::i;53639:221::-;;;;;;;;;;-1:-1:-1;53639:221:0;;;;;:::i;:::-;;:::i;52521:55::-;;;;;;;;;;;;52559:17;52521:55;;53870:97;;;;;;;;;;-1:-1:-1;53870:97:0;;;;;:::i;:::-;;:::i;52422:25::-;;;;;;;;;;-1:-1:-1;52422:25:0;;;;;;;;;;;27123:311;;;;;;;;;;-1:-1:-1;27123:311:0;;;;;:::i;:::-;;:::i;57072:292::-;;;;;;;;;;-1:-1:-1;57072:292:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56675:389::-;;;;;;;;;;-1:-1:-1;56675:389:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;53975:243::-;;;;;;;;;;-1:-1:-1;53975:243:0;;;;;:::i;:::-;;:::i;31538:43::-;;;;;;;;;;;;;;;;51603:37;;;;;;;;;;;;51636:4;51603:37;;26453:186;;;;;;;;;;-1:-1:-1;26453:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;26598:25:0;;;26575:4;26598:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26453:186;52391:24;;;;;;;;;;-1:-1:-1;52391:24:0;;;;;;;;39503:201;;;;;;;;;;-1:-1:-1;39503:201:0;;;;;:::i;:::-;;:::i;56074:322::-;56168:4;56192:38;56218:11;56192:25;:38::i;:::-;:80;;;-1:-1:-1;;;;;;;56234:38:0;;-1:-1:-1;;;56234:38:0;56192:80;:146;;;-1:-1:-1;;;;;;;56292:46:0;;-1:-1:-1;;;56292:46:0;56192:146;:196;;;-1:-1:-1;;;;;;;56342:46:0;;-1:-1:-1;;;56342:46:0;56192:196;56185:203;56074:322;-1:-1:-1;;56074:322:0:o;24323:94::-;24377:13;24406:5;24399:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24323:94;:::o;25848:204::-;25916:7;25940:16;25948:7;27760:12;;-1:-1:-1;27750:22:0;27673:105;25940:16;25932:74;;;;-1:-1:-1;;;25932:74:0;;25411:2:1;25932:74:0;;;25393:21:1;25450:2;25430:18;;;25423:30;25489:34;25469:18;;;25462:62;-1:-1:-1;;;25540:18:1;;;25533:43;25593:19;;25932:74:0;;;;;;;;;-1:-1:-1;26022:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26022:24:0;;25848:204::o;25411:379::-;25480:13;25496:24;25512:7;25496:15;:24::i;:::-;25480:40;;25541:5;-1:-1:-1;;;;;25535:11:0;:2;-1:-1:-1;;;;;25535:11:0;;;25527:58;;;;-1:-1:-1;;;25527:58:0;;21612:2:1;25527:58:0;;;21594:21:1;21651:2;21631:18;;;21624:30;21690:34;21670:18;;;21663:62;-1:-1:-1;;;21741:18:1;;;21734:32;21783:19;;25527:58:0;21410:398:1;25527:58:0;9574:10;-1:-1:-1;;;;;25610:21:0;;;;:62;;-1:-1:-1;25635:37:0;25652:5;9574:10;26453:186;:::i;25635:37::-;25594:153;;;;-1:-1:-1;;;25594:153:0;;17848:2:1;25594:153:0;;;17830:21:1;17887:2;17867:18;;;17860:30;17926:34;17906:18;;;17899:62;17997:27;17977:18;;;17970:55;18042:19;;25594:153:0;17646:421:1;25594:153:0;25756:28;25765:2;25769:7;25778:5;25756:8;:28::i;:::-;25473:317;25411:379;;:::o;57372:232::-;57457:17;;57423;;-1:-1:-1;;;;;57457:17:0;:33;57453:123;;57513:16;;;57527:1;57513:16;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57513:16:0;57507:22;;57553:11;;57544:3;57548:1;57544:6;;;;;;;;:::i;:::-;;;;;;:20;;;;;57453:123;57372:232;;;:::o;26698:142::-;26806:28;26816:4;26822:2;26826:7;26806:9;:28::i;57612:156::-;57717:17;;57742:11;;57680:7;;;;-1:-1:-1;;;;;57717:17:0;;;;57754:5;;57736:17;;:5;:17;:::i;:::-;:23;;;;:::i;:::-;57709:51;;;;57612:156;;;;;:::o;55105:464::-;36644:1;37242:7;;:19;;37234:63;;;;-1:-1:-1;;;37234:63:0;;23945:2:1;37234:63:0;;;23927:21:1;23984:2;23964:18;;;23957:30;24023:33;24003:18;;;23996:61;24074:18;;37234:63:0;23743:355:1;37234:63:0;36644:1;37375:7;:18;55189:10:::1;55203:9;55189:23;55181:43;;;::::0;-1:-1:-1;;;55181:43:0;;23195:2:1;55181:43:0::1;::::0;::::1;23177:21:1::0;23234:1;23214:18;;;23207:29;-1:-1:-1;;;23252:18:1;;;23245:37;23299:18;;55181:43:0::1;22993:330:1::0;55181:43:0::1;55246:13;::::0;::::1;::::0;::::1;;;55245:14;:30:::0;::::1;;;-1:-1:-1::0;55263:12:0::1;::::0;::::1;;55245:30;55237:57;;;::::0;-1:-1:-1;;;55237:57:0;;21269:2:1;55237:57:0::1;::::0;::::1;21251:21:1::0;21308:2;21288:18;;;21281:30;-1:-1:-1;;;21327:18:1;;;21320:44;21381:18;;55237:57:0::1;21067:338:1::0;55237:57:0::1;55324:1;55315:6;:10;:26;;;;;55339:2;55329:6;:12;;55315:26;55307:49;;;::::0;-1:-1:-1;;;55307:49:0;;16768:2:1;55307:49:0::1;::::0;::::1;16750:21:1::0;16807:2;16787:18;;;16780:30;-1:-1:-1;;;16826:18:1;;;16819:40;16876:18;;55307:49:0::1;16566:334:1::0;55307:49:0::1;55402:9;55375:23;52559:17;55391:6:::0;55375:15:::1;:23::i;:::-;:36;;55367:80;;;::::0;-1:-1:-1;;;55367:80:0;;16408:2:1;55367:80:0::1;::::0;::::1;16390:21:1::0;16447:2;16427:18;;;16420:30;16486:33;16466:18;;;16459:61;16537:18;;55367:80:0::1;16206:355:1::0;55367:80:0::1;51636:4;55482:6;55466:13;21234:12:::0;;;21158:94;55466:13:::1;:22;;;;:::i;:::-;:32;;55458:61;;;::::0;-1:-1:-1;;;55458:61:0;;14435:2:1;55458:61:0::1;::::0;::::1;14417:21:1::0;14474:2;14454:18;;;14447:30;-1:-1:-1;;;14493:18:1;;;14486:46;14549:18;;55458:61:0::1;14233:340:1::0;55458:61:0::1;55532:29;55542:10;55554:6;55532:9;:29::i;:::-;-1:-1:-1::0;36600:1:0;37554:7;:22;55105:464::o;21789:744::-;21898:7;21933:16;21943:5;21933:9;:16::i;:::-;21925:5;:24;21917:71;;;;-1:-1:-1;;;21917:71:0;;14032:2:1;21917:71:0;;;14014:21:1;14071:2;14051:18;;;14044:30;14110:34;14090:18;;;14083:62;-1:-1:-1;;;14161:18:1;;;14154:32;14203:19;;21917:71:0;13830:398:1;21917:71:0;21995:22;22020:13;21234:12;;;21158:94;22020:13;21995:38;;22040:19;22070:25;22120:9;22115:350;22139:14;22135:1;:18;22115:350;;;22169:31;22203:14;;;:11;:14;;;;;;;;;22169:48;;;;;;;;;-1:-1:-1;;;;;22169:48:0;;;;;-1:-1:-1;;;22169:48:0;;;;;;;;;;;;22230:28;22226:89;;22291:14;;;-1:-1:-1;22226:89:0;22348:5;-1:-1:-1;;;;;22327:26:0;:17;-1:-1:-1;;;;;22327:26:0;;22323:135;;;22385:5;22370:11;:20;22366:59;;;-1:-1:-1;22412:1:0;-1:-1:-1;22405:8:0;;-1:-1:-1;;;22405:8:0;22366:59;22435:13;;;;:::i;:::-;;;;22323:135;-1:-1:-1;22155:3:0;;;;:::i;:::-;;;;22115:350;;;-1:-1:-1;22471:56:0;;-1:-1:-1;;;22471:56:0;;23530:2:1;22471:56:0;;;23512:21:1;23569:2;23549:18;;;23542:30;23608:34;23588:18;;;23581:62;-1:-1:-1;;;23659:18:1;;;23652:44;23713:19;;22471:56:0;23328:410:1;57958:837:0;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;58039:1:::1;58015:21;:25;58007:60;;;::::0;-1:-1:-1;;;58007:60:0;;20918:2:1;58007:60:0::1;::::0;::::1;20900:21:1::0;20957:2;20937:18;;;20930:30;-1:-1:-1;;;20976:18:1;;;20969:52;21038:18;;58007:60:0::1;20716:346:1::0;58007:60:0::1;58088:14;58105:44;58142:6;58105:32;:21;58131:5;58105:25;:32::i;:::-;:36:::0;::::1;:44::i;:::-;58088:61:::0;-1:-1:-1;58160:15:0::1;58178:44;58215:6;58178:32;:21;58204:5;58178:25;:32::i;:44::-;58160:62:::0;-1:-1:-1;58233:16:0::1;58252:44;58289:6;58252:32;:21;58278:5;58252:25;:32::i;:44::-;58233:63:::0;-1:-1:-1;58307:13:0::1;58323:43;58359:6;58323:31;:21;58349:4;58323:25;:31::i;:43::-;58307:59:::0;-1:-1:-1;58377:14:0::1;58394:43;58430:6;58394:31;:21;58420:4;58394:25;:31::i;:43::-;58377:60:::0;-1:-1:-1;58448:13:0::1;58464:44;58501:6;58464:32;:21;58490:5;58464:25;:32::i;:44::-;58534:4;::::0;58448:60;;-1:-1:-1;58525:25:0::1;::::0;-1:-1:-1;;;;;58534:4:0::1;58540:9:::0;58525:8:::1;:25::i;:::-;58570:5;::::0;58561:27:::1;::::0;-1:-1:-1;;;;;58570:5:0::1;58577:10:::0;58561:8:::1;:27::i;:::-;58608:6;::::0;58599:29:::1;::::0;-1:-1:-1;;;;;58608:6:0::1;58616:11:::0;58599:8:::1;:29::i;:::-;58648:3;::::0;58639:23:::1;::::0;-1:-1:-1;;;;;58648:3:0::1;58653:8:::0;58639::::1;:23::i;:::-;58682:4;::::0;58673:25:::1;::::0;-1:-1:-1;;;;;58682:4:0::1;58688:9:::0;58673:8:::1;:25::i;:::-;58718:3;::::0;58709:23:::1;::::0;-1:-1:-1;;;;;58718:3:0::1;58723:8:::0;58709::::1;:23::i;:::-;58754:9;::::0;58745:42:::1;::::0;-1:-1:-1;;;;;58754:9:0::1;58765:21;58745:8;:42::i;:::-;57997:798;;;;;;57958:837::o:0;26903:157::-;27015:39;27032:4;27038:2;27042:7;27015:39;;;;;;;;;;;;:16;:39::i;21321:177::-;21388:7;21420:13;21234:12;;;21158:94;21420:13;21412:5;:21;21404:69;;;;-1:-1:-1;;;21404:69:0;;15598:2:1;21404:69:0;;;15580:21:1;15637:2;15617:18;;;15610:30;15676:34;15656:18;;;15649:62;-1:-1:-1;;;15727:18:1;;;15720:33;15770:19;;21404:69:0;15396:399:1;21404:69:0;-1:-1:-1;21487:5:0;21321:177::o;24146:118::-;24210:7;24233:20;24245:7;24233:11;:20::i;:::-;:25;;24146:118;-1:-1:-1;;24146:118:0:o;54226:869::-;36644:1;37242:7;;:19;;37234:63;;;;-1:-1:-1;;;37234:63:0;;23945:2:1;37234:63:0;;;23927:21:1;23984:2;23964:18;;;23957:30;24023:33;24003:18;;;23996:61;24074:18;;37234:63:0;23743:355:1;37234:63:0;36644:1;37375:7;:18;54369:10:::1;54383:9;54369:23;54361:43;;;::::0;-1:-1:-1;;;54361:43:0;;23195:2:1;54361:43:0::1;::::0;::::1;23177:21:1::0;23234:1;23214:18;;;23207:29;-1:-1:-1;;;23252:18:1;;;23245:37;23299:18;;54361:43:0::1;22993:330:1::0;54361:43:0::1;54425:13;::::0;::::1;::::0;::::1;;;:30:::0;::::1;;;-1:-1:-1::0;54443:12:0::1;::::0;::::1;;54442:13;54425:30;54417:57;;;::::0;-1:-1:-1;;;54417:57:0;;25067:2:1;54417:57:0::1;::::0;::::1;25049:21:1::0;25106:2;25086:18;;;25079:30;-1:-1:-1;;;25125:18:1;;;25118:45;25180:18;;54417:57:0::1;24865:339:1::0;54417:57:0::1;54504:1;54495:6;:10;:25;;;;;54519:1;54509:6;:11;;54495:25;54487:48;;;::::0;-1:-1:-1;;;54487:48:0;;17107:2:1;54487:48:0::1;::::0;::::1;17089:21:1::0;17146:2;17126:18;;;17119:30;-1:-1:-1;;;17165:18:1;;;17158:40;17215:18;;54487:48:0::1;16905:334:1::0;54487:48:0::1;54584:9;54554:26;52497:17;54573:6:::0;54554:18:::1;:26::i;:::-;:39;;54546:83;;;::::0;-1:-1:-1;;;54546:83:0;;16408:2:1;54546:83:0::1;::::0;::::1;16390:21:1::0;16447:2;16427:18;;;16420:30;16486:33;16466:18;;;16459:61;16537:18;;54546:83:0::1;16206:355:1::0;54546:83:0::1;51636:4;54664:6;54648:13;21234:12:::0;;;21158:94;54648:13:::1;:22;;;;:::i;:::-;:32;;54640:61;;;::::0;-1:-1:-1;;;54640:61:0;;14435:2:1;54640:61:0::1;::::0;::::1;14417:21:1::0;14474:2;14454:18;;;14447:30;-1:-1:-1;;;14493:18:1;;;14486:46;14549:18;;54640:61:0::1;14233:340:1::0;54640:61:0::1;54733:10;54720:24;::::0;;;:12:::1;:24;::::0;;;;;54757:1:::1;::::0;54720:33:::1;::::0;54747:6;;54720:33:::1;:::i;:::-;:38;;54712:75;;;::::0;-1:-1:-1;;;54712:75:0;;18611:2:1;54712:75:0::1;::::0;::::1;18593:21:1::0;18650:2;18630:18;;;18623:30;18689:26;18669:18;;;18662:54;18733:18;;54712:75:0::1;18409:348:1::0;54712:75:0::1;54825:28;::::0;-1:-1:-1;;54842:10:0::1;9455:2:1::0;9451:15;9447:53;54825:28:0::1;::::0;::::1;9435:66:1::0;54800:12:0::1;::::0;9517::1;;54825:28:0::1;;;;;;;;;;;;54815:39;;;;;;54800:54;;54887:49;54906:11;;54887:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;54919:10:0::1;::::0;;-1:-1:-1;54931:4:0;;-1:-1:-1;54887:18:0::1;:49::i;:::-;54865:132;;;::::0;-1:-1:-1;;;54865:132:0;;17446:2:1;54865:132:0::1;::::0;::::1;17428:21:1::0;17485:2;17465:18;;;17458:30;17524:34;17504:18;;;17497:62;-1:-1:-1;;;17575:18:1;;;17568:31;17616:19;;54865:132:0::1;17244:397:1::0;54865:132:0::1;55023:10;55010:24;::::0;;;:12:::1;:24;::::0;;;;:35;;55039:6;;55010:24;:35:::1;::::0;55039:6;;55010:35:::1;:::i;:::-;::::0;;;-1:-1:-1;55058:29:0::1;::::0;-1:-1:-1;55068:10:0::1;55080:6:::0;55058:9:::1;:29::i;:::-;-1:-1:-1::0;;36600:1:0;37554:7;:22;-1:-1:-1;;54226:869:0:o;56507:160::-;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;56602:17:::1;:29:::0;;-1:-1:-1;;;;;;56602:29:0::1;-1:-1:-1::0;;;;;56602:29:0;;;::::1;::::0;;;::::1;::::0;;;56642:11:::1;:17:::0;56507:160::o;55577:423::-;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;55670:18:::1;55717:6:::0;55713:94:::1;55733:6;:13;55729:1;:17;55713:94;;;55785:7;55793:1;55785:10;;;;;;;;:::i;:::-;;;;;;;55768:27;;;;;:::i;:::-;::::0;-1:-1:-1;55748:4:0;::::1;::::0;::::1;:::i;:::-;;;;55713:94;;;;51636:4;55844:13;55828;21234:12:::0;;;21158:94;55828:13:::1;:29;;;;:::i;:::-;:39;;55819:62;;;::::0;-1:-1:-1;;;55819:62:0;;18274:2:1;55819:62:0::1;::::0;::::1;18256:21:1::0;18313:1;18293:18;;;18286:29;-1:-1:-1;;;18331:18:1;;;18324:39;18380:18;;55819:62:0::1;18072:332:1::0;55819:62:0::1;55898:6;55894:99;55914:6;:13;55910:1;:17;55894:99;;;55949:32;55959:6;55966:1;55959:9;;;;;;;;:::i;:::-;;;;;;;55970:7;55978:1;55970:10;;;;;;;;:::i;:::-;;;;;;;55949:9;:32::i;:::-;55929:4:::0;::::1;::::0;::::1;:::i;:::-;;;;55894:99;;;;55659:341;55577:423:::0;;:::o;23023:211::-;23087:7;-1:-1:-1;;;;;23111:19:0;;23103:75;;;;-1:-1:-1;;;23103:75:0;;18964:2:1;23103:75:0;;;18946:21:1;19003:2;18983:18;;;18976:30;19042:34;19022:18;;;19015:62;-1:-1:-1;;;19093:18:1;;;19086:41;19144:19;;23103:75:0;18762:407:1;23103:75:0;-1:-1:-1;;;;;;23200:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;23200:27:0;;23023:211::o;39245:103::-;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;39310:30:::1;39337:1;39310:18;:30::i;:::-;39245:103::o:0;53437:149::-;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;53511:10:::1;:24:::0;;;53553:25:::1;::::0;13570::1;;;53553::0::1;::::0;13558:2:1;13543:18;53553:25:0::1;;;;;;;53437:149:::0;:::o;24478:98::-;24534:13;24563:7;24556:14;;;;;:::i;26116:274::-;-1:-1:-1;;;;;26207:24:0;;9574:10;26207:24;;26199:63;;;;-1:-1:-1;;;26199:63:0;;20144:2:1;26199:63:0;;;20126:21:1;20183:2;20163:18;;;20156:30;20222:28;20202:18;;;20195:56;20268:18;;26199:63:0;19942:350:1;26199:63:0;9574:10;26271:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26271:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26271:53:0;;;;;;;;;;26336:48;;13099:41:1;;;26271:42:0;;9574:10;26336:48;;13072:18:1;26336:48:0;;;;;;;26116:274;;:::o;53639:221::-;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;53729:12:::1;:28:::0;;-1:-1:-1;;53768:30:0;53729:28;::::1;;-1:-1:-1::0;;53768:30:0;;53729:28:::1;53768:30:::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;53816:36:::1;::::0;;53729:28:::1;53825:13:::0;;::::1;::::0;::::1;13338:14:1::0;13331:22;13313:41;;53839:12:0;;;::::1;13397:14:1::0;13390:22;13385:2;13370:18;;13363:50;53816:36:0::1;::::0;13286:18:1;53816:36:0::1;;;;;;;53639:221:::0;;:::o;53870:97::-;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;53943:16:::1;:10;53956:3:::0;;53943:16:::1;:::i;27123:311::-:0;27260:28;27270:4;27276:2;27280:7;27260:9;:28::i;:::-;27311:48;27334:4;27340:2;27344:7;27353:5;27311:22;:48::i;:::-;27295:133;;;;-1:-1:-1;;;27295:133:0;;;;;;;:::i;57072:292::-;57182:17;;57130:35;;-1:-1:-1;;;;;57182:17:0;:33;57178:151;;57245:24;;;57267:1;57245:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57300:17:0;;57284:13;;;;-1:-1:-1;;;;;;57300:17:0;;57284:13;;-1:-1:-1;57300:17:0;;57284:13;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;57284:33:0;;;-1:-1:-1;;;;;57284:33:0;;;;;57072:292;;;:::o;56675:389::-;56803:17;;56729:35;;;;-1:-1:-1;;;;;56803:17:0;:33;56799:223;;56866:24;;;56888:1;56866:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56921:17:0;;56905:13;;;;-1:-1:-1;;;;;;56921:17:0;;56905:13;;-1:-1:-1;56921:17:0;;56905:13;;;;:::i;:::-;-1:-1:-1;;;;;56905:33:0;;;;:13;;;;;;;;;;:33;56959:16;;;56973:1;56959:16;;;;;;;;;;;;;;56905:13;56959:16;;;;;-1:-1:-1;56959:16:0;56953:22;;56999:11;;56990:3;56994:1;56990:6;;;;;;;;:::i;:::-;;;;;;:20;;;;;56799:223;56675:389;;;:::o;53975:243::-;54039:13;54073:16;54081:7;27760:12;;-1:-1:-1;27750:22:0;27673:105;54073:16;54065:71;;;;-1:-1:-1;;;54065:71:0;;;;;;;:::i;:::-;54178:10;54190:18;:7;:16;:18::i;:::-;54161:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54147:63;;53975:243;;;:::o;39503:201::-;38667:6;;-1:-1:-1;;;;;38667:6:0;9574:10;38814:23;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39592:22:0;::::1;39584:73;;;::::0;-1:-1:-1;;;39584:73:0;;14780:2:1;39584:73:0::1;::::0;::::1;14762:21:1::0;14819:2;14799:18;;;14792:30;14858:34;14838:18;;;14831:62;-1:-1:-1;;;14909:18:1;;;14902:36;14955:19;;39584:73:0::1;14578:402:1::0;39584:73:0::1;39668:28;39687:8;39668:18;:28::i;:::-;39503:201:::0;:::o;22597:370::-;22724:4;-1:-1:-1;;;;;;22754:40:0;;-1:-1:-1;;;22754:40:0;;:99;;-1:-1:-1;;;;;;;22805:48:0;;-1:-1:-1;;;22805:48:0;22754:99;:160;;;-1:-1:-1;;;;;;;22864:50:0;;-1:-1:-1;;;22864:50:0;22754:160;:207;;;-1:-1:-1;;;;;;;;;;11361:40:0;;;22925:36;11252:157;31360:172;31457:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;31457:29:0;-1:-1:-1;;;;;31457:29:0;;;;;;;;;31498:28;;31457:24;;31498:28;;;;;;;31360:172;;;:::o;29725:1529::-;29822:35;29860:20;29872:7;29860:11;:20::i;:::-;29931:18;;29822:58;;-1:-1:-1;29889:22:0;;-1:-1:-1;;;;;29915:34:0;9574:10;-1:-1:-1;;;;;29915:34:0;;:81;;;-1:-1:-1;9574:10:0;29960:20;29972:7;29960:11;:20::i;:::-;-1:-1:-1;;;;;29960:36:0;;29915:81;:142;;;-1:-1:-1;30024:18:0;;30007:50;;9574:10;26453:186;:::i;30007:50::-;29889:169;;30083:17;30067:101;;;;-1:-1:-1;;;30067:101:0;;20499:2:1;30067:101:0;;;20481:21:1;20538:2;20518:18;;;20511:30;20577:34;20557:18;;;20550:62;-1:-1:-1;;;20628:18:1;;;20621:48;20686:19;;30067:101:0;20297:414:1;30067:101:0;30215:4;-1:-1:-1;;;;;30193:26:0;:13;:18;;;-1:-1:-1;;;;;30193:26:0;;30177:98;;;;-1:-1:-1;;;30177:98:0;;19376:2:1;30177:98:0;;;19358:21:1;19415:2;19395:18;;;19388:30;19454:34;19434:18;;;19427:62;-1:-1:-1;;;19505:18:1;;;19498:36;19551:19;;30177:98:0;19174:402:1;30177:98:0;-1:-1:-1;;;;;30290:16:0;;30282:66;;;;-1:-1:-1;;;30282:66:0;;16002:2:1;30282:66:0;;;15984:21:1;16041:2;16021:18;;;16014:30;16080:34;16060:18;;;16053:62;-1:-1:-1;;;16131:18:1;;;16124:35;16176:19;;30282:66:0;15800:401:1;30282:66:0;30457:49;30474:1;30478:7;30487:13;:18;;;30457:8;:49::i;:::-;-1:-1:-1;;;;;30515:18:0;;;;;;:12;:18;;;;;:31;;30545:1;;30515:18;:31;;30545:1;;-1:-1:-1;;;;;30515:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;30515:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30553:16:0;;-1:-1:-1;30553:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;30553:16:0;;:29;;-1:-1:-1;;30553:29:0;;:::i;:::-;;;-1:-1:-1;;;;;30553:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30612:43:0;;;;;;;;-1:-1:-1;;;;;30612:43:0;;;;;;30638:15;30612:43;;;;;;;;;-1:-1:-1;30589:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;30589:66:0;-1:-1:-1;;;;;;30589:66:0;;;;;;;;;;;30905:11;30601:7;-1:-1:-1;30905:11:0;:::i;:::-;30968:1;30927:24;;;:11;:24;;;;;:29;30883:33;;-1:-1:-1;;;;;;30927:29:0;30923:236;;30985:20;30993:11;27760:12;;-1:-1:-1;27750:22:0;27673:105;30985:20;30981:171;;;31045:97;;;;;;;;31072:18;;-1:-1:-1;;;;;31045:97:0;;;;;;31103:28;;;;31045:97;;;;;;;;;;-1:-1:-1;31018:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;31018:124:0;-1:-1:-1;;;;;;31018:124:0;;;;;;;;;;;;30981:171;31191:7;31187:2;-1:-1:-1;;;;;31172:27:0;31181:4;-1:-1:-1;;;;;31172:27:0;;;;;;;;;;;31206:42;55577:423;45912:98;45970:7;45997:5;46001:1;45997;:5;:::i;:::-;45990:12;45912:98;-1:-1:-1;;;45912:98:0:o;27784:::-;27849:27;27859:2;27863:8;27849:27;;;;;;;;;;;;:9;:27::i;:::-;27784:98;;:::o;46311:::-;46369:7;46396:5;46400:1;46396;:5;:::i;57776:174::-;57846:12;57864:4;-1:-1:-1;;;;;57864:9:0;57881:5;57864:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57845:46;;;57912:7;57904:37;;;;-1:-1:-1;;;57904:37:0;;24305:2:1;57904:37:0;;;24287:21:1;24344:2;24324:18;;;24317:30;-1:-1:-1;;;24363:18:1;;;24356:47;24420:18;;57904:37:0;24103:341:1;23486:606:0;-1:-1:-1;;;;;;;;;;;;;;;;;23603:16:0;23611:7;27760:12;;-1:-1:-1;27750:22:0;27673:105;23603:16;23595:71;;;;-1:-1:-1;;;23595:71:0;;;;;;;:::i;:::-;23675:26;23723:12;23712:7;:23;23708:93;;23767:22;23777:12;23767:7;:22;:::i;:::-;:26;;23792:1;23767:26;:::i;:::-;23746:47;;23708:93;23829:7;23809:212;23846:18;23838:4;:26;23809:212;;23883:31;23917:17;;;:11;:17;;;;;;;;;23883:51;;;;;;;;;-1:-1:-1;;;;;23883:51:0;;;;;-1:-1:-1;;;23883:51:0;;;;;;;;;;;;23947:28;23943:71;;23995:9;23486:606;-1:-1:-1;;;;23486:606:0:o;23943:71::-;-1:-1:-1;23866:6:0;;;;:::i;:::-;;;;23809:212;;;-1:-1:-1;24029:57:0;;-1:-1:-1;;;24029:57:0;;24651:2:1;24029:57:0;;;24633:21:1;24690:2;24670:18;;;24663:30;24729:34;24709:18;;;24702:62;-1:-1:-1;;;24780:18:1;;;24773:45;24835:19;;24029:57:0;24449:411:1;40910:190:0;41035:4;41088;41059:25;41072:5;41079:4;41059:12;:25::i;:::-;:33;;40910:190;-1:-1:-1;;;;40910:190:0:o;39864:191::-;39957:6;;;-1:-1:-1;;;;;39974:17:0;;;-1:-1:-1;;;;;;39974:17:0;;;;;;;40007:40;;39957:6;;;39974:17;39957:6;;40007:40;;39938:16;;40007:40;39927:128;39864:191;:::o;33075:690::-;33212:4;-1:-1:-1;;;;;33229:13:0;;1898:19;:23;33225:535;;33268:72;;-1:-1:-1;;;33268:72:0;;-1:-1:-1;;;;;33268:36:0;;;;;:72;;9574:10;;33319:4;;33325:7;;33334:5;;33268:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33268:72:0;;;;;;;;-1:-1:-1;;33268:72:0;;;;;;;;;;;;:::i;:::-;;;33255:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33499:13:0;;33495:215;;33532:61;;-1:-1:-1;;;33532:61:0;;;;;;;:::i;33495:215::-;33678:6;33672:13;33663:6;33659:2;33655:15;33648:38;33255:464;-1:-1:-1;;;;;;33390:55:0;-1:-1:-1;;;33390:55:0;;-1:-1:-1;33383:62:0;;33225:535;-1:-1:-1;33748:4:0;33225:535;33075:690;;;;;;:::o;49646:723::-;49702:13;49923:10;49919:53;;-1:-1:-1;;49950:10:0;;;;;;;;;;;;-1:-1:-1;;;49950:10:0;;;;;49646:723::o;49919:53::-;49997:5;49982:12;50038:78;50045:9;;50038:78;;50071:8;;;;:::i;:::-;;-1:-1:-1;50094:10:0;;-1:-1:-1;50102:2:0;50094:10;;:::i;:::-;;;50038:78;;;50126:19;50158:6;50148:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50148:17:0;;50126:39;;50176:154;50183:10;;50176:154;;50210:11;50220:1;50210:11;;:::i;:::-;;-1:-1:-1;50279:10:0;50287:2;50279:5;:10;:::i;:::-;50266:24;;:2;:24;:::i;:::-;50253:39;;50236:6;50243;50236:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;50236:56:0;;;;;;;;-1:-1:-1;50307:11:0;50316:2;50307:11;;:::i;:::-;;;50176:154;;28221:1272;28349:12;;-1:-1:-1;;;;;28376:16:0;;28368:62;;;;-1:-1:-1;;;28368:62:0;;22793:2:1;28368:62:0;;;22775:21:1;22832:2;22812:18;;;22805:30;22871:34;22851:18;;;22844:62;-1:-1:-1;;;22922:18:1;;;22915:31;22963:19;;28368:62:0;22591:397:1;28368:62:0;28567:21;28575:12;27760;;-1:-1:-1;27750:22:0;27673:105;28567:21;28566:22;28558:64;;;;-1:-1:-1;;;28558:64:0;;22435:2:1;28558:64:0;;;22417:21:1;22474:2;22454:18;;;22447:30;22513:31;22493:18;;;22486:59;22562:18;;28558:64:0;22233:353:1;28558:64:0;28649:12;28637:8;:24;;28629:71;;;;-1:-1:-1;;;28629:71:0;;25825:2:1;28629:71:0;;;25807:21:1;25864:2;25844:18;;;25837:30;25903:34;25883:18;;;25876:62;-1:-1:-1;;;25954:18:1;;;25947:32;25996:19;;28629:71:0;25623:398:1;28629:71:0;-1:-1:-1;;;;;28812:16:0;;28779:30;28812:16;;;:12;:16;;;;;;;;;28779:49;;;;;;;;;-1:-1:-1;;;;;28779:49:0;;;;;-1:-1:-1;;;28779:49:0;;;;;;;;;;;28854:119;;;;;;;;28874:19;;28779:49;;28854:119;;;28874:39;;28904:8;;28874:39;:::i;:::-;-1:-1:-1;;;;;28854:119:0;;;;;28957:8;28922:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;28854:119:0;;;;;;-1:-1:-1;;;;;28835:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;28835:138:0;;;;;;;;;;;;29008:43;;;;;;;;;;;29034:15;29008:43;;;;;;;;28980:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;28980:71:0;-1:-1:-1;;;;;;28980:71:0;;;;;;;;;;;;;;;;;;28992:12;;29104:281;29128:8;29124:1;:12;29104:281;;;29157:38;;29182:12;;-1:-1:-1;;;;;29157:38:0;;;29174:1;;29157:38;;29174:1;;29157:38;29222:59;29253:1;29257:2;29261:12;29275:5;29222:22;:59::i;:::-;29204:150;;;;-1:-1:-1;;;29204:150:0;;;;;;;:::i;:::-;29363:14;;;;:::i;:::-;;;;29138:3;;;;;:::i;:::-;;;;29104:281;;;-1:-1:-1;29393:12:0;:27;;;29427:60;55577:423;41462:675;41545:7;41588:4;41545:7;41603:497;41627:5;:12;41623:1;:16;41603:497;;;41661:20;41684:5;41690:1;41684:8;;;;;;;;:::i;:::-;;;;;;;41661:31;;41727:12;41711;:28;41707:382;;42213:13;42263:15;;;42299:4;42292:15;;;42346:4;42330:21;;41839:57;;41707:382;;;42213:13;42263:15;;;42299:4;42292:15;;;42346:4;42330:21;;42016:57;;41707:382;-1:-1:-1;41641:3:0;;;;:::i;:::-;;;;41603:497;;;-1:-1:-1;42117:12:0;41462:675;-1:-1:-1;;;41462:675:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:673:1;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:163;509:2;506:1;503:9;495:163;;;566:17;;554:30;;604:12;;;;636;;;;527:1;520:9;495:163;;;-1:-1:-1;676:5:1;;14:673;-1:-1:-1;;;;;;;14:673:1:o;692:160::-;757:20;;813:13;;806:21;796:32;;786:60;;842:1;839;832:12;857:247;916:6;969:2;957:9;948:7;944:23;940:32;937:52;;;985:1;982;975:12;937:52;1024:9;1011:23;1043:31;1068:5;1043:31;:::i;1109:323::-;1185:6;1193;1246:2;1234:9;1225:7;1221:23;1217:32;1214:52;;;1262:1;1259;1252:12;1214:52;1301:9;1288:23;1320:31;1345:5;1320:31;:::i;:::-;1370:5;1422:2;1407:18;;;;1394:32;;-1:-1:-1;;;1109:323:1:o;1437:388::-;1505:6;1513;1566:2;1554:9;1545:7;1541:23;1537:32;1534:52;;;1582:1;1579;1572:12;1534:52;1621:9;1608:23;1640:31;1665:5;1640:31;:::i;:::-;1690:5;-1:-1:-1;1747:2:1;1732:18;;1719:32;1760:33;1719:32;1760:33;:::i;:::-;1812:7;1802:17;;;1437:388;;;;;:::o;1830:456::-;1907:6;1915;1923;1976:2;1964:9;1955:7;1951:23;1947:32;1944:52;;;1992:1;1989;1982:12;1944:52;2031:9;2018:23;2050:31;2075:5;2050:31;:::i;:::-;2100:5;-1:-1:-1;2157:2:1;2142:18;;2129:32;2170:33;2129:32;2170:33;:::i;:::-;1830:456;;2222:7;;-1:-1:-1;;;2276:2:1;2261:18;;;;2248:32;;1830:456::o;2291:1108::-;2386:6;2394;2402;2410;2463:3;2451:9;2442:7;2438:23;2434:33;2431:53;;;2480:1;2477;2470:12;2431:53;2519:9;2506:23;2538:31;2563:5;2538:31;:::i;:::-;2588:5;-1:-1:-1;2612:2:1;2651:18;;;2638:32;2679:33;2638:32;2679:33;:::i;:::-;2731:7;-1:-1:-1;2785:2:1;2770:18;;2757:32;;-1:-1:-1;2840:2:1;2825:18;;2812:32;2863:18;2893:14;;;2890:34;;;2920:1;2917;2910:12;2890:34;2958:6;2947:9;2943:22;2933:32;;3003:7;2996:4;2992:2;2988:13;2984:27;2974:55;;3025:1;3022;3015:12;2974:55;3061:2;3048:16;3083:2;3079;3076:10;3073:36;;;3089:18;;:::i;:::-;3131:53;3174:2;3155:13;;-1:-1:-1;;3151:27:1;3147:36;;3131:53;:::i;:::-;3118:66;;3207:2;3200:5;3193:17;3247:7;3242:2;3237;3233;3229:11;3225:20;3222:33;3219:53;;;3268:1;3265;3258:12;3219:53;3323:2;3318;3314;3310:11;3305:2;3298:5;3294:14;3281:45;3367:1;3362:2;3357;3350:5;3346:14;3342:23;3335:34;;3388:5;3378:15;;;;;2291:1108;;;;;;;:::o;3404:315::-;3469:6;3477;3530:2;3518:9;3509:7;3505:23;3501:32;3498:52;;;3546:1;3543;3536:12;3498:52;3585:9;3572:23;3604:31;3629:5;3604:31;:::i;:::-;3654:5;-1:-1:-1;3678:35:1;3709:2;3694:18;;3678:35;:::i;:::-;3668:45;;3404:315;;;;;:::o;4044:1226::-;4162:6;4170;4223:2;4211:9;4202:7;4198:23;4194:32;4191:52;;;4239:1;4236;4229:12;4191:52;4279:9;4266:23;4308:18;4349:2;4341:6;4338:14;4335:34;;;4365:1;4362;4355:12;4335:34;4403:6;4392:9;4388:22;4378:32;;4448:7;4441:4;4437:2;4433:13;4429:27;4419:55;;4470:1;4467;4460:12;4419:55;4506:2;4493:16;4528:4;4552:60;4568:43;4608:2;4568:43;:::i;4552:60::-;4634:3;4658:2;4653:3;4646:15;4686:2;4681:3;4677:12;4670:19;;4717:2;4713;4709:11;4765:7;4760:2;4754;4751:1;4747:10;4743:2;4739:19;4735:28;4732:41;4729:61;;;4786:1;4783;4776:12;4729:61;4808:1;4799:10;;4818:238;4832:2;4829:1;4826:9;4818:238;;;4903:3;4890:17;4920:31;4945:5;4920:31;:::i;:::-;4964:18;;4850:1;4843:9;;;;;5002:12;;;;5034;;4818:238;;;-1:-1:-1;5075:5:1;-1:-1:-1;;5118:18:1;;5105:32;;-1:-1:-1;;5149:16:1;;;5146:36;;;5178:1;5175;5168:12;5146:36;;5201:63;5256:7;5245:8;5234:9;5230:24;5201:63;:::i;:::-;5191:73;;;4044:1226;;;;;:::o;5275:248::-;5337:6;5345;5398:2;5386:9;5377:7;5373:23;5369:32;5366:52;;;5414:1;5411;5404:12;5366:52;5437:26;5453:9;5437:26;:::i;5528:180::-;5587:6;5640:2;5628:9;5619:7;5615:23;5611:32;5608:52;;;5656:1;5653;5646:12;5608:52;-1:-1:-1;5679:23:1;;5528:180;-1:-1:-1;5528:180:1:o;5713:245::-;5771:6;5824:2;5812:9;5803:7;5799:23;5795:32;5792:52;;;5840:1;5837;5830:12;5792:52;5879:9;5866:23;5898:30;5922:5;5898:30;:::i;5963:249::-;6032:6;6085:2;6073:9;6064:7;6060:23;6056:32;6053:52;;;6101:1;6098;6091:12;6053:52;6133:9;6127:16;6152:30;6176:5;6152:30;:::i;6217:592::-;6288:6;6296;6349:2;6337:9;6328:7;6324:23;6320:32;6317:52;;;6365:1;6362;6355:12;6317:52;6405:9;6392:23;6434:18;6475:2;6467:6;6464:14;6461:34;;;6491:1;6488;6481:12;6461:34;6529:6;6518:9;6514:22;6504:32;;6574:7;6567:4;6563:2;6559:13;6555:27;6545:55;;6596:1;6593;6586:12;6545:55;6636:2;6623:16;6662:2;6654:6;6651:14;6648:34;;;6678:1;6675;6668:12;6648:34;6723:7;6718:2;6709:6;6705:2;6701:15;6697:24;6694:37;6691:57;;;6744:1;6741;6734:12;6691:57;6775:2;6767:11;;;;;6797:6;;-1:-1:-1;6217:592:1;;-1:-1:-1;;;;6217:592:1:o;6999:683::-;7094:6;7102;7110;7163:2;7151:9;7142:7;7138:23;7134:32;7131:52;;;7179:1;7176;7169:12;7131:52;7215:9;7202:23;7192:33;;7276:2;7265:9;7261:18;7248:32;7299:18;7340:2;7332:6;7329:14;7326:34;;;7356:1;7353;7346:12;7326:34;7394:6;7383:9;7379:22;7369:32;;7439:7;7432:4;7428:2;7424:13;7420:27;7410:55;;7461:1;7458;7451:12;7410:55;7501:2;7488:16;7527:2;7519:6;7516:14;7513:34;;;7543:1;7540;7533:12;7513:34;7596:7;7591:2;7581:6;7578:1;7574:14;7570:2;7566:23;7562:32;7559:45;7556:65;;;7617:1;7614;7607:12;7556:65;7648:2;7644;7640:11;7630:21;;7670:6;7660:16;;;;;6999:683;;;;;:::o;7687:248::-;7755:6;7763;7816:2;7804:9;7795:7;7791:23;7787:32;7784:52;;;7832:1;7829;7822:12;7784:52;-1:-1:-1;;7855:23:1;;;7925:2;7910:18;;;7897:32;;-1:-1:-1;7687:248:1:o;7940:469::-;8001:3;8039:5;8033:12;8066:6;8061:3;8054:19;8092:4;8121:2;8116:3;8112:12;8105:19;;8158:2;8151:5;8147:14;8179:1;8189:195;8203:6;8200:1;8197:13;8189:195;;;8268:13;;-1:-1:-1;;;;;8264:39:1;8252:52;;8324:12;;;;8359:15;;;;8300:1;8218:9;8189:195;;;-1:-1:-1;8400:3:1;;7940:469;-1:-1:-1;;;;;7940:469:1:o;8414:435::-;8467:3;8505:5;8499:12;8532:6;8527:3;8520:19;8558:4;8587:2;8582:3;8578:12;8571:19;;8624:2;8617:5;8613:14;8645:1;8655:169;8669:6;8666:1;8663:13;8655:169;;;8730:13;;8718:26;;8764:12;;;;8799:15;;;;8691:1;8684:9;8655:169;;8854:257;8895:3;8933:5;8927:12;8960:6;8955:3;8948:19;8976:63;9032:6;9025:4;9020:3;9016:14;9009:4;9002:5;8998:16;8976:63;:::i;:::-;9093:2;9072:15;-1:-1:-1;;9068:29:1;9059:39;;;;9100:4;9055:50;;8854:257;-1:-1:-1;;8854:257:1:o;9116:185::-;9158:3;9196:5;9190:12;9211:52;9256:6;9251:3;9244:4;9237:5;9233:16;9211:52;:::i;:::-;9279:16;;;;;9116:185;-1:-1:-1;;9116:185:1:o;9540:1174::-;9716:3;9745:1;9778:6;9772:13;9808:3;9830:1;9858:9;9854:2;9850:18;9840:28;;9918:2;9907:9;9903:18;9940;9930:61;;9984:4;9976:6;9972:17;9962:27;;9930:61;10010:2;10058;10050:6;10047:14;10027:18;10024:38;10021:165;;;-1:-1:-1;;;10085:33:1;;10141:4;10138:1;10131:15;10171:4;10092:3;10159:17;10021:165;10202:18;10229:104;;;;10347:1;10342:320;;;;10195:467;;10229:104;-1:-1:-1;;10262:24:1;;10250:37;;10307:16;;;;-1:-1:-1;10229:104:1;;10342:320;26749:1;26742:14;;;26786:4;26773:18;;10437:1;10451:165;10465:6;10462:1;10459:13;10451:165;;;10543:14;;10530:11;;;10523:35;10586:16;;;;10480:10;;10451:165;;;10455:3;;10645:6;10640:3;10636:16;10629:23;;10195:467;;;;;;;10678:30;10704:3;10696:6;10678:30;:::i;:::-;10671:37;9540:1174;-1:-1:-1;;;;;9540:1174:1:o;11137:488::-;-1:-1:-1;;;;;11406:15:1;;;11388:34;;11458:15;;11453:2;11438:18;;11431:43;11505:2;11490:18;;11483:34;;;11553:3;11548:2;11533:18;;11526:31;;;11331:4;;11574:45;;11599:19;;11591:6;11574:45;:::i;:::-;11566:53;11137:488;-1:-1:-1;;;;;;11137:488:1:o;11909:285::-;12104:2;12093:9;12086:21;12067:4;12124:64;12184:2;12173:9;12169:18;12161:6;12124:64;:::i;12199:489::-;12472:2;12461:9;12454:21;12435:4;12498:64;12558:2;12547:9;12543:18;12535:6;12498:64;:::i;:::-;12610:9;12602:6;12598:22;12593:2;12582:9;12578:18;12571:50;12638:44;12675:6;12667;12638:44;:::i;12693:261::-;12872:2;12861:9;12854:21;12835:4;12892:56;12944:2;12933:9;12929:18;12921:6;12892:56;:::i;13606:219::-;13755:2;13744:9;13737:21;13718:4;13775:44;13815:2;13804:9;13800:18;13792:6;13775:44;:::i;14985:406::-;15187:2;15169:21;;;15226:2;15206:18;;;15199:30;15265:34;15260:2;15245:18;;15238:62;-1:-1:-1;;;15331:2:1;15316:18;;15309:40;15381:3;15366:19;;14985:406::o;19581:356::-;19783:2;19765:21;;;19802:18;;;19795:30;19861:34;19856:2;19841:18;;19834:62;19928:2;19913:18;;19581:356::o;21813:415::-;22015:2;21997:21;;;22054:2;22034:18;;;22027:30;22093:34;22088:2;22073:18;;22066:62;-1:-1:-1;;;22159:2:1;22144:18;;22137:49;22218:3;22203:19;;21813:415::o;26208:275::-;26279:2;26273:9;26344:2;26325:13;;-1:-1:-1;;26321:27:1;26309:40;;26379:18;26364:34;;26400:22;;;26361:62;26358:88;;;26426:18;;:::i;:::-;26462:2;26455:22;26208:275;;-1:-1:-1;26208:275:1:o;26488:183::-;26548:4;26581:18;26573:6;26570:30;26567:56;;;26603:18;;:::i;:::-;-1:-1:-1;26648:1:1;26644:14;26660:4;26640:25;;26488:183::o;26802:253::-;26842:3;-1:-1:-1;;;;;26931:2:1;26928:1;26924:10;26961:2;26958:1;26954:10;26992:3;26988:2;26984:12;26979:3;26976:21;26973:47;;;27000:18;;:::i;:::-;27036:13;;26802:253;-1:-1:-1;;;;26802:253:1:o;27060:128::-;27100:3;27131:1;27127:6;27124:1;27121:13;27118:39;;;27137:18;;:::i;:::-;-1:-1:-1;27173:9:1;;27060:128::o;27193:120::-;27233:1;27259;27249:35;;27264:18;;:::i;:::-;-1:-1:-1;27298:9:1;;27193:120::o;27318:168::-;27358:7;27424:1;27420;27416:6;27412:14;27409:1;27406:21;27401:1;27394:9;27387:17;27383:45;27380:71;;;27431:18;;:::i;:::-;-1:-1:-1;27471:9:1;;27318:168::o;27491:246::-;27531:4;-1:-1:-1;;;;;27644:10:1;;;;27614;;27666:12;;;27663:38;;;27681:18;;:::i;:::-;27718:13;;27491:246;-1:-1:-1;;;27491:246:1:o;27742:125::-;27782:4;27810:1;27807;27804:8;27801:34;;;27815:18;;:::i;:::-;-1:-1:-1;27852:9:1;;27742:125::o;27872:258::-;27944:1;27954:113;27968:6;27965:1;27962:13;27954:113;;;28044:11;;;28038:18;28025:11;;;28018:39;27990:2;27983:10;27954:113;;;28085:6;28082:1;28079:13;28076:48;;;-1:-1:-1;;28120:1:1;28102:16;;28095:27;27872:258::o;28135:136::-;28174:3;28202:5;28192:39;;28211:18;;:::i;:::-;-1:-1:-1;;;28247:18:1;;28135:136::o;28276:380::-;28355:1;28351:12;;;;28398;;;28419:61;;28473:4;28465:6;28461:17;28451:27;;28419:61;28526:2;28518:6;28515:14;28495:18;28492:38;28489:161;;;28572:10;28567:3;28563:20;28560:1;28553:31;28607:4;28604:1;28597:15;28635:4;28632:1;28625:15;28489:161;;28276:380;;;:::o;28661:135::-;28700:3;-1:-1:-1;;28721:17:1;;28718:43;;;28741:18;;:::i;:::-;-1:-1:-1;28788:1:1;28777:13;;28661:135::o;28801:112::-;28833:1;28859;28849:35;;28864:18;;:::i;:::-;-1:-1:-1;28898:9:1;;28801:112::o;28918:127::-;28979:10;28974:3;28970:20;28967:1;28960:31;29010:4;29007:1;29000:15;29034:4;29031:1;29024:15;29050:127;29111:10;29106:3;29102:20;29099:1;29092:31;29142:4;29139:1;29132:15;29166:4;29163:1;29156:15;29182:127;29243:10;29238:3;29234:20;29231:1;29224:31;29274:4;29271:1;29264:15;29298:4;29295:1;29288:15;29314:127;29375:10;29370:3;29366:20;29363:1;29356:31;29406:4;29403:1;29396:15;29430:4;29427:1;29420:15;29446:131;-1:-1:-1;;;;;29521:31:1;;29511:42;;29501:70;;29567:1;29564;29557:12;29582:131;-1:-1:-1;;;;;;29656:32:1;;29646:43;;29636:71;;29703:1;29700;29693:12

Swarm Source

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