ETH Price: $3,566.73 (+6.91%)

Token

BATANG ETHEREUM (BETH)
 

Overview

Max Total Supply

4,000 BETH

Holders

652

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BETH
0xa529b6a2320973238a8445b8c4e25ac2fff3120e
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:
BatangethereumContract

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-07-14
*/

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

//*********************************************************************//
//*********************************************************************//
//
//  ________  ________  _________  ________  ________   ________          _______  _________  ___  ___     
// |\   __  \|\   __  \|\___   ___\\   __  \|\   ___  \|\   ____\        |\  ___ \|\___   ___\\  \|\  \    
// \ \  \|\ /\ \  \|\  \|___ \  \_\ \  \|\  \ \  \\ \  \ \  \___|        \ \   __/\|___ \  \_\ \  \\\  \   
//  \ \   __  \ \   __  \   \ \  \ \ \   __  \ \  \\ \  \ \  \  ___       \ \  \_|/__  \ \  \ \ \   __  \  
//   \ \  \|\  \ \  \ \  \   \ \  \ \ \  \ \  \ \  \\ \  \ \  \|\  \       \ \  \_|\ \  \ \  \ \ \  \ \  \ 
//    \ \_______\ \__\ \__\   \ \__\ \ \__\ \__\ \__\\ \__\ \_______\       \ \_______\  \ \__\ \ \__\ \__\
//     \|_______|\|__|\|__|    \|__|  \|__|\|__|\|__| \|__|\|_______|        \|_______|   \|__|  \|__|\|__|
//                                                                                                         
//                                                                                                         
//                                                                                                         
//
//*********************************************************************//
//*********************************************************************//
  
//-------------DEPENDENCIES--------------------------//

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// 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);
    }
}
//-------------END DEPENDENCIES------------------------//

  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.
  *
  *
  * WARNING: You should avoid using leaf values that are 64 bytes long prior to
  * hashing, or use a hash function other than keccak256 for hashing leaves.
  * This is because the concatenation of a sorted pair of internal nodes in
  * the merkle tree could be reinterpreted as a leaf value.
  */
  library MerkleProof {
      /**
      * @dev Returns true if a 'leaf' can be proved to be a part of a Merkle tree
      * defined by 'root'. For this, a 'proof' must be provided, containing
      * sibling hashes on the branch from the leaf to the root of the tree. Each
      * pair of leaves and each pair of pre-images are assumed to be sorted.
      */
      function verify(
          bytes32[] memory proof,
          bytes32 root,
          bytes32 leaf
      ) internal pure returns (bool) {
          return processProof(proof, leaf) == root;
      }

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


  // File: Allowlist.sol

  pragma solidity ^0.8.0;

  abstract contract Allowlist is Ownable {
    bytes32 public merkleRoot = 0xaee2ffc5034334237b087a54b6abda041a4e6ce5f60eefe670cc8c8873f95ad1;
    bool public onlyAllowlistMode = true;

    /**
     * @dev Update merkle root to reflect changes in Allowlist
     * @param _newMerkleRoot new merkle root to reflect most recent Allowlist
     */
    function updateMerkleRoot(bytes32 _newMerkleRoot) public onlyOwner {
      require(_newMerkleRoot != merkleRoot, "Merkle root will be unchanged!");
      merkleRoot = _newMerkleRoot;
    }

    /**
     * @dev Check the proof of an address if valid for merkle root
     * @param _to address to check for proof
     * @param _merkleProof Proof of the address to validate against root and leaf
     */
    function isAllowlisted(address _to, bytes32[] calldata _merkleProof) public view returns(bool) {
      require(merkleRoot != 0, "Merkle root is not set!");
      bytes32 leaf = keccak256(abi.encodePacked(_to));

      return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
    }

    
    function enableAllowlistOnlyMode() public onlyOwner {
      onlyAllowlistMode = true;
    }

    function disableAllowlistOnlyMode() public onlyOwner {
        onlyAllowlistMode = false;
    }
  }
  
  
/**
 * @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 _startTokenId() (defaults to 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;

  uint256 public immutable collectionSize;
  uint256 public 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_;
    currentIndex = _startTokenId();
  }

  /**
  * To change the starting tokenId, please override this function.
  */
  function _startTokenId() internal view virtual returns (uint256) {
    return 1;
  }

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

  function currentTokenId() public view returns (uint256) {
    return _totalMinted();
  }

  function getNextTokenId() public view returns (uint256) {
      return _totalMinted() + 1;
  }

  /**
  * Returns the total amount of tokens minted in the contract.
  */
  function _totalMinted() internal view returns (uint256) {
    unchecked {
      return currentIndex - _startTokenId();
    }
  }

  /**
   * @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)
  {
    uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr && curr < currentIndex) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }

            // Invariant:
            // There will always be an ownership that has an address and is not burned
            // before an ownership that does not have an address and is not burned.
            // Hence, curr will not underflow.
            while (true) {
                curr--;
                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)
  {
    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 _startTokenId() <= tokenId && tokenId < currentIndex;
  }

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

  /**
   * @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,
    bool isAdminMint,
    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");

    // For admin mints we do not want to enforce the maxBatchSize limit
    if (isAdminMint == false) {
        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 + (isAdminMint ? 0 : 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");
    if (currentIndex == _startTokenId()) revert('No Tokens Minted Yet');

    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 {}
}


  
/** TimedDrop.sol
* This feature will allow the owner to be able to set timed drops for both the public and allowlist mint (if applicable).
* It is bound by the block timestamp. The owner is able to determine if the feature should be used as all 
* with the "enforcePublicDropTime" and "enforceAllowlistDropTime" variables. If the feature is disabled the implmented
* *DropTimePassed() functions will always return true. Otherwise calculation is done to check if time has passed.
*/
abstract contract TimedDrop is Ownable {
  bool public enforcePublicDropTime = true;
  uint256 public publicDropTime = 1658113200;
  
  /**
  * @dev Allow the contract owner to set the public time to mint.
  * @param _newDropTime timestamp since Epoch in seconds you want public drop to happen
  */
  function setPublicDropTime(uint256 _newDropTime) public onlyOwner {
    require(_newDropTime > block.timestamp, "Drop date must be in future! Otherwise call disablePublicDropTime!");
    publicDropTime = _newDropTime;
  }

  function usePublicDropTime() public onlyOwner {
    enforcePublicDropTime = true;
  }

  function disablePublicDropTime() public onlyOwner {
    enforcePublicDropTime = false;
  }

  /**
  * @dev determine if the public droptime has passed.
  * if the feature is disabled then assume the time has passed.
  */
  function publicDropTimePassed() public view returns(bool) {
    if(enforcePublicDropTime == false) {
      return true;
    }
    return block.timestamp >= publicDropTime;
  }
  
  // Allowlist implementation of the Timed Drop feature
  bool public enforceAllowlistDropTime = true;
  uint256 public allowlistDropTime = 1657854000;

  /**
  * @dev Allow the contract owner to set the allowlist time to mint.
  * @param _newDropTime timestamp since Epoch in seconds you want public drop to happen
  */
  function setAllowlistDropTime(uint256 _newDropTime) public onlyOwner {
    require(_newDropTime > block.timestamp, "Drop date must be in future! Otherwise call disableAllowlistDropTime!");
    allowlistDropTime = _newDropTime;
  }

  function useAllowlistDropTime() public onlyOwner {
    enforceAllowlistDropTime = true;
  }

  function disableAllowlistDropTime() public onlyOwner {
    enforceAllowlistDropTime = false;
  }

  function allowlistDropTimePassed() public view returns(bool) {
    if(enforceAllowlistDropTime == false) {
      return true;
    }

    return block.timestamp >= allowlistDropTime;
  }
}

  
interface IERC20 {
  function transfer(address _to, uint256 _amount) external returns (bool);
  function balanceOf(address account) external view returns (uint256);
}

abstract contract Withdrawable is Ownable {
  address[] public payableAddresses = [0xb4a9391C658bc1d5a4fd7928c5306d16046141f8];
  uint256[] public payableFees = [100];
  uint256 public payableAddressCount = 1;

  function withdrawAll() public onlyOwner {
      require(address(this).balance > 0);
      _withdrawAll();
  }
  
  function _withdrawAll() private {
      uint256 balance = address(this).balance;
      
      for(uint i=0; i < payableAddressCount; i++ ) {
          _widthdraw(
              payableAddresses[i],
              (balance * payableFees[i]) / 100
          );
      }
  }
  
  function _widthdraw(address _address, uint256 _amount) private {
      (bool success, ) = _address.call{value: _amount}("");
      require(success, "Transfer failed.");
  }

  /**
    * @dev Allow contract owner to withdraw ERC-20 balance from contract
    * while still splitting royalty payments to all other team members.
    * in the event ERC-20 tokens are paid to the contract.
    * @param _tokenContract contract of ERC-20 token to withdraw
    * @param _amount balance to withdraw according to balanceOf of ERC-20 token
    */
  function withdrawAllERC20(address _tokenContract, uint256 _amount) public onlyOwner {
    require(_amount > 0);
    IERC20 tokenContract = IERC20(_tokenContract);
    require(tokenContract.balanceOf(address(this)) >= _amount, 'Contract does not own enough tokens');

    for(uint i=0; i < payableAddressCount; i++ ) {
        tokenContract.transfer(payableAddresses[i], (_amount * payableFees[i]) / 100);
    }
  }
}


  
  
// File: EarlyMintIncentive.sol
// Allows the contract to have the first x tokens have a discount or
// zero fee that can be calculated on the fly.
abstract contract EarlyMintIncentive is Ownable, ERC721A {
  uint256 public PRICE = 0.05 ether;
  uint256 public EARLY_MINT_PRICE = 0.045 ether;
  uint256 public earlyMintTokenIdCap = 1500;
  bool public usingEarlyMintIncentive = true;

  function enableEarlyMintIncentive() public onlyOwner {
    usingEarlyMintIncentive = true;
  }

  function disableEarlyMintIncentive() public onlyOwner {
    usingEarlyMintIncentive = false;
  }

  /**
  * @dev Set the max token ID in which the cost incentive will be applied.
  * @param _newTokenIdCap max tokenId in which incentive will be applied
  */
  function setEarlyMintTokenIdCap(uint256 _newTokenIdCap) public onlyOwner {
    require(_newTokenIdCap <= collectionSize, "Cannot set incentive tokenId cap larger than totaly supply.");
    require(_newTokenIdCap >= 1, "Cannot set tokenId cap to less than the first token");
    earlyMintTokenIdCap = _newTokenIdCap;
  }

  /**
  * @dev Set the incentive mint price
  * @param _feeInWei new price per token when in incentive range
  */
  function setEarlyIncentivePrice(uint256 _feeInWei) public onlyOwner {
    EARLY_MINT_PRICE = _feeInWei;
  }

  /**
  * @dev Set the primary mint price - the base price when not under incentive
  * @param _feeInWei new price per token
  */
  function setPrice(uint256 _feeInWei) public onlyOwner {
    PRICE = _feeInWei;
  }

  function getPrice(uint256 _count) public view returns (uint256) {
    require(_count > 0, "Must be minting at least 1 token.");

    // short circuit function if we dont need to even calc incentive pricing
    // short circuit if the current tokenId is also already over cap
    if(
      usingEarlyMintIncentive == false ||
      currentTokenId() > earlyMintTokenIdCap
    ) {
      return PRICE * _count;
    }

    uint256 endingTokenId = currentTokenId() + _count;
    // If qty to mint results in a final token ID less than or equal to the cap then
    // the entire qty is within free mint.
    if(endingTokenId  <= earlyMintTokenIdCap) {
      return EARLY_MINT_PRICE * _count;
    }

    // If the current token id is less than the incentive cap
    // and the ending token ID is greater than the incentive cap
    // we will be straddling the cap so there will be some amount
    // that are incentive and some that are regular fee.
    uint256 incentiveTokenCount = earlyMintTokenIdCap - currentTokenId();
    uint256 outsideIncentiveCount = endingTokenId - earlyMintTokenIdCap;

    return (EARLY_MINT_PRICE * incentiveTokenCount) + (PRICE * outsideIncentiveCount);
  }
}

  
abstract contract BethERC721A is 
    Ownable,
    ERC721A,
    Withdrawable,
    ReentrancyGuard 
    , EarlyMintIncentive 
    , Allowlist 
    , TimedDrop
{
  constructor(
    string memory tokenName,
    string memory tokenSymbol
  ) ERC721A(tokenName, tokenSymbol, 2, 4000) { }
    uint8 public CONTRACT_VERSION = 2;
    string public _baseTokenURI = "ipfs/bafybeib7ivflhuw3ucbmieybglsdq2lkxhpkbmjz7g4hzw6xn3wmrol5e4/";

    bool public mintingOpen = true;
    bool public isRevealed = false;
    
    uint256 public MAX_WALLET_MINTS = 50;

    mapping(address => bool) public OGClaimed;
    mapping(address => bool) public whitelistClaimed;
    mapping(address => bool) public freeMintClaimed;

  
    /////////////// Admin Mint Functions
    /**
     * @dev Mints a token to an address with a tokenURI.
     * This is owner only and allows a fee-free drop
     * @param _to address of the future owner of the token
     * @param _qty amount of tokens to drop the owner
     */
     function mintToAdminV2(address _to, uint256 _qty) public onlyOwner{
         require(_qty > 0, "Must mint at least 1 token.");
         require(currentTokenId() + _qty <= collectionSize, "Cannot mint over supply cap of 5000");
         _safeMint(_to, _qty, true);
     }

  
    /////////////// GENERIC MINT FUNCTIONS
    /**
    * @dev Mints a single token to an address.
    * fee may or may not be required*
    * @param _to address of the future owner of the token
    */
    function mintTo(address _to) public payable {
        require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 5000");
        require(mintingOpen == true && onlyAllowlistMode == false, "Public minting is not open right now!");
        require(publicDropTimePassed() == true, "Public drop time has not passed!");
        require(canMintAmount(_to, 1), "Wallet address is over the maximum allowed mints");
        require(msg.value == getPrice(1), "Value needs to be exactly the mint fee!");
        
        _safeMint(_to, 1, false);
    }

    /**
    * @dev Mints a token to an address with a tokenURI.
    * fee may or may not be required*
    * @param _to address of the future owner of the token
    * @param _amount number of tokens to mint
    */
    function mintToMultiple(address _to, uint256 _amount) public payable {
        require(_amount >= 1, "Must mint at least 1 token");
        require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction");
        require(mintingOpen == true && onlyAllowlistMode == false, "Public minting is not open right now!");
        require(publicDropTimePassed() == true, "Public drop time has not passed!");
        require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints");
        require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000");
        require(msg.value == getPrice(_amount), "Value below required mint fee for amount");

        _safeMint(_to, _amount, false);
    }

    function openMinting() public onlyOwner {
        mintingOpen = true;
    }

    function stopMinting() public onlyOwner {
        mintingOpen = false;
    }

  
    ///////////// ALLOWLIST MINTING FUNCTIONS

    /**
    * @dev Mints a token to an address with a tokenURI for allowlist.
    * fee may or may not be required*
    * @param _to address of the future owner of the token
    */
    function mintToAL(address _to, bytes32[] calldata _merkleProof) public payable {
        require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed");
        require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!");
        require(getNextTokenId() <= collectionSize, "Cannot mint over supply cap of 5000");
        require(canMintAmount(_to, 1), "Wallet address is over the maximum allowed mints");
        require(msg.value == getPrice(1), "Value needs to be exactly the mint fee!");
        require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!");

        _safeMint(_to, 1, false);
    }

    /**
    * @dev Mints a token to an address with a tokenURI for allowlist.
    * fee may or may not be required*
    * @param _to address of the future owner of the token
    * @param _amount number of tokens to mint
    */
    function mintToMultipleOG(address _to, uint256 _amount, bytes32[] calldata _merkleProof) public payable {
        require(!OGClaimed[msg.sender], "Address already claimed");
        require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed");
        require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!");
        require(_amount >= 1, "Must mint at least 1 token");
        require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction");

        require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints");
        require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000");
        require(msg.value == getPrice(_amount), "Value below required mint fee for amount");
        require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!");

        _safeMint(_to, _amount, false);
        OGClaimed[msg.sender] = true;
    }

    function mintToMultipleAL(address _to, uint256 _amount, bytes32[] calldata _merkleProof) public payable {
        require(!whitelistClaimed[msg.sender], "Address already claimed");
        require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed");
        require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!");
        require(_amount >= 1, "Must mint at least 1 token");
        require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction");

        require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints");
        require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000");
        require(msg.value == getPrice(_amount), "Value below required mint fee for amount");
        require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!");

        _safeMint(_to, _amount, false);
        whitelistClaimed[msg.sender] = true;
    }

    function mintToMultipleFM(address _to, uint256 _amount, bytes32[] calldata _merkleProof) public payable {
        require(!freeMintClaimed[msg.sender], "Address already claimed");
        require(onlyAllowlistMode == true && mintingOpen == true, "Allowlist minting is closed");
        require(isAllowlisted(_to, _merkleProof), "Address is not in Allowlist!");
        require(_amount >= 1, "Must mint at least 1 token");
        require(_amount <= maxBatchSize, "Cannot mint more than max mint per transaction");

        require(canMintAmount(_to, _amount), "Wallet address is over the maximum allowed mints");
        require(currentTokenId() + _amount <= collectionSize, "Cannot mint over supply cap of 5000");
        require(msg.value == getPrice(_amount), "Value below required mint fee for amount");
        require(allowlistDropTimePassed() == true, "Allowlist drop time has not passed!");

        _safeMint(_to, _amount, false);
        freeMintClaimed[msg.sender] = true;
    }

    /**
     * @dev Enable allowlist minting fully by enabling both flags
     */
    function openAllowlistMint() public onlyOwner {
        enableAllowlistOnlyMode();
        mintingOpen = true;
    }

    /**
     * @dev Close allowlist minting fully by disabling both flags
     */
    function closeAllowlistMint() public onlyOwner {
        disableAllowlistOnlyMode();
        mintingOpen = false;
    }


  
    /**
    * @dev Check if wallet over MAX_WALLET_MINTS
    * @param _address address in question to check if minted count exceeds max
    */
    function canMintAmount(address _address, uint256 _amount) public view returns(bool) {
        require(_amount >= 1, "Amount must be greater than or equal to 1");
        return (_numberMinted(_address) + _amount) <= MAX_WALLET_MINTS;
    }

    /**
    * @dev Update the maximum amount of tokens that can be minted by a unique wallet
    * @param _newWalletMax the new max of tokens a wallet can mint. Must be >= 1
    */
    function setWalletMax(uint256 _newWalletMax) public onlyOwner {
        require(_newWalletMax >= 1, "Max mints per wallet must be at least 1");
        MAX_WALLET_MINTS = _newWalletMax;
    }
    

  
    /**
     * @dev Allows owner to set Max mints per tx
     * @param _newMaxMint maximum amount of tokens allowed to mint per tx. Must be >= 1
     */
     function setMaxMint(uint256 _newMaxMint) public onlyOwner {
         require(_newMaxMint >= 1, "Max mint must be at least 1");
         maxBatchSize = _newMaxMint;
     }
    

  
    function unveil(string memory _updatedTokenURI) public onlyOwner {
        require(isRevealed == false, "Tokens are already unveiled");
        _baseTokenURI = _updatedTokenURI;
        isRevealed = true;
    }
    

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

  function baseTokenURI() public view returns(string memory) {
    return _baseTokenURI;
  }

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

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


  
// File: contracts/BatangethereumContract.sol
//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract BatangethereumContract is BethERC721A {
    constructor() BethERC721A("BATANG ETHEREUM", "BETH"){}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLY_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"OGClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistDropTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistDropTimePassed","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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"canMintAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableAllowlistOnlyMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableEarlyMintIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyMintTokenIdCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAllowlistOnlyMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableEarlyMintIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enforceAllowlistDropTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforcePublicDropTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isAllowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToAL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"mintToAdminV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToMultipleAL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToMultipleFM","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintToMultipleOG","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyAllowlistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openAllowlistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddressCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payableFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicDropTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicDropTimePassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDropTime","type":"uint256"}],"name":"setAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setEarlyIncentivePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTokenIdCap","type":"uint256"}],"name":"setEarlyMintTokenIdCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDropTime","type":"uint256"}],"name":"setPublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWalletMax","type":"uint256"}],"name":"setWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMinting","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":"string","name":"_updatedTokenURI","type":"string"}],"name":"unveil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useAllowlistDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usePublicDropTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usingEarlyMintIncentive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAllERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600060095560c060405273b4a9391c658bc1d5a4fd7928c5306d16046141f860a09081526200003390600a90600162000305565b506040805160208101909152606481526200005390600b9060016200036f565b506001600c81905566b1a2bc2ec50000600e55669fdf42f6e48000600f556105dc6010556011805460ff1990811683179091557faee2ffc5034334237b087a54b6abda041a4e6ce5f60eefe670cc8c8873f95ad16012556013805461010161ffff199091161790556362d4ccb06014556015805482169092179091556362d0d8306016556017805490911660021790556040805160808101909152604180825262004a85602083013980516200011291601891602090910190620003b2565b506019805461ffff191660011790556032601a553480156200013357600080fd5b506040518060400160405280600f81526020016e424154414e4720455448455245554d60881b815250604051806040016040528060048152602001630848aa8960e31b81525081816002610fa06200019a62000194620002b160201b60201c565b620002b5565b60008111620002075760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002695760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b6064820152608401620001fe565b83516200027e906003906020870190620003b2565b50825162000294906004906020860190620003b2565b5060029190915560805250506001808055600d5550620004839050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280548282559060005260206000209081019282156200035d579160200282015b828111156200035d57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000326565b506200036b9291506200042f565b5090565b8280548282559060005260206000209081019282156200035d579160200282015b828111156200035d578251829060ff1690559160200191906001019062000390565b828054620003c09062000446565b90600052602060002090601f016020900481019282620003e457600085556200035d565b82601f10620003ff57805160ff19168380011785556200035d565b828001600101855582156200035d579182015b828111156200035d57825182559160200191906001019062000412565b5b808211156200036b576000815560010162000430565b600181811c908216806200045b57607f821691505b602082108114156200047d57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516145ae620004d76000396000818161076b01528181610f8c0152818161136f015281816117a50152818161192301528181611cba015281816120a40152818161267e015261290f01526145ae6000f3fe6080604052600436106104935760003560e01c8063817c0d9c11610260578063caa0f92a11610144578063e0eddd91116100c1578063ee54be9611610085578063ee54be9614610d59578063f2fde38b14610d79578063f4637a1514610d99578063f703166314610db3578063f8c0fd2014610dd3578063fd19eaf014610de857600080fd5b8063e0eddd9114610cab578063e692893314610cc1578063e6c6990a14610cd6578063e757223014610cf0578063e985e9c514610d1057600080fd5b8063d7224ba011610108578063d7224ba014610c0d578063d8d2412014610c23578063db4bec4414610c38578063df213e8a14610c68578063e0ec7c3614610c7b57600080fd5b8063caa0f92a14610b9b578063cc3a508514610bb0578063cfc86f7b14610bc3578063cff4492314610bd8578063d547cfb714610bf857600080fd5b806395d89b41116101dd578063b4835e07116101a1578063b4835e0714610afc578063b88d4fde14610b1c578063bb1876a814610b3c578063bc05748e14610b51578063c54826ab14610b66578063c87b56dd14610b7b57600080fd5b806395d89b4114610a72578063a22cb46514610a87578063ab523c6814610aa7578063afe5608b14610ac7578063b40ebceb14610adc57600080fd5b80638f4bb497116102245780638f4bb497146109ac5780638ff4013f146109c657806391b7f5ed146109e657806391c4b57414610a065780639231ab2a14610a2557600080fd5b8063817c0d9c1461092e578063853828b614610943578063891bbe73146109585780638d859f3e146109785780638da5cb5b1461098e57600080fd5b80633e3e0b121161038757806355228ca7116103045780636ba9fd38116102c85780636ba9fd38146108a75780636d3de806146108bc57806370a08231146108d1578063715018a6146108f1578063755edd171461090657806379ab3c891461091957600080fd5b806355228ca71461082257806355f804b31461083c57806358feaa591461085c5780636352211e1461087157806367dec6781461089157600080fd5b80634783f0ef1161034b5780634783f0ef1461078d5780634ab8b5dd146107ad5780634f6ccce7146107c357806354214f69146107e3578063547520fe1461080257600080fd5b80633e3e0b12146106ee57806340ccc0821461070357806342842e0e1461072357806344eed8811461074357806345c0f5331461075957600080fd5b806323b872dd116104155780632f745c59116103d95780632f745c5914610659578063330067861461067957806338b90333146106995780633c003254146106c55780633e07311c146106d857600080fd5b806323b872dd146105da57806326c8140f146105fa578063286c81371461060d5780632913daa01461062d5780632eb4a7ab1461064357600080fd5b8063095ea7b31161045c578063095ea7b31461055f5780630c863bb61461057f57806318160ddd146104985780631aa4ba67146105945780631dfcaa48146105aa57600080fd5b80629a9b7b1461049857806301ffc9a7146104c05780630644cefa146104f057806306fdde0314610505578063081812fc14610527575b600080fd5b3480156104a457600080fd5b506104ad610e08565b6040519081526020015b60405180910390f35b3480156104cc57600080fd5b506104e06104db366004613ea7565b610e1c565b60405190151581526020016104b7565b6105036104fe366004613dee565b610e89565b005b34801561051157600080fd5b5061051a611013565b6040516104b7919061404b565b34801561053357600080fd5b50610547610542366004613e8e565b6110a5565b6040516001600160a01b0390911681526020016104b7565b34801561056b57600080fd5b5061050361057a366004613dee565b61112e565b34801561058b57600080fd5b506104e0611246565b3480156105a057600080fd5b506104ad60165481565b3480156105b657600080fd5b506104e06105c5366004613c60565b601b6020526000908152604090205460ff1681565b3480156105e657600080fd5b506105036105f5366004613cae565b611268565b610503610608366004613e18565b611273565b34801561061957600080fd5b506104ad610628366004613e8e565b61143b565b34801561063957600080fd5b506104ad60025481565b34801561064f57600080fd5b506104ad60125481565b34801561066557600080fd5b506104ad610674366004613dee565b61145c565b34801561068557600080fd5b506104e0610694366004613d65565b6115d3565b3480156106a557600080fd5b506017546106b39060ff1681565b60405160ff90911681526020016104b7565b6105036106d3366004613e18565b6116a9565b3480156106e457600080fd5b506104ad600c5481565b3480156106fa57600080fd5b50610503611871565b34801561070f57600080fd5b5061050361071e366004613dee565b6118a7565b34801561072f57600080fd5b5061050361073e366004613cae565b61197f565b34801561074f57600080fd5b506104ad60145481565b34801561076557600080fd5b506104ad7f000000000000000000000000000000000000000000000000000000000000000081565b34801561079957600080fd5b506105036107a8366004613e8e565b61199a565b3480156107b957600080fd5b506104ad601a5481565b3480156107cf57600080fd5b506104ad6107de366004613e8e565b611a1b565b3480156107ef57600080fd5b506019546104e090610100900460ff1681565b34801561080e57600080fd5b5061050361081d366004613e8e565b611a83565b34801561082e57600080fd5b506015546104e09060ff1681565b34801561084857600080fd5b50610503610857366004613ee1565b611b03565b34801561086857600080fd5b50610503611b39565b34801561087d57600080fd5b5061054761088c366004613e8e565b611b70565b34801561089d57600080fd5b506104ad600f5481565b3480156108b357600080fd5b50610503611b82565b3480156108c857600080fd5b50610503611bbb565b3480156108dd57600080fd5b506104ad6108ec366004613c60565b611bf1565b3480156108fd57600080fd5b50610503611c82565b610503610914366004613c60565b611cb8565b34801561092557600080fd5b50610503611ded565b34801561093a57600080fd5b50610503611e26565b34801561094f57600080fd5b50610503611e5f565b34801561096457600080fd5b50610547610973366004613e8e565b611e9e565b34801561098457600080fd5b506104ad600e5481565b34801561099a57600080fd5b506000546001600160a01b0316610547565b3480156109b857600080fd5b506019546104e09060ff1681565b3480156109d257600080fd5b506105036109e1366004613e8e565b611ec8565b3480156109f257600080fd5b50610503610a01366004613e8e565b611f58565b348015610a1257600080fd5b506013546104e090610100900460ff1681565b348015610a3157600080fd5b50610a45610a40366004613e8e565b611f87565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016104b7565b348015610a7e57600080fd5b5061051a611fa4565b348015610a9357600080fd5b50610503610aa2366004613db7565b611fb3565b348015610ab357600080fd5b50610503610ac2366004613e8e565b612078565b348015610ad357600080fd5b506105036121aa565b348015610ae857600080fd5b50610503610af7366004613dee565b6121dc565b348015610b0857600080fd5b50610503610b17366004613e8e565b612401565b348015610b2857600080fd5b50610503610b37366004613cea565b612430565b348015610b4857600080fd5b50610503612463565b348015610b5d57600080fd5b50610503612499565b348015610b7257600080fd5b506105036124d4565b348015610b8757600080fd5b5061051a610b96366004613e8e565b61250a565b348015610ba757600080fd5b506104ad612568565b610503610bbe366004613e18565b612582565b348015610bcf57600080fd5b5061051a61274a565b348015610be457600080fd5b50610503610bf3366004613f52565b6127d8565b348015610c0457600080fd5b5061051a612880565b348015610c1957600080fd5b506104ad60095481565b348015610c2f57600080fd5b506104e061288f565b348015610c4457600080fd5b506104e0610c53366004613c60565b601c6020526000908152604090205460ff1681565b610503610c76366004613d65565b6128ac565b348015610c8757600080fd5b506104e0610c96366004613c60565b601d6020526000908152604090205460ff1681565b348015610cb757600080fd5b506104ad60105481565b348015610ccd57600080fd5b506105036129d9565b348015610ce257600080fd5b506013546104e09060ff1681565b348015610cfc57600080fd5b506104ad610d0b366004613e8e565b612a12565b348015610d1c57600080fd5b506104e0610d2b366004613c7b565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610d6557600080fd5b50610503610d74366004613e8e565b612b19565b348015610d8557600080fd5b50610503610d94366004613c60565b612bc8565b348015610da557600080fd5b506011546104e09060ff1681565b348015610dbf57600080fd5b50610503610dce366004613e8e565b612c60565b348015610ddf57600080fd5b50610503612d12565b348015610df457600080fd5b506104e0610e03366004613dee565b612d44565b6000610e176001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610e4d57506001600160e01b03198216635b5e139f60e01b145b80610e6857506001600160e01b0319821663780e9d6360e01b145b80610e8357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001811015610eb35760405162461bcd60e51b8152600401610eaa9061405e565b60405180910390fd5b600254811115610ed55760405162461bcd60e51b8152600401610eaa9061436c565b60195460ff1615156001148015610eef575060135460ff16155b610f0b5760405162461bcd60e51b8152600401610eaa906140cc565b610f13611246565b1515600114610f645760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b610f6e8282612d44565b610f8a5760405162461bcd60e51b8152600401610eaa90614154565b7f000000000000000000000000000000000000000000000000000000000000000081610fb4610e08565b610fbe91906143dc565b1115610fdc5760405162461bcd60e51b8152600401610eaa90614222565b610fe581612a12565b34146110035760405162461bcd60e51b8152600401610eaa90614324565b61100f82826000612dc9565b5050565b60606003805461102290614492565b80601f016020809104026020016040519081016040528092919081815260200182805461104e90614492565b801561109b5780601f106110705761010080835404028352916020019161109b565b820191906000526020600020905b81548152906001019060200180831161107e57829003601f168201915b5050505050905090565b60006110b082612de4565b6111125760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610eaa565b506000908152600760205260409020546001600160a01b031690565b600061113982611b70565b9050806001600160a01b0316836001600160a01b031614156111a85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610eaa565b336001600160a01b03821614806111c457506111c48133610d2b565b6112365760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610eaa565b611241838383612dfa565b505050565b601354600090610100900460ff1661125e5750600190565b5060145442101590565b611241838383612e56565b336000908152601d602052604090205460ff16156112a35760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156112c1575060195460ff1615156001145b6112dd5760405162461bcd60e51b8152600401610eaa90614095565b6112e88483836115d3565b6113045760405162461bcd60e51b8152600401610eaa906141a4565b60018310156113255760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156113475760405162461bcd60e51b8152600401610eaa9061436c565b6113518484612d44565b61136d5760405162461bcd60e51b8152600401610eaa90614154565b7f000000000000000000000000000000000000000000000000000000000000000083611397610e08565b6113a191906143dc565b11156113bf5760405162461bcd60e51b8152600401610eaa90614222565b6113c883612a12565b34146113e65760405162461bcd60e51b8152600401610eaa90614324565b6113ee61288f565b151560011461140f5760405162461bcd60e51b8152600401610eaa90614111565b61141b84846000612dc9565b5050336000908152601d60205260409020805460ff191660011790555050565b600b818154811061144b57600080fd5b600091825260209091200154905081565b600061146783611bf1565b82106114c05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610eaa565b60006114ca610e08565b905060008060005b83811015611573576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561152457805192505b876001600160a01b0316836001600160a01b03161415611560578684141561155257509350610e8392505050565b8361155c816144cd565b9450505b508061156b816144cd565b9150506114d2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610eaa565b6012546000906116255760405162461bcd60e51b815260206004820152601760248201527f4d65726b6c6520726f6f74206973206e6f7420736574210000000000000000006044820152606401610eaa565b6040516bffffffffffffffffffffffff19606086901b1660208201526000906034016040516020818303038152906040528051906020012090506116a08484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506131d9565b95945050505050565b336000908152601c602052604090205460ff16156116d95760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156116f7575060195460ff1615156001145b6117135760405162461bcd60e51b8152600401610eaa90614095565b61171e8483836115d3565b61173a5760405162461bcd60e51b8152600401610eaa906141a4565b600183101561175b5760405162461bcd60e51b8152600401610eaa9061405e565b60025483111561177d5760405162461bcd60e51b8152600401610eaa9061436c565b6117878484612d44565b6117a35760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000000836117cd610e08565b6117d791906143dc565b11156117f55760405162461bcd60e51b8152600401610eaa90614222565b6117fe83612a12565b341461181c5760405162461bcd60e51b8152600401610eaa90614324565b61182461288f565b15156001146118455760405162461bcd60e51b8152600401610eaa90614111565b61185184846000612dc9565b5050336000908152601c60205260409020805460ff191660011790555050565b6000546001600160a01b0316331461189b5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19169055565b6000546001600160a01b031633146118d15760405162461bcd60e51b8152600401610eaa90614265565b600081116119215760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401610eaa565b7f00000000000000000000000000000000000000000000000000000000000000008161194b610e08565b61195591906143dc565b11156119735760405162461bcd60e51b8152600401610eaa90614222565b61100f82826001612dc9565b61124183838360405180602001604052806000815250612430565b6000546001600160a01b031633146119c45760405162461bcd60e51b8152600401610eaa90614265565b601254811415611a165760405162461bcd60e51b815260206004820152601e60248201527f4d65726b6c6520726f6f742077696c6c20626520756e6368616e6765642100006044820152606401610eaa565b601255565b6000611a25610e08565b8210611a7f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610eaa565b5090565b6000546001600160a01b03163314611aad5760405162461bcd60e51b8152600401610eaa90614265565b6001811015611afe5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610eaa565b600255565b6000546001600160a01b03163314611b2d5760405162461bcd60e51b8152600401610eaa90614265565b61124160188383613a7b565b6000546001600160a01b03163314611b635760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff0019169055565b6000611b7b826131ef565b5192915050565b6000546001600160a01b03163314611bac5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19166001179055565b6000546001600160a01b03163314611be55760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19169055565b60006001600160a01b038216611c5d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610eaa565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610eaa90614265565b611cb6600061331d565b565b7f0000000000000000000000000000000000000000000000000000000000000000611ce1612568565b1115611cff5760405162461bcd60e51b8152600401610eaa90614222565b60195460ff1615156001148015611d19575060135460ff16155b611d355760405162461bcd60e51b8152600401610eaa906140cc565b611d3d611246565b1515600114611d8e5760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b611d99816001612d44565b611db55760405162461bcd60e51b8152600401610eaa90614154565b611dbf6001612a12565b3414611ddd5760405162461bcd60e51b8152600401610eaa906141db565b611dea8160016000612dc9565b50565b6000546001600160a01b03163314611e175760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19166001179055565b6000546001600160a01b03163314611e505760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19166001179055565b6000546001600160a01b03163314611e895760405162461bcd60e51b8152600401610eaa90614265565b60004711611e9657600080fd5b611cb661336d565b600a8181548110611eae57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314611ef25760405162461bcd60e51b8152600401610eaa90614265565b6001811015611f535760405162461bcd60e51b815260206004820152602760248201527f4d6178206d696e7473207065722077616c6c6574206d757374206265206174206044820152666c65617374203160c81b6064820152608401610eaa565b601a55565b6000546001600160a01b03163314611f825760405162461bcd60e51b8152600401610eaa90614265565b600e55565b6040805180820190915260008082526020820152610e83826131ef565b60606004805461102290614492565b6001600160a01b03821633141561200c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610eaa565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146120a25760405162461bcd60e51b8152600401610eaa90614265565b7f00000000000000000000000000000000000000000000000000000000000000008111156121385760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420696e63656e7469766520746f6b656e49642063617060448201527f206c6172676572207468616e20746f74616c7920737570706c792e00000000006064820152608401610eaa565b60018110156121a55760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073657420746f6b656e49642063617020746f206c65737320746044820152723430b7103a3432903334b939ba103a37b5b2b760691b6064820152608401610eaa565b601055565b6000546001600160a01b031633146121d45760405162461bcd60e51b8152600401610eaa90614265565b61189b611bbb565b6000546001600160a01b031633146122065760405162461bcd60e51b8152600401610eaa90614265565b6000811161221357600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228e9190613f9a565b10156122e85760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610eaa565b60005b600c548110156123fb57816001600160a01b031663a9059cbb600a838154811061231757612317614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b858154811061234a5761234a614528565b9060005260206000200154876123609190614408565b61236a91906143f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190613e71565b50806123f3816144cd565b9150506122eb565b50505050565b6000546001600160a01b0316331461242b5760405162461bcd60e51b8152600401610eaa90614265565b600f55565b61243b848484612e56565b612447848484846133fb565b6123fb5760405162461bcd60e51b8152600401610eaa906142d1565b6000546001600160a01b0316331461248d5760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19169055565b6000546001600160a01b031633146124c35760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff001916610100179055565b6000546001600160a01b031633146124fe5760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19169055565b60606000612516612880565b905060008151116125365760405180602001604052806000815250612561565b8061254084613509565b604051602001612551929190613fdf565b6040516020818303038152906040525b9392505050565b60006125776001546000190190565b610e179060016143dc565b336000908152601b602052604090205460ff16156125b25760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156125d0575060195460ff1615156001145b6125ec5760405162461bcd60e51b8152600401610eaa90614095565b6125f78483836115d3565b6126135760405162461bcd60e51b8152600401610eaa906141a4565b60018310156126345760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156126565760405162461bcd60e51b8152600401610eaa9061436c565b6126608484612d44565b61267c5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000000836126a6610e08565b6126b091906143dc565b11156126ce5760405162461bcd60e51b8152600401610eaa90614222565b6126d783612a12565b34146126f55760405162461bcd60e51b8152600401610eaa90614324565b6126fd61288f565b151560011461271e5760405162461bcd60e51b8152600401610eaa90614111565b61272a84846000612dc9565b5050336000908152601b60205260409020805460ff191660011790555050565b6018805461275790614492565b80601f016020809104026020016040519081016040528092919081815260200182805461278390614492565b80156127d05780601f106127a5576101008083540402835291602001916127d0565b820191906000526020600020905b8154815290600101906020018083116127b357829003601f168201915b505050505081565b6000546001600160a01b031633146128025760405162461bcd60e51b8152600401610eaa90614265565b601954610100900460ff161561285a5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e732061726520616c726561647920756e7665696c656400000000006044820152606401610eaa565b805161286d906018906020840190613afb565b50506019805461ff001916610100179055565b60606018805461102290614492565b60155460009060ff166128a25750600190565b5060165442101590565b60135460ff16151560011480156128ca575060195460ff1615156001145b6128e65760405162461bcd60e51b8152600401610eaa90614095565b6128f18383836115d3565b61290d5760405162461bcd60e51b8152600401610eaa906141a4565b7f0000000000000000000000000000000000000000000000000000000000000000612936612568565b11156129545760405162461bcd60e51b8152600401610eaa90614222565b61295f836001612d44565b61297b5760405162461bcd60e51b8152600401610eaa90614154565b6129856001612a12565b34146129a35760405162461bcd60e51b8152600401610eaa906141db565b6129ab61288f565b15156001146129cc5760405162461bcd60e51b8152600401610eaa90614111565b6112418360016000612dc9565b6000546001600160a01b03163314612a035760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19166001179055565b6000808211612a6d5760405162461bcd60e51b815260206004820152602160248201527f4d757374206265206d696e74696e67206174206c65617374203120746f6b656e6044820152601760f91b6064820152608401610eaa565b60115460ff161580612a875750601054612a85610e08565b115b15612a9a5781600e54610e839190614408565b600082612aa5610e08565b612aaf91906143dc565b90506010548111612ac85782600f546125619190614408565b6000612ad2610e08565b601054612adf919061444f565b9050600060105483612af1919061444f565b905080600e54612b019190614408565b82600f54612b0f9190614408565b6116a091906143dc565b6000546001600160a01b03163314612b435760405162461bcd60e51b8152600401610eaa90614265565b428111612bc35760405162461bcd60e51b815260206004820152604260248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c655075626c696344726f7054696d606482015261652160f01b608482015260a401610eaa565b601455565b6000546001600160a01b03163314612bf25760405162461bcd60e51b8152600401610eaa90614265565b6001600160a01b038116612c575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610eaa565b611dea8161331d565b6000546001600160a01b03163314612c8a5760405162461bcd60e51b8152600401610eaa90614265565b428111612d0d5760405162461bcd60e51b815260206004820152604560248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c65416c6c6f776c69737444726f7060648201526454696d652160d81b608482015260a401610eaa565b601655565b6000546001600160a01b03163314612d3c5760405162461bcd60e51b8152600401610eaa90614265565b611bac611ded565b60006001821015612da95760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206d7573742062652067726561746572207468616e206f7220656044820152687175616c20746f203160b81b6064820152608401610eaa565b601a5482612db685613606565b612dc091906143dc565b11159392505050565b611241838383604051806020016040528060008152506136a4565b600081600111158015610e835750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612e61826131ef565b80519091506000906001600160a01b0316336001600160a01b03161480612e98575033612e8d846110a5565b6001600160a01b0316145b80612eaa57508151612eaa9033610d2b565b905080612f145760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610eaa565b846001600160a01b031682600001516001600160a01b031614612f885760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610eaa565b6001600160a01b038416612fec5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610eaa565b612ffc6000848460000151612dfa565b6001600160a01b038516600090815260066020526040812080546001929061302e9084906001600160801b0316614427565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600660205260408120805460019450909261307a918591166143ba565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556131018460016143dc565b6000818152600560205260409020549091506001600160a01b03166131905761312981612de4565b156131905760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000826131e68584613971565b14949350505050565b60408051808201909152600080825260208201528180600111158015613216575060015481105b156132bd576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215613267579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156132b8579392505050565b613267565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610eaa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600c5481101561100f576133e9600a828154811061339157613391614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b84815481106133c4576133c4614528565b9060005260206000200154856133da9190614408565b6133e491906143f4565b6139e5565b806133f3816144cd565b915050613371565b60006001600160a01b0384163b156134fd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061343f90339089908890889060040161400e565b602060405180830381600087803b15801561345957600080fd5b505af1925050508015613489575060408051601f3d908101601f1916820190925261348691810190613ec4565b60015b6134e3573d8080156134b7576040519150601f19603f3d011682016040523d82523d6000602084013e6134bc565b606091505b5080516134db5760405162461bcd60e51b8152600401610eaa906142d1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613501565b5060015b949350505050565b60608161352d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135575780613541816144cd565b91506135509050600a836143f4565b9150613531565b6000816001600160401b038111156135715761357161453e565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b5090505b8415613501576135b060018361444f565b91506135bd600a866144e8565b6135c89060306143dc565b60f81b8183815181106135dd576135dd614528565b60200101906001600160f81b031916908160001a9053506135ff600a866143f4565b945061359f565b60006001600160a01b0382166136785760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610eaa565b506001600160a01b0316600090815260066020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0385166137075760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610eaa565b61371081612de4565b1561375d5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610eaa565b826137bf576002548411156137bf5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610eaa565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061381b9088906143ba565b6001600160801b03168152602001856138345786613837565b60005b836020015161384691906143ba565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156139655760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461392960008984886133fb565b6139455760405162461bcd60e51b8152600401610eaa906142d1565b8161394f816144cd565b925050808061395d906144cd565b9150506138dc565b50600155505050505050565b600081815b84518110156139dd57600085828151811061399357613993614528565b602002602001015190508083116139b957600083815260208290526040902092506139ca565b600081815260208490526040902092505b50806139d5816144cd565b915050613976565b509392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613a32576040519150601f19603f3d011682016040523d82523d6000602084013e613a37565b606091505b50509050806112415760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610eaa565b828054613a8790614492565b90600052602060002090601f016020900481019282613aa95760008555613aef565b82601f10613ac25782800160ff19823516178555613aef565b82800160010185558215613aef579182015b82811115613aef578235825591602001919060010190613ad4565b50611a7f929150613b6f565b828054613b0790614492565b90600052602060002090601f016020900481019282613b295760008555613aef565b82601f10613b4257805160ff1916838001178555613aef565b82800160010185558215613aef579182015b82811115613aef578251825591602001919060010190613b54565b5b80821115611a7f5760008155600101613b70565b60006001600160401b0380841115613b9e57613b9e61453e565b604051601f8501601f19908116603f01168101908282118183101715613bc657613bc661453e565b81604052809350858152868686011115613bdf57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114613c1057600080fd5b919050565b60008083601f840112613c2757600080fd5b5081356001600160401b03811115613c3e57600080fd5b6020830191508360208260051b8501011115613c5957600080fd5b9250929050565b600060208284031215613c7257600080fd5b61256182613bf9565b60008060408385031215613c8e57600080fd5b613c9783613bf9565b9150613ca560208401613bf9565b90509250929050565b600080600060608486031215613cc357600080fd5b613ccc84613bf9565b9250613cda60208501613bf9565b9150604084013590509250925092565b60008060008060808587031215613d0057600080fd5b613d0985613bf9565b9350613d1760208601613bf9565b92506040850135915060608501356001600160401b03811115613d3957600080fd5b8501601f81018713613d4a57600080fd5b613d5987823560208401613b84565b91505092959194509250565b600080600060408486031215613d7a57600080fd5b613d8384613bf9565b925060208401356001600160401b03811115613d9e57600080fd5b613daa86828701613c15565b9497909650939450505050565b60008060408385031215613dca57600080fd5b613dd383613bf9565b91506020830135613de381614554565b809150509250929050565b60008060408385031215613e0157600080fd5b613e0a83613bf9565b946020939093013593505050565b60008060008060608587031215613e2e57600080fd5b613e3785613bf9565b93506020850135925060408501356001600160401b03811115613e5957600080fd5b613e6587828801613c15565b95989497509550505050565b600060208284031215613e8357600080fd5b815161256181614554565b600060208284031215613ea057600080fd5b5035919050565b600060208284031215613eb957600080fd5b813561256181614562565b600060208284031215613ed657600080fd5b815161256181614562565b60008060208385031215613ef457600080fd5b82356001600160401b0380821115613f0b57600080fd5b818501915085601f830112613f1f57600080fd5b813581811115613f2e57600080fd5b866020828501011115613f4057600080fd5b60209290920196919550909350505050565b600060208284031215613f6457600080fd5b81356001600160401b03811115613f7a57600080fd5b8201601f81018413613f8b57600080fd5b61350184823560208401613b84565b600060208284031215613fac57600080fd5b5051919050565b60008151808452613fcb816020860160208601614466565b601f01601f19169290920160200192915050565b60008351613ff1818460208801614466565b835190830190614005818360208801614466565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061404190830184613fb3565b9695505050505050565b6020815260006125616020830184613fb3565b6020808252601a908201527f4d757374206d696e74206174206c65617374203120746f6b656e000000000000604082015260600190565b6020808252601b908201527f416c6c6f776c697374206d696e74696e6720697320636c6f7365640000000000604082015260600190565b60208082526025908201527f5075626c6963206d696e74696e67206973206e6f74206f70656e207269676874604082015264206e6f772160d81b606082015260800190565b60208082526023908201527f416c6c6f776c6973742064726f702074696d6520686173206e6f74207061737360408201526265642160e81b606082015260800190565b60208082526030908201527f57616c6c65742061646472657373206973206f76657220746865206d6178696d60408201526f756d20616c6c6f776564206d696e747360801b606082015260800190565b6020808252601c908201527f41646472657373206973206e6f7420696e20416c6c6f776c6973742100000000604082015260600190565b60208082526027908201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696040820152666e74206665652160c81b606082015260800190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203560408201526203030360ec1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526028908201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6040820152671c88185b5bdd5b9d60c21b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b60006001600160801b03808316818516808303821115614005576140056144fc565b600082198211156143ef576143ef6144fc565b500190565b60008261440357614403614512565b500490565b6000816000190483118215151615614422576144226144fc565b500290565b60006001600160801b0383811690831681811015614447576144476144fc565b039392505050565b600082821015614461576144616144fc565b500390565b60005b83811015614481578181015183820152602001614469565b838111156123fb5750506000910152565b600181811c908216806144a657607f821691505b602082108114156144c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144e1576144e16144fc565b5060010190565b6000826144f7576144f7614512565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611dea57600080fd5b6001600160e01b031981168114611dea57600080fdfea2646970667358221220714ed29faa832a107702f251e68574942364e5e5bd278d61ac239e5296cda59364736f6c63430008070033697066732f6261667962656962376976666c687577337563626d69657962676c736471326c6b7868706b626d6a7a376734687a7736786e33776d726f6c3565342f

Deployed Bytecode

0x6080604052600436106104935760003560e01c8063817c0d9c11610260578063caa0f92a11610144578063e0eddd91116100c1578063ee54be9611610085578063ee54be9614610d59578063f2fde38b14610d79578063f4637a1514610d99578063f703166314610db3578063f8c0fd2014610dd3578063fd19eaf014610de857600080fd5b8063e0eddd9114610cab578063e692893314610cc1578063e6c6990a14610cd6578063e757223014610cf0578063e985e9c514610d1057600080fd5b8063d7224ba011610108578063d7224ba014610c0d578063d8d2412014610c23578063db4bec4414610c38578063df213e8a14610c68578063e0ec7c3614610c7b57600080fd5b8063caa0f92a14610b9b578063cc3a508514610bb0578063cfc86f7b14610bc3578063cff4492314610bd8578063d547cfb714610bf857600080fd5b806395d89b41116101dd578063b4835e07116101a1578063b4835e0714610afc578063b88d4fde14610b1c578063bb1876a814610b3c578063bc05748e14610b51578063c54826ab14610b66578063c87b56dd14610b7b57600080fd5b806395d89b4114610a72578063a22cb46514610a87578063ab523c6814610aa7578063afe5608b14610ac7578063b40ebceb14610adc57600080fd5b80638f4bb497116102245780638f4bb497146109ac5780638ff4013f146109c657806391b7f5ed146109e657806391c4b57414610a065780639231ab2a14610a2557600080fd5b8063817c0d9c1461092e578063853828b614610943578063891bbe73146109585780638d859f3e146109785780638da5cb5b1461098e57600080fd5b80633e3e0b121161038757806355228ca7116103045780636ba9fd38116102c85780636ba9fd38146108a75780636d3de806146108bc57806370a08231146108d1578063715018a6146108f1578063755edd171461090657806379ab3c891461091957600080fd5b806355228ca71461082257806355f804b31461083c57806358feaa591461085c5780636352211e1461087157806367dec6781461089157600080fd5b80634783f0ef1161034b5780634783f0ef1461078d5780634ab8b5dd146107ad5780634f6ccce7146107c357806354214f69146107e3578063547520fe1461080257600080fd5b80633e3e0b12146106ee57806340ccc0821461070357806342842e0e1461072357806344eed8811461074357806345c0f5331461075957600080fd5b806323b872dd116104155780632f745c59116103d95780632f745c5914610659578063330067861461067957806338b90333146106995780633c003254146106c55780633e07311c146106d857600080fd5b806323b872dd146105da57806326c8140f146105fa578063286c81371461060d5780632913daa01461062d5780632eb4a7ab1461064357600080fd5b8063095ea7b31161045c578063095ea7b31461055f5780630c863bb61461057f57806318160ddd146104985780631aa4ba67146105945780631dfcaa48146105aa57600080fd5b80629a9b7b1461049857806301ffc9a7146104c05780630644cefa146104f057806306fdde0314610505578063081812fc14610527575b600080fd5b3480156104a457600080fd5b506104ad610e08565b6040519081526020015b60405180910390f35b3480156104cc57600080fd5b506104e06104db366004613ea7565b610e1c565b60405190151581526020016104b7565b6105036104fe366004613dee565b610e89565b005b34801561051157600080fd5b5061051a611013565b6040516104b7919061404b565b34801561053357600080fd5b50610547610542366004613e8e565b6110a5565b6040516001600160a01b0390911681526020016104b7565b34801561056b57600080fd5b5061050361057a366004613dee565b61112e565b34801561058b57600080fd5b506104e0611246565b3480156105a057600080fd5b506104ad60165481565b3480156105b657600080fd5b506104e06105c5366004613c60565b601b6020526000908152604090205460ff1681565b3480156105e657600080fd5b506105036105f5366004613cae565b611268565b610503610608366004613e18565b611273565b34801561061957600080fd5b506104ad610628366004613e8e565b61143b565b34801561063957600080fd5b506104ad60025481565b34801561064f57600080fd5b506104ad60125481565b34801561066557600080fd5b506104ad610674366004613dee565b61145c565b34801561068557600080fd5b506104e0610694366004613d65565b6115d3565b3480156106a557600080fd5b506017546106b39060ff1681565b60405160ff90911681526020016104b7565b6105036106d3366004613e18565b6116a9565b3480156106e457600080fd5b506104ad600c5481565b3480156106fa57600080fd5b50610503611871565b34801561070f57600080fd5b5061050361071e366004613dee565b6118a7565b34801561072f57600080fd5b5061050361073e366004613cae565b61197f565b34801561074f57600080fd5b506104ad60145481565b34801561076557600080fd5b506104ad7f0000000000000000000000000000000000000000000000000000000000000fa081565b34801561079957600080fd5b506105036107a8366004613e8e565b61199a565b3480156107b957600080fd5b506104ad601a5481565b3480156107cf57600080fd5b506104ad6107de366004613e8e565b611a1b565b3480156107ef57600080fd5b506019546104e090610100900460ff1681565b34801561080e57600080fd5b5061050361081d366004613e8e565b611a83565b34801561082e57600080fd5b506015546104e09060ff1681565b34801561084857600080fd5b50610503610857366004613ee1565b611b03565b34801561086857600080fd5b50610503611b39565b34801561087d57600080fd5b5061054761088c366004613e8e565b611b70565b34801561089d57600080fd5b506104ad600f5481565b3480156108b357600080fd5b50610503611b82565b3480156108c857600080fd5b50610503611bbb565b3480156108dd57600080fd5b506104ad6108ec366004613c60565b611bf1565b3480156108fd57600080fd5b50610503611c82565b610503610914366004613c60565b611cb8565b34801561092557600080fd5b50610503611ded565b34801561093a57600080fd5b50610503611e26565b34801561094f57600080fd5b50610503611e5f565b34801561096457600080fd5b50610547610973366004613e8e565b611e9e565b34801561098457600080fd5b506104ad600e5481565b34801561099a57600080fd5b506000546001600160a01b0316610547565b3480156109b857600080fd5b506019546104e09060ff1681565b3480156109d257600080fd5b506105036109e1366004613e8e565b611ec8565b3480156109f257600080fd5b50610503610a01366004613e8e565b611f58565b348015610a1257600080fd5b506013546104e090610100900460ff1681565b348015610a3157600080fd5b50610a45610a40366004613e8e565b611f87565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016104b7565b348015610a7e57600080fd5b5061051a611fa4565b348015610a9357600080fd5b50610503610aa2366004613db7565b611fb3565b348015610ab357600080fd5b50610503610ac2366004613e8e565b612078565b348015610ad357600080fd5b506105036121aa565b348015610ae857600080fd5b50610503610af7366004613dee565b6121dc565b348015610b0857600080fd5b50610503610b17366004613e8e565b612401565b348015610b2857600080fd5b50610503610b37366004613cea565b612430565b348015610b4857600080fd5b50610503612463565b348015610b5d57600080fd5b50610503612499565b348015610b7257600080fd5b506105036124d4565b348015610b8757600080fd5b5061051a610b96366004613e8e565b61250a565b348015610ba757600080fd5b506104ad612568565b610503610bbe366004613e18565b612582565b348015610bcf57600080fd5b5061051a61274a565b348015610be457600080fd5b50610503610bf3366004613f52565b6127d8565b348015610c0457600080fd5b5061051a612880565b348015610c1957600080fd5b506104ad60095481565b348015610c2f57600080fd5b506104e061288f565b348015610c4457600080fd5b506104e0610c53366004613c60565b601c6020526000908152604090205460ff1681565b610503610c76366004613d65565b6128ac565b348015610c8757600080fd5b506104e0610c96366004613c60565b601d6020526000908152604090205460ff1681565b348015610cb757600080fd5b506104ad60105481565b348015610ccd57600080fd5b506105036129d9565b348015610ce257600080fd5b506013546104e09060ff1681565b348015610cfc57600080fd5b506104ad610d0b366004613e8e565b612a12565b348015610d1c57600080fd5b506104e0610d2b366004613c7b565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b348015610d6557600080fd5b50610503610d74366004613e8e565b612b19565b348015610d8557600080fd5b50610503610d94366004613c60565b612bc8565b348015610da557600080fd5b506011546104e09060ff1681565b348015610dbf57600080fd5b50610503610dce366004613e8e565b612c60565b348015610ddf57600080fd5b50610503612d12565b348015610df457600080fd5b506104e0610e03366004613dee565b612d44565b6000610e176001546000190190565b905090565b60006001600160e01b031982166380ac58cd60e01b1480610e4d57506001600160e01b03198216635b5e139f60e01b145b80610e6857506001600160e01b0319821663780e9d6360e01b145b80610e8357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001811015610eb35760405162461bcd60e51b8152600401610eaa9061405e565b60405180910390fd5b600254811115610ed55760405162461bcd60e51b8152600401610eaa9061436c565b60195460ff1615156001148015610eef575060135460ff16155b610f0b5760405162461bcd60e51b8152600401610eaa906140cc565b610f13611246565b1515600114610f645760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b610f6e8282612d44565b610f8a5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa081610fb4610e08565b610fbe91906143dc565b1115610fdc5760405162461bcd60e51b8152600401610eaa90614222565b610fe581612a12565b34146110035760405162461bcd60e51b8152600401610eaa90614324565b61100f82826000612dc9565b5050565b60606003805461102290614492565b80601f016020809104026020016040519081016040528092919081815260200182805461104e90614492565b801561109b5780601f106110705761010080835404028352916020019161109b565b820191906000526020600020905b81548152906001019060200180831161107e57829003601f168201915b5050505050905090565b60006110b082612de4565b6111125760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610eaa565b506000908152600760205260409020546001600160a01b031690565b600061113982611b70565b9050806001600160a01b0316836001600160a01b031614156111a85760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610eaa565b336001600160a01b03821614806111c457506111c48133610d2b565b6112365760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610eaa565b611241838383612dfa565b505050565b601354600090610100900460ff1661125e5750600190565b5060145442101590565b611241838383612e56565b336000908152601d602052604090205460ff16156112a35760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156112c1575060195460ff1615156001145b6112dd5760405162461bcd60e51b8152600401610eaa90614095565b6112e88483836115d3565b6113045760405162461bcd60e51b8152600401610eaa906141a4565b60018310156113255760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156113475760405162461bcd60e51b8152600401610eaa9061436c565b6113518484612d44565b61136d5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa083611397610e08565b6113a191906143dc565b11156113bf5760405162461bcd60e51b8152600401610eaa90614222565b6113c883612a12565b34146113e65760405162461bcd60e51b8152600401610eaa90614324565b6113ee61288f565b151560011461140f5760405162461bcd60e51b8152600401610eaa90614111565b61141b84846000612dc9565b5050336000908152601d60205260409020805460ff191660011790555050565b600b818154811061144b57600080fd5b600091825260209091200154905081565b600061146783611bf1565b82106114c05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610eaa565b60006114ca610e08565b905060008060005b83811015611573576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561152457805192505b876001600160a01b0316836001600160a01b03161415611560578684141561155257509350610e8392505050565b8361155c816144cd565b9450505b508061156b816144cd565b9150506114d2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610eaa565b6012546000906116255760405162461bcd60e51b815260206004820152601760248201527f4d65726b6c6520726f6f74206973206e6f7420736574210000000000000000006044820152606401610eaa565b6040516bffffffffffffffffffffffff19606086901b1660208201526000906034016040516020818303038152906040528051906020012090506116a08484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060125491508490506131d9565b95945050505050565b336000908152601c602052604090205460ff16156116d95760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156116f7575060195460ff1615156001145b6117135760405162461bcd60e51b8152600401610eaa90614095565b61171e8483836115d3565b61173a5760405162461bcd60e51b8152600401610eaa906141a4565b600183101561175b5760405162461bcd60e51b8152600401610eaa9061405e565b60025483111561177d5760405162461bcd60e51b8152600401610eaa9061436c565b6117878484612d44565b6117a35760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa0836117cd610e08565b6117d791906143dc565b11156117f55760405162461bcd60e51b8152600401610eaa90614222565b6117fe83612a12565b341461181c5760405162461bcd60e51b8152600401610eaa90614324565b61182461288f565b15156001146118455760405162461bcd60e51b8152600401610eaa90614111565b61185184846000612dc9565b5050336000908152601c60205260409020805460ff191660011790555050565b6000546001600160a01b0316331461189b5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19169055565b6000546001600160a01b031633146118d15760405162461bcd60e51b8152600401610eaa90614265565b600081116119215760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401610eaa565b7f0000000000000000000000000000000000000000000000000000000000000fa08161194b610e08565b61195591906143dc565b11156119735760405162461bcd60e51b8152600401610eaa90614222565b61100f82826001612dc9565b61124183838360405180602001604052806000815250612430565b6000546001600160a01b031633146119c45760405162461bcd60e51b8152600401610eaa90614265565b601254811415611a165760405162461bcd60e51b815260206004820152601e60248201527f4d65726b6c6520726f6f742077696c6c20626520756e6368616e6765642100006044820152606401610eaa565b601255565b6000611a25610e08565b8210611a7f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610eaa565b5090565b6000546001600160a01b03163314611aad5760405162461bcd60e51b8152600401610eaa90614265565b6001811015611afe5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610eaa565b600255565b6000546001600160a01b03163314611b2d5760405162461bcd60e51b8152600401610eaa90614265565b61124160188383613a7b565b6000546001600160a01b03163314611b635760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff0019169055565b6000611b7b826131ef565b5192915050565b6000546001600160a01b03163314611bac5760405162461bcd60e51b8152600401610eaa90614265565b6019805460ff19166001179055565b6000546001600160a01b03163314611be55760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19169055565b60006001600160a01b038216611c5d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610eaa565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6000546001600160a01b03163314611cac5760405162461bcd60e51b8152600401610eaa90614265565b611cb6600061331d565b565b7f0000000000000000000000000000000000000000000000000000000000000fa0611ce1612568565b1115611cff5760405162461bcd60e51b8152600401610eaa90614222565b60195460ff1615156001148015611d19575060135460ff16155b611d355760405162461bcd60e51b8152600401610eaa906140cc565b611d3d611246565b1515600114611d8e5760405162461bcd60e51b815260206004820181905260248201527f5075626c69632064726f702074696d6520686173206e6f7420706173736564216044820152606401610eaa565b611d99816001612d44565b611db55760405162461bcd60e51b8152600401610eaa90614154565b611dbf6001612a12565b3414611ddd5760405162461bcd60e51b8152600401610eaa906141db565b611dea8160016000612dc9565b50565b6000546001600160a01b03163314611e175760405162461bcd60e51b8152600401610eaa90614265565b6013805460ff19166001179055565b6000546001600160a01b03163314611e505760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19166001179055565b6000546001600160a01b03163314611e895760405162461bcd60e51b8152600401610eaa90614265565b60004711611e9657600080fd5b611cb661336d565b600a8181548110611eae57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314611ef25760405162461bcd60e51b8152600401610eaa90614265565b6001811015611f535760405162461bcd60e51b815260206004820152602760248201527f4d6178206d696e7473207065722077616c6c6574206d757374206265206174206044820152666c65617374203160c81b6064820152608401610eaa565b601a55565b6000546001600160a01b03163314611f825760405162461bcd60e51b8152600401610eaa90614265565b600e55565b6040805180820190915260008082526020820152610e83826131ef565b60606004805461102290614492565b6001600160a01b03821633141561200c5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610eaa565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146120a25760405162461bcd60e51b8152600401610eaa90614265565b7f0000000000000000000000000000000000000000000000000000000000000fa08111156121385760405162461bcd60e51b815260206004820152603b60248201527f43616e6e6f742073657420696e63656e7469766520746f6b656e49642063617060448201527f206c6172676572207468616e20746f74616c7920737570706c792e00000000006064820152608401610eaa565b60018110156121a55760405162461bcd60e51b815260206004820152603360248201527f43616e6e6f742073657420746f6b656e49642063617020746f206c65737320746044820152723430b7103a3432903334b939ba103a37b5b2b760691b6064820152608401610eaa565b601055565b6000546001600160a01b031633146121d45760405162461bcd60e51b8152600401610eaa90614265565b61189b611bbb565b6000546001600160a01b031633146122065760405162461bcd60e51b8152600401610eaa90614265565b6000811161221357600080fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a082319060240160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228e9190613f9a565b10156122e85760405162461bcd60e51b815260206004820152602360248201527f436f6e747261637420646f6573206e6f74206f776e20656e6f75676820746f6b604482015262656e7360e81b6064820152608401610eaa565b60005b600c548110156123fb57816001600160a01b031663a9059cbb600a838154811061231757612317614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b858154811061234a5761234a614528565b9060005260206000200154876123609190614408565b61236a91906143f4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190613e71565b50806123f3816144cd565b9150506122eb565b50505050565b6000546001600160a01b0316331461242b5760405162461bcd60e51b8152600401610eaa90614265565b600f55565b61243b848484612e56565b612447848484846133fb565b6123fb5760405162461bcd60e51b8152600401610eaa906142d1565b6000546001600160a01b0316331461248d5760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19169055565b6000546001600160a01b031633146124c35760405162461bcd60e51b8152600401610eaa90614265565b6013805461ff001916610100179055565b6000546001600160a01b031633146124fe5760405162461bcd60e51b8152600401610eaa90614265565b6011805460ff19169055565b60606000612516612880565b905060008151116125365760405180602001604052806000815250612561565b8061254084613509565b604051602001612551929190613fdf565b6040516020818303038152906040525b9392505050565b60006125776001546000190190565b610e179060016143dc565b336000908152601b602052604090205460ff16156125b25760405162461bcd60e51b8152600401610eaa9061429a565b60135460ff16151560011480156125d0575060195460ff1615156001145b6125ec5760405162461bcd60e51b8152600401610eaa90614095565b6125f78483836115d3565b6126135760405162461bcd60e51b8152600401610eaa906141a4565b60018310156126345760405162461bcd60e51b8152600401610eaa9061405e565b6002548311156126565760405162461bcd60e51b8152600401610eaa9061436c565b6126608484612d44565b61267c5760405162461bcd60e51b8152600401610eaa90614154565b7f0000000000000000000000000000000000000000000000000000000000000fa0836126a6610e08565b6126b091906143dc565b11156126ce5760405162461bcd60e51b8152600401610eaa90614222565b6126d783612a12565b34146126f55760405162461bcd60e51b8152600401610eaa90614324565b6126fd61288f565b151560011461271e5760405162461bcd60e51b8152600401610eaa90614111565b61272a84846000612dc9565b5050336000908152601b60205260409020805460ff191660011790555050565b6018805461275790614492565b80601f016020809104026020016040519081016040528092919081815260200182805461278390614492565b80156127d05780601f106127a5576101008083540402835291602001916127d0565b820191906000526020600020905b8154815290600101906020018083116127b357829003601f168201915b505050505081565b6000546001600160a01b031633146128025760405162461bcd60e51b8152600401610eaa90614265565b601954610100900460ff161561285a5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e732061726520616c726561647920756e7665696c656400000000006044820152606401610eaa565b805161286d906018906020840190613afb565b50506019805461ff001916610100179055565b60606018805461102290614492565b60155460009060ff166128a25750600190565b5060165442101590565b60135460ff16151560011480156128ca575060195460ff1615156001145b6128e65760405162461bcd60e51b8152600401610eaa90614095565b6128f18383836115d3565b61290d5760405162461bcd60e51b8152600401610eaa906141a4565b7f0000000000000000000000000000000000000000000000000000000000000fa0612936612568565b11156129545760405162461bcd60e51b8152600401610eaa90614222565b61295f836001612d44565b61297b5760405162461bcd60e51b8152600401610eaa90614154565b6129856001612a12565b34146129a35760405162461bcd60e51b8152600401610eaa906141db565b6129ab61288f565b15156001146129cc5760405162461bcd60e51b8152600401610eaa90614111565b6112418360016000612dc9565b6000546001600160a01b03163314612a035760405162461bcd60e51b8152600401610eaa90614265565b6015805460ff19166001179055565b6000808211612a6d5760405162461bcd60e51b815260206004820152602160248201527f4d757374206265206d696e74696e67206174206c65617374203120746f6b656e6044820152601760f91b6064820152608401610eaa565b60115460ff161580612a875750601054612a85610e08565b115b15612a9a5781600e54610e839190614408565b600082612aa5610e08565b612aaf91906143dc565b90506010548111612ac85782600f546125619190614408565b6000612ad2610e08565b601054612adf919061444f565b9050600060105483612af1919061444f565b905080600e54612b019190614408565b82600f54612b0f9190614408565b6116a091906143dc565b6000546001600160a01b03163314612b435760405162461bcd60e51b8152600401610eaa90614265565b428111612bc35760405162461bcd60e51b815260206004820152604260248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c655075626c696344726f7054696d606482015261652160f01b608482015260a401610eaa565b601455565b6000546001600160a01b03163314612bf25760405162461bcd60e51b8152600401610eaa90614265565b6001600160a01b038116612c575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610eaa565b611dea8161331d565b6000546001600160a01b03163314612c8a5760405162461bcd60e51b8152600401610eaa90614265565b428111612d0d5760405162461bcd60e51b815260206004820152604560248201527f44726f702064617465206d75737420626520696e2066757475726521204f746860448201527f6572776973652063616c6c2064697361626c65416c6c6f776c69737444726f7060648201526454696d652160d81b608482015260a401610eaa565b601655565b6000546001600160a01b03163314612d3c5760405162461bcd60e51b8152600401610eaa90614265565b611bac611ded565b60006001821015612da95760405162461bcd60e51b815260206004820152602960248201527f416d6f756e74206d7573742062652067726561746572207468616e206f7220656044820152687175616c20746f203160b81b6064820152608401610eaa565b601a5482612db685613606565b612dc091906143dc565b11159392505050565b611241838383604051806020016040528060008152506136a4565b600081600111158015610e835750506001541190565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612e61826131ef565b80519091506000906001600160a01b0316336001600160a01b03161480612e98575033612e8d846110a5565b6001600160a01b0316145b80612eaa57508151612eaa9033610d2b565b905080612f145760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610eaa565b846001600160a01b031682600001516001600160a01b031614612f885760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610eaa565b6001600160a01b038416612fec5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610eaa565b612ffc6000848460000151612dfa565b6001600160a01b038516600090815260066020526040812080546001929061302e9084906001600160801b0316614427565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600660205260408120805460019450909261307a918591166143ba565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526005909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556131018460016143dc565b6000818152600560205260409020549091506001600160a01b03166131905761312981612de4565b156131905760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000826131e68584613971565b14949350505050565b60408051808201909152600080825260208201528180600111158015613216575060015481105b156132bd576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215613267579392505050565b50600019016000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156132b8579392505050565b613267565b60405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610eaa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b4760005b600c5481101561100f576133e9600a828154811061339157613391614528565b9060005260206000200160009054906101000a90046001600160a01b03166064600b84815481106133c4576133c4614528565b9060005260206000200154856133da9190614408565b6133e491906143f4565b6139e5565b806133f3816144cd565b915050613371565b60006001600160a01b0384163b156134fd57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061343f90339089908890889060040161400e565b602060405180830381600087803b15801561345957600080fd5b505af1925050508015613489575060408051601f3d908101601f1916820190925261348691810190613ec4565b60015b6134e3573d8080156134b7576040519150601f19603f3d011682016040523d82523d6000602084013e6134bc565b606091505b5080516134db5760405162461bcd60e51b8152600401610eaa906142d1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613501565b5060015b949350505050565b60608161352d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135575780613541816144cd565b91506135509050600a836143f4565b9150613531565b6000816001600160401b038111156135715761357161453e565b6040519080825280601f01601f19166020018201604052801561359b576020820181803683370190505b5090505b8415613501576135b060018361444f565b91506135bd600a866144e8565b6135c89060306143dc565b60f81b8183815181106135dd576135dd614528565b60200101906001600160f81b031916908160001a9053506135ff600a866143f4565b945061359f565b60006001600160a01b0382166136785760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610eaa565b506001600160a01b0316600090815260066020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0385166137075760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610eaa565b61371081612de4565b1561375d5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610eaa565b826137bf576002548411156137bf5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610eaa565b6001600160a01b0385166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b909104169181019190915281518083019092528051909190819061381b9088906143ba565b6001600160801b03168152602001856138345786613837565b60005b836020015161384691906143ba565b6001600160801b039081169091526001600160a01b0380891660008181526006602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526005909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b868110156139655760405182906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461392960008984886133fb565b6139455760405162461bcd60e51b8152600401610eaa906142d1565b8161394f816144cd565b925050808061395d906144cd565b9150506138dc565b50600155505050505050565b600081815b84518110156139dd57600085828151811061399357613993614528565b602002602001015190508083116139b957600083815260208290526040902092506139ca565b600081815260208490526040902092505b50806139d5816144cd565b915050613976565b509392505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613a32576040519150601f19603f3d011682016040523d82523d6000602084013e613a37565b606091505b50509050806112415760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610eaa565b828054613a8790614492565b90600052602060002090601f016020900481019282613aa95760008555613aef565b82601f10613ac25782800160ff19823516178555613aef565b82800160010185558215613aef579182015b82811115613aef578235825591602001919060010190613ad4565b50611a7f929150613b6f565b828054613b0790614492565b90600052602060002090601f016020900481019282613b295760008555613aef565b82601f10613b4257805160ff1916838001178555613aef565b82800160010185558215613aef579182015b82811115613aef578251825591602001919060010190613b54565b5b80821115611a7f5760008155600101613b70565b60006001600160401b0380841115613b9e57613b9e61453e565b604051601f8501601f19908116603f01168101908282118183101715613bc657613bc661453e565b81604052809350858152868686011115613bdf57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114613c1057600080fd5b919050565b60008083601f840112613c2757600080fd5b5081356001600160401b03811115613c3e57600080fd5b6020830191508360208260051b8501011115613c5957600080fd5b9250929050565b600060208284031215613c7257600080fd5b61256182613bf9565b60008060408385031215613c8e57600080fd5b613c9783613bf9565b9150613ca560208401613bf9565b90509250929050565b600080600060608486031215613cc357600080fd5b613ccc84613bf9565b9250613cda60208501613bf9565b9150604084013590509250925092565b60008060008060808587031215613d0057600080fd5b613d0985613bf9565b9350613d1760208601613bf9565b92506040850135915060608501356001600160401b03811115613d3957600080fd5b8501601f81018713613d4a57600080fd5b613d5987823560208401613b84565b91505092959194509250565b600080600060408486031215613d7a57600080fd5b613d8384613bf9565b925060208401356001600160401b03811115613d9e57600080fd5b613daa86828701613c15565b9497909650939450505050565b60008060408385031215613dca57600080fd5b613dd383613bf9565b91506020830135613de381614554565b809150509250929050565b60008060408385031215613e0157600080fd5b613e0a83613bf9565b946020939093013593505050565b60008060008060608587031215613e2e57600080fd5b613e3785613bf9565b93506020850135925060408501356001600160401b03811115613e5957600080fd5b613e6587828801613c15565b95989497509550505050565b600060208284031215613e8357600080fd5b815161256181614554565b600060208284031215613ea057600080fd5b5035919050565b600060208284031215613eb957600080fd5b813561256181614562565b600060208284031215613ed657600080fd5b815161256181614562565b60008060208385031215613ef457600080fd5b82356001600160401b0380821115613f0b57600080fd5b818501915085601f830112613f1f57600080fd5b813581811115613f2e57600080fd5b866020828501011115613f4057600080fd5b60209290920196919550909350505050565b600060208284031215613f6457600080fd5b81356001600160401b03811115613f7a57600080fd5b8201601f81018413613f8b57600080fd5b61350184823560208401613b84565b600060208284031215613fac57600080fd5b5051919050565b60008151808452613fcb816020860160208601614466565b601f01601f19169290920160200192915050565b60008351613ff1818460208801614466565b835190830190614005818360208801614466565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061404190830184613fb3565b9695505050505050565b6020815260006125616020830184613fb3565b6020808252601a908201527f4d757374206d696e74206174206c65617374203120746f6b656e000000000000604082015260600190565b6020808252601b908201527f416c6c6f776c697374206d696e74696e6720697320636c6f7365640000000000604082015260600190565b60208082526025908201527f5075626c6963206d696e74696e67206973206e6f74206f70656e207269676874604082015264206e6f772160d81b606082015260800190565b60208082526023908201527f416c6c6f776c6973742064726f702074696d6520686173206e6f74207061737360408201526265642160e81b606082015260800190565b60208082526030908201527f57616c6c65742061646472657373206973206f76657220746865206d6178696d60408201526f756d20616c6c6f776564206d696e747360801b606082015260800190565b6020808252601c908201527f41646472657373206973206e6f7420696e20416c6c6f776c6973742100000000604082015260600190565b60208082526027908201527f56616c7565206e6565647320746f2062652065786163746c7920746865206d696040820152666e74206665652160c81b606082015260800190565b60208082526023908201527f43616e6e6f74206d696e74206f76657220737570706c7920636170206f66203560408201526203030360ec1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f4164647265737320616c726561647920636c61696d6564000000000000000000604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60208082526028908201527f56616c75652062656c6f77207265717569726564206d696e742066656520666f6040820152671c88185b5bdd5b9d60c21b606082015260800190565b6020808252602e908201527f43616e6e6f74206d696e74206d6f7265207468616e206d6178206d696e74207060408201526d32b9103a3930b739b0b1ba34b7b760911b606082015260800190565b60006001600160801b03808316818516808303821115614005576140056144fc565b600082198211156143ef576143ef6144fc565b500190565b60008261440357614403614512565b500490565b6000816000190483118215151615614422576144226144fc565b500290565b60006001600160801b0383811690831681811015614447576144476144fc565b039392505050565b600082821015614461576144616144fc565b500390565b60005b83811015614481578181015183820152602001614469565b838111156123fb5750506000910152565b600181811c908216806144a657607f821691505b602082108114156144c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144e1576144e16144fc565b5060010190565b6000826144f7576144f7614512565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611dea57600080fd5b6001600160e01b031981168114611dea57600080fdfea2646970667358221220714ed29faa832a107702f251e68574942364e5e5bd278d61ac239e5296cda59364736f6c63430008070033

Deployed Bytecode Sourcemap

65743:111:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34346:90;;;;;;;;;;;;;:::i;:::-;;;9203:25:1;;;9191:2;9176:18;34346:90:0;;;;;;;;36098:370;;;;;;;;;;-1:-1:-1;36098:370:0;;;;;:::i;:::-;;:::i;:::-;;;9030:14:1;;9023:22;9005:41;;8993:2;8978:18;36098:370:0;8865:187:1;58254:767:0;;;;;;:::i;:::-;;:::i;:::-;;38163:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39578:204::-;;;;;;;;;;-1:-1:-1;39578:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8049:32:1;;;8031:51;;8019:2;8004:18;39578:204:0;7885:203:1;39141:379:0;;;;;;;;;;-1:-1:-1;39141:379:0;;;;;:::i;:::-;;:::i;50230:180::-;;;;;;;;;;;;;:::i;50523:45::-;;;;;;;;;;;;;;;;56517:41;;;;;;;;;;-1:-1:-1;56517:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40428:142;;;;;;;;;;-1:-1:-1;40428:142:0;;;;;:::i;:::-;;:::i;62364:1003::-;;;;;;:::i;:::-;;:::i;51696:36::-;;;;;;;;;;-1:-1:-1;51696:36:0;;;;;:::i;:::-;;:::i;32678:27::-;;;;;;;;;;;;;;;;30556:94;;;;;;;;;;;;;;;;35290:744;;;;;;;;;;-1:-1:-1;35290:744:0;;;;;:::i;:::-;;:::i;31277:287::-;;;;;;;;;;-1:-1:-1;31277:287:0;;;;;:::i;:::-;;:::i;56246:33::-;;;;;;;;;;-1:-1:-1;56246:33:0;;;;;;;;;;;28026:4:1;28014:17;;;27996:36;;27984:2;27969:18;56246:33:0;27854:184:1;61351:1005:0;;;;;;:::i;:::-;;:::i;51737:38::-;;;;;;;;;;;;;;;;59114:78;;;;;;;;;;;;;:::i;56968:274::-;;;;;;;;;;-1:-1:-1;56968:274:0;;;;;:::i;:::-;;:::i;40633:157::-;;;;;;;;;;-1:-1:-1;40633:157:0;;;;;:::i;:::-;;:::i;49456:42::-;;;;;;;;;;;;;;;;32634:39;;;;;;;;;;;;;;;30863:191;;;;;;;;;;-1:-1:-1;30863:191:0;;;;;:::i;:::-;;:::i;56472:36::-;;;;;;;;;;;;;;;;34822:177;;;;;;;;;;-1:-1:-1;34822:177:0;;;;;:::i;:::-;;:::i;56429:30::-;;;;;;;;;;-1:-1:-1;56429:30:0;;;;;;;;;;;64760:173;;;;;;;;;;-1:-1:-1;64760:173:0;;;;;:::i;:::-;;:::i;50475:43::-;;;;;;;;;;-1:-1:-1;50475:43:0;;;;;;;;65388:100;;;;;;;;;;-1:-1:-1;65388:100:0;;;;;:::i;:::-;;:::i;49999:92::-;;;;;;;;;;;;;:::i;37986:118::-;;;;;;;;;;-1:-1:-1;37986:118:0;;;;;:::i;:::-;;:::i;53428:45::-;;;;;;;;;;;;;;;;59029:77;;;;;;;;;;;;;:::i;31679:97::-;;;;;;;;;;;;;:::i;36524:211::-;;;;;;;;;;-1:-1:-1;36524:211:0;;;;;:::i;:::-;;:::i;27034:103::-;;;;;;;;;;;;;:::i;57461:566::-;;;;;;:::i;:::-;;:::i;31578:93::-;;;;;;;;;;;;;:::i;53573:96::-;;;;;;;;;;;;;:::i;51782:112::-;;;;;;;;;;;;;:::i;51611:80::-;;;;;;;;;;-1:-1:-1;51611:80:0;;;;;:::i;:::-;;:::i;53390:33::-;;;;;;;;;;;;;;;;26385:87;;;;;;;;;;-1:-1:-1;26431:7:0;26458:6;-1:-1:-1;;;;;26458:6:0;26385:87;;56392:30;;;;;;;;;;-1:-1:-1;56392:30:0;;;;;;;;64390:194;;;;;;;;;;-1:-1:-1;64390:194:0;;;;;:::i;:::-;;:::i;54638:84::-;;;;;;;;;;-1:-1:-1;54638:84:0;;;;;:::i;:::-;;:::i;49411:40::-;;;;;;;;;;-1:-1:-1;49411:40:0;;;;;;;;;;;65494:128;;;;;;;;;;-1:-1:-1;65494:128:0;;;;;:::i;:::-;;:::i;:::-;;;;27537:13:1;;-1:-1:-1;;;;;27533:39:1;27515:58;;27633:4;27621:17;;;27615:24;-1:-1:-1;;;;;27611:49:1;27589:20;;;27582:79;;;;27488:18;65494:128:0;27305:362:1;38318:98:0;;;;;;;;;;;;;:::i;39846:274::-;;;;;;;;;;-1:-1:-1;39846:274:0;;;;;:::i;:::-;;:::i;53942:323::-;;;;;;;;;;-1:-1:-1;53942:323:0;;;;;:::i;:::-;;:::i;63672:122::-;;;;;;;;;;;;;:::i;52738:422::-;;;;;;;;;;-1:-1:-1;52738:422:0;;;;;:::i;:::-;;:::i;54389:109::-;;;;;;;;;;-1:-1:-1;54389:109:0;;;;;:::i;:::-;;:::i;40853:311::-;;;;;;;;;;-1:-1:-1;40853:311:0;;;;;:::i;:::-;;:::i;51085:98::-;;;;;;;;;;;;;:::i;49906:87::-;;;;;;;;;;;;;:::i;53675:98::-;;;;;;;;;;;;;:::i;38479:288::-;;;;;;;;;;-1:-1:-1;38479:288:0;;;;;:::i;:::-;;:::i;34442:96::-;;;;;;;;;;;;;:::i;60352:991::-;;;;;;:::i;:::-;;:::i;56286:97::-;;;;;;;;;;;;;:::i;64951:214::-;;;;;;;;;;-1:-1:-1;64951:214:0;;;;;:::i;:::-;;:::i;65290:92::-;;;;;;;;;;;;;:::i;45461:43::-;;;;;;;;;;;;;;;;51189:191;;;;;;;;;;;;;:::i;56565:48::-;;;;;;;;;;-1:-1:-1;56565:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59439:672;;;;;;:::i;:::-;;:::i;56620:47::-;;;;;;;;;;-1:-1:-1;56620:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53478:41;;;;;;;;;;;;;;;;50986:93;;;;;;;;;;;;;:::i;30657:36::-;;;;;;;;;;-1:-1:-1;30657:36:0;;;;;;;;54728:1207;;;;;;;;;;-1:-1:-1;54728:1207:0;;;;;:::i;:::-;;:::i;40183:186::-;;;;;;;;;;-1:-1:-1;40183:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;40328:25:0;;;40305:4;40328:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40183:186;49676:224;;;;;;;;;;-1:-1:-1;49676:224:0;;;;;:::i;:::-;;:::i;27290:201::-;;;;;;;;;;-1:-1:-1;27290:201:0;;;;;:::i;:::-;;:::i;53524:42::-;;;;;;;;;;-1:-1:-1;53524:42:0;;;;;;;;50747:233;;;;;;;;;;-1:-1:-1;50747:233:0;;;;;:::i;:::-;;:::i;63460:119::-;;;;;;;;;;;;;:::i;63955:242::-;;;;;;;;;;-1:-1:-1;63955:242:0;;;;;:::i;:::-;;:::i;34346:90::-;34393:7;34416:14;34169:1;34710:12;-1:-1:-1;;34710:30:0;;34621:132;34416:14;34409:21;;34346:90;:::o;36098:370::-;36225:4;-1:-1:-1;;;;;;36255:40:0;;-1:-1:-1;;;36255:40:0;;:99;;-1:-1:-1;;;;;;;36306:48:0;;-1:-1:-1;;;36306:48:0;36255:99;:160;;;-1:-1:-1;;;;;;;36365:50:0;;-1:-1:-1;;;36365:50:0;36255:160;:207;;;-1:-1:-1;;;;;;;;;;12879:40:0;;;36426:36;36241:221;36098:370;-1:-1:-1;;36098:370:0:o;58254:767::-;58353:1;58342:7;:12;;58334:51;;;;-1:-1:-1;;;58334:51:0;;;;;;;:::i;:::-;;;;;;;;;58415:12;;58404:7;:23;;58396:82;;;;-1:-1:-1;;;58396:82:0;;;;;;;:::i;:::-;58497:11;;;;:19;;:11;:19;:49;;;;-1:-1:-1;58520:17:0;;;;:26;58497:49;58489:99;;;;-1:-1:-1;;;58489:99:0;;;;;;;:::i;:::-;58607:22;:20;:22::i;:::-;:30;;58633:4;58607:30;58599:75;;;;-1:-1:-1;;;58599:75:0;;21158:2:1;58599:75:0;;;21140:21:1;;;21177:18;;;21170:30;21236:34;21216:18;;;21209:62;21288:18;;58599:75:0;20956:356:1;58599:75:0;58693:27;58707:3;58712:7;58693:13;:27::i;:::-;58685:88;;;;-1:-1:-1;;;58685:88:0;;;;;;;:::i;:::-;58822:14;58811:7;58792:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;58784:92;;;;-1:-1:-1;;;58784:92:0;;;;;;;:::i;:::-;58908:17;58917:7;58908:8;:17::i;:::-;58895:9;:30;58887:83;;;;-1:-1:-1;;;58887:83:0;;;;;;;:::i;:::-;58983:30;58993:3;58998:7;59007:5;58983:9;:30::i;:::-;58254:767;;:::o;38163:94::-;38217:13;38246:5;38239:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38163:94;:::o;39578:204::-;39646:7;39670:16;39678:7;39670;:16::i;:::-;39662:74;;;;-1:-1:-1;;;39662:74:0;;26288:2:1;39662:74:0;;;26270:21:1;26327:2;26307:18;;;26300:30;26366:34;26346:18;;;26339:62;-1:-1:-1;;;26417:18:1;;;26410:43;26470:19;;39662:74:0;26086:409:1;39662:74:0;-1:-1:-1;39752:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39752:24:0;;39578:204::o;39141:379::-;39210:13;39226:24;39242:7;39226:15;:24::i;:::-;39210:40;;39271:5;-1:-1:-1;;;;;39265:11:0;:2;-1:-1:-1;;;;;39265:11:0;;;39257:58;;;;-1:-1:-1;;;39257:58:0;;21519:2:1;39257:58:0;;;21501:21:1;21558:2;21538:18;;;21531:30;21597:34;21577:18;;;21570:62;-1:-1:-1;;;21648:18:1;;;21641:32;21690:19;;39257:58:0;21317:398:1;39257:58:0;25191:10;-1:-1:-1;;;;;39340:21:0;;;;:62;;-1:-1:-1;39365:37:0;39382:5;25191:10;40183:186;:::i;39365:37::-;39324:153;;;;-1:-1:-1;;;39324:153:0;;17594:2:1;39324:153:0;;;17576:21:1;17633:2;17613:18;;;17606:30;17672:34;17652:18;;;17645:62;17743:27;17723:18;;;17716:55;17788:19;;39324:153:0;17392:421:1;39324:153:0;39486:28;39495:2;39499:7;39508:5;39486:8;:28::i;:::-;39203:317;39141:379;;:::o;50230:180::-;50298:21;;50282:4;;50298:21;;;;;50295:63;;-1:-1:-1;50346:4:0;;50230:180::o;50295:63::-;-1:-1:-1;50390:14:0;;50371:15;:33;;;50230:180::o;40428:142::-;40536:28;40546:4;40552:2;40556:7;40536:9;:28::i;62364:1003::-;62504:10;62488:27;;;;:15;:27;;;;;;;;62487:28;62479:64;;;;-1:-1:-1;;;62479:64:0;;;;;;;:::i;:::-;62562:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;62591:11:0;;;;:19;;:11;:19;62562:48;62554:88;;;;-1:-1:-1;;;62554:88:0;;;;;;;:::i;:::-;62661:32;62675:3;62680:12;;62661:13;:32::i;:::-;62653:73;;;;-1:-1:-1;;;62653:73:0;;;;;;;:::i;:::-;62756:1;62745:7;:12;;62737:51;;;;-1:-1:-1;;;62737:51:0;;;;;;;:::i;:::-;62818:12;;62807:7;:23;;62799:82;;;;-1:-1:-1;;;62799:82:0;;;;;;;:::i;:::-;62902:27;62916:3;62921:7;62902:13;:27::i;:::-;62894:88;;;;-1:-1:-1;;;62894:88:0;;;;;;;:::i;:::-;63031:14;63020:7;63001:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;62993:92;;;;-1:-1:-1;;;62993:92:0;;;;;;;:::i;:::-;63117:17;63126:7;63117:8;:17::i;:::-;63104:9;:30;63096:83;;;;-1:-1:-1;;;63096:83:0;;;;;;;:::i;:::-;63198:25;:23;:25::i;:::-;:33;;63227:4;63198:33;63190:81;;;;-1:-1:-1;;;63190:81:0;;;;;;;:::i;:::-;63284:30;63294:3;63299:7;63308:5;63284:9;:30::i;:::-;-1:-1:-1;;63341:10:0;63325:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;63325:34:0;63355:4;63325:34;;;-1:-1:-1;;62364:1003:0:o;51696:36::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51696:36:0;:::o;35290:744::-;35399:7;35434:16;35444:5;35434:9;:16::i;:::-;35426:5;:24;35418:71;;;;-1:-1:-1;;;35418:71:0;;9665:2:1;35418:71:0;;;9647:21:1;9704:2;9684:18;;;9677:30;9743:34;9723:18;;;9716:62;-1:-1:-1;;;9794:18:1;;;9787:32;9836:19;;35418:71:0;9463:398:1;35418:71:0;35496:22;35521:13;:11;:13::i;:::-;35496:38;;35541:19;35571:25;35621:9;35616:350;35640:14;35636:1;:18;35616:350;;;35670:31;35704:14;;;:11;:14;;;;;;;;;35670:48;;;;;;;;;-1:-1:-1;;;;;35670:48:0;;;;;-1:-1:-1;;;35670:48:0;;;-1:-1:-1;;;;;35670:48:0;;;;;;;;35731:28;35727:89;;35792:14;;;-1:-1:-1;35727:89:0;35849:5;-1:-1:-1;;;;;35828:26:0;:17;-1:-1:-1;;;;;35828:26:0;;35824:135;;;35886:5;35871:11;:20;35867:59;;;-1:-1:-1;35913:1:0;-1:-1:-1;35906:8:0;;-1:-1:-1;;;35906:8:0;35867:59;35936:13;;;;:::i;:::-;;;;35824:135;-1:-1:-1;35656:3:0;;;;:::i;:::-;;;;35616:350;;;-1:-1:-1;35972:56:0;;-1:-1:-1;;;35972:56:0;;25047:2:1;35972:56:0;;;25029:21:1;25086:2;25066:18;;;25059:30;25125:34;25105:18;;;25098:62;-1:-1:-1;;;25176:18:1;;;25169:44;25230:19;;35972:56:0;24845:410:1;31277:287:0;31389:10;;31366:4;;31381:51;;;;-1:-1:-1;;;31381:51:0;;10424:2:1;31381:51:0;;;10406:21:1;10463:2;10443:18;;;10436:30;10502:25;10482:18;;;10475:53;10545:18;;31381:51:0;10222:347:1;31381:51:0;31466:21;;-1:-1:-1;;7115:2:1;7111:15;;;7107:53;31466:21:0;;;7095:66:1;31441:12:0;;7177::1;;31466:21:0;;;;;;;;;;;;31456:32;;;;;;31441:47;;31506:50;31525:12;;31506:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31539:10:0;;;-1:-1:-1;31551:4:0;;-1:-1:-1;31506:18:0;:50::i;:::-;31499:57;31277:287;-1:-1:-1;;;;;31277:287:0:o;61351:1005::-;61492:10;61475:28;;;;:16;:28;;;;;;;;61474:29;61466:65;;;;-1:-1:-1;;;61466:65:0;;;;;;;:::i;:::-;61550:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;61579:11:0;;;;:19;;:11;:19;61550:48;61542:88;;;;-1:-1:-1;;;61542:88:0;;;;;;;:::i;:::-;61649:32;61663:3;61668:12;;61649:13;:32::i;:::-;61641:73;;;;-1:-1:-1;;;61641:73:0;;;;;;;:::i;:::-;61744:1;61733:7;:12;;61725:51;;;;-1:-1:-1;;;61725:51:0;;;;;;;:::i;:::-;61806:12;;61795:7;:23;;61787:82;;;;-1:-1:-1;;;61787:82:0;;;;;;;:::i;:::-;61890:27;61904:3;61909:7;61890:13;:27::i;:::-;61882:88;;;;-1:-1:-1;;;61882:88:0;;;;;;;:::i;:::-;62019:14;62008:7;61989:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;61981:92;;;;-1:-1:-1;;;61981:92:0;;;;;;;:::i;:::-;62105:17;62114:7;62105:8;:17::i;:::-;62092:9;:30;62084:83;;;;-1:-1:-1;;;62084:83:0;;;;;;;:::i;:::-;62186:25;:23;:25::i;:::-;:33;;62215:4;62186:33;62178:81;;;;-1:-1:-1;;;62178:81:0;;;;;;;:::i;:::-;62272:30;62282:3;62287:7;62296:5;62272:9;:30::i;:::-;-1:-1:-1;;62330:10:0;62313:28;;;;:16;:28;;;;;:35;;-1:-1:-1;;62313:35:0;62344:4;62313:35;;;-1:-1:-1;;61351:1005:0:o;59114:78::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;59165:11:::1;:19:::0;;-1:-1:-1;;59165:19:0::1;::::0;;59114:78::o;56968:274::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;57061:1:::1;57054:4;:8;57046:48;;;::::0;-1:-1:-1;;;57046:48:0;;13536:2:1;57046:48:0::1;::::0;::::1;13518:21:1::0;13575:2;13555:18;;;13548:30;13614:29;13594:18;;;13587:57;13661:18;;57046:48:0::1;13334:351:1::0;57046:48:0::1;57141:14;57133:4;57114:16;:14;:16::i;:::-;:23;;;;:::i;:::-;:41;;57106:89;;;;-1:-1:-1::0;;;57106:89:0::1;;;;;;;:::i;:::-;57207:26;57217:3;57222:4;57228;57207:9;:26::i;40633:157::-:0;40745:39;40762:4;40768:2;40772:7;40745:39;;;;;;;;;;;;:16;:39::i;30863:191::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;30965:10:::1;;30947:14;:28;;30939:71;;;::::0;-1:-1:-1;;;30939:71:0;;12773:2:1;30939:71:0::1;::::0;::::1;12755:21:1::0;12812:2;12792:18;;;12785:30;12851:32;12831:18;;;12824:60;12901:18;;30939:71:0::1;12571:354:1::0;30939:71:0::1;31019:10;:27:::0;30863:191::o;34822:177::-;34889:7;34921:13;:11;:13::i;:::-;34913:5;:21;34905:69;;;;-1:-1:-1;;;34905:69:0;;13132:2:1;34905:69:0;;;13114:21:1;13171:2;13151:18;;;13144:30;13210:34;13190:18;;;13183:62;-1:-1:-1;;;13261:18:1;;;13254:33;13304:19;;34905:69:0;12930:399:1;34905:69:0;-1:-1:-1;34988:5:0;34822:177::o;64760:173::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;64853:1:::1;64838:11;:16;;64830:56;;;::::0;-1:-1:-1;;;64830:56:0;;10068:2:1;64830:56:0::1;::::0;::::1;10050:21:1::0;10107:2;10087:18;;;10080:30;10146:29;10126:18;;;10119:57;10193:18;;64830:56:0::1;9866:351:1::0;64830:56:0::1;64898:12;:26:::0;64760:173::o;65388:100::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;65459:23:::1;:13;65475:7:::0;;65459:23:::1;:::i;49999:92::-:0;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;50056:21:::1;:29:::0;;-1:-1:-1;;50056:29:0::1;::::0;;49999:92::o;37986:118::-;38050:7;38073:20;38085:7;38073:11;:20::i;:::-;:25;;37986:118;-1:-1:-1;;37986:118:0:o;59029:77::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;59080:11:::1;:18:::0;;-1:-1:-1;;59080:18:0::1;59094:4;59080:18;::::0;;59029:77::o;31679:97::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;31743:17:::1;:25:::0;;-1:-1:-1;;31743:25:0::1;::::0;;31679:97::o;36524:211::-;36588:7;-1:-1:-1;;;;;36612:19:0;;36604:75;;;;-1:-1:-1;;;36604:75:0;;18424:2:1;36604:75:0;;;18406:21:1;18463:2;18443:18;;;18436:30;18502:34;18482:18;;;18475:62;-1:-1:-1;;;18553:18:1;;;18546:41;18604:19;;36604:75:0;18222:407:1;36604:75:0;-1:-1:-1;;;;;;36701:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;36701:27:0;;36524:211::o;27034:103::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;27099:30:::1;27126:1;27099:18;:30::i;:::-;27034:103::o:0;57461:566::-;57544:14;57524:16;:14;:16::i;:::-;:34;;57516:82;;;;-1:-1:-1;;;57516:82:0;;;;;;;:::i;:::-;57617:11;;;;:19;;:11;:19;:49;;;;-1:-1:-1;57640:17:0;;;;:26;57617:49;57609:99;;;;-1:-1:-1;;;57609:99:0;;;;;;;:::i;:::-;57727:22;:20;:22::i;:::-;:30;;57753:4;57727:30;57719:75;;;;-1:-1:-1;;;57719:75:0;;21158:2:1;57719:75:0;;;21140:21:1;;;21177:18;;;21170:30;21236:34;21216:18;;;21209:62;21288:18;;57719:75:0;20956:356:1;57719:75:0;57813:21;57827:3;57832:1;57813:13;:21::i;:::-;57805:82;;;;-1:-1:-1;;;57805:82:0;;;;;;;:::i;:::-;57919:11;57928:1;57919:8;:11::i;:::-;57906:9;:24;57898:76;;;;-1:-1:-1;;;57898:76:0;;;;;;;:::i;:::-;57995:24;58005:3;58010:1;58013:5;57995:9;:24::i;:::-;57461:566;:::o;31578:93::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;31639:17:::1;:24:::0;;-1:-1:-1;;31639:24:0::1;31659:4;31639:24;::::0;;31578:93::o;53573:96::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;53633:23:::1;:30:::0;;-1:-1:-1;;53633:30:0::1;53659:4;53633:30;::::0;;53573:96::o;51782:112::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;51863:1:::1;51839:21;:25;51831:34;;;::::0;::::1;;51874:14;:12;:14::i;51611:80::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51611:80:0;;-1:-1:-1;51611:80:0;:::o;64390:194::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;64488:1:::1;64471:13;:18;;64463:70;;;::::0;-1:-1:-1;;;64463:70:0;;13892:2:1;64463:70:0::1;::::0;::::1;13874:21:1::0;13931:2;13911:18;;;13904:30;13970:34;13950:18;;;13943:62;-1:-1:-1;;;14021:18:1;;;14014:37;14068:19;;64463:70:0::1;13690:403:1::0;64463:70:0::1;64544:16;:32:::0;64390:194::o;54638:84::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;54699:5:::1;:17:::0;54638:84::o;65494:128::-;-1:-1:-1;;;;;;;;;;;;;;;;;65596:20:0;65608:7;65596:11;:20::i;38318:98::-;38374:13;38403:7;38396:14;;;;;:::i;39846:274::-;-1:-1:-1;;;;;39937:24:0;;25191:10;39937:24;;39929:63;;;;-1:-1:-1;;;39929:63:0;;20384:2:1;39929:63:0;;;20366:21:1;20423:2;20403:18;;;20396:30;20462:28;20442:18;;;20435:56;20508:18;;39929:63:0;20182:350:1;39929:63:0;25191:10;40001:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40001:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40001:53:0;;;;;;;;;;40066:48;;9005:41:1;;;40001:42:0;;25191:10;40066:48;;8978:18:1;40066:48:0;;;;;;;39846:274;;:::o;53942:323::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;54048:14:::1;54030;:32;;54022:104;;;::::0;-1:-1:-1;;;54022:104:0;;19243:2:1;54022:104:0::1;::::0;::::1;19225:21:1::0;19282:2;19262:18;;;19255:30;19321:34;19301:18;;;19294:62;19392:29;19372:18;;;19365:57;19439:19;;54022:104:0::1;19041:423:1::0;54022:104:0::1;54159:1;54141:14;:19;;54133:83;;;::::0;-1:-1:-1;;;54133:83:0;;23045:2:1;54133:83:0::1;::::0;::::1;23027:21:1::0;23084:2;23064:18;;;23057:30;23123:34;23103:18;;;23096:62;-1:-1:-1;;;23174:18:1;;;23167:49;23233:19;;54133:83:0::1;22843:415:1::0;54133:83:0::1;54223:19;:36:::0;53942:323::o;63672:122::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;63730:26:::1;:24;:26::i;52738:422::-:0;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;52847:1:::1;52837:7;:11;52829:20;;;::::0;::::1;;52916:38;::::0;-1:-1:-1;;;52916:38:0;;52948:4:::1;52916:38;::::0;::::1;8031:51:1::0;52886:14:0;;52958:7;;-1:-1:-1;;;;;52916:23:0;::::1;::::0;::::1;::::0;8004:18:1;;52916:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;52908:97;;;::::0;-1:-1:-1;;;52908:97:0;;11251:2:1;52908:97:0::1;::::0;::::1;11233:21:1::0;11290:2;11270:18;;;11263:30;11329:34;11309:18;;;11302:62;-1:-1:-1;;;11380:18:1;;;11373:33;11423:19;;52908:97:0::1;11049:399:1::0;52908:97:0::1;53018:6;53014:141;53032:19;;53028:1;:23;53014:141;;;53070:13;-1:-1:-1::0;;;;;53070:22:0::1;;53093:16;53110:1;53093:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53093:19:0::1;53143:3;53125:11;53137:1;53125:14;;;;;;;;:::i;:::-;;;;;;;;;53115:7;:24;;;;:::i;:::-;53114:32;;;;:::i;:::-;53070:77;::::0;-1:-1:-1;;;;;;53070:77:0::1;::::0;;;;;;-1:-1:-1;;;;;8778:32:1;;;53070:77:0::1;::::0;::::1;8760:51:1::0;8827:18;;;8820:34;8733:18;;53070:77:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53053:3:0;::::1;::::0;::::1;:::i;:::-;;;;53014:141;;;;52822:338;52738:422:::0;;:::o;54389:109::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;54464:16:::1;:28:::0;54389:109::o;40853:311::-;40990:28;41000:4;41006:2;41010:7;40990:9;:28::i;:::-;41041:48;41064:4;41070:2;41074:7;41083:5;41041:22;:48::i;:::-;41025:133;;;;-1:-1:-1;;;41025:133:0;;;;;;;:::i;51085:98::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;51145:24:::1;:32:::0;;-1:-1:-1;;51145:32:0::1;::::0;;51085:98::o;49906:87::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;49959:21:::1;:28:::0;;-1:-1:-1;;49959:28:0::1;;;::::0;;49906:87::o;53675:98::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;53736:23:::1;:31:::0;;-1:-1:-1;;53736:31:0::1;::::0;;53675:98::o;38479:288::-;38577:13;38602:21;38626:10;:8;:10::i;:::-;38602:34;;38681:1;38663:7;38657:21;:25;:104;;;;;;;;;;;;;;;;;38718:7;38727:18;:7;:16;:18::i;:::-;38701:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38657:104;38643:118;38479:288;-1:-1:-1;;;38479:288:0:o;34442:96::-;34489:7;34514:14;34169:1;34710:12;-1:-1:-1;;34710:30:0;;34621:132;34514:14;:18;;34531:1;34514:18;:::i;60352:991::-;60486:10;60476:21;;;;:9;:21;;;;;;;;60475:22;60467:58;;;;-1:-1:-1;;;60467:58:0;;;;;;;:::i;:::-;60544:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;60573:11:0;;;;:19;;:11;:19;60544:48;60536:88;;;;-1:-1:-1;;;60536:88:0;;;;;;;:::i;:::-;60643:32;60657:3;60662:12;;60643:13;:32::i;:::-;60635:73;;;;-1:-1:-1;;;60635:73:0;;;;;;;:::i;:::-;60738:1;60727:7;:12;;60719:51;;;;-1:-1:-1;;;60719:51:0;;;;;;;:::i;:::-;60800:12;;60789:7;:23;;60781:82;;;;-1:-1:-1;;;60781:82:0;;;;;;;:::i;:::-;60884:27;60898:3;60903:7;60884:13;:27::i;:::-;60876:88;;;;-1:-1:-1;;;60876:88:0;;;;;;;:::i;:::-;61013:14;61002:7;60983:16;:14;:16::i;:::-;:26;;;;:::i;:::-;:44;;60975:92;;;;-1:-1:-1;;;60975:92:0;;;;;;;:::i;:::-;61099:17;61108:7;61099:8;:17::i;:::-;61086:9;:30;61078:83;;;;-1:-1:-1;;;61078:83:0;;;;;;;:::i;:::-;61180:25;:23;:25::i;:::-;:33;;61209:4;61180:33;61172:81;;;;-1:-1:-1;;;61172:81:0;;;;;;;:::i;:::-;61266:30;61276:3;61281:7;61290:5;61266:9;:30::i;:::-;-1:-1:-1;;61317:10:0;61307:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;61307:28:0;61331:4;61307:28;;;-1:-1:-1;;60352:991:0:o;56286:97::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64951:214::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;65035:10:::1;::::0;::::1;::::0;::::1;;;:19;65027:59;;;::::0;-1:-1:-1;;;65027:59:0;;24691:2:1;65027:59:0::1;::::0;::::1;24673:21:1::0;24730:2;24710:18;;;24703:30;24769:29;24749:18;;;24742:57;24816:18;;65027:59:0::1;24489:351:1::0;65027:59:0::1;65097:32:::0;;::::1;::::0;:13:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;65140:10:0::1;:17:::0;;-1:-1:-1;;65140:17:0::1;;;::::0;;64951:214::o;65290:92::-;65334:13;65363;65356:20;;;;;:::i;51189:191::-;51260:24;;51244:4;;51260:24;;51257:66;;-1:-1:-1;51311:4:0;;51189:191::o;51257:66::-;-1:-1:-1;51357:17:0;;51338:15;:36;;;51189:191::o;59439:672::-;59537:17;;;;:25;;:17;:25;:48;;;;-1:-1:-1;59566:11:0;;;;:19;;:11;:19;59537:48;59529:88;;;;-1:-1:-1;;;59529:88:0;;;;;;;:::i;:::-;59636:32;59650:3;59655:12;;59636:13;:32::i;:::-;59628:73;;;;-1:-1:-1;;;59628:73:0;;;;;;;:::i;:::-;59740:14;59720:16;:14;:16::i;:::-;:34;;59712:82;;;;-1:-1:-1;;;59712:82:0;;;;;;;:::i;:::-;59813:21;59827:3;59832:1;59813:13;:21::i;:::-;59805:82;;;;-1:-1:-1;;;59805:82:0;;;;;;;:::i;:::-;59919:11;59928:1;59919:8;:11::i;:::-;59906:9;:24;59898:76;;;;-1:-1:-1;;;59898:76:0;;;;;;;:::i;:::-;59993:25;:23;:25::i;:::-;:33;;60022:4;59993:33;59985:81;;;;-1:-1:-1;;;59985:81:0;;;;;;;:::i;:::-;60079:24;60089:3;60094:1;60097:5;60079:9;:24::i;50986:93::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;51042:24:::1;:31:::0;;-1:-1:-1;;51042:31:0::1;51069:4;51042:31;::::0;;50986:93::o;54728:1207::-;54783:7;54816:1;54807:6;:10;54799:56;;;;-1:-1:-1;;;54799:56:0;;26702:2:1;54799:56:0;;;26684:21:1;26741:2;26721:18;;;26714:30;26780:34;26760:18;;;26753:62;-1:-1:-1;;;26831:18:1;;;26824:31;26872:19;;54799:56:0;26500:397:1;54799:56:0;55023:23;;;;:32;;:81;;;55085:19;;55066:16;:14;:16::i;:::-;:38;55023:81;55012:138;;;55136:6;55128:5;;:14;;;;:::i;55012:138::-;55158:21;55201:6;55182:16;:14;:16::i;:::-;:25;;;;:::i;:::-;55158:49;;55365:19;;55347:13;:37;55344:91;;55421:6;55402:16;;:25;;;;:::i;55344:91::-;55697:27;55749:16;:14;:16::i;:::-;55727:19;;:38;;;;:::i;:::-;55697:68;;55772:29;55820:19;;55804:13;:35;;;;:::i;:::-;55772:67;;55907:21;55899:5;;:29;;;;:::i;:::-;55875:19;55856:16;;:38;;;;:::i;:::-;55855:74;;;;:::i;49676:224::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;49772:15:::1;49757:12;:30;49749:109;;;::::0;-1:-1:-1;;;49749:109:0;;10776:2:1;49749:109:0::1;::::0;::::1;10758:21:1::0;10815:2;10795:18;;;10788:30;10854:34;10834:18;;;10827:62;10925:34;10905:18;;;10898:62;-1:-1:-1;;;10976:19:1;;;10969:33;11019:19;;49749:109:0::1;10574:470:1::0;49749:109:0::1;49865:14;:29:::0;49676:224::o;27290:201::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27379:22:0;::::1;27371:73;;;::::0;-1:-1:-1;;;27371:73:0;;11655:2:1;27371:73:0::1;::::0;::::1;11637:21:1::0;11694:2;11674:18;;;11667:30;11733:34;11713:18;;;11706:62;-1:-1:-1;;;11784:18:1;;;11777:36;11830:19;;27371:73:0::1;11453:402:1::0;27371:73:0::1;27455:28;27474:8;27455:18;:28::i;50747:233::-:0;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;50846:15:::1;50831:12;:30;50823:112;;;::::0;-1:-1:-1;;;50823:112:0;;17116:2:1;50823:112:0::1;::::0;::::1;17098:21:1::0;17155:2;17135:18;;;17128:30;17194:34;17174:18;;;17167:62;17265:34;17245:18;;;17238:62;-1:-1:-1;;;17316:19:1;;;17309:36;17362:19;;50823:112:0::1;16914:473:1::0;50823:112:0::1;50942:17;:32:::0;50747:233::o;63460:119::-;26431:7;26458:6;-1:-1:-1;;;;;26458:6:0;25191:10;26605:23;26597:68;;;;-1:-1:-1;;;26597:68:0;;;;;;;:::i;:::-;63517:25:::1;:23;:25::i;63955:242::-:0;64033:4;64069:1;64058:7;:12;;64050:66;;;;-1:-1:-1;;;64050:66:0;;25878:2:1;64050:66:0;;;25860:21:1;25917:2;25897:18;;;25890:30;25956:34;25936:18;;;25929:62;-1:-1:-1;;;26007:18:1;;;26000:39;26056:19;;64050:66:0;25676:405:1;64050:66:0;64173:16;;64161:7;64135:23;64149:8;64135:13;:23::i;:::-;:33;;;;:::i;:::-;64134:55;;;63955:242;-1:-1:-1;;;63955:242:0:o;41540:129::-;41623:40;41633:2;41637:8;41647:11;41623:40;;;;;;;;;;;;:9;:40::i;41399:135::-;41456:4;41495:7;34169:1;41476:26;;:52;;;;-1:-1:-1;;41516:12:0;;-1:-1:-1;41506:22:0;41399:135::o;45283:172::-;45380:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;45380:29:0;-1:-1:-1;;;;;45380:29:0;;;;;;;;;45421:28;;45380:24;;45421:28;;;;;;;45283:172;;;:::o;43652:1529::-;43749:35;43787:20;43799:7;43787:11;:20::i;:::-;43858:18;;43749:58;;-1:-1:-1;43816:22:0;;-1:-1:-1;;;;;43842:34:0;25191:10;-1:-1:-1;;;;;43842:34:0;;:81;;;-1:-1:-1;25191:10:0;43887:20;43899:7;43887:11;:20::i;:::-;-1:-1:-1;;;;;43887:36:0;;43842:81;:142;;;-1:-1:-1;43951:18:0;;43934:50;;25191:10;40183:186;:::i;43934:50::-;43816:169;;44010:17;43994:101;;;;-1:-1:-1;;;43994:101:0;;20739:2:1;43994:101:0;;;20721:21:1;20778:2;20758:18;;;20751:30;20817:34;20797:18;;;20790:62;-1:-1:-1;;;20868:18:1;;;20861:48;20926:19;;43994:101:0;20537:414:1;43994:101:0;44142:4;-1:-1:-1;;;;;44120:26:0;:13;:18;;;-1:-1:-1;;;;;44120:26:0;;44104:98;;;;-1:-1:-1;;;44104:98:0;;18836:2:1;44104:98:0;;;18818:21:1;18875:2;18855:18;;;18848:30;18914:34;18894:18;;;18887:62;-1:-1:-1;;;18965:18:1;;;18958:36;19011:19;;44104:98:0;18634:402:1;44104:98:0;-1:-1:-1;;;;;44217:16:0;;44209:66;;;;-1:-1:-1;;;44209:66:0;;14300:2:1;44209:66:0;;;14282:21:1;14339:2;14319:18;;;14312:30;14378:34;14358:18;;;14351:62;-1:-1:-1;;;14429:18:1;;;14422:35;14474:19;;44209:66:0;14098:401:1;44209:66:0;44384:49;44401:1;44405:7;44414:13;:18;;;44384:8;:49::i;:::-;-1:-1:-1;;;;;44442:18:0;;;;;;:12;:18;;;;;:31;;44472:1;;44442:18;:31;;44472:1;;-1:-1:-1;;;;;44442:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;44442:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44480:16:0;;-1:-1:-1;44480:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;44480:16:0;;:29;;-1:-1:-1;;44480:29:0;;:::i;:::-;;;-1:-1:-1;;;;;44480:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44539:43:0;;;;;;;;-1:-1:-1;;;;;44539:43:0;;;;;-1:-1:-1;;;;;44565:15:0;44539:43;;;;;;;;;-1:-1:-1;44516:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;44516:66:0;-1:-1:-1;;;;;;44516:66:0;;;;;;;;;;;44832:11;44528:7;-1:-1:-1;44832:11:0;:::i;:::-;44895:1;44854:24;;;:11;:24;;;;;:29;44810:33;;-1:-1:-1;;;;;;44854:29:0;44850:236;;44912:20;44920:11;44912:7;:20::i;:::-;44908:171;;;44972:97;;;;;;;;44999:18;;-1:-1:-1;;;;;44972:97:0;;;;;;45030:28;;;;-1:-1:-1;;;;;44972:97:0;;;;;;;;;-1:-1:-1;44945:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;44945:124:0;-1:-1:-1;;;;;;44945:124:0;;;;;;;;;;;;44908:171;45118:7;45114:2;-1:-1:-1;;;;;45099:27:0;45108:4;-1:-1:-1;;;;;45099:27:0;;;;;;;;;;;43742:1439;;;43652:1529;;;:::o;28919:202::-;29052:4;29107;29078:25;29091:5;29098:4;29078:12;:25::i;:::-;:33;;28919:202;-1:-1:-1;;;;28919:202:0:o;36987:945::-;-1:-1:-1;;;;;;;;;;;;;;;;;37111:7:0;;34169:1;37152:23;;:46;;;;;37186:12;;37179:4;:19;37152:46;37148:706;;;37215:31;37249:17;;;:11;:17;;;;;;;;;37215:51;;;;;;;;;-1:-1:-1;;;;;37215:51:0;;;;;-1:-1:-1;;;37215:51:0;;;-1:-1:-1;;;;;37215:51:0;;;;;;;;37285:28;37281:85;;37341:9;36987:945;-1:-1:-1;;;36987:945:0:o;37281:85::-;-1:-1:-1;;;37662:6:0;37699:17;;;;:11;:17;;;;;;;;;37687:29;;;;;;;;;-1:-1:-1;;;;;37687:29:0;;;;;-1:-1:-1;;;37687:29:0;;;-1:-1:-1;;;;;37687:29:0;;;;;;;;37739:28;37735:93;;37799:9;36987:945;-1:-1:-1;;;36987:945:0:o;37735:93::-;37630:213;;37148:706;37869:57;;-1:-1:-1;;;37869:57:0;;25462:2:1;37869:57:0;;;25444:21:1;25501:2;25481:18;;;25474:30;25540:34;25520:18;;;25513:62;-1:-1:-1;;;25591:18:1;;;25584:45;25646:19;;37869:57:0;25260:411:1;27649:191:0;27723:16;27742:6;;-1:-1:-1;;;;;27759:17:0;;;-1:-1:-1;;;;;;27759:17:0;;;;;;27792:40;;27742:6;;;;;;;27792:40;;27723:16;27792:40;27712:128;27649:191;:::o;51902:278::-;51961:21;51943:15;51999:176;52017:19;;52013:1;:23;51999:176;;;52057:108;52084:16;52101:1;52084:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52084:19:0;52149:3;52131:11;52143:1;52131:14;;;;;;;;:::i;:::-;;;;;;;;;52121:7;:24;;;;:::i;:::-;52120:32;;;;:::i;:::-;52057:10;:108::i;:::-;52038:3;;;;:::i;:::-;;;;51999:176;;47072:690;47209:4;-1:-1:-1;;;;;47226:13:0;;3054:19;:23;47222:535;;47265:72;;-1:-1:-1;;;47265:72:0;;-1:-1:-1;;;;;47265:36:0;;;;;:72;;25191:10;;47316:4;;47322:7;;47331:5;;47265:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47265:72:0;;;;;;;;-1:-1:-1;;47265:72:0;;;;;;;;;;;;:::i;:::-;;;47252:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47496:13:0;;47492:215;;47529:61;;-1:-1:-1;;;47529:61:0;;;;;;;:::i;47492:215::-;47675:6;47669:13;47660:6;47656:2;47652:15;47645:38;47252:464;-1:-1:-1;;;;;;47387:55:0;-1:-1:-1;;;47387:55:0;;-1:-1:-1;47380:62:0;;47222:535;-1:-1:-1;47745:4:0;47222:535;47072:690;;;;;;:::o;19942:723::-;19998:13;20219:10;20215:53;;-1:-1:-1;;20246:10:0;;;;;;;;;;;;-1:-1:-1;;;20246:10:0;;;;;19942:723::o;20215:53::-;20293:5;20278:12;20334:78;20341:9;;20334:78;;20367:8;;;;:::i;:::-;;-1:-1:-1;20390:10:0;;-1:-1:-1;20398:2:0;20390:10;;:::i;:::-;;;20334:78;;;20422:19;20454:6;-1:-1:-1;;;;;20444:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20444:17:0;;20422:39;;20472:154;20479:10;;20472:154;;20506:11;20516:1;20506:11;;:::i;:::-;;-1:-1:-1;20575:10:0;20583:2;20575:5;:10;:::i;:::-;20562:24;;:2;:24;:::i;:::-;20549:39;;20532:6;20539;20532:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20532:56:0;;;;;;;;-1:-1:-1;20603:11:0;20612:2;20603:11;;:::i;:::-;;;20472:154;;36741:240;36802:7;-1:-1:-1;;;;;36834:19:0;;36818:102;;;;-1:-1:-1;;;36818:102:0;;14706:2:1;36818:102:0;;;14688:21:1;14745:2;14725:18;;;14718:30;14784:34;14764:18;;;14757:62;-1:-1:-1;;;14835:18:1;;;14828:47;14892:19;;36818:102:0;14504:413:1;36818:102:0;-1:-1:-1;;;;;;36942:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;36942:32:0;;-1:-1:-1;;;;;36942:32:0;;36741:240::o;41998:1434::-;42149:12;;-1:-1:-1;;;;;42176:16:0;;42168:62;;;;-1:-1:-1;;;42168:62:0;;23465:2:1;42168:62:0;;;23447:21:1;23504:2;23484:18;;;23477:30;23543:34;23523:18;;;23516:62;-1:-1:-1;;;23594:18:1;;;23587:31;23635:19;;42168:62:0;23263:397:1;42168:62:0;42367:21;42375:12;42367:7;:21::i;:::-;42366:22;42358:64;;;;-1:-1:-1;;;42358:64:0;;22687:2:1;42358:64:0;;;22669:21:1;22726:2;22706:18;;;22699:30;22765:31;22745:18;;;22738:59;22814:18;;42358:64:0;22485:353:1;42358:64:0;42508:20;42504:116;;42561:12;;42549:8;:24;;42541:71;;;;-1:-1:-1;;;42541:71:0;;27104:2:1;42541:71:0;;;27086:21:1;27143:2;27123:18;;;27116:30;27182:34;27162:18;;;27155:62;-1:-1:-1;;;27233:18:1;;;27226:32;27275:19;;42541:71:0;26902:398:1;42541:71:0;-1:-1:-1;;;;;42731:16:0;;42698:30;42731:16;;;:12;:16;;;;;;;;;42698:49;;;;;;;;;-1:-1:-1;;;;;42698:49:0;;;;;-1:-1:-1;;;42698:49:0;;;;;;;;;;;42773:139;;;;;;;;42793:19;;42698:49;;42773:139;;;42793:39;;42823:8;;42793:39;:::i;:::-;-1:-1:-1;;;;;42773:139:0;;;;;42869:11;:35;;42895:8;42869:35;;;42883:1;42869:35;42841:11;:24;;;:64;;;;:::i;:::-;-1:-1:-1;;;;;42773:139:0;;;;;;-1:-1:-1;;;;;42754:16:0;;;;;;;:12;:16;;;;;;;;:158;;;;;;;;-1:-1:-1;;;42754:158:0;;;;;;;;;;;;42947:43;;;;;;;;;;-1:-1:-1;;;;;42973:15:0;42947:43;;;;;;;;42919:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;42919:71:0;-1:-1:-1;;;;;;42919:71:0;;;;;;;;;;;;;;;;;;42931:12;;43043:281;43067:8;43063:1;:12;43043:281;;;43096:38;;43121:12;;-1:-1:-1;;;;;43096:38:0;;;43113:1;;43096:38;;43113:1;;43096:38;43161:59;43192:1;43196:2;43200:12;43214:5;43161:22;:59::i;:::-;43143:150;;;;-1:-1:-1;;;43143:150:0;;;;;;;:::i;:::-;43302:14;;;;:::i;:::-;;;;43077:3;;;;;:::i;:::-;;;;43043:281;;;-1:-1:-1;43332:12:0;:27;-1:-1:-1;;;;;;41998:1434:0:o;29493:701::-;29576:7;29621:4;29576:7;29638:515;29662:5;:12;29658:1;:16;29638:515;;;29698:20;29721:5;29727:1;29721:8;;;;;;;;:::i;:::-;;;;;;;29698:31;;29766:12;29750;:28;29746:394;;30272:13;30326:15;;;30364:4;30357:15;;;30413:4;30397:21;;29882:57;;29746:394;;;30272:13;30326:15;;;30364:4;30357:15;;;30413:4;30397:21;;30065:57;;29746:394;-1:-1:-1;29676:3:0;;;;:::i;:::-;;;;29638:515;;;-1:-1:-1;30172:12:0;29493:701;-1:-1:-1;;;29493:701:0:o;52188:175::-;52261:12;52279:8;-1:-1:-1;;;;;52279:13:0;52300:7;52279:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52260:52;;;52329:7;52321:36;;;;-1:-1:-1;;;52321:36:0;;21922:2:1;52321:36:0;;;21904:21:1;21961:2;21941:18;;;21934:30;-1:-1:-1;;;21980:18:1;;;21973:46;22036:18;;52321:36:0;21720:340:1;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;-1:-1:-1;;;;;1028:30:1;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1122:67;828:367;;;;;:::o;1200:186::-;1259:6;1312:2;1300:9;1291:7;1287:23;1283:32;1280:52;;;1328:1;1325;1318:12;1280:52;1351:29;1370:9;1351:29;:::i;1391:260::-;1459:6;1467;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1559:29;1578:9;1559:29;:::i;:::-;1549:39;;1607:38;1641:2;1630:9;1626:18;1607:38;:::i;:::-;1597:48;;1391:260;;;;;:::o;1656:328::-;1733:6;1741;1749;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1841:29;1860:9;1841:29;:::i;:::-;1831:39;;1889:38;1923:2;1912:9;1908:18;1889:38;:::i;:::-;1879:48;;1974:2;1963:9;1959:18;1946:32;1936:42;;1656:328;;;;;:::o;1989:666::-;2084:6;2092;2100;2108;2161:3;2149:9;2140:7;2136:23;2132:33;2129:53;;;2178:1;2175;2168:12;2129:53;2201:29;2220:9;2201:29;:::i;:::-;2191:39;;2249:38;2283:2;2272:9;2268:18;2249:38;:::i;:::-;2239:48;;2334:2;2323:9;2319:18;2306:32;2296:42;;2389:2;2378:9;2374:18;2361:32;-1:-1:-1;;;;;2408:6:1;2405:30;2402:50;;;2448:1;2445;2438:12;2402:50;2471:22;;2524:4;2516:13;;2512:27;-1:-1:-1;2502:55:1;;2553:1;2550;2543:12;2502:55;2576:73;2641:7;2636:2;2623:16;2618:2;2614;2610:11;2576:73;:::i;:::-;2566:83;;;1989:666;;;;;;;:::o;2660:511::-;2755:6;2763;2771;2824:2;2812:9;2803:7;2799:23;2795:32;2792:52;;;2840:1;2837;2830:12;2792:52;2863:29;2882:9;2863:29;:::i;:::-;2853:39;;2943:2;2932:9;2928:18;2915:32;-1:-1:-1;;;;;2962:6:1;2959:30;2956:50;;;3002:1;2999;2992:12;2956:50;3041:70;3103:7;3094:6;3083:9;3079:22;3041:70;:::i;:::-;2660:511;;3130:8;;-1:-1:-1;3015:96:1;;-1:-1:-1;;;;2660:511:1:o;3176:315::-;3241:6;3249;3302:2;3290:9;3281:7;3277:23;3273:32;3270:52;;;3318:1;3315;3308:12;3270:52;3341:29;3360:9;3341:29;:::i;:::-;3331:39;;3420:2;3409:9;3405:18;3392:32;3433:28;3455:5;3433:28;:::i;:::-;3480:5;3470:15;;;3176:315;;;;;:::o;3496:254::-;3564:6;3572;3625:2;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;3664:29;3683:9;3664:29;:::i;:::-;3654:39;3740:2;3725:18;;;;3712:32;;-1:-1:-1;;;3496:254:1:o;3755:579::-;3859:6;3867;3875;3883;3936:2;3924:9;3915:7;3911:23;3907:32;3904:52;;;3952:1;3949;3942:12;3904:52;3975:29;3994:9;3975:29;:::i;:::-;3965:39;;4051:2;4040:9;4036:18;4023:32;4013:42;;4106:2;4095:9;4091:18;4078:32;-1:-1:-1;;;;;4125:6:1;4122:30;4119:50;;;4165:1;4162;4155:12;4119:50;4204:70;4266:7;4257:6;4246:9;4242:22;4204:70;:::i;:::-;3755:579;;;;-1:-1:-1;4293:8:1;-1:-1:-1;;;;3755:579:1:o;4339:245::-;4406:6;4459:2;4447:9;4438:7;4434:23;4430:32;4427:52;;;4475:1;4472;4465:12;4427:52;4507:9;4501:16;4526:28;4548:5;4526:28;:::i;4589:180::-;4648:6;4701:2;4689:9;4680:7;4676:23;4672:32;4669:52;;;4717:1;4714;4707:12;4669:52;-1:-1:-1;4740:23:1;;4589:180;-1:-1:-1;4589:180:1:o;4774:245::-;4832:6;4885:2;4873:9;4864:7;4860:23;4856:32;4853:52;;;4901:1;4898;4891:12;4853:52;4940:9;4927:23;4959:30;4983:5;4959:30;:::i;5024:249::-;5093:6;5146:2;5134:9;5125:7;5121:23;5117:32;5114:52;;;5162:1;5159;5152:12;5114:52;5194:9;5188:16;5213:30;5237:5;5213:30;:::i;5278:592::-;5349:6;5357;5410:2;5398:9;5389:7;5385:23;5381:32;5378:52;;;5426:1;5423;5416:12;5378:52;5466:9;5453:23;-1:-1:-1;;;;;5536:2:1;5528:6;5525:14;5522:34;;;5552:1;5549;5542:12;5522:34;5590:6;5579:9;5575:22;5565:32;;5635:7;5628:4;5624:2;5620:13;5616:27;5606:55;;5657:1;5654;5647:12;5606:55;5697:2;5684:16;5723:2;5715:6;5712:14;5709:34;;;5739:1;5736;5729:12;5709:34;5784:7;5779:2;5770:6;5766:2;5762:15;5758:24;5755:37;5752:57;;;5805:1;5802;5795:12;5752:57;5836:2;5828:11;;;;;5858:6;;-1:-1:-1;5278:592:1;;-1:-1:-1;;;;5278:592:1:o;5875:450::-;5944:6;5997:2;5985:9;5976:7;5972:23;5968:32;5965:52;;;6013:1;6010;6003:12;5965:52;6053:9;6040:23;-1:-1:-1;;;;;6078:6:1;6075:30;6072:50;;;6118:1;6115;6108:12;6072:50;6141:22;;6194:4;6186:13;;6182:27;-1:-1:-1;6172:55:1;;6223:1;6220;6213:12;6172:55;6246:73;6311:7;6306:2;6293:16;6288:2;6284;6280:11;6246:73;:::i;6515:184::-;6585:6;6638:2;6626:9;6617:7;6613:23;6609:32;6606:52;;;6654:1;6651;6644:12;6606:52;-1:-1:-1;6677:16:1;;6515:184;-1:-1:-1;6515:184:1:o;6704:257::-;6745:3;6783:5;6777:12;6810:6;6805:3;6798:19;6826:63;6882:6;6875:4;6870:3;6866:14;6859:4;6852:5;6848:16;6826:63;:::i;:::-;6943:2;6922:15;-1:-1:-1;;6918:29:1;6909:39;;;;6950:4;6905:50;;6704:257;-1:-1:-1;;6704:257:1:o;7200:470::-;7379:3;7417:6;7411:13;7433:53;7479:6;7474:3;7467:4;7459:6;7455:17;7433:53;:::i;:::-;7549:13;;7508:16;;;;7571:57;7549:13;7508:16;7605:4;7593:17;;7571:57;:::i;:::-;7644:20;;7200:470;-1:-1:-1;;;;7200:470:1:o;8093:488::-;-1:-1:-1;;;;;8362:15:1;;;8344:34;;8414:15;;8409:2;8394:18;;8387:43;8461:2;8446:18;;8439:34;;;8509:3;8504:2;8489:18;;8482:31;;;8287:4;;8530:45;;8555:19;;8547:6;8530:45;:::i;:::-;8522:53;8093:488;-1:-1:-1;;;;;;8093:488:1:o;9239:219::-;9388:2;9377:9;9370:21;9351:4;9408:44;9448:2;9437:9;9433:18;9425:6;9408:44;:::i;11860:350::-;12062:2;12044:21;;;12101:2;12081:18;;;12074:30;12140:28;12135:2;12120:18;;12113:56;12201:2;12186:18;;11860:350::o;12215:351::-;12417:2;12399:21;;;12456:2;12436:18;;;12429:30;12495:29;12490:2;12475:18;;12468:57;12557:2;12542:18;;12215:351::o;14922:401::-;15124:2;15106:21;;;15163:2;15143:18;;;15136:30;15202:34;15197:2;15182:18;;15175:62;-1:-1:-1;;;15268:2:1;15253:18;;15246:35;15313:3;15298:19;;14922:401::o;15328:399::-;15530:2;15512:21;;;15569:2;15549:18;;;15542:30;15608:34;15603:2;15588:18;;15581:62;-1:-1:-1;;;15674:2:1;15659:18;;15652:33;15717:3;15702:19;;15328:399::o;15732:412::-;15934:2;15916:21;;;15973:2;15953:18;;;15946:30;16012:34;16007:2;15992:18;;15985:62;-1:-1:-1;;;16078:2:1;16063:18;;16056:46;16134:3;16119:19;;15732:412::o;16149:352::-;16351:2;16333:21;;;16390:2;16370:18;;;16363:30;16429;16424:2;16409:18;;16402:58;16492:2;16477:18;;16149:352::o;16506:403::-;16708:2;16690:21;;;16747:2;16727:18;;;16720:30;16786:34;16781:2;16766:18;;16759:62;-1:-1:-1;;;16852:2:1;16837:18;;16830:37;16899:3;16884:19;;16506:403::o;17818:399::-;18020:2;18002:21;;;18059:2;18039:18;;;18032:30;18098:34;18093:2;18078:18;;18071:62;-1:-1:-1;;;18164:2:1;18149:18;;18142:33;18207:3;18192:19;;17818:399::o;19469:356::-;19671:2;19653:21;;;19690:18;;;19683:30;19749:34;19744:2;19729:18;;19722:62;19816:2;19801:18;;19469:356::o;19830:347::-;20032:2;20014:21;;;20071:2;20051:18;;;20044:30;20110:25;20105:2;20090:18;;20083:53;20168:2;20153:18;;19830:347::o;22065:415::-;22267:2;22249:21;;;22306:2;22286:18;;;22279:30;22345:34;22340:2;22325:18;;22318:62;-1:-1:-1;;;22411:2:1;22396:18;;22389:49;22470:3;22455:19;;22065:415::o;23665:404::-;23867:2;23849:21;;;23906:2;23886:18;;;23879:30;23945:34;23940:2;23925:18;;23918:62;-1:-1:-1;;;24011:2:1;23996:18;;23989:38;24059:3;24044:19;;23665:404::o;24074:410::-;24276:2;24258:21;;;24315:2;24295:18;;;24288:30;24354:34;24349:2;24334:18;;24327:62;-1:-1:-1;;;24420:2:1;24405:18;;24398:44;24474:3;24459:19;;24074:410::o;28043:253::-;28083:3;-1:-1:-1;;;;;28172:2:1;28169:1;28165:10;28202:2;28199:1;28195:10;28233:3;28229:2;28225:12;28220:3;28217:21;28214:47;;;28241:18;;:::i;28301:128::-;28341:3;28372:1;28368:6;28365:1;28362:13;28359:39;;;28378:18;;:::i;:::-;-1:-1:-1;28414:9:1;;28301:128::o;28434:120::-;28474:1;28500;28490:35;;28505:18;;:::i;:::-;-1:-1:-1;28539:9:1;;28434:120::o;28559:168::-;28599:7;28665:1;28661;28657:6;28653:14;28650:1;28647:21;28642:1;28635:9;28628:17;28624:45;28621:71;;;28672:18;;:::i;:::-;-1:-1:-1;28712:9:1;;28559:168::o;28732:246::-;28772:4;-1:-1:-1;;;;;28885:10:1;;;;28855;;28907:12;;;28904:38;;;28922:18;;:::i;:::-;28959:13;;28732:246;-1:-1:-1;;;28732:246:1:o;28983:125::-;29023:4;29051:1;29048;29045:8;29042:34;;;29056:18;;:::i;:::-;-1:-1:-1;29093:9:1;;28983:125::o;29113:258::-;29185:1;29195:113;29209:6;29206:1;29203:13;29195:113;;;29285:11;;;29279:18;29266:11;;;29259:39;29231:2;29224:10;29195:113;;;29326:6;29323:1;29320:13;29317:48;;;-1:-1:-1;;29361:1:1;29343:16;;29336:27;29113:258::o;29376:380::-;29455:1;29451:12;;;;29498;;;29519:61;;29573:4;29565:6;29561:17;29551:27;;29519:61;29626:2;29618:6;29615:14;29595:18;29592:38;29589:161;;;29672:10;29667:3;29663:20;29660:1;29653:31;29707:4;29704:1;29697:15;29735:4;29732:1;29725:15;29589:161;;29376:380;;;:::o;29761:135::-;29800:3;-1:-1:-1;;29821:17:1;;29818:43;;;29841:18;;:::i;:::-;-1:-1:-1;29888:1:1;29877:13;;29761:135::o;29901:112::-;29933:1;29959;29949:35;;29964:18;;:::i;:::-;-1:-1:-1;29998:9:1;;29901:112::o;30018:127::-;30079:10;30074:3;30070:20;30067:1;30060:31;30110:4;30107:1;30100:15;30134:4;30131:1;30124:15;30150:127;30211:10;30206:3;30202:20;30199:1;30192:31;30242:4;30239:1;30232:15;30266:4;30263:1;30256:15;30282:127;30343:10;30338:3;30334:20;30331:1;30324:31;30374:4;30371:1;30364:15;30398:4;30395:1;30388:15;30414:127;30475:10;30470:3;30466:20;30463:1;30456:31;30506:4;30503:1;30496:15;30530:4;30527:1;30520:15;30546:118;30632:5;30625:13;30618:21;30611:5;30608:32;30598:60;;30654:1;30651;30644:12;30669:131;-1:-1:-1;;;;;;30743:32:1;;30733:43;;30723:71;;30790:1;30787;30780:12

Swarm Source

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