ETH Price: $2,526.10 (+0.14%)

Token

XENEXIS (XNX)
 

Overview

Max Total Supply

126 XNX

Holders

32

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Moon Rabbits: Deployer
Balance
5 XNX
0x3d81340fe3700e8fc0fa1892fccd12592552f3a5
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:
XENEXIS

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-06-24
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;





/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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 Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/xenesis.sol


pragma solidity >=0.7.0 <0.9.0;


contract XENEXIS is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;
  using SafeMath for uint256;

  mapping (address => bool) public whitelistForMaestro;
  mapping (uint256 => mapping (address => bool)) public whitelistForOthers;

  mapping (address => uint256) public mintedForMaestro;
  mapping (uint256 => mapping (address => uint256)) public mintedForOthers;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  
  uint256 public costForMaestro = 1.1 ether;
  uint256 public costForOthers = 0.11 ether;
  uint256 public maxSupply = 7888;
  uint256 public maxMintAmountPerTx = 5;

  uint256 public maxMintAmountForMaestroPerEach = 1;
  uint256 public maxMintAmountForOthersPerEach = 5;

  uint256 public mintCountForMaestro = 0;
  uint256 public maxMintCountForMaestro = 111;

  uint256[] public mintCountForOthers;
  uint256[] public maxMintCountForOthers;
  uint256[] public firstNumberForOthers;

  uint256 public eachMintCountForOthers = 0;
  uint256 public eachMaxMintCountForOthers = 1111;

  bool public paused = true;
  bool public pausedForMaestro = true;
  bool public pausedForMaestroPublicMinting = true;
  bool[] public pausedForOthers;
  bool[] public pausedForOthersPublicMinting;

  address public managerAccount;

  constructor() ERC721("XENEXIS", "XNX") {
    setUriPrefix("ipfs://QmNs5Dz8jFtmxMthnbdtyyR35hS16PU1PV9rY6k4Mv7JPk/");
    for (uint256 i = 0; i < 7; i++) {
        mintCountForOthers.push(eachMintCountForOthers);
        maxMintCountForOthers.push(eachMaxMintCountForOthers);
        firstNumberForOthers.push(maxMintCountForMaestro.add(eachMaxMintCountForOthers.mul(i)));
        pausedForOthers.push(true);
        pausedForOthersPublicMinting.push(true);
    }
    managerAccount = 0x065a54BCd0629B2C1a884D983c436a403F490Ff1;
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mintForMaestroWL(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(!pausedForMaestro, "Minting for Maestro is paused!");
    require(msg.value >= costForMaestro * _mintAmount, "Insufficient funds!");
    require(whitelistForMaestro[msg.sender], "This account does not exist in whitelist");

    //_mintLoop(msg.sender, _mintAmount);
    for (uint256 i = 0; i < _mintAmount; i++) {
        require(mintCountForMaestro < maxMintCountForMaestro);
        require(mintedForMaestro[msg.sender] < maxMintAmountForMaestroPerEach, "Already minted!");
        supply.increment();
        _safeMint(msg.sender, mintCountForMaestro.add(1));
        mintCountForMaestro = mintCountForMaestro + 1;
        mintedForMaestro[msg.sender] = mintedForMaestro[msg.sender].add(1);
    }
  }

  function mintForMaestro(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(!pausedForMaestro, "Minting for Maestro is paused!");
    require(!pausedForMaestroPublicMinting, "Minting for Maestro (Public Minitng) is paused!");
    require(msg.value >= costForMaestro * _mintAmount, "Insufficient funds!");

    //_mintLoop(msg.sender, _mintAmount);
    for (uint256 i = 0; i < _mintAmount; i++) {
        require(mintCountForMaestro < maxMintCountForMaestro);
        require(mintedForMaestro[msg.sender] < maxMintAmountForMaestroPerEach, "Already minted!");
        supply.increment();
        _safeMint(msg.sender, mintCountForMaestro.add(1));
        mintCountForMaestro = mintCountForMaestro + 1;
        mintedForMaestro[msg.sender] = mintedForMaestro[msg.sender].add(1);
    }
  }

  function mintForOthersWL(uint256 _collectionNumber, uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(!pausedForOthers[_collectionNumber], "Minting for Others is paused!");
    require(msg.value >= costForOthers * _mintAmount, "Insufficient funds!");
    require(whitelistForOthers[_collectionNumber][msg.sender], "This account does not exist in whitelist");

    //_mintLoop(msg.sender, _mintAmount);
    for (uint256 i = 0; i < _mintAmount; i++) {
        require(mintCountForOthers[_collectionNumber] < maxMintCountForOthers[_collectionNumber]);
        require(mintedForOthers[_collectionNumber][msg.sender] < maxMintAmountForOthersPerEach, "Already minted!");
        supply.increment();
        _safeMint(msg.sender, firstNumberForOthers[_collectionNumber].add(mintCountForOthers[_collectionNumber]).add(1));
        mintCountForOthers[_collectionNumber] = mintCountForOthers[_collectionNumber] + 1;
        mintedForOthers[_collectionNumber][msg.sender] = mintedForOthers[_collectionNumber][msg.sender].add(1);
    }
    
  }

  function mintForOthers(uint256 _collectionNumber, uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(!pausedForOthers[_collectionNumber], "Minting for Others is paused!");
    require(!pausedForOthersPublicMinting[_collectionNumber], "Minting for Others (Public Minting) is paused!");
    require(msg.value >= costForOthers * _mintAmount, "Insufficient funds!");

    //_mintLoop(msg.sender, _mintAmount);
    for (uint256 i = 0; i < _mintAmount; i++) {
        require(mintCountForOthers[_collectionNumber] < maxMintCountForOthers[_collectionNumber]);
        require(mintedForOthers[_collectionNumber][msg.sender] < maxMintAmountForOthersPerEach, "Already minted!");
        supply.increment();
        _safeMint(msg.sender, firstNumberForOthers[_collectionNumber].add(mintCountForOthers[_collectionNumber]).add(1));
        mintCountForOthers[_collectionNumber] = mintCountForOthers[_collectionNumber] + 1;
        mintedForOthers[_collectionNumber][msg.sender] = mintedForOthers[_collectionNumber][msg.sender].add(1);
    }
  }
  
//   function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
//     _mintLoop(_receiver, _mintAmount);
//   }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : "";
  }

  function setCost(uint256 _costForMaestro, uint256 _costForOthers) public onlyOwner {
    costForMaestro = _costForMaestro;
    costForOthers = _costForOthers;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setMaxMintAmountForMaestroPerEach(uint256 _maxMintAmountForMaestroPerEach) public onlyOwner {
    maxMintAmountForMaestroPerEach = _maxMintAmountForMaestroPerEach;
  }

  function setMaxMintAmountForOthersPerEach(uint256 _maxMintAmountForOthersPerEach) public onlyOwner {
    maxMintAmountForOthersPerEach = _maxMintAmountForOthersPerEach;
  }
  

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setPausedForMaestro(bool _state) public onlyOwner {
    pausedForMaestro = _state;
  }

  function setPausedForMaestroPublicMinting(bool _state) public onlyOwner {
    pausedForMaestroPublicMinting = _state;
  }

  function setPausedForOthers(uint256 _collectionNumber, bool _state) public onlyOwner {
    pausedForOthers[_collectionNumber] = _state;
  }

  function setPausedForOthersPublicMinting(uint256 _collectionNumber, bool _state) public onlyOwner {
    pausedForOthersPublicMinting[_collectionNumber] = _state;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

  function ownerMintLoop(address[] calldata _mintingMembers, uint256[] calldata _tokenIds) public {
      require(msg.sender == managerAccount, "Only manager can use Owner Minting");
      require(_mintingMembers.length == _tokenIds.length, "Different length arrays (address, tokenid)");
      for (uint256 i = 0; i < _mintingMembers.length; i++) {
          supply.increment();
          _safeMint(_mintingMembers[i], _tokenIds[i]);
      }
  }

//   function _mintLoop(address _receiver, uint256 _mintAmount) internal {
//     for (uint256 i = 0; i < _mintAmount; i++) {
//       supply.increment();
//       _safeMint(_receiver, supply.current());
//     }
//   }

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

  function setWhitelistForMaestroForLoop(address[] calldata _whitelistMembers) public {
      require(msg.sender == managerAccount, "Only manager can set whitelist");
      for (uint256 i = 0; i < _whitelistMembers.length; i++) {
        whitelistForMaestro[_whitelistMembers[i]] = true;
      }
  }

  function setWhitelistForMaestro(address _whitelistMember, bool _enable) public {
      require(msg.sender == managerAccount, "Only manager can set whitelist");
      whitelistForMaestro[_whitelistMember] = _enable;
  }

  function setWhitelistForOthersForLoop(uint256 _collectionNumber, address[] calldata _whitelistMembers) public {
      require(msg.sender == managerAccount, "Only manager can set whitelist");
      for (uint256 i = 0; i < _whitelistMembers.length; i++) {
        whitelistForOthers[_collectionNumber][_whitelistMembers[i]] = true;
      }
  }

  function setWhitelistForOthers(uint256 _collectionNumber, address _whitelistMember, bool _enable) public {
      require(msg.sender == managerAccount, "Only manager can set whitelist");
      whitelistForOthers[_collectionNumber][_whitelistMember] = _enable;
  }

  function getMintCountForMaestro() public view returns (uint256) {
    return mintCountForMaestro;
  }

  function getMintCountForOthers(uint256 _collectionNumber) public view returns (uint256) {
    return mintCountForOthers[_collectionNumber];
  }

  function getWhitelistedForMaestro(address _checkAddress) public view returns (bool) {
    return whitelistForMaestro[_checkAddress];
  }

  function getWhitelistedForOthers(uint256 _collectionNumber, address _checkAddress) public view returns (bool) {
    return whitelistForOthers[_collectionNumber][_checkAddress];
  }

  function getMintedForMaestro(address _checkAddress) public view returns (uint256) {
    return mintedForMaestro[_checkAddress];
  }

  function getMintedForOthers(uint256 _collectionNumber, address _checkAddress) public view returns (uint256) {
    return mintedForOthers[_collectionNumber][_checkAddress];
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costForMaestro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eachMaxMintCountForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eachMintCountForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"firstNumberForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintCountForMaestro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"}],"name":"getMintCountForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_checkAddress","type":"address"}],"name":"getMintedForMaestro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"address","name":"_checkAddress","type":"address"}],"name":"getMintedForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_checkAddress","type":"address"}],"name":"getWhitelistedForMaestro","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"address","name":"_checkAddress","type":"address"}],"name":"getWhitelistedForOthers","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":"managerAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountForMaestroPerEach","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountForOthersPerEach","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintCountForMaestro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxMintCountForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCountForMaestro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintCountForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForMaestro","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForMaestroWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForOthers","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForOthersWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedForMaestro","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"mintedForOthers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_mintingMembers","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"ownerMintLoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedForMaestro","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedForMaestroPublicMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pausedForOthers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pausedForOthersPublicMinting","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_costForMaestro","type":"uint256"},{"internalType":"uint256","name":"_costForOthers","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountForMaestroPerEach","type":"uint256"}],"name":"setMaxMintAmountForMaestroPerEach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountForOthersPerEach","type":"uint256"}],"name":"setMaxMintAmountForOthersPerEach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPausedForMaestro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPausedForMaestroPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPausedForOthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPausedForOthersPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whitelistMember","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setWhitelistForMaestro","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelistMembers","type":"address[]"}],"name":"setWhitelistForMaestroForLoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"address","name":"_whitelistMember","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setWhitelistForOthers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionNumber","type":"uint256"},{"internalType":"address[]","name":"_whitelistMembers","type":"address[]"}],"name":"setWhitelistForOthersForLoop","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistForMaestro","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"whitelistForOthers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600c91620003d8565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a91600d91620003d8565b50670f43fc2c04ee0000600e55670186cc6acd4b0000600f55611ed060105560056011819055600160125560135560006014819055606f601555601955610457601a55601b805462ffffff191662010101179055348015620000ab57600080fd5b50604080518082018252600781526658454e4558495360c81b6020808301918252835180850190945260038452620b09cb60eb1b908401528151919291620000f691600091620003d8565b5080516200010c906001906020840190620003d8565b5050506200012962000123620002e760201b60201c565b620002eb565b6200014d60405180606001604052806036815260200162003df5603691396200033d565b60005b6007811015620002ba576019546016805460018082019092557fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890191909155601a546017805492830181556000527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c15909101819055601890620001fc90620001e59084620003b5602090811b6200260917901c565b601554620003ca60201b620026151790919060201c565b8154600181810184556000938452602080852090920192909255601c80548084019091558181047f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21101805460ff601f93841661010090810a82810219909316909217909255601d805495860181559095529183047f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f0180549390911690930a9081021990911617905580620002b181620004f8565b91505062000150565b50601e80546001600160a01b03191673065a54bcd0629b2c1a884d983c436a403f490ff11790556200052c565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b031633146200039c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620003b190600c906020840190620003d8565b5050565b6000620003c3828462000499565b9392505050565b6000620003c382846200047e565b828054620003e690620004bb565b90600052602060002090601f0160209004810192826200040a576000855562000455565b82601f106200042557805160ff191683800117855562000455565b8280016001018555821562000455579182015b828111156200045557825182559160200191906001019062000438565b506200046392915062000467565b5090565b5b8082111562000463576000815560010162000468565b6000821982111562000494576200049462000516565b500190565b6000816000190483118215151615620004b657620004b662000516565b500290565b600181811c90821680620004d057607f821691505b60208210811415620004f257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200050f576200050f62000516565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6138b9806200053c6000396000f3fe6080604052600436106104055760003560e01c806370a0823111610213578063b071401b11610123578063dad9adc2116100ab578063f0cf023c1161007a578063f0cf023c14610c6d578063f20c322a14610c9a578063f2fde38b14610cba578063f3a5d55614610cda578063f62d587c14610cf957600080fd5b8063dad9adc214610bce578063e82dc96814610bee578063e985e9c514610c04578063efb2a1ce14610c4d57600080fd5b8063be27575c116100f2578063be27575c14610b2f578063be5014ff14610b42578063bfb75c1a14610b62578063c87b56dd14610b98578063d5abeb0114610bb857600080fd5b8063b071401b14610a97578063b3e4323a14610ab7578063b6e70c7a14610ad7578063b88d4fde14610b0f57600080fd5b80638da5cb5b116101a65780639de3536f116101755780639de3536f14610a0e578063a22cb46514610a21578063a83f5b2114610a41578063afa31fd214610a57578063b003955814610a7757600080fd5b80638da5cb5b146109b057806394354fd0146109ce57806395d89b41146109e45780639b313192146109f957600080fd5b80637ec4a659116101e25780637ec4a659146109305780637ee12ec0146109505780638663d0b3146109705780638a61daba1461099057600080fd5b806370a08231146108bb57806370c0d558146108db578063715018a6146108fb5780637696e0881461091057600080fd5b80633858e4b6116103195780634c0b0c5c116102a15780635c32f591116102705780635c32f591146108095780635c975abb1461084c57806362b99ad4146108665780636352211e1461087b5780636873dbf91461089b57600080fd5b80634c0b0c5c146107945780635503a0e8146107b4578063578fafb5146107c95780635bcf1d60146107e957600080fd5b80633ccfd60b116102e85780633ccfd60b146106fc5780633d2216861461071157806342842e0e14610731578063438b630014610751578063473d13661461077e57600080fd5b80633858e4b6146106835780633876b724146106995780633c58ae81146106c95780633ccb0d60146106e957600080fd5b80631f5356561161039c57806325c35a391161036b57806325c35a39146105db57806326a3380f146105fb5780632c56f04e146106115780633397f6ac1461062757806337226cad1461063d57600080fd5b80631f535656146105345780632180aaa71461056f57806323b872dd146105a8578063250b8bc4146105c857600080fd5b80630c8033e2116103d85780630c8033e2146104bb57806316ba10e0146104df57806316c38b3c146104ff57806318160ddd1461051f57600080fd5b806301ffc9a71461040a57806306fdde031461043f578063081812fc14610461578063095ea7b314610499575b600080fd5b34801561041657600080fd5b5061042a6104253660046131cd565b610d19565b60405190151581526020015b60405180910390f35b34801561044b57600080fd5b50610454610d6b565b60405161043691906134ca565b34801561046d57600080fd5b5061048161047c366004613250565b610dfd565b6040516001600160a01b039091168152602001610436565b3480156104a557600080fd5b506104b96104b43660046130da565b610e97565b005b3480156104c757600080fd5b506104d160195481565b604051908152602001610436565b3480156104eb57600080fd5b506104b96104fa366004613207565b610fad565b34801561050b57600080fd5b506104b961051a3660046131b2565b610fee565b34801561052b57600080fd5b506104d161102b565b34801561054057600080fd5b5061042a61054f366004613269565b600860209081526000928352604080842090915290825290205460ff1681565b34801561057b57600080fd5b5061042a61058a366004612faa565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156105b457600080fd5b506104b96105c3366004612ff8565b61103b565b6104b96105d6366004613337565b61106c565b3480156105e757600080fd5b506104b96105f6366004613250565b6113d0565b34801561060757600080fd5b506104d1600f5481565b34801561061d57600080fd5b506104d160155481565b34801561063357600080fd5b506104d160125481565b34801561064957600080fd5b5061042a610658366004613269565b60009182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561068f57600080fd5b506104d1600e5481565b3480156106a557600080fd5b5061042a6106b4366004612faa565b60076020526000908152604090205460ff1681565b3480156106d557600080fd5b506104b96106e436600461328c565b6113ff565b6104b96106f7366004613250565b61145e565b34801561070857600080fd5b506104b961169c565b34801561071d57600080fd5b506104d161072c366004613250565b61173a565b34801561073d57600080fd5b506104b961074c366004612ff8565b611761565b34801561075d57600080fd5b5061077161076c366004612faa565b61177c565b6040516104369190613486565b34801561078a57600080fd5b506104d160145481565b3480156107a057600080fd5b506104b96107af366004613104565b61185d565b3480156107c057600080fd5b506104546118f9565b3480156107d557600080fd5b506104d16107e4366004613250565b611987565b3480156107f557600080fd5b506104d1610804366004613250565b6119a8565b34801561081557600080fd5b506104d1610824366004613269565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205490565b34801561085857600080fd5b50601b5461042a9060ff1681565b34801561087257600080fd5b506104546119b8565b34801561088757600080fd5b50610481610896366004613250565b6119c5565b3480156108a757600080fd5b506104b96108b6366004613146565b611a3c565b3480156108c757600080fd5b506104d16108d6366004612faa565b611b7d565b3480156108e757600080fd5b50601b5461042a9062010000900460ff1681565b34801561090757600080fd5b506104b9611c04565b34801561091c57600080fd5b506104b961092b366004613337565b611c3a565b34801561093c57600080fd5b506104b961094b366004613207565b611c6f565b34801561095c57600080fd5b506104b961096b3660046131b2565b611cac565b34801561097c57600080fd5b506104b961098b366004613314565b611cf0565b34801561099c57600080fd5b506104b96109ab366004613314565b611d5b565b3480156109bc57600080fd5b506006546001600160a01b0316610481565b3480156109da57600080fd5b506104d160115481565b3480156109f057600080fd5b50610454611d99565b348015610a0557600080fd5b506014546104d1565b6104b9610a1c366004613337565b611da8565b348015610a2d57600080fd5b506104b9610a3c3660046130b0565b612066565b348015610a4d57600080fd5b506104d160135481565b348015610a6357600080fd5b506104b9610a723660046130b0565b612071565b348015610a8357600080fd5b50601e54610481906001600160a01b031681565b348015610aa357600080fd5b506104b9610ab2366004613250565b6120c6565b348015610ac357600080fd5b506104b9610ad2366004613250565b6120f5565b348015610ae357600080fd5b506104d1610af2366004613269565b600a60209081526000928352604080842090915290825290205481565b348015610b1b57600080fd5b506104b9610b2a366004613034565b612124565b6104b9610b3d366004613250565b612156565b348015610b4e57600080fd5b5061042a610b5d366004613250565b612352565b348015610b6e57600080fd5b506104d1610b7d366004612faa565b6001600160a01b031660009081526009602052604090205490565b348015610ba457600080fd5b50610454610bb3366004613250565b612386565b348015610bc457600080fd5b506104d160105481565b348015610bda57600080fd5b5061042a610be9366004613250565b612464565b348015610bfa57600080fd5b506104d1601a5481565b348015610c1057600080fd5b5061042a610c1f366004612fc5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610c5957600080fd5b506104b9610c683660046132c8565b612474565b348015610c7957600080fd5b506104d1610c88366004612faa565b60096020526000908152604090205481565b348015610ca657600080fd5b506104d1610cb5366004613250565b61251b565b348015610cc657600080fd5b506104b9610cd5366004612faa565b61252b565b348015610ce657600080fd5b50601b5461042a90610100900460ff1681565b348015610d0557600080fd5b506104b9610d143660046131b2565b6125c3565b60006001600160e01b031982166380ac58cd60e01b1480610d4a57506001600160e01b03198216635b5e139f60e01b145b80610d6557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610d7a906137ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610da6906137ab565b8015610df35780601f10610dc857610100808354040283529160200191610df3565b820191906000526020600020905b815481529060010190602001808311610dd657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ea2826119c5565b9050806001600160a01b0316836001600160a01b03161415610f105760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e72565b336001600160a01b0382161480610f2c5750610f2c8133610c1f565b610f9e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e72565b610fa88383612621565b505050565b6006546001600160a01b03163314610fd75760405162461bcd60e51b8152600401610e72906135dc565b8051610fea90600d906020840190612e23565b5050565b6006546001600160a01b031633146110185760405162461bcd60e51b8152600401610e72906135dc565b601b805460ff1916911515919091179055565b6000611036600b5490565b905090565b611045338261268f565b6110615760405162461bcd60e51b8152600401610e7290613676565b610fa8838383612786565b8060008111801561107f57506011548111155b61109b5760405162461bcd60e51b8152600401610e729061352f565b601054816110a8600b5490565b6110b2919061371d565b11156110d05760405162461bcd60e51b8152600401610e7290613648565b601b5460ff16156110f35760405162461bcd60e51b8152600401610e7290613611565b601c838154811061110657611106613841565b90600052602060002090602091828204019190069054906101000a900460ff16156111735760405162461bcd60e51b815260206004820152601d60248201527f4d696e74696e6720666f72204f746865727320697320706175736564210000006044820152606401610e72565b601d838154811061118657611186613841565b90600052602060002090602091828204019190069054906101000a900460ff161561120a5760405162461bcd60e51b815260206004820152602e60248201527f4d696e74696e6720666f72204f746865727320285075626c6963204d696e746960448201526d6e6729206973207061757365642160901b6064820152608401610e72565b81600f546112189190613749565b3410156112375760405162461bcd60e51b8152600401610e72906136f0565b60005b828110156113ca576017848154811061125557611255613841565b90600052602060002001546016858154811061127357611273613841565b90600052602060002001541061128857600080fd5b6013546000858152600a60209081526040808320338452909152902054106112c25760405162461bcd60e51b8152600401610e72906136c7565b6112d0600b80546001019055565b6113313361132c6001611326601689815481106112ef576112ef613841565b906000526020600020015460188a8154811061130d5761130d613841565b906000526020600020015461261590919063ffffffff16565b90612615565b612926565b6016848154811061134457611344613841565b9060005260206000200154600161135b919061371d565b6016858154811061136e5761136e613841565b6000918252602080832090910192909255858152600a82526040808220338352909252205461139e906001612615565b6000858152600a60209081526040808320338452909152902055806113c2816137e6565b91505061123a565b50505050565b6006546001600160a01b031633146113fa5760405162461bcd60e51b8152600401610e72906135dc565b601255565b601e546001600160a01b031633146114295760405162461bcd60e51b8152600401610e729061355d565b60009283526008602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b8060008111801561147157506011548111155b61148d5760405162461bcd60e51b8152600401610e729061352f565b6010548161149a600b5490565b6114a4919061371d565b11156114c25760405162461bcd60e51b8152600401610e7290613648565b601b5460ff16156114e55760405162461bcd60e51b8152600401610e7290613611565b601b54610100900460ff161561153d5760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e6720666f72204d61657374726f206973207061757365642100006044820152606401610e72565b601b5462010000900460ff16156115ae5760405162461bcd60e51b815260206004820152602f60248201527f4d696e74696e6720666f72204d61657374726f20285075626c6963204d696e6960448201526e746e6729206973207061757365642160881b6064820152608401610e72565b81600e546115bc9190613749565b3410156115db5760405162461bcd60e51b8152600401610e72906136f0565b60005b82811015610fa857601554601454106115f657600080fd5b60125433600090815260096020526040902054106116265760405162461bcd60e51b8152600401610e72906136c7565b611634600b80546001019055565b61164e3361132c600160145461261590919063ffffffff16565b60145461165c90600161371d565b6014553360009081526009602052604090205461167a906001612615565b3360009081526009602052604090205580611694816137e6565b9150506115de565b6006546001600160a01b031633146116c65760405162461bcd60e51b8152600401610e72906135dc565b60006116da6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611724576040519150601f19603f3d011682016040523d82523d6000602084013e611729565b606091505b505090508061173757600080fd5b50565b60006016828154811061174f5761174f613841565b90600052602060002001549050919050565b610fa883838360405180602001604052806000815250612124565b6060600061178983611b7d565b905060008167ffffffffffffffff8111156117a6576117a6613857565b6040519080825280602002602001820160405280156117cf578160200160208202803683370190505b509050600160005b83811080156117e857506010548211155b156118535760006117f8836119c5565b9050866001600160a01b0316816001600160a01b03161415611840578284838151811061182757611827613841565b60209081029190910101528161183c816137e6565b9250505b8261184a816137e6565b935050506117d7565b5090949350505050565b601e546001600160a01b031633146118875760405162461bcd60e51b8152600401610e729061355d565b60005b81811015610fa8576001600760008585858181106118aa576118aa613841565b90506020020160208101906118bf9190612faa565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806118f1816137e6565b91505061188a565b600d8054611906906137ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611932906137ab565b801561197f5780601f106119545761010080835404028352916020019161197f565b820191906000526020600020905b81548152906001019060200180831161196257829003601f168201915b505050505081565b6018818154811061199757600080fd5b600091825260209091200154905081565b6016818154811061199757600080fd5b600c8054611906906137ab565b6000818152600260205260408120546001600160a01b031680610d655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610e72565b601e546001600160a01b03163314611aa15760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206d616e616765722063616e20757365204f776e6572204d696e74696044820152616e6760f01b6064820152608401610e72565b828114611b035760405162461bcd60e51b815260206004820152602a60248201527f446966666572656e74206c656e677468206172726179732028616464726573736044820152692c20746f6b656e69642960b01b6064820152608401610e72565b60005b83811015611b7657611b1c600b80546001019055565b611b64858583818110611b3157611b31613841565b9050602002016020810190611b469190612faa565b848484818110611b5857611b58613841565b90506020020135612926565b80611b6e816137e6565b915050611b06565b5050505050565b60006001600160a01b038216611be85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610e72565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314611c2e5760405162461bcd60e51b8152600401610e72906135dc565b611c386000612940565b565b6006546001600160a01b03163314611c645760405162461bcd60e51b8152600401610e72906135dc565b600e91909155600f55565b6006546001600160a01b03163314611c995760405162461bcd60e51b8152600401610e72906135dc565b8051610fea90600c906020840190612e23565b6006546001600160a01b03163314611cd65760405162461bcd60e51b8152600401610e72906135dc565b601b80549115156101000261ff0019909216919091179055565b6006546001600160a01b03163314611d1a5760405162461bcd60e51b8152600401610e72906135dc565b80601c8381548110611d2e57611d2e613841565b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055505050565b6006546001600160a01b03163314611d855760405162461bcd60e51b8152600401610e72906135dc565b80601d8381548110611d2e57611d2e613841565b606060018054610d7a906137ab565b80600081118015611dbb57506011548111155b611dd75760405162461bcd60e51b8152600401610e729061352f565b60105481611de4600b5490565b611dee919061371d565b1115611e0c5760405162461bcd60e51b8152600401610e7290613648565b601b5460ff1615611e2f5760405162461bcd60e51b8152600401610e7290613611565b601c8381548110611e4257611e42613841565b90600052602060002090602091828204019190069054906101000a900460ff1615611eaf5760405162461bcd60e51b815260206004820152601d60248201527f4d696e74696e6720666f72204f746865727320697320706175736564210000006044820152606401610e72565b81600f54611ebd9190613749565b341015611edc5760405162461bcd60e51b8152600401610e72906136f0565b600083815260086020908152604080832033845290915290205460ff16611f155760405162461bcd60e51b8152600401610e7290613594565b60005b828110156113ca5760178481548110611f3357611f33613841565b906000526020600020015460168581548110611f5157611f51613841565b906000526020600020015410611f6657600080fd5b6013546000858152600a6020908152604080832033845290915290205410611fa05760405162461bcd60e51b8152600401610e72906136c7565b611fae600b80546001019055565b611fcd3361132c6001611326601689815481106112ef576112ef613841565b60168481548110611fe057611fe0613841565b90600052602060002001546001611ff7919061371d565b6016858154811061200a5761200a613841565b6000918252602080832090910192909255858152600a82526040808220338352909252205461203a906001612615565b6000858152600a602090815260408083203384529091529020558061205e816137e6565b915050611f18565b610fea338383612992565b601e546001600160a01b0316331461209b5760405162461bcd60e51b8152600401610e729061355d565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6006546001600160a01b031633146120f05760405162461bcd60e51b8152600401610e72906135dc565b601155565b6006546001600160a01b0316331461211f5760405162461bcd60e51b8152600401610e72906135dc565b601355565b61212e338361268f565b61214a5760405162461bcd60e51b8152600401610e7290613676565b6113ca84848484612a61565b8060008111801561216957506011548111155b6121855760405162461bcd60e51b8152600401610e729061352f565b60105481612192600b5490565b61219c919061371d565b11156121ba5760405162461bcd60e51b8152600401610e7290613648565b601b5460ff16156121dd5760405162461bcd60e51b8152600401610e7290613611565b601b54610100900460ff16156122355760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e6720666f72204d61657374726f206973207061757365642100006044820152606401610e72565b81600e546122439190613749565b3410156122625760405162461bcd60e51b8152600401610e72906136f0565b3360009081526007602052604090205460ff166122915760405162461bcd60e51b8152600401610e7290613594565b60005b82811015610fa857601554601454106122ac57600080fd5b60125433600090815260096020526040902054106122dc5760405162461bcd60e51b8152600401610e72906136c7565b6122ea600b80546001019055565b6123043361132c600160145461261590919063ffffffff16565b60145461231290600161371d565b60145533600090815260096020526040902054612330906001612615565b336000908152600960205260409020558061234a816137e6565b915050612294565b601d818154811061236257600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000818152600260205260409020546060906001600160a01b03166124055760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610e72565b600061240f612a94565b9050600081511161242f576040518060200160405280600081525061245d565b8061243984612aa3565b600d60405160200161244d93929190613385565b6040516020818303038152906040525b9392505050565b601c818154811061236257600080fd5b601e546001600160a01b0316331461249e5760405162461bcd60e51b8152600401610e729061355d565b60005b818110156113ca5760008481526008602052604081206001918585858181106124cc576124cc613841565b90506020020160208101906124e19190612faa565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612513816137e6565b9150506124a1565b6017818154811061199757600080fd5b6006546001600160a01b031633146125555760405162461bcd60e51b8152600401610e72906135dc565b6001600160a01b0381166125ba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e72565b61173781612940565b6006546001600160a01b031633146125ed5760405162461bcd60e51b8152600401610e72906135dc565b601b8054911515620100000262ff000019909216919091179055565b600061245d8284613749565b600061245d828461371d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612656826119c5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166127085760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e72565b6000612713836119c5565b9050806001600160a01b0316846001600160a01b0316148061274e5750836001600160a01b031661274384610dfd565b6001600160a01b0316145b8061277e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612799826119c5565b6001600160a01b0316146128015760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e72565b6001600160a01b0382166128635760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e72565b61286e600082612621565b6001600160a01b0383166000908152600360205260408120805460019290612897908490613768565b90915550506001600160a01b03821660009081526003602052604081208054600192906128c590849061371d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610fea828260405180602001604052806000815250612ba1565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156129f45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e72565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612a6c848484612786565b612a7884848484612bd4565b6113ca5760405162461bcd60e51b8152600401610e72906134dd565b6060600c8054610d7a906137ab565b606081612ac75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612af15780612adb816137e6565b9150612aea9050600a83613735565b9150612acb565b60008167ffffffffffffffff811115612b0c57612b0c613857565b6040519080825280601f01601f191660200182016040528015612b36576020820181803683370190505b5090505b841561277e57612b4b600183613768565b9150612b58600a86613801565b612b6390603061371d565b60f81b818381518110612b7857612b78613841565b60200101906001600160f81b031916908160001a905350612b9a600a86613735565b9450612b3a565b612bab8383612ce1565b612bb86000848484612bd4565b610fa85760405162461bcd60e51b8152600401610e72906134dd565b60006001600160a01b0384163b15612cd657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c18903390899088908890600401613449565b602060405180830381600087803b158015612c3257600080fd5b505af1925050508015612c62575060408051601f3d908101601f19168201909252612c5f918101906131ea565b60015b612cbc573d808015612c90576040519150601f19603f3d011682016040523d82523d6000602084013e612c95565b606091505b508051612cb45760405162461bcd60e51b8152600401610e72906134dd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061277e565b506001949350505050565b6001600160a01b038216612d375760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e72565b6000818152600260205260409020546001600160a01b031615612d9c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e72565b6001600160a01b0382166000908152600360205260408120805460019290612dc590849061371d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612e2f906137ab565b90600052602060002090601f016020900481019282612e515760008555612e97565b82601f10612e6a57805160ff1916838001178555612e97565b82800160010185558215612e97579182015b82811115612e97578251825591602001919060010190612e7c565b50612ea3929150612ea7565b5090565b5b80821115612ea35760008155600101612ea8565b600067ffffffffffffffff80841115612ed757612ed7613857565b604051601f8501601f19908116603f01168101908282118183101715612eff57612eff613857565b81604052809350858152868686011115612f1857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612f4957600080fd5b919050565b60008083601f840112612f6057600080fd5b50813567ffffffffffffffff811115612f7857600080fd5b6020830191508360208260051b8501011115612f9357600080fd5b9250929050565b80358015158114612f4957600080fd5b600060208284031215612fbc57600080fd5b61245d82612f32565b60008060408385031215612fd857600080fd5b612fe183612f32565b9150612fef60208401612f32565b90509250929050565b60008060006060848603121561300d57600080fd5b61301684612f32565b925061302460208501612f32565b9150604084013590509250925092565b6000806000806080858703121561304a57600080fd5b61305385612f32565b935061306160208601612f32565b925060408501359150606085013567ffffffffffffffff81111561308457600080fd5b8501601f8101871361309557600080fd5b6130a487823560208401612ebc565b91505092959194509250565b600080604083850312156130c357600080fd5b6130cc83612f32565b9150612fef60208401612f9a565b600080604083850312156130ed57600080fd5b6130f683612f32565b946020939093013593505050565b6000806020838503121561311757600080fd5b823567ffffffffffffffff81111561312e57600080fd5b61313a85828601612f4e565b90969095509350505050565b6000806000806040858703121561315c57600080fd5b843567ffffffffffffffff8082111561317457600080fd5b61318088838901612f4e565b9096509450602087013591508082111561319957600080fd5b506131a687828801612f4e565b95989497509550505050565b6000602082840312156131c457600080fd5b61245d82612f9a565b6000602082840312156131df57600080fd5b813561245d8161386d565b6000602082840312156131fc57600080fd5b815161245d8161386d565b60006020828403121561321957600080fd5b813567ffffffffffffffff81111561323057600080fd5b8201601f8101841361324157600080fd5b61277e84823560208401612ebc565b60006020828403121561326257600080fd5b5035919050565b6000806040838503121561327c57600080fd5b82359150612fef60208401612f32565b6000806000606084860312156132a157600080fd5b833592506132b160208501612f32565b91506132bf60408501612f9a565b90509250925092565b6000806000604084860312156132dd57600080fd5b83359250602084013567ffffffffffffffff8111156132fb57600080fd5b61330786828701612f4e565b9497909650939450505050565b6000806040838503121561332757600080fd5b82359150612fef60208401612f9a565b6000806040838503121561334a57600080fd5b50508035926020909101359150565b6000815180845261337181602086016020860161377f565b601f01601f19169290920160200192915050565b6000845160206133988285838a0161377f565b8551918401916133ab8184848a0161377f565b8554920191600090600181811c90808316806133c857607f831692505b8583108114156133e657634e487b7160e01b85526022600452602485fd5b8080156133fa576001811461340b57613438565b60ff19851688528388019550613438565b60008b81526020902060005b858110156134305781548a820152908401908801613417565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347c90830184613359565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134be578351835292840192918401916001016134a2565b50909695505050505050565b60208152600061245d6020830184613359565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252601e908201527f4f6e6c79206d616e616765722063616e207365742077686974656c6973740000604082015260600190565b60208082526028908201527f54686973206163636f756e7420646f6573206e6f7420657869737420696e20776040820152671a1a5d195b1a5cdd60c21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600f908201526e416c7265616479206d696e7465642160881b604082015260600190565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b6000821982111561373057613730613815565b500190565b6000826137445761374461382b565b500490565b600081600019048311821515161561376357613763613815565b500290565b60008282101561377a5761377a613815565b500390565b60005b8381101561379a578181015183820152602001613782565b838111156113ca5750506000910152565b600181811c908216806137bf57607f821691505b602082108114156137e057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137fa576137fa613815565b5060010190565b6000826138105761381061382b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461173757600080fdfea2646970667358221220d6e1246fe29820cbe62b3b5edb765448aa12b245bcf01dce7f22ea9f67d5d17964736f6c63430008070033697066733a2f2f516d4e7335447a386a46746d784d74686e6264747979523335685331365055315056397259366b344d76374a506b2f

Deployed Bytecode

0x6080604052600436106104055760003560e01c806370a0823111610213578063b071401b11610123578063dad9adc2116100ab578063f0cf023c1161007a578063f0cf023c14610c6d578063f20c322a14610c9a578063f2fde38b14610cba578063f3a5d55614610cda578063f62d587c14610cf957600080fd5b8063dad9adc214610bce578063e82dc96814610bee578063e985e9c514610c04578063efb2a1ce14610c4d57600080fd5b8063be27575c116100f2578063be27575c14610b2f578063be5014ff14610b42578063bfb75c1a14610b62578063c87b56dd14610b98578063d5abeb0114610bb857600080fd5b8063b071401b14610a97578063b3e4323a14610ab7578063b6e70c7a14610ad7578063b88d4fde14610b0f57600080fd5b80638da5cb5b116101a65780639de3536f116101755780639de3536f14610a0e578063a22cb46514610a21578063a83f5b2114610a41578063afa31fd214610a57578063b003955814610a7757600080fd5b80638da5cb5b146109b057806394354fd0146109ce57806395d89b41146109e45780639b313192146109f957600080fd5b80637ec4a659116101e25780637ec4a659146109305780637ee12ec0146109505780638663d0b3146109705780638a61daba1461099057600080fd5b806370a08231146108bb57806370c0d558146108db578063715018a6146108fb5780637696e0881461091057600080fd5b80633858e4b6116103195780634c0b0c5c116102a15780635c32f591116102705780635c32f591146108095780635c975abb1461084c57806362b99ad4146108665780636352211e1461087b5780636873dbf91461089b57600080fd5b80634c0b0c5c146107945780635503a0e8146107b4578063578fafb5146107c95780635bcf1d60146107e957600080fd5b80633ccfd60b116102e85780633ccfd60b146106fc5780633d2216861461071157806342842e0e14610731578063438b630014610751578063473d13661461077e57600080fd5b80633858e4b6146106835780633876b724146106995780633c58ae81146106c95780633ccb0d60146106e957600080fd5b80631f5356561161039c57806325c35a391161036b57806325c35a39146105db57806326a3380f146105fb5780632c56f04e146106115780633397f6ac1461062757806337226cad1461063d57600080fd5b80631f535656146105345780632180aaa71461056f57806323b872dd146105a8578063250b8bc4146105c857600080fd5b80630c8033e2116103d85780630c8033e2146104bb57806316ba10e0146104df57806316c38b3c146104ff57806318160ddd1461051f57600080fd5b806301ffc9a71461040a57806306fdde031461043f578063081812fc14610461578063095ea7b314610499575b600080fd5b34801561041657600080fd5b5061042a6104253660046131cd565b610d19565b60405190151581526020015b60405180910390f35b34801561044b57600080fd5b50610454610d6b565b60405161043691906134ca565b34801561046d57600080fd5b5061048161047c366004613250565b610dfd565b6040516001600160a01b039091168152602001610436565b3480156104a557600080fd5b506104b96104b43660046130da565b610e97565b005b3480156104c757600080fd5b506104d160195481565b604051908152602001610436565b3480156104eb57600080fd5b506104b96104fa366004613207565b610fad565b34801561050b57600080fd5b506104b961051a3660046131b2565b610fee565b34801561052b57600080fd5b506104d161102b565b34801561054057600080fd5b5061042a61054f366004613269565b600860209081526000928352604080842090915290825290205460ff1681565b34801561057b57600080fd5b5061042a61058a366004612faa565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156105b457600080fd5b506104b96105c3366004612ff8565b61103b565b6104b96105d6366004613337565b61106c565b3480156105e757600080fd5b506104b96105f6366004613250565b6113d0565b34801561060757600080fd5b506104d1600f5481565b34801561061d57600080fd5b506104d160155481565b34801561063357600080fd5b506104d160125481565b34801561064957600080fd5b5061042a610658366004613269565b60009182526008602090815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561068f57600080fd5b506104d1600e5481565b3480156106a557600080fd5b5061042a6106b4366004612faa565b60076020526000908152604090205460ff1681565b3480156106d557600080fd5b506104b96106e436600461328c565b6113ff565b6104b96106f7366004613250565b61145e565b34801561070857600080fd5b506104b961169c565b34801561071d57600080fd5b506104d161072c366004613250565b61173a565b34801561073d57600080fd5b506104b961074c366004612ff8565b611761565b34801561075d57600080fd5b5061077161076c366004612faa565b61177c565b6040516104369190613486565b34801561078a57600080fd5b506104d160145481565b3480156107a057600080fd5b506104b96107af366004613104565b61185d565b3480156107c057600080fd5b506104546118f9565b3480156107d557600080fd5b506104d16107e4366004613250565b611987565b3480156107f557600080fd5b506104d1610804366004613250565b6119a8565b34801561081557600080fd5b506104d1610824366004613269565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205490565b34801561085857600080fd5b50601b5461042a9060ff1681565b34801561087257600080fd5b506104546119b8565b34801561088757600080fd5b50610481610896366004613250565b6119c5565b3480156108a757600080fd5b506104b96108b6366004613146565b611a3c565b3480156108c757600080fd5b506104d16108d6366004612faa565b611b7d565b3480156108e757600080fd5b50601b5461042a9062010000900460ff1681565b34801561090757600080fd5b506104b9611c04565b34801561091c57600080fd5b506104b961092b366004613337565b611c3a565b34801561093c57600080fd5b506104b961094b366004613207565b611c6f565b34801561095c57600080fd5b506104b961096b3660046131b2565b611cac565b34801561097c57600080fd5b506104b961098b366004613314565b611cf0565b34801561099c57600080fd5b506104b96109ab366004613314565b611d5b565b3480156109bc57600080fd5b506006546001600160a01b0316610481565b3480156109da57600080fd5b506104d160115481565b3480156109f057600080fd5b50610454611d99565b348015610a0557600080fd5b506014546104d1565b6104b9610a1c366004613337565b611da8565b348015610a2d57600080fd5b506104b9610a3c3660046130b0565b612066565b348015610a4d57600080fd5b506104d160135481565b348015610a6357600080fd5b506104b9610a723660046130b0565b612071565b348015610a8357600080fd5b50601e54610481906001600160a01b031681565b348015610aa357600080fd5b506104b9610ab2366004613250565b6120c6565b348015610ac357600080fd5b506104b9610ad2366004613250565b6120f5565b348015610ae357600080fd5b506104d1610af2366004613269565b600a60209081526000928352604080842090915290825290205481565b348015610b1b57600080fd5b506104b9610b2a366004613034565b612124565b6104b9610b3d366004613250565b612156565b348015610b4e57600080fd5b5061042a610b5d366004613250565b612352565b348015610b6e57600080fd5b506104d1610b7d366004612faa565b6001600160a01b031660009081526009602052604090205490565b348015610ba457600080fd5b50610454610bb3366004613250565b612386565b348015610bc457600080fd5b506104d160105481565b348015610bda57600080fd5b5061042a610be9366004613250565b612464565b348015610bfa57600080fd5b506104d1601a5481565b348015610c1057600080fd5b5061042a610c1f366004612fc5565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610c5957600080fd5b506104b9610c683660046132c8565b612474565b348015610c7957600080fd5b506104d1610c88366004612faa565b60096020526000908152604090205481565b348015610ca657600080fd5b506104d1610cb5366004613250565b61251b565b348015610cc657600080fd5b506104b9610cd5366004612faa565b61252b565b348015610ce657600080fd5b50601b5461042a90610100900460ff1681565b348015610d0557600080fd5b506104b9610d143660046131b2565b6125c3565b60006001600160e01b031982166380ac58cd60e01b1480610d4a57506001600160e01b03198216635b5e139f60e01b145b80610d6557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610d7a906137ab565b80601f0160208091040260200160405190810160405280929190818152602001828054610da6906137ab565b8015610df35780601f10610dc857610100808354040283529160200191610df3565b820191906000526020600020905b815481529060010190602001808311610dd657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ea2826119c5565b9050806001600160a01b0316836001600160a01b03161415610f105760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e72565b336001600160a01b0382161480610f2c5750610f2c8133610c1f565b610f9e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e72565b610fa88383612621565b505050565b6006546001600160a01b03163314610fd75760405162461bcd60e51b8152600401610e72906135dc565b8051610fea90600d906020840190612e23565b5050565b6006546001600160a01b031633146110185760405162461bcd60e51b8152600401610e72906135dc565b601b805460ff1916911515919091179055565b6000611036600b5490565b905090565b611045338261268f565b6110615760405162461bcd60e51b8152600401610e7290613676565b610fa8838383612786565b8060008111801561107f57506011548111155b61109b5760405162461bcd60e51b8152600401610e729061352f565b601054816110a8600b5490565b6110b2919061371d565b11156110d05760405162461bcd60e51b8152600401610e7290613648565b601b5460ff16156110f35760405162461bcd60e51b8152600401610e7290613611565b601c838154811061110657611106613841565b90600052602060002090602091828204019190069054906101000a900460ff16156111735760405162461bcd60e51b815260206004820152601d60248201527f4d696e74696e6720666f72204f746865727320697320706175736564210000006044820152606401610e72565b601d838154811061118657611186613841565b90600052602060002090602091828204019190069054906101000a900460ff161561120a5760405162461bcd60e51b815260206004820152602e60248201527f4d696e74696e6720666f72204f746865727320285075626c6963204d696e746960448201526d6e6729206973207061757365642160901b6064820152608401610e72565b81600f546112189190613749565b3410156112375760405162461bcd60e51b8152600401610e72906136f0565b60005b828110156113ca576017848154811061125557611255613841565b90600052602060002001546016858154811061127357611273613841565b90600052602060002001541061128857600080fd5b6013546000858152600a60209081526040808320338452909152902054106112c25760405162461bcd60e51b8152600401610e72906136c7565b6112d0600b80546001019055565b6113313361132c6001611326601689815481106112ef576112ef613841565b906000526020600020015460188a8154811061130d5761130d613841565b906000526020600020015461261590919063ffffffff16565b90612615565b612926565b6016848154811061134457611344613841565b9060005260206000200154600161135b919061371d565b6016858154811061136e5761136e613841565b6000918252602080832090910192909255858152600a82526040808220338352909252205461139e906001612615565b6000858152600a60209081526040808320338452909152902055806113c2816137e6565b91505061123a565b50505050565b6006546001600160a01b031633146113fa5760405162461bcd60e51b8152600401610e72906135dc565b601255565b601e546001600160a01b031633146114295760405162461bcd60e51b8152600401610e729061355d565b60009283526008602090815260408085206001600160a01b039490941685529290529120805460ff1916911515919091179055565b8060008111801561147157506011548111155b61148d5760405162461bcd60e51b8152600401610e729061352f565b6010548161149a600b5490565b6114a4919061371d565b11156114c25760405162461bcd60e51b8152600401610e7290613648565b601b5460ff16156114e55760405162461bcd60e51b8152600401610e7290613611565b601b54610100900460ff161561153d5760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e6720666f72204d61657374726f206973207061757365642100006044820152606401610e72565b601b5462010000900460ff16156115ae5760405162461bcd60e51b815260206004820152602f60248201527f4d696e74696e6720666f72204d61657374726f20285075626c6963204d696e6960448201526e746e6729206973207061757365642160881b6064820152608401610e72565b81600e546115bc9190613749565b3410156115db5760405162461bcd60e51b8152600401610e72906136f0565b60005b82811015610fa857601554601454106115f657600080fd5b60125433600090815260096020526040902054106116265760405162461bcd60e51b8152600401610e72906136c7565b611634600b80546001019055565b61164e3361132c600160145461261590919063ffffffff16565b60145461165c90600161371d565b6014553360009081526009602052604090205461167a906001612615565b3360009081526009602052604090205580611694816137e6565b9150506115de565b6006546001600160a01b031633146116c65760405162461bcd60e51b8152600401610e72906135dc565b60006116da6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611724576040519150601f19603f3d011682016040523d82523d6000602084013e611729565b606091505b505090508061173757600080fd5b50565b60006016828154811061174f5761174f613841565b90600052602060002001549050919050565b610fa883838360405180602001604052806000815250612124565b6060600061178983611b7d565b905060008167ffffffffffffffff8111156117a6576117a6613857565b6040519080825280602002602001820160405280156117cf578160200160208202803683370190505b509050600160005b83811080156117e857506010548211155b156118535760006117f8836119c5565b9050866001600160a01b0316816001600160a01b03161415611840578284838151811061182757611827613841565b60209081029190910101528161183c816137e6565b9250505b8261184a816137e6565b935050506117d7565b5090949350505050565b601e546001600160a01b031633146118875760405162461bcd60e51b8152600401610e729061355d565b60005b81811015610fa8576001600760008585858181106118aa576118aa613841565b90506020020160208101906118bf9190612faa565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806118f1816137e6565b91505061188a565b600d8054611906906137ab565b80601f0160208091040260200160405190810160405280929190818152602001828054611932906137ab565b801561197f5780601f106119545761010080835404028352916020019161197f565b820191906000526020600020905b81548152906001019060200180831161196257829003601f168201915b505050505081565b6018818154811061199757600080fd5b600091825260209091200154905081565b6016818154811061199757600080fd5b600c8054611906906137ab565b6000818152600260205260408120546001600160a01b031680610d655760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610e72565b601e546001600160a01b03163314611aa15760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206d616e616765722063616e20757365204f776e6572204d696e74696044820152616e6760f01b6064820152608401610e72565b828114611b035760405162461bcd60e51b815260206004820152602a60248201527f446966666572656e74206c656e677468206172726179732028616464726573736044820152692c20746f6b656e69642960b01b6064820152608401610e72565b60005b83811015611b7657611b1c600b80546001019055565b611b64858583818110611b3157611b31613841565b9050602002016020810190611b469190612faa565b848484818110611b5857611b58613841565b90506020020135612926565b80611b6e816137e6565b915050611b06565b5050505050565b60006001600160a01b038216611be85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610e72565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314611c2e5760405162461bcd60e51b8152600401610e72906135dc565b611c386000612940565b565b6006546001600160a01b03163314611c645760405162461bcd60e51b8152600401610e72906135dc565b600e91909155600f55565b6006546001600160a01b03163314611c995760405162461bcd60e51b8152600401610e72906135dc565b8051610fea90600c906020840190612e23565b6006546001600160a01b03163314611cd65760405162461bcd60e51b8152600401610e72906135dc565b601b80549115156101000261ff0019909216919091179055565b6006546001600160a01b03163314611d1a5760405162461bcd60e51b8152600401610e72906135dc565b80601c8381548110611d2e57611d2e613841565b90600052602060002090602091828204019190066101000a81548160ff0219169083151502179055505050565b6006546001600160a01b03163314611d855760405162461bcd60e51b8152600401610e72906135dc565b80601d8381548110611d2e57611d2e613841565b606060018054610d7a906137ab565b80600081118015611dbb57506011548111155b611dd75760405162461bcd60e51b8152600401610e729061352f565b60105481611de4600b5490565b611dee919061371d565b1115611e0c5760405162461bcd60e51b8152600401610e7290613648565b601b5460ff1615611e2f5760405162461bcd60e51b8152600401610e7290613611565b601c8381548110611e4257611e42613841565b90600052602060002090602091828204019190069054906101000a900460ff1615611eaf5760405162461bcd60e51b815260206004820152601d60248201527f4d696e74696e6720666f72204f746865727320697320706175736564210000006044820152606401610e72565b81600f54611ebd9190613749565b341015611edc5760405162461bcd60e51b8152600401610e72906136f0565b600083815260086020908152604080832033845290915290205460ff16611f155760405162461bcd60e51b8152600401610e7290613594565b60005b828110156113ca5760178481548110611f3357611f33613841565b906000526020600020015460168581548110611f5157611f51613841565b906000526020600020015410611f6657600080fd5b6013546000858152600a6020908152604080832033845290915290205410611fa05760405162461bcd60e51b8152600401610e72906136c7565b611fae600b80546001019055565b611fcd3361132c6001611326601689815481106112ef576112ef613841565b60168481548110611fe057611fe0613841565b90600052602060002001546001611ff7919061371d565b6016858154811061200a5761200a613841565b6000918252602080832090910192909255858152600a82526040808220338352909252205461203a906001612615565b6000858152600a602090815260408083203384529091529020558061205e816137e6565b915050611f18565b610fea338383612992565b601e546001600160a01b0316331461209b5760405162461bcd60e51b8152600401610e729061355d565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6006546001600160a01b031633146120f05760405162461bcd60e51b8152600401610e72906135dc565b601155565b6006546001600160a01b0316331461211f5760405162461bcd60e51b8152600401610e72906135dc565b601355565b61212e338361268f565b61214a5760405162461bcd60e51b8152600401610e7290613676565b6113ca84848484612a61565b8060008111801561216957506011548111155b6121855760405162461bcd60e51b8152600401610e729061352f565b60105481612192600b5490565b61219c919061371d565b11156121ba5760405162461bcd60e51b8152600401610e7290613648565b601b5460ff16156121dd5760405162461bcd60e51b8152600401610e7290613611565b601b54610100900460ff16156122355760405162461bcd60e51b815260206004820152601e60248201527f4d696e74696e6720666f72204d61657374726f206973207061757365642100006044820152606401610e72565b81600e546122439190613749565b3410156122625760405162461bcd60e51b8152600401610e72906136f0565b3360009081526007602052604090205460ff166122915760405162461bcd60e51b8152600401610e7290613594565b60005b82811015610fa857601554601454106122ac57600080fd5b60125433600090815260096020526040902054106122dc5760405162461bcd60e51b8152600401610e72906136c7565b6122ea600b80546001019055565b6123043361132c600160145461261590919063ffffffff16565b60145461231290600161371d565b60145533600090815260096020526040902054612330906001612615565b336000908152600960205260409020558061234a816137e6565b915050612294565b601d818154811061236257600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000818152600260205260409020546060906001600160a01b03166124055760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610e72565b600061240f612a94565b9050600081511161242f576040518060200160405280600081525061245d565b8061243984612aa3565b600d60405160200161244d93929190613385565b6040516020818303038152906040525b9392505050565b601c818154811061236257600080fd5b601e546001600160a01b0316331461249e5760405162461bcd60e51b8152600401610e729061355d565b60005b818110156113ca5760008481526008602052604081206001918585858181106124cc576124cc613841565b90506020020160208101906124e19190612faa565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612513816137e6565b9150506124a1565b6017818154811061199757600080fd5b6006546001600160a01b031633146125555760405162461bcd60e51b8152600401610e72906135dc565b6001600160a01b0381166125ba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e72565b61173781612940565b6006546001600160a01b031633146125ed5760405162461bcd60e51b8152600401610e72906135dc565b601b8054911515620100000262ff000019909216919091179055565b600061245d8284613749565b600061245d828461371d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612656826119c5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166127085760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e72565b6000612713836119c5565b9050806001600160a01b0316846001600160a01b0316148061274e5750836001600160a01b031661274384610dfd565b6001600160a01b0316145b8061277e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612799826119c5565b6001600160a01b0316146128015760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e72565b6001600160a01b0382166128635760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e72565b61286e600082612621565b6001600160a01b0383166000908152600360205260408120805460019290612897908490613768565b90915550506001600160a01b03821660009081526003602052604081208054600192906128c590849061371d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610fea828260405180602001604052806000815250612ba1565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156129f45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e72565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612a6c848484612786565b612a7884848484612bd4565b6113ca5760405162461bcd60e51b8152600401610e72906134dd565b6060600c8054610d7a906137ab565b606081612ac75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612af15780612adb816137e6565b9150612aea9050600a83613735565b9150612acb565b60008167ffffffffffffffff811115612b0c57612b0c613857565b6040519080825280601f01601f191660200182016040528015612b36576020820181803683370190505b5090505b841561277e57612b4b600183613768565b9150612b58600a86613801565b612b6390603061371d565b60f81b818381518110612b7857612b78613841565b60200101906001600160f81b031916908160001a905350612b9a600a86613735565b9450612b3a565b612bab8383612ce1565b612bb86000848484612bd4565b610fa85760405162461bcd60e51b8152600401610e72906134dd565b60006001600160a01b0384163b15612cd657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c18903390899088908890600401613449565b602060405180830381600087803b158015612c3257600080fd5b505af1925050508015612c62575060408051601f3d908101601f19168201909252612c5f918101906131ea565b60015b612cbc573d808015612c90576040519150601f19603f3d011682016040523d82523d6000602084013e612c95565b606091505b508051612cb45760405162461bcd60e51b8152600401610e72906134dd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061277e565b506001949350505050565b6001600160a01b038216612d375760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e72565b6000818152600260205260409020546001600160a01b031615612d9c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e72565b6001600160a01b0382166000908152600360205260408120805460019290612dc590849061371d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612e2f906137ab565b90600052602060002090601f016020900481019282612e515760008555612e97565b82601f10612e6a57805160ff1916838001178555612e97565b82800160010185558215612e97579182015b82811115612e97578251825591602001919060010190612e7c565b50612ea3929150612ea7565b5090565b5b80821115612ea35760008155600101612ea8565b600067ffffffffffffffff80841115612ed757612ed7613857565b604051601f8501601f19908116603f01168101908282118183101715612eff57612eff613857565b81604052809350858152868686011115612f1857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612f4957600080fd5b919050565b60008083601f840112612f6057600080fd5b50813567ffffffffffffffff811115612f7857600080fd5b6020830191508360208260051b8501011115612f9357600080fd5b9250929050565b80358015158114612f4957600080fd5b600060208284031215612fbc57600080fd5b61245d82612f32565b60008060408385031215612fd857600080fd5b612fe183612f32565b9150612fef60208401612f32565b90509250929050565b60008060006060848603121561300d57600080fd5b61301684612f32565b925061302460208501612f32565b9150604084013590509250925092565b6000806000806080858703121561304a57600080fd5b61305385612f32565b935061306160208601612f32565b925060408501359150606085013567ffffffffffffffff81111561308457600080fd5b8501601f8101871361309557600080fd5b6130a487823560208401612ebc565b91505092959194509250565b600080604083850312156130c357600080fd5b6130cc83612f32565b9150612fef60208401612f9a565b600080604083850312156130ed57600080fd5b6130f683612f32565b946020939093013593505050565b6000806020838503121561311757600080fd5b823567ffffffffffffffff81111561312e57600080fd5b61313a85828601612f4e565b90969095509350505050565b6000806000806040858703121561315c57600080fd5b843567ffffffffffffffff8082111561317457600080fd5b61318088838901612f4e565b9096509450602087013591508082111561319957600080fd5b506131a687828801612f4e565b95989497509550505050565b6000602082840312156131c457600080fd5b61245d82612f9a565b6000602082840312156131df57600080fd5b813561245d8161386d565b6000602082840312156131fc57600080fd5b815161245d8161386d565b60006020828403121561321957600080fd5b813567ffffffffffffffff81111561323057600080fd5b8201601f8101841361324157600080fd5b61277e84823560208401612ebc565b60006020828403121561326257600080fd5b5035919050565b6000806040838503121561327c57600080fd5b82359150612fef60208401612f32565b6000806000606084860312156132a157600080fd5b833592506132b160208501612f32565b91506132bf60408501612f9a565b90509250925092565b6000806000604084860312156132dd57600080fd5b83359250602084013567ffffffffffffffff8111156132fb57600080fd5b61330786828701612f4e565b9497909650939450505050565b6000806040838503121561332757600080fd5b82359150612fef60208401612f9a565b6000806040838503121561334a57600080fd5b50508035926020909101359150565b6000815180845261337181602086016020860161377f565b601f01601f19169290920160200192915050565b6000845160206133988285838a0161377f565b8551918401916133ab8184848a0161377f565b8554920191600090600181811c90808316806133c857607f831692505b8583108114156133e657634e487b7160e01b85526022600452602485fd5b8080156133fa576001811461340b57613438565b60ff19851688528388019550613438565b60008b81526020902060005b858110156134305781548a820152908401908801613417565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347c90830184613359565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134be578351835292840192918401916001016134a2565b50909695505050505050565b60208152600061245d6020830184613359565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252601e908201527f4f6e6c79206d616e616765722063616e207365742077686974656c6973740000604082015260600190565b60208082526028908201527f54686973206163636f756e7420646f6573206e6f7420657869737420696e20776040820152671a1a5d195b1a5cdd60c21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600f908201526e416c7265616479206d696e7465642160881b604082015260600190565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b6000821982111561373057613730613815565b500190565b6000826137445761374461382b565b500490565b600081600019048311821515161561376357613763613815565b500290565b60008282101561377a5761377a613815565b500390565b60005b8381101561379a578181015183820152602001613782565b838111156113ca5750506000910152565b600181811c908216806137bf57607f821691505b602082108114156137e057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137fa576137fa613815565b5060010190565b6000826138105761381061382b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461173757600080fdfea2646970667358221220d6e1246fe29820cbe62b3b5edb765448aa12b245bcf01dce7f22ea9f67d5d17964736f6c63430008070033

Deployed Bytecode Sourcemap

44789:12046:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25230:305;;;;;;;;;;-1:-1:-1;25230:305:0;;;;;:::i;:::-;;:::i;:::-;;;11001:14:1;;10994:22;10976:41;;10964:2;10949:18;25230:305:0;;;;;;;;26175:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27734:221::-;;;;;;;;;;-1:-1:-1;27734:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9662:32:1;;;9644:51;;9632:2;9617:18;27734:221:0;9498:203:1;27257:411:0;;;;;;;;;;-1:-1:-1;27257:411:0;;;;;:::i;:::-;;:::i;:::-;;45819:41;;;;;;;;;;;;;;;;;;;22652:25:1;;;22640:2;22625:18;45819:41:0;22506:177:1;53086:100:0;;;;;;;;;;-1:-1:-1;53086:100:0;;;;;:::i;:::-;;:::i;53192:77::-;;;;;;;;;;-1:-1:-1;53192:77:0;;;;;:::i;:::-;;:::i;46948:89::-;;;;;;;;;;;;;:::i;44990:72::-;;;;;;;;;;-1:-1:-1;44990:72:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;56182:138;;;;;;;;;;-1:-1:-1;56182:138:0;;;;;:::i;:::-;-1:-1:-1;;;;;56280:34:0;56260:4;56280:34;;;:19;:34;;;;;;;;;56182:138;28484:339;;;;;;;;;;-1:-1:-1;28484:339:0;;;;;:::i;:::-;;:::i;49932:1122::-;;;;;;:::i;:::-;;:::i;52612:178::-;;;;;;;;;;-1:-1:-1;52612:178:0;;;;;:::i;:::-;;:::i;45364:41::-;;;;;;;;;;;;;;;;45642:43;;;;;;;;;;;;;;;;45490:49;;;;;;;;;;;;;;;;56326:182;;;;;;;;;;-1:-1:-1;56326:182:0;;;;;:::i;:::-;56430:4;56450:37;;;:18;:37;;;;;;;;-1:-1:-1;;;;;56450:52:0;;;;;;;;;;;;;;;56326:182;45318:41;;;;;;;;;;;;;;;;44933:52;;;;;;;;;;-1:-1:-1;44933:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55651:265;;;;;;;;;;-1:-1:-1;55651:265:0;;;;;:::i;:::-;;:::i;47920:875::-;;;;;;:::i;:::-;;:::i;53827:137::-;;;;;;;;;;;;;:::i;56031:145::-;;;;;;;;;;-1:-1:-1;56031:145:0;;;;;:::i;:::-;;:::i;28894:185::-;;;;;;;;;;-1:-1:-1;28894:185:0;;;;;:::i;:::-;;:::i;51232:635::-;;;;;;;;;;-1:-1:-1;51232:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45599:38::-;;;;;;;;;;;;;;;;54764:302;;;;;;;;;;-1:-1:-1;54764:302:0;;;;;:::i;:::-;;:::i;45276:33::-;;;;;;;;;;;;;:::i;45775:37::-;;;;;;;;;;-1:-1:-1;45775:37:0;;;;;:::i;:::-;;:::i;45692:35::-;;;;;;;;;;-1:-1:-1;45692:35:0;;;;;:::i;:::-;;:::i;56653:177::-;;;;;;;;;;-1:-1:-1;56653:177:0;;;;;:::i;:::-;56752:7;56775:34;;;:15;:34;;;;;;;;-1:-1:-1;;;;;56775:49:0;;;;;;;;;;;;;56653:177;45919:25;;;;;;;;;;-1:-1:-1;45919:25:0;;;;;;;;45243:28;;;;;;;;;;;;;:::i;25869:239::-;;;;;;;;;;-1:-1:-1;25869:239:0;;;;;:::i;:::-;;:::i;53970:450::-;;;;;;;;;;-1:-1:-1;53970:450:0;;;;;:::i;:::-;;:::i;25599:208::-;;;;;;;;;;-1:-1:-1;25599:208:0;;;;;:::i;:::-;;:::i;45989:48::-;;;;;;;;;;-1:-1:-1;45989:48:0;;;;;;;;;;;6224:103;;;;;;;;;;;;;:::i;52305:165::-;;;;;;;;;;-1:-1:-1;52305:165:0;;;;;:::i;:::-;;:::i;52980:100::-;;;;;;;;;;-1:-1:-1;52980:100:0;;;;;:::i;:::-;;:::i;53275:97::-;;;;;;;;;;-1:-1:-1;53275:97:0;;;;;:::i;:::-;;:::i;53507:141::-;;;;;;;;;;-1:-1:-1;53507:141:0;;;;;:::i;:::-;;:::i;53654:167::-;;;;;;;;;;-1:-1:-1;53654:167:0;;;;;:::i;:::-;;:::i;5573:87::-;;;;;;;;;;-1:-1:-1;5646:6:0;;-1:-1:-1;;;;;5646:6:0;5573:87;;45446:37;;;;;;;;;;;;;;;;26344:104;;;;;;;;;;;;;:::i;55922:103::-;;;;;;;;;;-1:-1:-1;56000:19:0;;55922:103;;48801:1125;;;;;;:::i;:::-;;:::i;28027:155::-;;;;;;;;;;-1:-1:-1;28027:155:0;;;;;:::i;:::-;;:::i;45544:48::-;;;;;;;;;;;;;;;;55072:221;;;;;;;;;;-1:-1:-1;55072:221:0;;;;;:::i;:::-;;:::i;46125:29::-;;;;;;;;;;-1:-1:-1;46125:29:0;;;;-1:-1:-1;;;;;46125:29:0;;;52476:130;;;;;;;;;;-1:-1:-1;52476:130:0;;;;;:::i;:::-;;:::i;52796:174::-;;;;;;;;;;-1:-1:-1;52796:174:0;;;;;:::i;:::-;;:::i;45126:72::-;;;;;;;;;;-1:-1:-1;45126:72:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;29150:328;;;;;;;;;;-1:-1:-1;29150:328:0;;;;;:::i;:::-;;:::i;47043:871::-;;;;;;:::i;:::-;;:::i;46076:42::-;;;;;;;;;;-1:-1:-1;46076:42:0;;;;;:::i;:::-;;:::i;56514:133::-;;;;;;;;;;-1:-1:-1;56514:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;56610:31:0;56587:7;56610:31;;;:16;:31;;;;;;;56514:133;51873:426;;;;;;;;;;-1:-1:-1;51873:426:0;;;;;:::i;:::-;;:::i;45410:31::-;;;;;;;;;;;;;;;;46042:29;;;;;;;;;;-1:-1:-1;46042:29:0;;;;;:::i;:::-;;:::i;45865:47::-;;;;;;;;;;;;;;;;28253:164;;;;;;;;;;-1:-1:-1;28253:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28374:25:0;;;28350:4;28374:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28253:164;55299:346;;;;;;;;;;-1:-1:-1;55299:346:0;;;;;:::i;:::-;;:::i;45069:52::-;;;;;;;;;;-1:-1:-1;45069:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;45732:38;;;;;;;;;;-1:-1:-1;45732:38:0;;;;;:::i;:::-;;:::i;6482:201::-;;;;;;;;;;-1:-1:-1;6482:201:0;;;;;:::i;:::-;;:::i;45949:35::-;;;;;;;;;;-1:-1:-1;45949:35:0;;;;;;;;;;;53378:123;;;;;;;;;;-1:-1:-1;53378:123:0;;;;;:::i;:::-;;:::i;25230:305::-;25332:4;-1:-1:-1;;;;;;25369:40:0;;-1:-1:-1;;;25369:40:0;;:105;;-1:-1:-1;;;;;;;25426:48:0;;-1:-1:-1;;;25426:48:0;25369:105;:158;;;-1:-1:-1;;;;;;;;;;18114:40:0;;;25491:36;25349:178;25230:305;-1:-1:-1;;25230:305:0:o;26175:100::-;26229:13;26262:5;26255:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26175:100;:::o;27734:221::-;27810:7;31077:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31077:16:0;27830:73;;;;-1:-1:-1;;;27830:73:0;;18537:2:1;27830:73:0;;;18519:21:1;18576:2;18556:18;;;18549:30;18615:34;18595:18;;;18588:62;-1:-1:-1;;;18666:18:1;;;18659:42;18718:19;;27830:73:0;;;;;;;;;-1:-1:-1;27923:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27923:24:0;;27734:221::o;27257:411::-;27338:13;27354:23;27369:7;27354:14;:23::i;:::-;27338:39;;27402:5;-1:-1:-1;;;;;27396:11:0;:2;-1:-1:-1;;;;;27396:11:0;;;27388:57;;;;-1:-1:-1;;;27388:57:0;;20489:2:1;27388:57:0;;;20471:21:1;20528:2;20508:18;;;20501:30;20567:34;20547:18;;;20540:62;-1:-1:-1;;;20618:18:1;;;20611:31;20659:19;;27388:57:0;20287:397:1;27388:57:0;4377:10;-1:-1:-1;;;;;27480:21:0;;;;:62;;-1:-1:-1;27505:37:0;27522:5;4377:10;28253:164;:::i;27505:37::-;27458:168;;;;-1:-1:-1;;;27458:168:0;;16099:2:1;27458:168:0;;;16081:21:1;16138:2;16118:18;;;16111:30;16177:34;16157:18;;;16150:62;16248:26;16228:18;;;16221:54;16292:19;;27458:168:0;15897:420:1;27458:168:0;27639:21;27648:2;27652:7;27639:8;:21::i;:::-;27327:341;27257:411;;:::o;53086:100::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53158:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;53086:100:::0;:::o;53192:77::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53248:6:::1;:15:::0;;-1:-1:-1;;53248:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53192:77::o;46948:89::-;46992:7;47015:16;:6;993:14;;901:114;47015:16;47008:23;;46948:89;:::o;28484:339::-;28679:41;4377:10;28712:7;28679:18;:41::i;:::-;28671:103;;;;-1:-1:-1;;;28671:103:0;;;;;;;:::i;:::-;28787:28;28797:4;28803:2;28807:7;28787:9;:28::i;49932:1122::-;50033:11;46782:1;46768:11;:15;:52;;;;;46802:18;;46787:11;:33;;46768:52;46760:85;;;;-1:-1:-1;;;46760:85:0;;;;;;;:::i;:::-;46894:9;;46879:11;46860:16;:6;993:14;;901:114;46860:16;:30;;;;:::i;:::-;:43;;46852:76;;;;-1:-1:-1;;;46852:76:0;;;;;;;:::i;:::-;50062:6:::1;::::0;::::1;;50061:7;50053:43;;;;-1:-1:-1::0;;;50053:43:0::1;;;;;;;:::i;:::-;50112:15;50128:17;50112:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;50111:35;50103:77;;;::::0;-1:-1:-1;;;50103:77:0;;22350:2:1;50103:77:0::1;::::0;::::1;22332:21:1::0;22389:2;22369:18;;;22362:30;22428:31;22408:18;;;22401:59;22477:18;;50103:77:0::1;22148:353:1::0;50103:77:0::1;50196:28;50225:17;50196:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;50195:48;50187:107;;;::::0;-1:-1:-1;;;50187:107:0;;16524:2:1;50187:107:0::1;::::0;::::1;16506:21:1::0;16563:2;16543:18;;;16536:30;16602:34;16582:18;;;16575:62;-1:-1:-1;;;16653:18:1;;;16646:44;16707:19;;50187:107:0::1;16322:410:1::0;50187:107:0::1;50338:11;50322:13;;:27;;;;:::i;:::-;50309:9;:40;;50301:72;;;;-1:-1:-1::0;;;50301:72:0::1;;;;;;;:::i;:::-;50430:9;50425:624;50449:11;50445:1;:15;50425:624;;;50526:21;50548:17;50526:40;;;;;;;;:::i;:::-;;;;;;;;;50486:18;50505:17;50486:37;;;;;;;;:::i;:::-;;;;;;;;;:80;50478:89;;;::::0;::::1;;50635:29;::::0;50586:34:::1;::::0;;;:15:::1;:34;::::0;;;;;;;50621:10:::1;50586:46:::0;;;;;;;;:78:::1;50578:106;;;;-1:-1:-1::0;;;50578:106:0::1;;;;;;;:::i;:::-;50695:18;:6;1112:19:::0;;1130:1;1112:19;;;1023:127;50695:18:::1;50724:112;50734:10;50746:89;50833:1;50746:82;50790:18;50809:17;50790:37;;;;;;;;:::i;:::-;;;;;;;;;50746:20;50767:17;50746:39;;;;;;;;:::i;:::-;;;;;;;;;:43;;:82;;;;:::i;:::-;:86:::0;::::1;:89::i;:::-;50724:9;:112::i;:::-;50887:18;50906:17;50887:37;;;;;;;;:::i;:::-;;;;;;;;;50927:1;50887:41;;;;:::i;:::-;50847:18;50866:17;50847:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:81:::0;;;;50988:34;;;:15:::1;:34:::0;;;;;;51023:10:::1;50988:46:::0;;;;;;;:53:::1;::::0;51039:1:::1;50988:50;:53::i;:::-;50939:34;::::0;;;:15:::1;:34;::::0;;;;;;;50974:10:::1;50939:46:::0;;;;;;;:102;50462:3;::::1;::::0;::::1;:::i;:::-;;;;50425:624;;;;49932:1122:::0;;;:::o;52612:178::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;52720:30:::1;:64:::0;52612:178::o;55651:265::-;55787:14;;-1:-1:-1;;;;;55787:14:0;55773:10;:28;55765:71;;;;-1:-1:-1;;;55765:71:0;;;;;;;:::i;:::-;55845:37;;;;:18;:37;;;;;;;;-1:-1:-1;;;;;55845:55:0;;;;;;;;;;;:65;;-1:-1:-1;;55845:65:0;;;;;;;;;;55651:265::o;47920:875::-;47995:11;46782:1;46768:11;:15;:52;;;;;46802:18;;46787:11;:33;;46768:52;46760:85;;;;-1:-1:-1;;;46760:85:0;;;;;;;:::i;:::-;46894:9;;46879:11;46860:16;:6;993:14;;901:114;46860:16;:30;;;;:::i;:::-;:43;;46852:76;;;;-1:-1:-1;;;46852:76:0;;;;;;;:::i;:::-;48024:6:::1;::::0;::::1;;48023:7;48015:43;;;;-1:-1:-1::0;;;48015:43:0::1;;;;;;;:::i;:::-;48074:16;::::0;::::1;::::0;::::1;;;48073:17;48065:60;;;::::0;-1:-1:-1;;;48065:60:0;;14920:2:1;48065:60:0::1;::::0;::::1;14902:21:1::0;14959:2;14939:18;;;14932:30;14998:32;14978:18;;;14971:60;15048:18;;48065:60:0::1;14718:354:1::0;48065:60:0::1;48141:29;::::0;;;::::1;;;48140:30;48132:90;;;::::0;-1:-1:-1;;;48132:90:0;;18121:2:1;48132:90:0::1;::::0;::::1;18103:21:1::0;18160:2;18140:18;;;18133:30;18199:34;18179:18;;;18172:62;-1:-1:-1;;;18250:18:1;;;18243:45;18305:19;;48132:90:0::1;17919:411:1::0;48132:90:0::1;48267:11;48250:14;;:28;;;;:::i;:::-;48237:9;:41;;48229:73;;;;-1:-1:-1::0;;;48229:73:0::1;;;;;;;:::i;:::-;48359:9;48354:436;48378:11;48374:1;:15;48354:436;;;48437:22;;48415:19;;:44;48407:53;;;::::0;::::1;;48510:30;::::0;48496:10:::1;48479:28;::::0;;;:16:::1;:28;::::0;;;;;:61:::1;48471:89;;;;-1:-1:-1::0;;;48471:89:0::1;;;;;;;:::i;:::-;48571:18;:6;1112:19:::0;;1130:1;1112:19;;;1023:127;48571:18:::1;48600:49;48610:10;48622:26;48646:1;48622:19;;:23;;:26;;;;:::i;48600:49::-;48682:19;::::0;:23:::1;::::0;48704:1:::1;48682:23;:::i;:::-;48660:19;:45:::0;48764:10:::1;48747:28;::::0;;;:16:::1;:28;::::0;;;;;:35:::1;::::0;48780:1:::1;48747:32;:35::i;:::-;48733:10;48716:28;::::0;;;:16:::1;:28;::::0;;;;:66;48391:3;::::1;::::0;::::1;:::i;:::-;;;;48354:436;;53827:137:::0;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53872:7:::1;53893;5646:6:::0;;-1:-1:-1;;;;;5646:6:0;;5573:87;53893:7:::1;-1:-1:-1::0;;;;;53885:21:0::1;53914;53885:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53871:69;;;53955:2;53947:11;;;::::0;::::1;;53864:100;53827:137::o:0;56031:145::-;56110:7;56133:18;56152:17;56133:37;;;;;;;;:::i;:::-;;;;;;;;;56126:44;;56031:145;;;:::o;28894:185::-;29032:39;29049:4;29055:2;29059:7;29032:39;;;;;;;;;;;;:16;:39::i;51232:635::-;51307:16;51335:23;51361:17;51371:6;51361:9;:17::i;:::-;51335:43;;51385:30;51432:15;51418:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51418:30:0;-1:-1:-1;51385:63:0;-1:-1:-1;51480:1:0;51455:22;51524:309;51549:15;51531;:33;:64;;;;;51586:9;;51568:14;:27;;51531:64;51524:309;;;51606:25;51634:23;51642:14;51634:7;:23::i;:::-;51606:51;;51693:6;-1:-1:-1;;;;;51672:27:0;:17;-1:-1:-1;;;;;51672:27:0;;51668:131;;;51745:14;51712:13;51726:15;51712:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;51772:17;;;;:::i;:::-;;;;51668:131;51809:16;;;;:::i;:::-;;;;51597:236;51524:309;;;-1:-1:-1;51848:13:0;;51232:635;-1:-1:-1;;;;51232:635:0:o;54764:302::-;54879:14;;-1:-1:-1;;;;;54879:14:0;54865:10;:28;54857:71;;;;-1:-1:-1;;;54857:71:0;;;;;;;:::i;:::-;54942:9;54937:124;54957:28;;;54937:124;;;55047:4;55003:19;:41;55023:17;;55041:1;55023:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55003:41:0;;;;;;;;;;;;-1:-1:-1;55003:41:0;:48;;-1:-1:-1;;55003:48:0;;;;;;;;;;54987:3;;;;:::i;:::-;;;;54937:124;;45276:33;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45775:37::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45775:37:0;:::o;45692:35::-;;;;;;;;;;;;45243:28;;;;;;;:::i;25869:239::-;25941:7;25977:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25977:16:0;26012:19;26004:73;;;;-1:-1:-1;;;26004:73:0;;17350:2:1;26004:73:0;;;17332:21:1;17389:2;17369:18;;;17362:30;17428:34;17408:18;;;17401:62;-1:-1:-1;;;17479:18:1;;;17472:39;17528:19;;26004:73:0;17148:405:1;53970:450:0;54097:14;;-1:-1:-1;;;;;54097:14:0;54083:10;:28;54075:75;;;;-1:-1:-1;;;54075:75:0;;13745:2:1;54075:75:0;;;13727:21:1;13784:2;13764:18;;;13757:30;13823:34;13803:18;;;13796:62;-1:-1:-1;;;13874:18:1;;;13867:32;13916:19;;54075:75:0;13543:398:1;54075:75:0;54167:42;;;54159:97;;;;-1:-1:-1;;;54159:97:0;;15688:2:1;54159:97:0;;;15670:21:1;15727:2;15707:18;;;15700:30;15766:34;15746:18;;;15739:62;-1:-1:-1;;;15817:18:1;;;15810:40;15867:19;;54159:97:0;15486:406:1;54159:97:0;54270:9;54265:150;54285:26;;;54265:150;;;54331:18;:6;1112:19;;1130:1;1112:19;;;1023:127;54331:18;54362:43;54372:15;;54388:1;54372:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;54392:9;;54402:1;54392:12;;;;;;;:::i;:::-;;;;;;;54362:9;:43::i;:::-;54313:3;;;;:::i;:::-;;;;54265:150;;;;53970:450;;;;:::o;25599:208::-;25671:7;-1:-1:-1;;;;;25699:19:0;;25691:74;;;;-1:-1:-1;;;25691:74:0;;16939:2:1;25691:74:0;;;16921:21:1;16978:2;16958:18;;;16951:30;17017:34;16997:18;;;16990:62;-1:-1:-1;;;17068:18:1;;;17061:40;17118:19;;25691:74:0;16737:406:1;25691:74:0;-1:-1:-1;;;;;;25783:16:0;;;;;:9;:16;;;;;;;25599:208::o;6224:103::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;6289:30:::1;6316:1;6289:18;:30::i;:::-;6224:103::o:0;52305:165::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;52395:14:::1;:32:::0;;;;52434:13:::1;:30:::0;52305:165::o;52980:100::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53052:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;53275:97::-:0;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53341:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;53341:25:0;;::::1;::::0;;;::::1;::::0;;53275:97::o;53507:141::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53636:6:::1;53599:15;53615:17;53599:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;53507:141:::0;;:::o;53654:167::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53809:6:::1;53759:28;53788:17;53759:47;;;;;;;;:::i;26344:104::-:0;26400:13;26433:7;26426:14;;;;;:::i;48801:1125::-;48904:11;46782:1;46768:11;:15;:52;;;;;46802:18;;46787:11;:33;;46768:52;46760:85;;;;-1:-1:-1;;;46760:85:0;;;;;;;:::i;:::-;46894:9;;46879:11;46860:16;:6;993:14;;901:114;46860:16;:30;;;;:::i;:::-;:43;;46852:76;;;;-1:-1:-1;;;46852:76:0;;;;;;;:::i;:::-;48933:6:::1;::::0;::::1;;48932:7;48924:43;;;;-1:-1:-1::0;;;48924:43:0::1;;;;;;;:::i;:::-;48983:15;48999:17;48983:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;48982:35;48974:77;;;::::0;-1:-1:-1;;;48974:77:0;;22350:2:1;48974:77:0::1;::::0;::::1;22332:21:1::0;22389:2;22369:18;;;22362:30;22428:31;22408:18;;;22401:59;22477:18;;48974:77:0::1;22148:353:1::0;48974:77:0::1;49095:11;49079:13;;:27;;;;:::i;:::-;49066:9;:40;;49058:72;;;;-1:-1:-1::0;;;49058:72:0::1;;;;;;;:::i;:::-;49145:37;::::0;;;:18:::1;:37;::::0;;;;;;;49183:10:::1;49145:49:::0;;;;;;;;::::1;;49137:102;;;;-1:-1:-1::0;;;49137:102:0::1;;;;;;;:::i;:::-;49296:9;49291:624;49315:11;49311:1;:15;49291:624;;;49392:21;49414:17;49392:40;;;;;;;;:::i;:::-;;;;;;;;;49352:18;49371:17;49352:37;;;;;;;;:::i;:::-;;;;;;;;;:80;49344:89;;;::::0;::::1;;49501:29;::::0;49452:34:::1;::::0;;;:15:::1;:34;::::0;;;;;;;49487:10:::1;49452:46:::0;;;;;;;;:78:::1;49444:106;;;;-1:-1:-1::0;;;49444:106:0::1;;;;;;;:::i;:::-;49561:18;:6;1112:19:::0;;1130:1;1112:19;;;1023:127;49561:18:::1;49590:112;49600:10;49612:89;49699:1;49612:82;49656:18;49675:17;49656:37;;;;;;;;:::i;49590:112::-;49753:18;49772:17;49753:37;;;;;;;;:::i;:::-;;;;;;;;;49793:1;49753:41;;;;:::i;:::-;49713:18;49732:17;49713:37;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:81:::0;;;;49854:34;;;:15:::1;:34:::0;;;;;;49889:10:::1;49854:46:::0;;;;;;;:53:::1;::::0;49905:1:::1;49854:50;:53::i;:::-;49805:34;::::0;;;:15:::1;:34;::::0;;;;;;;49840:10:::1;49805:46:::0;;;;;;;:102;49328:3;::::1;::::0;::::1;:::i;:::-;;;;49291:624;;28027:155:::0;28122:52;4377:10;28155:8;28165;28122:18;:52::i;55072:221::-;55182:14;;-1:-1:-1;;;;;55182:14:0;55168:10;:28;55160:71;;;;-1:-1:-1;;;55160:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55240:37:0;;;;;;;;:19;:37;;;;;:47;;-1:-1:-1;;55240:47:0;;;;;;;;;;55072:221::o;52476:130::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;52560:18:::1;:40:::0;52476:130::o;52796:174::-;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;52902:29:::1;:62:::0;52796:174::o;29150:328::-;29325:41;4377:10;29358:7;29325:18;:41::i;:::-;29317:103;;;;-1:-1:-1;;;29317:103:0;;;;;;;:::i;:::-;29431:39;29445:4;29451:2;29455:7;29464:5;29431:13;:39::i;47043:871::-;47120:11;46782:1;46768:11;:15;:52;;;;;46802:18;;46787:11;:33;;46768:52;46760:85;;;;-1:-1:-1;;;46760:85:0;;;;;;;:::i;:::-;46894:9;;46879:11;46860:16;:6;993:14;;901:114;46860:16;:30;;;;:::i;:::-;:43;;46852:76;;;;-1:-1:-1;;;46852:76:0;;;;;;;:::i;:::-;47149:6:::1;::::0;::::1;;47148:7;47140:43;;;;-1:-1:-1::0;;;47140:43:0::1;;;;;;;:::i;:::-;47199:16;::::0;::::1;::::0;::::1;;;47198:17;47190:60;;;::::0;-1:-1:-1;;;47190:60:0;;14920:2:1;47190:60:0::1;::::0;::::1;14902:21:1::0;14959:2;14939:18;;;14932:30;14998:32;14978:18;;;14971:60;15048:18;;47190:60:0::1;14718:354:1::0;47190:60:0::1;47295:11;47278:14;;:28;;;;:::i;:::-;47265:9;:41;;47257:73;;;;-1:-1:-1::0;;;47257:73:0::1;;;;;;;:::i;:::-;47365:10;47345:31;::::0;;;:19:::1;:31;::::0;;;;;::::1;;47337:84;;;;-1:-1:-1::0;;;47337:84:0::1;;;;;;;:::i;:::-;47478:9;47473:436;47497:11;47493:1;:15;47473:436;;;47556:22;;47534:19;;:44;47526:53;;;::::0;::::1;;47629:30;::::0;47615:10:::1;47598:28;::::0;;;:16:::1;:28;::::0;;;;;:61:::1;47590:89;;;;-1:-1:-1::0;;;47590:89:0::1;;;;;;;:::i;:::-;47690:18;:6;1112:19:::0;;1130:1;1112:19;;;1023:127;47690:18:::1;47719:49;47729:10;47741:26;47765:1;47741:19;;:23;;:26;;;;:::i;47719:49::-;47801:19;::::0;:23:::1;::::0;47823:1:::1;47801:23;:::i;:::-;47779:19;:45:::0;47883:10:::1;47866:28;::::0;;;:16:::1;:28;::::0;;;;;:35:::1;::::0;47899:1:::1;47866:32;:35::i;:::-;47852:10;47835:28;::::0;;;:16:::1;:28;::::0;;;;:66;47510:3;::::1;::::0;::::1;:::i;:::-;;;;47473:436;;46076:42:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51873:426::-;31053:4;31077:16;;;:7;:16;;;;;;51972:13;;-1:-1:-1;;;;;31077:16:0;51997:98;;;;-1:-1:-1;;;51997:98:0;;20073:2:1;51997:98:0;;;20055:21:1;20112:2;20092:18;;;20085:30;20151:34;20131:18;;;20124:62;-1:-1:-1;;;20202:18:1;;;20195:45;20257:19;;51997:98:0;19871:411:1;51997:98:0;52108:28;52139:10;:8;:10::i;:::-;52108:41;;52194:1;52169:14;52163:28;:32;:130;;;;;;;;;;;;;;;;;52231:14;52247:19;:8;:17;:19::i;:::-;52268:9;52214:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52163:130;52156:137;51873:426;-1:-1:-1;;;51873:426:0:o;46042:29::-;;;;;;;;;;;;55299:346;55440:14;;-1:-1:-1;;;;;55440:14:0;55426:10;:28;55418:71;;;;-1:-1:-1;;;55418:71:0;;;;;;;:::i;:::-;55503:9;55498:142;55518:28;;;55498:142;;;55564:37;;;;:18;:37;;;;;55626:4;;55602:17;;55620:1;55602:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55564:59:0;;;;;;;;;;;;-1:-1:-1;55564:59:0;:66;;-1:-1:-1;;55564:66:0;;;;;;;;;;55548:3;;;;:::i;:::-;;;;55498:142;;45732:38;;;;;;;;;;;;6482:201;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6571:22:0;::::1;6563:73;;;::::0;-1:-1:-1;;;6563:73:0;;11873:2:1;6563:73:0::1;::::0;::::1;11855:21:1::0;11912:2;11892:18;;;11885:30;11951:34;11931:18;;;11924:62;-1:-1:-1;;;12002:18:1;;;11995:36;12048:19;;6563:73:0::1;11671:402:1::0;6563:73:0::1;6647:28;6666:8;6647:18;:28::i;53378:123::-:0;5646:6;;-1:-1:-1;;;;;5646:6:0;4377:10;5793:23;5785:68;;;;-1:-1:-1;;;5785:68:0;;;;;;;:::i;:::-;53457:29:::1;:38:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;53457:38:0;;::::1;::::0;;;::::1;::::0;;53378:123::o;41289:98::-;41347:7;41374:5;41378:1;41374;:5;:::i;40551:98::-;40609:7;40636:5;40640:1;40636;:5;:::i;34970:174::-;35045:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35045:29:0;-1:-1:-1;;;;;35045:29:0;;;;;;;;:24;;35099:23;35045:24;35099:14;:23::i;:::-;-1:-1:-1;;;;;35090:46:0;;;;;;;;;;;34970:174;;:::o;31282:348::-;31375:4;31077:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31077:16:0;31392:73;;;;-1:-1:-1;;;31392:73:0;;14148:2:1;31392:73:0;;;14130:21:1;14187:2;14167:18;;;14160:30;14226:34;14206:18;;;14199:62;-1:-1:-1;;;14277:18:1;;;14270:42;14329:19;;31392:73:0;13946:408:1;31392:73:0;31476:13;31492:23;31507:7;31492:14;:23::i;:::-;31476:39;;31545:5;-1:-1:-1;;;;;31534:16:0;:7;-1:-1:-1;;;;;31534:16:0;;:51;;;;31578:7;-1:-1:-1;;;;;31554:31:0;:20;31566:7;31554:11;:20::i;:::-;-1:-1:-1;;;;;31554:31:0;;31534:51;:87;;;-1:-1:-1;;;;;;28374:25:0;;;28350:4;28374:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31589:32;31526:96;31282:348;-1:-1:-1;;;;31282:348:0:o;34274:578::-;34433:4;-1:-1:-1;;;;;34406:31:0;:23;34421:7;34406:14;:23::i;:::-;-1:-1:-1;;;;;34406:31:0;;34398:85;;;;-1:-1:-1;;;34398:85:0;;19663:2:1;34398:85:0;;;19645:21:1;19702:2;19682:18;;;19675:30;19741:34;19721:18;;;19714:62;-1:-1:-1;;;19792:18:1;;;19785:39;19841:19;;34398:85:0;19461:405:1;34398:85:0;-1:-1:-1;;;;;34502:16:0;;34494:65;;;;-1:-1:-1;;;34494:65:0;;12986:2:1;34494:65:0;;;12968:21:1;13025:2;13005:18;;;12998:30;13064:34;13044:18;;;13037:62;-1:-1:-1;;;13115:18:1;;;13108:34;13159:19;;34494:65:0;12784:400:1;34494:65:0;34676:29;34693:1;34697:7;34676:8;:29::i;:::-;-1:-1:-1;;;;;34718:15:0;;;;;;:9;:15;;;;;:20;;34737:1;;34718:15;:20;;34737:1;;34718:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34749:13:0;;;;;;:9;:13;;;;;:18;;34766:1;;34749:13;:18;;34766:1;;34749:18;:::i;:::-;;;;-1:-1:-1;;34778:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34778:21:0;-1:-1:-1;;;;;34778:21:0;;;;;;;;;34817:27;;34778:16;;34817:27;;;;;;;34274:578;;;:::o;31972:110::-;32048:26;32058:2;32062:7;32048:26;;;;;;;;;;;;:9;:26::i;6843:191::-;6936:6;;;-1:-1:-1;;;;;6953:17:0;;;-1:-1:-1;;;;;;6953:17:0;;;;;;;6986:40;;6936:6;;;6953:17;6936:6;;6986:40;;6917:16;;6986:40;6906:128;6843:191;:::o;35286:315::-;35441:8;-1:-1:-1;;;;;35432:17:0;:5;-1:-1:-1;;;;;35432:17:0;;;35424:55;;;;-1:-1:-1;;;35424:55:0;;13391:2:1;35424:55:0;;;13373:21:1;13430:2;13410:18;;;13403:30;13469:27;13449:18;;;13442:55;13514:18;;35424:55:0;13189:349:1;35424:55:0;-1:-1:-1;;;;;35490:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35490:46:0;;;;;;;;;;35552:41;;10976::1;;;35552::0;;10949:18:1;35552:41:0;;;;;;;35286:315;;;:::o;30360:::-;30517:28;30527:4;30533:2;30537:7;30517:9;:28::i;:::-;30564:48;30587:4;30593:2;30597:7;30606:5;30564:22;:48::i;:::-;30556:111;;;;-1:-1:-1;;;30556:111:0;;;;;;;:::i;54654:104::-;54714:13;54743:9;54736:16;;;;;:::i;1859:723::-;1915:13;2136:10;2132:53;;-1:-1:-1;;2163:10:0;;;;;;;;;;;;-1:-1:-1;;;2163:10:0;;;;;1859:723::o;2132:53::-;2210:5;2195:12;2251:78;2258:9;;2251:78;;2284:8;;;;:::i;:::-;;-1:-1:-1;2307:10:0;;-1:-1:-1;2315:2:0;2307:10;;:::i;:::-;;;2251:78;;;2339:19;2371:6;2361:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2361:17:0;;2339:39;;2389:154;2396:10;;2389:154;;2423:11;2433:1;2423:11;;:::i;:::-;;-1:-1:-1;2492:10:0;2500:2;2492:5;:10;:::i;:::-;2479:24;;:2;:24;:::i;:::-;2466:39;;2449:6;2456;2449:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;2449:56:0;;;;;;;;-1:-1:-1;2520:11:0;2529:2;2520:11;;:::i;:::-;;;2389:154;;32309:321;32439:18;32445:2;32449:7;32439:5;:18::i;:::-;32490:54;32521:1;32525:2;32529:7;32538:5;32490:22;:54::i;:::-;32468:154;;;;-1:-1:-1;;;32468:154:0;;;;;;;:::i;36166:799::-;36321:4;-1:-1:-1;;;;;36342:13:0;;8184:20;8232:8;36338:620;;36378:72;;-1:-1:-1;;;36378:72:0;;-1:-1:-1;;;;;36378:36:0;;;;;:72;;4377:10;;36429:4;;36435:7;;36444:5;;36378:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36378:72:0;;;;;;;;-1:-1:-1;;36378:72:0;;;;;;;;;;;;:::i;:::-;;;36374:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36620:13:0;;36616:272;;36663:60;;-1:-1:-1;;;36663:60:0;;;;;;;:::i;36616:272::-;36838:6;36832:13;36823:6;36819:2;36815:15;36808:38;36374:529;-1:-1:-1;;;;;;36501:51:0;-1:-1:-1;;;36501:51:0;;-1:-1:-1;36494:58:0;;36338:620;-1:-1:-1;36942:4:0;36166:799;;;;;;:::o;32966:382::-;-1:-1:-1;;;;;33046:16:0;;33038:61;;;;-1:-1:-1;;;33038:61:0;;17760:2:1;33038:61:0;;;17742:21:1;;;17779:18;;;17772:30;17838:34;17818:18;;;17811:62;17890:18;;33038:61:0;17558:356:1;33038:61:0;31053:4;31077:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31077:16:0;:30;33110:58;;;;-1:-1:-1;;;33110:58:0;;12280:2:1;33110:58:0;;;12262:21:1;12319:2;12299:18;;;12292:30;12358;12338:18;;;12331:58;12406:18;;33110:58:0;12078:352:1;33110:58:0;-1:-1:-1;;;;;33239:13:0;;;;;;:9;:13;;;;;:18;;33256:1;;33239:13;:18;;33256:1;;33239:18;:::i;:::-;;;;-1:-1:-1;;33268:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;33268:21:0;-1:-1:-1;;;;;33268:21:0;;;;;;;;33307:33;;33268:16;;;33307:33;;33268:16;;33307:33;32966:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;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;;1039:18;1028:30;;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:160::-;1265:20;;1321:13;;1314:21;1304:32;;1294:60;;1350:1;1347;1340:12;1365:186;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;1516:29;1535:9;1516:29;:::i;1556:260::-;1624:6;1632;1685:2;1673:9;1664:7;1660:23;1656:32;1653:52;;;1701:1;1698;1691:12;1653:52;1724:29;1743:9;1724:29;:::i;:::-;1714:39;;1772:38;1806:2;1795:9;1791:18;1772:38;:::i;:::-;1762:48;;1556:260;;;;;:::o;1821:328::-;1898:6;1906;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2006:29;2025:9;2006:29;:::i;:::-;1996:39;;2054:38;2088:2;2077:9;2073:18;2054:38;:::i;:::-;2044:48;;2139:2;2128:9;2124:18;2111:32;2101:42;;1821:328;;;;;:::o;2154:666::-;2249:6;2257;2265;2273;2326:3;2314:9;2305:7;2301:23;2297:33;2294:53;;;2343:1;2340;2333:12;2294:53;2366:29;2385:9;2366:29;:::i;:::-;2356:39;;2414:38;2448:2;2437:9;2433:18;2414:38;:::i;:::-;2404:48;;2499:2;2488:9;2484:18;2471:32;2461:42;;2554:2;2543:9;2539:18;2526:32;2581:18;2573:6;2570:30;2567:50;;;2613:1;2610;2603:12;2567:50;2636:22;;2689:4;2681:13;;2677:27;-1:-1:-1;2667:55:1;;2718:1;2715;2708:12;2667:55;2741:73;2806:7;2801:2;2788:16;2783:2;2779;2775:11;2741:73;:::i;:::-;2731:83;;;2154:666;;;;;;;:::o;2825:254::-;2890:6;2898;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;:::-;2980:39;;3038:35;3069:2;3058:9;3054:18;3038:35;:::i;3084:254::-;3152:6;3160;3213:2;3201:9;3192:7;3188:23;3184:32;3181:52;;;3229:1;3226;3219:12;3181:52;3252:29;3271:9;3252:29;:::i;:::-;3242:39;3328:2;3313:18;;;;3300:32;;-1:-1:-1;;;3084:254:1:o;3343:437::-;3429:6;3437;3490:2;3478:9;3469:7;3465:23;3461:32;3458:52;;;3506:1;3503;3496:12;3458:52;3546:9;3533:23;3579:18;3571:6;3568:30;3565:50;;;3611:1;3608;3601:12;3565:50;3650:70;3712:7;3703:6;3692:9;3688:22;3650:70;:::i;:::-;3739:8;;3624:96;;-1:-1:-1;3343:437:1;-1:-1:-1;;;;3343:437:1:o;3785:773::-;3907:6;3915;3923;3931;3984:2;3972:9;3963:7;3959:23;3955:32;3952:52;;;4000:1;3997;3990:12;3952:52;4040:9;4027:23;4069:18;4110:2;4102:6;4099:14;4096:34;;;4126:1;4123;4116:12;4096:34;4165:70;4227:7;4218:6;4207:9;4203:22;4165:70;:::i;:::-;4254:8;;-1:-1:-1;4139:96:1;-1:-1:-1;4342:2:1;4327:18;;4314:32;;-1:-1:-1;4358:16:1;;;4355:36;;;4387:1;4384;4377:12;4355:36;;4426:72;4490:7;4479:8;4468:9;4464:24;4426:72;:::i;:::-;3785:773;;;;-1:-1:-1;4517:8:1;-1:-1:-1;;;;3785:773:1:o;4563:180::-;4619:6;4672:2;4660:9;4651:7;4647:23;4643:32;4640:52;;;4688:1;4685;4678:12;4640:52;4711:26;4727:9;4711:26;:::i;4748:245::-;4806:6;4859:2;4847:9;4838:7;4834:23;4830:32;4827:52;;;4875:1;4872;4865:12;4827:52;4914:9;4901:23;4933:30;4957:5;4933:30;:::i;4998:249::-;5067:6;5120:2;5108:9;5099:7;5095:23;5091:32;5088:52;;;5136:1;5133;5126:12;5088:52;5168:9;5162:16;5187:30;5211:5;5187:30;:::i;5252:450::-;5321:6;5374:2;5362:9;5353:7;5349:23;5345:32;5342:52;;;5390:1;5387;5380:12;5342:52;5430:9;5417:23;5463:18;5455:6;5452:30;5449:50;;;5495:1;5492;5485:12;5449:50;5518:22;;5571:4;5563:13;;5559:27;-1:-1:-1;5549:55:1;;5600:1;5597;5590:12;5549:55;5623:73;5688:7;5683:2;5670:16;5665:2;5661;5657:11;5623:73;:::i;5707:180::-;5766:6;5819:2;5807:9;5798:7;5794:23;5790:32;5787:52;;;5835:1;5832;5825:12;5787:52;-1:-1:-1;5858:23:1;;5707:180;-1:-1:-1;5707:180:1:o;5892:254::-;5960:6;5968;6021:2;6009:9;6000:7;5996:23;5992:32;5989:52;;;6037:1;6034;6027:12;5989:52;6073:9;6060:23;6050:33;;6102:38;6136:2;6125:9;6121:18;6102:38;:::i;6151:322::-;6225:6;6233;6241;6294:2;6282:9;6273:7;6269:23;6265:32;6262:52;;;6310:1;6307;6300:12;6262:52;6346:9;6333:23;6323:33;;6375:38;6409:2;6398:9;6394:18;6375:38;:::i;:::-;6365:48;;6432:35;6463:2;6452:9;6448:18;6432:35;:::i;:::-;6422:45;;6151:322;;;;;:::o;6478:505::-;6573:6;6581;6589;6642:2;6630:9;6621:7;6617:23;6613:32;6610:52;;;6658:1;6655;6648:12;6610:52;6694:9;6681:23;6671:33;;6755:2;6744:9;6740:18;6727:32;6782:18;6774:6;6771:30;6768:50;;;6814:1;6811;6804:12;6768:50;6853:70;6915:7;6906:6;6895:9;6891:22;6853:70;:::i;:::-;6478:505;;6942:8;;-1:-1:-1;6827:96:1;;-1:-1:-1;;;;6478:505:1:o;6988:248::-;7053:6;7061;7114:2;7102:9;7093:7;7089:23;7085:32;7082:52;;;7130:1;7127;7120:12;7082:52;7166:9;7153:23;7143:33;;7195:35;7226:2;7215:9;7211:18;7195:35;:::i;7241:248::-;7309:6;7317;7370:2;7358:9;7349:7;7345:23;7341:32;7338:52;;;7386:1;7383;7376:12;7338:52;-1:-1:-1;;7409:23:1;;;7479:2;7464:18;;;7451:32;;-1:-1:-1;7241:248:1:o;7494:257::-;7535:3;7573:5;7567:12;7600:6;7595:3;7588:19;7616:63;7672:6;7665:4;7660:3;7656:14;7649:4;7642:5;7638:16;7616:63;:::i;:::-;7733:2;7712:15;-1:-1:-1;;7708:29:1;7699:39;;;;7740:4;7695:50;;7494:257;-1:-1:-1;;7494:257:1:o;7756:1527::-;7980:3;8018:6;8012:13;8044:4;8057:51;8101:6;8096:3;8091:2;8083:6;8079:15;8057:51;:::i;:::-;8171:13;;8130:16;;;;8193:55;8171:13;8130:16;8215:15;;;8193:55;:::i;:::-;8337:13;;8270:20;;;8310:1;;8397;8419:18;;;;8472;;;;8499:93;;8577:4;8567:8;8563:19;8551:31;;8499:93;8640:2;8630:8;8627:16;8607:18;8604:40;8601:167;;;-1:-1:-1;;;8667:33:1;;8723:4;8720:1;8713:15;8753:4;8674:3;8741:17;8601:167;8784:18;8811:110;;;;8935:1;8930:328;;;;8777:481;;8811:110;-1:-1:-1;;8846:24:1;;8832:39;;8891:20;;;;-1:-1:-1;8811:110:1;;8930:328;22761:1;22754:14;;;22798:4;22785:18;;9025:1;9039:169;9053:8;9050:1;9047:15;9039:169;;;9135:14;;9120:13;;;9113:37;9178:16;;;;9070:10;;9039:169;;;9043:3;;9239:8;9232:5;9228:20;9221:27;;8777:481;-1:-1:-1;9274:3:1;;7756:1527;-1:-1:-1;;;;;;;;;;;7756:1527:1:o;9706:488::-;-1:-1:-1;;;;;9975:15:1;;;9957:34;;10027:15;;10022:2;10007:18;;10000:43;10074:2;10059:18;;10052:34;;;10122:3;10117:2;10102:18;;10095:31;;;9900:4;;10143:45;;10168:19;;10160:6;10143:45;:::i;:::-;10135:53;9706:488;-1:-1:-1;;;;;;9706:488:1:o;10199:632::-;10370:2;10422:21;;;10492:13;;10395:18;;;10514:22;;;10341:4;;10370:2;10593:15;;;;10567:2;10552:18;;;10341:4;10636:169;10650:6;10647:1;10644:13;10636:169;;;10711:13;;10699:26;;10780:15;;;;10745:12;;;;10672:1;10665:9;10636:169;;;-1:-1:-1;10822:3:1;;10199:632;-1:-1:-1;;;;;;10199:632:1:o;11028:219::-;11177:2;11166:9;11159:21;11140:4;11197:44;11237:2;11226:9;11222:18;11214:6;11197:44;:::i;11252:414::-;11454:2;11436:21;;;11493:2;11473:18;;;11466:30;11532:34;11527:2;11512:18;;11505:62;-1:-1:-1;;;11598:2:1;11583:18;;11576:48;11656:3;11641:19;;11252:414::o;12435:344::-;12637:2;12619:21;;;12676:2;12656:18;;;12649:30;-1:-1:-1;;;12710:2:1;12695:18;;12688:50;12770:2;12755:18;;12435:344::o;14359:354::-;14561:2;14543:21;;;14600:2;14580:18;;;14573:30;14639:32;14634:2;14619:18;;14612:60;14704:2;14689:18;;14359:354::o;15077:404::-;15279:2;15261:21;;;15318:2;15298:18;;;15291:30;15357:34;15352:2;15337:18;;15330:62;-1:-1:-1;;;15423:2:1;15408:18;;15401:38;15471:3;15456:19;;15077:404::o;18748:356::-;18950:2;18932:21;;;18969:18;;;18962:30;19028:34;19023:2;19008:18;;19001:62;19095:2;19080:18;;18748:356::o;19109:347::-;19311:2;19293:21;;;19350:2;19330:18;;;19323:30;19389:25;19384:2;19369:18;;19362:53;19447:2;19432:18;;19109:347::o;20689:344::-;20891:2;20873:21;;;20930:2;20910:18;;;20903:30;-1:-1:-1;;;20964:2:1;20949:18;;20942:50;21024:2;21009:18;;20689:344::o;21038:413::-;21240:2;21222:21;;;21279:2;21259:18;;;21252:30;21318:34;21313:2;21298:18;;21291:62;-1:-1:-1;;;21384:2:1;21369:18;;21362:47;21441:3;21426:19;;21038:413::o;21456:339::-;21658:2;21640:21;;;21697:2;21677:18;;;21670:30;-1:-1:-1;;;21731:2:1;21716:18;;21709:45;21786:2;21771:18;;21456:339::o;21800:343::-;22002:2;21984:21;;;22041:2;22021:18;;;22014:30;-1:-1:-1;;;22075:2:1;22060:18;;22053:49;22134:2;22119:18;;21800:343::o;22814:128::-;22854:3;22885:1;22881:6;22878:1;22875:13;22872:39;;;22891:18;;:::i;:::-;-1:-1:-1;22927:9:1;;22814:128::o;22947:120::-;22987:1;23013;23003:35;;23018:18;;:::i;:::-;-1:-1:-1;23052:9:1;;22947:120::o;23072:168::-;23112:7;23178:1;23174;23170:6;23166:14;23163:1;23160:21;23155:1;23148:9;23141:17;23137:45;23134:71;;;23185:18;;:::i;:::-;-1:-1:-1;23225:9:1;;23072:168::o;23245:125::-;23285:4;23313:1;23310;23307:8;23304:34;;;23318:18;;:::i;:::-;-1:-1:-1;23355:9:1;;23245:125::o;23375:258::-;23447:1;23457:113;23471:6;23468:1;23465:13;23457:113;;;23547:11;;;23541:18;23528:11;;;23521:39;23493:2;23486:10;23457:113;;;23588:6;23585:1;23582:13;23579:48;;;-1:-1:-1;;23623:1:1;23605:16;;23598:27;23375:258::o;23638:380::-;23717:1;23713:12;;;;23760;;;23781:61;;23835:4;23827:6;23823:17;23813:27;;23781:61;23888:2;23880:6;23877:14;23857:18;23854:38;23851:161;;;23934:10;23929:3;23925:20;23922:1;23915:31;23969:4;23966:1;23959:15;23997:4;23994:1;23987:15;23851:161;;23638:380;;;:::o;24023:135::-;24062:3;-1:-1:-1;;24083:17:1;;24080:43;;;24103:18;;:::i;:::-;-1:-1:-1;24150:1:1;24139:13;;24023:135::o;24163:112::-;24195:1;24221;24211:35;;24226:18;;:::i;:::-;-1:-1:-1;24260:9:1;;24163:112::o;24280:127::-;24341:10;24336:3;24332:20;24329:1;24322:31;24372:4;24369:1;24362:15;24396:4;24393:1;24386:15;24412:127;24473:10;24468:3;24464:20;24461:1;24454:31;24504:4;24501:1;24494:15;24528:4;24525:1;24518:15;24544:127;24605:10;24600:3;24596:20;24593:1;24586:31;24636:4;24633:1;24626:15;24660:4;24657:1;24650:15;24676:127;24737:10;24732:3;24728:20;24725:1;24718:31;24768:4;24765:1;24758:15;24792:4;24789:1;24782:15;24808:131;-1:-1:-1;;;;;;24882:32:1;;24872:43;;24862:71;;24929:1;24926;24919:12

Swarm Source

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