ETH Price: $3,269.73 (+0.29%)
Gas: 2 Gwei

Token

Lei Haku Aloha (LHA)
 

Overview

Max Total Supply

5,000 LHA

Holders

8

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mintsniper.eth
Balance
4 LHA
0xA8e2A4F1356Ce4715275Da00Ab53De1D3761E402
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:
LeiHakuAloha

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-09
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File: @openzeppelin/contracts/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/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

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/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/Address.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: @openzeppelin/contracts/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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("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: contracts/LeiHakuAloha.sol

pragma solidity 0.8.6;

contract LeiHakuAloha is ERC721, Ownable, ReentrancyGuard {
    bool public isActive;
    uint256 public constant MAX_SUPPLY = 5000;
    uint256 public constant PER_ORDER_LIMIT = 10;
    uint256 public constant SALE_PRICE = 5000000000000000 wei; // 0.0050 ether

    string public constant BASE_URI = "ipfs://QmbPn45u2NwiTooboiS5VjbiqHFmSoR6t3QRLWggzggCpa";

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("Lei Haku Aloha", "LHA") {
        isActive = false;
    }

    function mint(uint256 qty) public payable nonReentrant {
        require(isActive, "Contract is not active");
        require(qty > 0, "Cannot order a quantity of zero");
        require(qty < (PER_ORDER_LIMIT + 1), "Cannot purchase more than the per-order limit");
        require((totalSold() + qty) < (MAX_SUPPLY + 1), "Requested quantity would exceed total supply");
        require(msg.value == (SALE_PRICE * qty), "Incorrect payment amount");

        for (uint256 i = 0; i < qty; i++) {
            _tokenIds.increment();
            uint256 mintIndex = totalSold();
            _safeMint(msg.sender, mintIndex);
        }
    }

    function totalSupply() public pure returns (uint256) {
        return MAX_SUPPLY;
    }

    function salePrice() public pure returns (uint256) {
        return SALE_PRICE;
    }

    function totalSold() public view returns (uint256) {
        return _tokenIds.current();
    }

    function setActive(bool val) public onlyOwner {
        isActive = val;
    }

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

    function tokenURI(uint256 tokenId)
        public
        pure
        override
        returns (string memory)
    {
        require(tokenId > 0, "Token Id = 0");

        return
            bytes(BASE_URI).length > 0
                ? string(abi.encodePacked(BASE_URI, "/", uint2str(tokenId), ".json"))
                : "";
    }

    // https://stackoverflow.com/a/47137572
    function uint2str(uint256 _i)
        private
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_ORDER_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","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":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setActive","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":"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":"pure","type":"function"},{"inputs":[],"name":"totalSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","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"}]

60806040523480156200001157600080fd5b506040518060400160405280600e81526020017f4c65692048616b7520416c6f68610000000000000000000000000000000000008152506040518060400160405280600381526020017f4c48410000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001c9565b508060019080519060200190620000af929190620001c9565b505050620000d2620000c6620000fb60201b60201c565b6200010360201b60201c565b60016007819055506000600860006101000a81548160ff021916908315150217905550620002de565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d79062000279565b90600052602060002090601f016020900481019282620001fb576000855562000247565b82601f106200021657805160ff191683800117855562000247565b8280016001018555821562000247579182015b828111156200024657825182559160200191906001019062000229565b5b5090506200025691906200025a565b5090565b5b80821115620002755760008160009055506001016200025b565b5090565b600060028204905060018216806200029257607f821691505b60208210811415620002a957620002a8620002af565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61357280620002ee6000396000f3fe6080604052600436106101815760003560e01c80637f205a74116100d1578063acec338a1161008a578063dbddb26a11610064578063dbddb26a14610563578063e985e9c51461058e578063f2fde38b146105cb578063f51f96dd146105f457610181565b8063acec338a146104d4578063b88d4fde146104fd578063c87b56dd1461052657610181565b80637f205a74146103e35780638da5cb5b1461040e5780639106d7ba1461043957806395d89b4114610464578063a0712d681461048f578063a22cb465146104ab57610181565b806322f3e2d41161013e57806342842e0e1161011857806342842e0e146103295780636352211e1461035257806370a082311461038f578063715018a6146103cc57610181565b806322f3e2d4146102aa57806323b872dd146102d557806332cb6b0c146102fe57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806312e705da1461025457806318160ddd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612229565b61061f565b6040516101ba9190612769565b60405180910390f35b3480156101cf57600080fd5b506101d8610701565b6040516101e59190612784565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612283565b610793565b6040516102229190612702565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906121bc565b610818565b005b34801561026057600080fd5b50610269610930565b6040516102769190612a66565b60405180910390f35b34801561028b57600080fd5b50610294610935565b6040516102a19190612a66565b60405180910390f35b3480156102b657600080fd5b506102bf61093f565b6040516102cc9190612769565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f791906120a6565b610952565b005b34801561030a57600080fd5b506103136109b2565b6040516103209190612a66565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906120a6565b6109b8565b005b34801561035e57600080fd5b5061037960048036038101906103749190612283565b6109d8565b6040516103869190612702565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190612039565b610a8a565b6040516103c39190612a66565b60405180910390f35b3480156103d857600080fd5b506103e1610b42565b005b3480156103ef57600080fd5b506103f8610bca565b6040516104059190612a66565b60405180910390f35b34801561041a57600080fd5b50610423610bd5565b6040516104309190612702565b60405180910390f35b34801561044557600080fd5b5061044e610bff565b60405161045b9190612a66565b60405180910390f35b34801561047057600080fd5b50610479610c10565b6040516104869190612784565b60405180910390f35b6104a960048036038101906104a49190612283565b610ca2565b005b3480156104b757600080fd5b506104d260048036038101906104cd919061217c565b610ed2565b005b3480156104e057600080fd5b506104fb60048036038101906104f691906121fc565b611053565b005b34801561050957600080fd5b50610524600480360381019061051f91906120f9565b6110ec565b005b34801561053257600080fd5b5061054d60048036038101906105489190612283565b61114e565b60405161055a9190612784565b60405180910390f35b34801561056f57600080fd5b50610578611213565b6040516105859190612784565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b09190612066565b61122f565b6040516105c29190612769565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed9190612039565b6112c3565b005b34801561060057600080fd5b506106096113bb565b6040516106169190612a66565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fa57506106f9826113ca565b5b9050919050565b60606000805461071090612d29565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90612d29565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b5050505050905090565b600061079e82611434565b6107dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d490612966565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610823826109d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b906129e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b36114a0565b73ffffffffffffffffffffffffffffffffffffffff1614806108e257506108e1816108dc6114a0565b61122f565b5b610921576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610918906128c6565b60405180910390fd5b61092b83836114a8565b505050565b600a81565b6000611388905090565b600860009054906101000a900460ff1681565b61096361095d6114a0565b82611561565b6109a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099990612a06565b60405180910390fd5b6109ad83838361163f565b505050565b61138881565b6109d3838383604051806020016040528060008152506110ec565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7890612906565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af2906128e6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b4a6114a0565b73ffffffffffffffffffffffffffffffffffffffff16610b68610bd5565b73ffffffffffffffffffffffffffffffffffffffff1614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612986565b60405180910390fd5b610bc8600061189b565b565b6611c37937e0800081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610c0b6009611961565b905090565b606060018054610c1f90612d29565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4b90612d29565b8015610c985780601f10610c6d57610100808354040283529160200191610c98565b820191906000526020600020905b815481529060010190602001808311610c7b57829003601f168201915b5050505050905090565b60026007541415610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf90612a26565b60405180910390fd5b6002600781905550600860009054906101000a900460ff16610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690612946565b60405180910390fd5b60008111610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d79906129c6565b60405180910390fd5b6001600a610d909190612b1a565b8110610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890612806565b60405180910390fd5b6001611388610de09190612b1a565b81610de9610bff565b610df39190612b1a565b10610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a906128a6565b60405180910390fd5b806611c37937e08000610e469190612bd8565b3414610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e90612866565b60405180910390fd5b60005b81811015610ec657610e9c600961196f565b6000610ea6610bff565b9050610eb23382611985565b508080610ebe90612d8c565b915050610e8a565b50600160078190555050565b610eda6114a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90612846565b60405180910390fd5b8060056000610f556114a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110026114a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110479190612769565b60405180910390a35050565b61105b6114a0565b73ffffffffffffffffffffffffffffffffffffffff16611079610bd5565b73ffffffffffffffffffffffffffffffffffffffff16146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690612986565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b6110fd6110f76114a0565b83611561565b61113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612a06565b60405180910390fd5b611148848484846119a3565b50505050565b606060008211611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90612a46565b60405180910390fd5b60006040518060600160405280603581526020016135086035913951116111c9576040518060200160405280600081525061120c565b604051806060016040528060358152602001613508603591396111eb836119ff565b6040516020016111fc9291906126c8565b6040516020818303038152906040525b9050919050565b6040518060600160405280603581526020016135086035913981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112cb6114a0565b73ffffffffffffffffffffffffffffffffffffffff166112e9610bd5565b73ffffffffffffffffffffffffffffffffffffffff161461133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690612986565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a6906127c6565b60405180910390fd5b6113b88161189b565b50565b60006611c37937e08000905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661151b836109d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061156c82611434565b6115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290612886565b60405180910390fd5b60006115b6836109d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061162557508373ffffffffffffffffffffffffffffffffffffffff1661160d84610793565b73ffffffffffffffffffffffffffffffffffffffff16145b806116365750611635818561122f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661165f826109d8565b73ffffffffffffffffffffffffffffffffffffffff16146116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac906129a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90612826565b60405180910390fd5b611730838383611b88565b61173b6000826114a8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178b9190612c32565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e29190612b1a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61199f828260405180602001604052806000815250611b8d565b5050565b6119ae84848461163f565b6119ba84848484611be8565b6119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906127a6565b60405180910390fd5b50505050565b60606000821415611a47576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b83565b600082905060005b60008214611a79578080611a6290612d8c565b915050600a82611a729190612ba7565b9150611a4f565b60008167ffffffffffffffff811115611a9557611a94612e91565b5b6040519080825280601f01601f191660200182016040528015611ac75781602001600182028036833780820191505090505b50905060008290505b60008614611b7b57600181611ae59190612c32565b90506000600a8088611af79190612ba7565b611b019190612bd8565b87611b0c9190612c32565b6030611b189190612b70565b905060008160f81b905080848481518110611b3657611b35612e62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88611b729190612ba7565b97505050611ad0565b819450505050505b919050565b505050565b611b978383611d7f565b611ba46000848484611be8565b611be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bda906127a6565b60405180910390fd5b505050565b6000611c098473ffffffffffffffffffffffffffffffffffffffff16611f4d565b15611d72578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c326114a0565b8786866040518563ffffffff1660e01b8152600401611c54949392919061271d565b602060405180830381600087803b158015611c6e57600080fd5b505af1925050508015611c9f57506040513d601f19601f82011682018060405250810190611c9c9190612256565b60015b611d22573d8060008114611ccf576040519150601f19603f3d011682016040523d82523d6000602084013e611cd4565b606091505b50600081511415611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906127a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d77565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690612926565b60405180910390fd5b611df881611434565b15611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f906127e6565b60405180910390fd5b611e4460008383611b88565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e949190612b1a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000611f73611f6e84612aa6565b612a81565b905082815260208101848484011115611f8f57611f8e612ec5565b5b611f9a848285612ce7565b509392505050565b600081359050611fb1816134ab565b92915050565b600081359050611fc6816134c2565b92915050565b600081359050611fdb816134d9565b92915050565b600081519050611ff0816134d9565b92915050565b600082601f83011261200b5761200a612ec0565b5b813561201b848260208601611f60565b91505092915050565b600081359050612033816134f0565b92915050565b60006020828403121561204f5761204e612ecf565b5b600061205d84828501611fa2565b91505092915050565b6000806040838503121561207d5761207c612ecf565b5b600061208b85828601611fa2565b925050602061209c85828601611fa2565b9150509250929050565b6000806000606084860312156120bf576120be612ecf565b5b60006120cd86828701611fa2565b93505060206120de86828701611fa2565b92505060406120ef86828701612024565b9150509250925092565b6000806000806080858703121561211357612112612ecf565b5b600061212187828801611fa2565b945050602061213287828801611fa2565b935050604061214387828801612024565b925050606085013567ffffffffffffffff81111561216457612163612eca565b5b61217087828801611ff6565b91505092959194509250565b6000806040838503121561219357612192612ecf565b5b60006121a185828601611fa2565b92505060206121b285828601611fb7565b9150509250929050565b600080604083850312156121d3576121d2612ecf565b5b60006121e185828601611fa2565b92505060206121f285828601612024565b9150509250929050565b60006020828403121561221257612211612ecf565b5b600061222084828501611fb7565b91505092915050565b60006020828403121561223f5761223e612ecf565b5b600061224d84828501611fcc565b91505092915050565b60006020828403121561226c5761226b612ecf565b5b600061227a84828501611fe1565b91505092915050565b60006020828403121561229957612298612ecf565b5b60006122a784828501612024565b91505092915050565b6122b981612c66565b82525050565b6122c881612c78565b82525050565b60006122d982612ad7565b6122e38185612aed565b93506122f3818560208601612cf6565b6122fc81612ed4565b840191505092915050565b600061231282612ae2565b61231c8185612afe565b935061232c818560208601612cf6565b61233581612ed4565b840191505092915050565b600061234b82612ae2565b6123558185612b0f565b9350612365818560208601612cf6565b80840191505092915050565b600061237e603283612afe565b915061238982612ee5565b604082019050919050565b60006123a1602683612afe565b91506123ac82612f34565b604082019050919050565b60006123c4601c83612afe565b91506123cf82612f83565b602082019050919050565b60006123e7602d83612afe565b91506123f282612fac565b604082019050919050565b600061240a602483612afe565b915061241582612ffb565b604082019050919050565b600061242d601983612afe565b91506124388261304a565b602082019050919050565b6000612450601883612afe565b915061245b82613073565b602082019050919050565b6000612473602c83612afe565b915061247e8261309c565b604082019050919050565b6000612496602c83612afe565b91506124a1826130eb565b604082019050919050565b60006124b9603883612afe565b91506124c48261313a565b604082019050919050565b60006124dc602a83612afe565b91506124e782613189565b604082019050919050565b60006124ff602983612afe565b915061250a826131d8565b604082019050919050565b6000612522602083612afe565b915061252d82613227565b602082019050919050565b6000612545601683612afe565b915061255082613250565b602082019050919050565b6000612568602c83612afe565b915061257382613279565b604082019050919050565b600061258b600583612b0f565b9150612596826132c8565b600582019050919050565b60006125ae602083612afe565b91506125b9826132f1565b602082019050919050565b60006125d1602983612afe565b91506125dc8261331a565b604082019050919050565b60006125f4601f83612afe565b91506125ff82613369565b602082019050919050565b6000612617602183612afe565b915061262282613392565b604082019050919050565b600061263a603183612afe565b9150612645826133e1565b604082019050919050565b600061265d601f83612afe565b915061266882613430565b602082019050919050565b6000612680600c83612afe565b915061268b82613459565b602082019050919050565b60006126a3600183612b0f565b91506126ae82613482565b600182019050919050565b6126c281612cd0565b82525050565b60006126d48285612340565b91506126df82612696565b91506126eb8284612340565b91506126f68261257e565b91508190509392505050565b600060208201905061271760008301846122b0565b92915050565b600060808201905061273260008301876122b0565b61273f60208301866122b0565b61274c60408301856126b9565b818103606083015261275e81846122ce565b905095945050505050565b600060208201905061277e60008301846122bf565b92915050565b6000602082019050818103600083015261279e8184612307565b905092915050565b600060208201905081810360008301526127bf81612371565b9050919050565b600060208201905081810360008301526127df81612394565b9050919050565b600060208201905081810360008301526127ff816123b7565b9050919050565b6000602082019050818103600083015261281f816123da565b9050919050565b6000602082019050818103600083015261283f816123fd565b9050919050565b6000602082019050818103600083015261285f81612420565b9050919050565b6000602082019050818103600083015261287f81612443565b9050919050565b6000602082019050818103600083015261289f81612466565b9050919050565b600060208201905081810360008301526128bf81612489565b9050919050565b600060208201905081810360008301526128df816124ac565b9050919050565b600060208201905081810360008301526128ff816124cf565b9050919050565b6000602082019050818103600083015261291f816124f2565b9050919050565b6000602082019050818103600083015261293f81612515565b9050919050565b6000602082019050818103600083015261295f81612538565b9050919050565b6000602082019050818103600083015261297f8161255b565b9050919050565b6000602082019050818103600083015261299f816125a1565b9050919050565b600060208201905081810360008301526129bf816125c4565b9050919050565b600060208201905081810360008301526129df816125e7565b9050919050565b600060208201905081810360008301526129ff8161260a565b9050919050565b60006020820190508181036000830152612a1f8161262d565b9050919050565b60006020820190508181036000830152612a3f81612650565b9050919050565b60006020820190508181036000830152612a5f81612673565b9050919050565b6000602082019050612a7b60008301846126b9565b92915050565b6000612a8b612a9c565b9050612a978282612d5b565b919050565b6000604051905090565b600067ffffffffffffffff821115612ac157612ac0612e91565b5b612aca82612ed4565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b2582612cd0565b9150612b3083612cd0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b6557612b64612dd5565b5b828201905092915050565b6000612b7b82612cda565b9150612b8683612cda565b92508260ff03821115612b9c57612b9b612dd5565b5b828201905092915050565b6000612bb282612cd0565b9150612bbd83612cd0565b925082612bcd57612bcc612e04565b5b828204905092915050565b6000612be382612cd0565b9150612bee83612cd0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c2757612c26612dd5565b5b828202905092915050565b6000612c3d82612cd0565b9150612c4883612cd0565b925082821015612c5b57612c5a612dd5565b5b828203905092915050565b6000612c7182612cb0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612d14578082015181840152602081019050612cf9565b83811115612d23576000848401525b50505050565b60006002820490506001821680612d4157607f821691505b60208210811415612d5557612d54612e33565b5b50919050565b612d6482612ed4565b810181811067ffffffffffffffff82111715612d8357612d82612e91565b5b80604052505050565b6000612d9782612cd0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dca57612dc9612dd5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74207075726368617365206d6f7265207468616e2074686520706560008201527f722d6f72646572206c696d697400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e636f7272656374207061796d656e7420616d6f756e740000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f526571756573746564207175616e7469747920776f756c64206578636565642060008201527f746f74616c20737570706c790000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206f726465722061207175616e74697479206f66207a65726f00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f546f6b656e204964203d20300000000000000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6134b481612c66565b81146134bf57600080fd5b50565b6134cb81612c78565b81146134d657600080fd5b50565b6134e281612c84565b81146134ed57600080fd5b50565b6134f981612cd0565b811461350457600080fd5b5056fe697066733a2f2f516d62506e343575324e7769546f6f626f695335566a62697148466d536f5236743351524c5767677a6767437061a26469706673582212205da51a32bf96482fa07b9fa2f28c82c825465d4b30ac6fc7f6d6074d12b8ac7764736f6c63430008060033

Deployed Bytecode

0x6080604052600436106101815760003560e01c80637f205a74116100d1578063acec338a1161008a578063dbddb26a11610064578063dbddb26a14610563578063e985e9c51461058e578063f2fde38b146105cb578063f51f96dd146105f457610181565b8063acec338a146104d4578063b88d4fde146104fd578063c87b56dd1461052657610181565b80637f205a74146103e35780638da5cb5b1461040e5780639106d7ba1461043957806395d89b4114610464578063a0712d681461048f578063a22cb465146104ab57610181565b806322f3e2d41161013e57806342842e0e1161011857806342842e0e146103295780636352211e1461035257806370a082311461038f578063715018a6146103cc57610181565b806322f3e2d4146102aa57806323b872dd146102d557806332cb6b0c146102fe57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806312e705da1461025457806318160ddd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612229565b61061f565b6040516101ba9190612769565b60405180910390f35b3480156101cf57600080fd5b506101d8610701565b6040516101e59190612784565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612283565b610793565b6040516102229190612702565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906121bc565b610818565b005b34801561026057600080fd5b50610269610930565b6040516102769190612a66565b60405180910390f35b34801561028b57600080fd5b50610294610935565b6040516102a19190612a66565b60405180910390f35b3480156102b657600080fd5b506102bf61093f565b6040516102cc9190612769565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f791906120a6565b610952565b005b34801561030a57600080fd5b506103136109b2565b6040516103209190612a66565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906120a6565b6109b8565b005b34801561035e57600080fd5b5061037960048036038101906103749190612283565b6109d8565b6040516103869190612702565b60405180910390f35b34801561039b57600080fd5b506103b660048036038101906103b19190612039565b610a8a565b6040516103c39190612a66565b60405180910390f35b3480156103d857600080fd5b506103e1610b42565b005b3480156103ef57600080fd5b506103f8610bca565b6040516104059190612a66565b60405180910390f35b34801561041a57600080fd5b50610423610bd5565b6040516104309190612702565b60405180910390f35b34801561044557600080fd5b5061044e610bff565b60405161045b9190612a66565b60405180910390f35b34801561047057600080fd5b50610479610c10565b6040516104869190612784565b60405180910390f35b6104a960048036038101906104a49190612283565b610ca2565b005b3480156104b757600080fd5b506104d260048036038101906104cd919061217c565b610ed2565b005b3480156104e057600080fd5b506104fb60048036038101906104f691906121fc565b611053565b005b34801561050957600080fd5b50610524600480360381019061051f91906120f9565b6110ec565b005b34801561053257600080fd5b5061054d60048036038101906105489190612283565b61114e565b60405161055a9190612784565b60405180910390f35b34801561056f57600080fd5b50610578611213565b6040516105859190612784565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b09190612066565b61122f565b6040516105c29190612769565b60405180910390f35b3480156105d757600080fd5b506105f260048036038101906105ed9190612039565b6112c3565b005b34801561060057600080fd5b506106096113bb565b6040516106169190612a66565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fa57506106f9826113ca565b5b9050919050565b60606000805461071090612d29565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90612d29565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b5050505050905090565b600061079e82611434565b6107dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d490612966565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610823826109d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088b906129e6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108b36114a0565b73ffffffffffffffffffffffffffffffffffffffff1614806108e257506108e1816108dc6114a0565b61122f565b5b610921576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610918906128c6565b60405180910390fd5b61092b83836114a8565b505050565b600a81565b6000611388905090565b600860009054906101000a900460ff1681565b61096361095d6114a0565b82611561565b6109a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099990612a06565b60405180910390fd5b6109ad83838361163f565b505050565b61138881565b6109d3838383604051806020016040528060008152506110ec565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7890612906565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af2906128e6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b4a6114a0565b73ffffffffffffffffffffffffffffffffffffffff16610b68610bd5565b73ffffffffffffffffffffffffffffffffffffffff1614610bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb590612986565b60405180910390fd5b610bc8600061189b565b565b6611c37937e0800081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610c0b6009611961565b905090565b606060018054610c1f90612d29565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4b90612d29565b8015610c985780601f10610c6d57610100808354040283529160200191610c98565b820191906000526020600020905b815481529060010190602001808311610c7b57829003601f168201915b5050505050905090565b60026007541415610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf90612a26565b60405180910390fd5b6002600781905550600860009054906101000a900460ff16610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690612946565b60405180910390fd5b60008111610d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d79906129c6565b60405180910390fd5b6001600a610d909190612b1a565b8110610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890612806565b60405180910390fd5b6001611388610de09190612b1a565b81610de9610bff565b610df39190612b1a565b10610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a906128a6565b60405180910390fd5b806611c37937e08000610e469190612bd8565b3414610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e90612866565b60405180910390fd5b60005b81811015610ec657610e9c600961196f565b6000610ea6610bff565b9050610eb23382611985565b508080610ebe90612d8c565b915050610e8a565b50600160078190555050565b610eda6114a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3f90612846565b60405180910390fd5b8060056000610f556114a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110026114a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110479190612769565b60405180910390a35050565b61105b6114a0565b73ffffffffffffffffffffffffffffffffffffffff16611079610bd5565b73ffffffffffffffffffffffffffffffffffffffff16146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690612986565b60405180910390fd5b80600860006101000a81548160ff02191690831515021790555050565b6110fd6110f76114a0565b83611561565b61113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612a06565b60405180910390fd5b611148848484846119a3565b50505050565b606060008211611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90612a46565b60405180910390fd5b60006040518060600160405280603581526020016135086035913951116111c9576040518060200160405280600081525061120c565b604051806060016040528060358152602001613508603591396111eb836119ff565b6040516020016111fc9291906126c8565b6040516020818303038152906040525b9050919050565b6040518060600160405280603581526020016135086035913981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112cb6114a0565b73ffffffffffffffffffffffffffffffffffffffff166112e9610bd5565b73ffffffffffffffffffffffffffffffffffffffff161461133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690612986565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a6906127c6565b60405180910390fd5b6113b88161189b565b50565b60006611c37937e08000905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661151b836109d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061156c82611434565b6115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290612886565b60405180910390fd5b60006115b6836109d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061162557508373ffffffffffffffffffffffffffffffffffffffff1661160d84610793565b73ffffffffffffffffffffffffffffffffffffffff16145b806116365750611635818561122f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661165f826109d8565b73ffffffffffffffffffffffffffffffffffffffff16146116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac906129a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c90612826565b60405180910390fd5b611730838383611b88565b61173b6000826114a8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178b9190612c32565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e29190612b1a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61199f828260405180602001604052806000815250611b8d565b5050565b6119ae84848461163f565b6119ba84848484611be8565b6119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f0906127a6565b60405180910390fd5b50505050565b60606000821415611a47576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611b83565b600082905060005b60008214611a79578080611a6290612d8c565b915050600a82611a729190612ba7565b9150611a4f565b60008167ffffffffffffffff811115611a9557611a94612e91565b5b6040519080825280601f01601f191660200182016040528015611ac75781602001600182028036833780820191505090505b50905060008290505b60008614611b7b57600181611ae59190612c32565b90506000600a8088611af79190612ba7565b611b019190612bd8565b87611b0c9190612c32565b6030611b189190612b70565b905060008160f81b905080848481518110611b3657611b35612e62565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88611b729190612ba7565b97505050611ad0565b819450505050505b919050565b505050565b611b978383611d7f565b611ba46000848484611be8565b611be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bda906127a6565b60405180910390fd5b505050565b6000611c098473ffffffffffffffffffffffffffffffffffffffff16611f4d565b15611d72578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c326114a0565b8786866040518563ffffffff1660e01b8152600401611c54949392919061271d565b602060405180830381600087803b158015611c6e57600080fd5b505af1925050508015611c9f57506040513d601f19601f82011682018060405250810190611c9c9190612256565b60015b611d22573d8060008114611ccf576040519150601f19603f3d011682016040523d82523d6000602084013e611cd4565b606091505b50600081511415611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d11906127a6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d77565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690612926565b60405180910390fd5b611df881611434565b15611e38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2f906127e6565b60405180910390fd5b611e4460008383611b88565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e949190612b1a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000611f73611f6e84612aa6565b612a81565b905082815260208101848484011115611f8f57611f8e612ec5565b5b611f9a848285612ce7565b509392505050565b600081359050611fb1816134ab565b92915050565b600081359050611fc6816134c2565b92915050565b600081359050611fdb816134d9565b92915050565b600081519050611ff0816134d9565b92915050565b600082601f83011261200b5761200a612ec0565b5b813561201b848260208601611f60565b91505092915050565b600081359050612033816134f0565b92915050565b60006020828403121561204f5761204e612ecf565b5b600061205d84828501611fa2565b91505092915050565b6000806040838503121561207d5761207c612ecf565b5b600061208b85828601611fa2565b925050602061209c85828601611fa2565b9150509250929050565b6000806000606084860312156120bf576120be612ecf565b5b60006120cd86828701611fa2565b93505060206120de86828701611fa2565b92505060406120ef86828701612024565b9150509250925092565b6000806000806080858703121561211357612112612ecf565b5b600061212187828801611fa2565b945050602061213287828801611fa2565b935050604061214387828801612024565b925050606085013567ffffffffffffffff81111561216457612163612eca565b5b61217087828801611ff6565b91505092959194509250565b6000806040838503121561219357612192612ecf565b5b60006121a185828601611fa2565b92505060206121b285828601611fb7565b9150509250929050565b600080604083850312156121d3576121d2612ecf565b5b60006121e185828601611fa2565b92505060206121f285828601612024565b9150509250929050565b60006020828403121561221257612211612ecf565b5b600061222084828501611fb7565b91505092915050565b60006020828403121561223f5761223e612ecf565b5b600061224d84828501611fcc565b91505092915050565b60006020828403121561226c5761226b612ecf565b5b600061227a84828501611fe1565b91505092915050565b60006020828403121561229957612298612ecf565b5b60006122a784828501612024565b91505092915050565b6122b981612c66565b82525050565b6122c881612c78565b82525050565b60006122d982612ad7565b6122e38185612aed565b93506122f3818560208601612cf6565b6122fc81612ed4565b840191505092915050565b600061231282612ae2565b61231c8185612afe565b935061232c818560208601612cf6565b61233581612ed4565b840191505092915050565b600061234b82612ae2565b6123558185612b0f565b9350612365818560208601612cf6565b80840191505092915050565b600061237e603283612afe565b915061238982612ee5565b604082019050919050565b60006123a1602683612afe565b91506123ac82612f34565b604082019050919050565b60006123c4601c83612afe565b91506123cf82612f83565b602082019050919050565b60006123e7602d83612afe565b91506123f282612fac565b604082019050919050565b600061240a602483612afe565b915061241582612ffb565b604082019050919050565b600061242d601983612afe565b91506124388261304a565b602082019050919050565b6000612450601883612afe565b915061245b82613073565b602082019050919050565b6000612473602c83612afe565b915061247e8261309c565b604082019050919050565b6000612496602c83612afe565b91506124a1826130eb565b604082019050919050565b60006124b9603883612afe565b91506124c48261313a565b604082019050919050565b60006124dc602a83612afe565b91506124e782613189565b604082019050919050565b60006124ff602983612afe565b915061250a826131d8565b604082019050919050565b6000612522602083612afe565b915061252d82613227565b602082019050919050565b6000612545601683612afe565b915061255082613250565b602082019050919050565b6000612568602c83612afe565b915061257382613279565b604082019050919050565b600061258b600583612b0f565b9150612596826132c8565b600582019050919050565b60006125ae602083612afe565b91506125b9826132f1565b602082019050919050565b60006125d1602983612afe565b91506125dc8261331a565b604082019050919050565b60006125f4601f83612afe565b91506125ff82613369565b602082019050919050565b6000612617602183612afe565b915061262282613392565b604082019050919050565b600061263a603183612afe565b9150612645826133e1565b604082019050919050565b600061265d601f83612afe565b915061266882613430565b602082019050919050565b6000612680600c83612afe565b915061268b82613459565b602082019050919050565b60006126a3600183612b0f565b91506126ae82613482565b600182019050919050565b6126c281612cd0565b82525050565b60006126d48285612340565b91506126df82612696565b91506126eb8284612340565b91506126f68261257e565b91508190509392505050565b600060208201905061271760008301846122b0565b92915050565b600060808201905061273260008301876122b0565b61273f60208301866122b0565b61274c60408301856126b9565b818103606083015261275e81846122ce565b905095945050505050565b600060208201905061277e60008301846122bf565b92915050565b6000602082019050818103600083015261279e8184612307565b905092915050565b600060208201905081810360008301526127bf81612371565b9050919050565b600060208201905081810360008301526127df81612394565b9050919050565b600060208201905081810360008301526127ff816123b7565b9050919050565b6000602082019050818103600083015261281f816123da565b9050919050565b6000602082019050818103600083015261283f816123fd565b9050919050565b6000602082019050818103600083015261285f81612420565b9050919050565b6000602082019050818103600083015261287f81612443565b9050919050565b6000602082019050818103600083015261289f81612466565b9050919050565b600060208201905081810360008301526128bf81612489565b9050919050565b600060208201905081810360008301526128df816124ac565b9050919050565b600060208201905081810360008301526128ff816124cf565b9050919050565b6000602082019050818103600083015261291f816124f2565b9050919050565b6000602082019050818103600083015261293f81612515565b9050919050565b6000602082019050818103600083015261295f81612538565b9050919050565b6000602082019050818103600083015261297f8161255b565b9050919050565b6000602082019050818103600083015261299f816125a1565b9050919050565b600060208201905081810360008301526129bf816125c4565b9050919050565b600060208201905081810360008301526129df816125e7565b9050919050565b600060208201905081810360008301526129ff8161260a565b9050919050565b60006020820190508181036000830152612a1f8161262d565b9050919050565b60006020820190508181036000830152612a3f81612650565b9050919050565b60006020820190508181036000830152612a5f81612673565b9050919050565b6000602082019050612a7b60008301846126b9565b92915050565b6000612a8b612a9c565b9050612a978282612d5b565b919050565b6000604051905090565b600067ffffffffffffffff821115612ac157612ac0612e91565b5b612aca82612ed4565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612b2582612cd0565b9150612b3083612cd0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b6557612b64612dd5565b5b828201905092915050565b6000612b7b82612cda565b9150612b8683612cda565b92508260ff03821115612b9c57612b9b612dd5565b5b828201905092915050565b6000612bb282612cd0565b9150612bbd83612cd0565b925082612bcd57612bcc612e04565b5b828204905092915050565b6000612be382612cd0565b9150612bee83612cd0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c2757612c26612dd5565b5b828202905092915050565b6000612c3d82612cd0565b9150612c4883612cd0565b925082821015612c5b57612c5a612dd5565b5b828203905092915050565b6000612c7182612cb0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612d14578082015181840152602081019050612cf9565b83811115612d23576000848401525b50505050565b60006002820490506001821680612d4157607f821691505b60208210811415612d5557612d54612e33565b5b50919050565b612d6482612ed4565b810181811067ffffffffffffffff82111715612d8357612d82612e91565b5b80604052505050565b6000612d9782612cd0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612dca57612dc9612dd5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e6e6f74207075726368617365206d6f7265207468616e2074686520706560008201527f722d6f72646572206c696d697400000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e636f7272656374207061796d656e7420616d6f756e740000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f526571756573746564207175616e7469747920776f756c64206578636565642060008201527f746f74616c20737570706c790000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74206f726465722061207175616e74697479206f66207a65726f00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f546f6b656e204964203d20300000000000000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6134b481612c66565b81146134bf57600080fd5b50565b6134cb81612c78565b81146134d657600080fd5b50565b6134e281612c84565b81146134ed57600080fd5b50565b6134f981612cd0565b811461350457600080fd5b5056fe697066733a2f2f516d62506e343575324e7769546f6f626f695335566a62697148466d536f5236743351524c5767677a6767437061a26469706673582212205da51a32bf96482fa07b9fa2f28c82c825465d4b30ac6fc7f6d6074d12b8ac7764736f6c63430008060033

Deployed Bytecode Sourcemap

38978:2720:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26784:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27729:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29288:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28811:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39118:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40178:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39043:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30178:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39070:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30588:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27423:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27153:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24839:94;;;;;;;;;;;;;:::i;:::-;;39169:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24188:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40370:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27898:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39523:647;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29581:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40474:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30844:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40678:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39251:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29947:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25088:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40275:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26784:305;26886:4;26938:25;26923:40;;;:11;:40;;;;:105;;;;26995:33;26980:48;;;:11;:48;;;;26923:105;:158;;;;27045:36;27069:11;27045:23;:36::i;:::-;26923:158;26903:178;;26784:305;;;:::o;27729:100::-;27783:13;27816:5;27809:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27729:100;:::o;29288:221::-;29364:7;29392:16;29400:7;29392;:16::i;:::-;29384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29477:15;:24;29493:7;29477:24;;;;;;;;;;;;;;;;;;;;;29470:31;;29288:221;;;:::o;28811:411::-;28892:13;28908:23;28923:7;28908:14;:23::i;:::-;28892:39;;28956:5;28950:11;;:2;:11;;;;28942:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29050:5;29034:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29059:37;29076:5;29083:12;:10;:12::i;:::-;29059:16;:37::i;:::-;29034:62;29012:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29193:21;29202:2;29206:7;29193:8;:21::i;:::-;28881:341;28811:411;;:::o;39118:44::-;39160:2;39118:44;:::o;40178:89::-;40222:7;39107:4;40242:17;;40178:89;:::o;39043:20::-;;;;;;;;;;;;;:::o;30178:339::-;30373:41;30392:12;:10;:12::i;:::-;30406:7;30373:18;:41::i;:::-;30365:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30481:28;30491:4;30497:2;30501:7;30481:9;:28::i;:::-;30178:339;;;:::o;39070:41::-;39107:4;39070:41;:::o;30588:185::-;30726:39;30743:4;30749:2;30753:7;30726:39;;;;;;;;;;;;:16;:39::i;:::-;30588:185;;;:::o;27423:239::-;27495:7;27515:13;27531:7;:16;27539:7;27531:16;;;;;;;;;;;;;;;;;;;;;27515:32;;27583:1;27566:19;;:5;:19;;;;27558:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27649:5;27642:12;;;27423:239;;;:::o;27153:208::-;27225:7;27270:1;27253:19;;:5;:19;;;;27245:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27337:9;:16;27347:5;27337:16;;;;;;;;;;;;;;;;27330:23;;27153:208;;;:::o;24839:94::-;24419:12;:10;:12::i;:::-;24408:23;;:7;:5;:7::i;:::-;:23;;;24400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24904:21:::1;24922:1;24904:9;:21::i;:::-;24839:94::o:0;39169:57::-;39206:20;39169:57;:::o;24188:87::-;24234:7;24261:6;;;;;;;;;;;24254:13;;24188:87;:::o;40370:96::-;40412:7;40439:19;:9;:17;:19::i;:::-;40432:26;;40370:96;:::o;27898:104::-;27954:13;27987:7;27980:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27898:104;:::o;39523:647::-;1778:1;2374:7;;:19;;2366:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2507:7;:18;;;;39597:8:::1;;;;;;;;;;;39589:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39657:1;39651:3;:7;39643:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39738:1;39160:2;39720:19;;;;:::i;:::-;39713:3;:27;39705:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39845:1;39107:4;39832:14;;;;:::i;:::-;39824:3;39810:11;:9;:11::i;:::-;:17;;;;:::i;:::-;39809:38;39801:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39942:3;39206:20;39929:16;;;;:::i;:::-;39915:9;:31;39907:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39993:9;39988:175;40012:3;40008:1;:7;39988:175;;;40037:21;:9;:19;:21::i;:::-;40073:17;40093:11;:9;:11::i;:::-;40073:31;;40119:32;40129:10;40141:9;40119;:32::i;:::-;40022:141;40017:3;;;;;:::i;:::-;;;;39988:175;;;;1734:1:::0;2686:7;:22;;;;39523:647;:::o;29581:295::-;29696:12;:10;:12::i;:::-;29684:24;;:8;:24;;;;29676:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29796:8;29751:18;:32;29770:12;:10;:12::i;:::-;29751:32;;;;;;;;;;;;;;;:42;29784:8;29751:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29849:8;29820:48;;29835:12;:10;:12::i;:::-;29820:48;;;29859:8;29820:48;;;;;;:::i;:::-;;;;;;;;29581:295;;:::o;40474:79::-;24419:12;:10;:12::i;:::-;24408:23;;:7;:5;:7::i;:::-;:23;;;24400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40542:3:::1;40531:8;;:14;;;;;;;;;;;;;;;;;;40474:79:::0;:::o;30844:328::-;31019:41;31038:12;:10;:12::i;:::-;31052:7;31019:18;:41::i;:::-;31011:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31125:39;31139:4;31145:2;31149:7;31158:5;31125:13;:39::i;:::-;30844:328;;;;:::o;40678:344::-;40779:13;40828:1;40818:7;:11;40810:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;40904:1;40885:8;;;;;;;;;;;;;;;;;40879:22;:26;:135;;;;;;;;;;;;;;;;;40949:8;;;;;;;;;;;;;;;;;40964:17;40973:7;40964:8;:17::i;:::-;40932:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40879:135;40859:155;;40678:344;;;:::o;39251:89::-;;;;;;;;;;;;;;;;;;;:::o;29947:164::-;30044:4;30068:18;:25;30087:5;30068:25;;;;;;;;;;;;;;;:35;30094:8;30068:35;;;;;;;;;;;;;;;;;;;;;;;;;30061:42;;29947:164;;;;:::o;25088:192::-;24419:12;:10;:12::i;:::-;24408:23;;:7;:5;:7::i;:::-;:23;;;24400:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25197:1:::1;25177:22;;:8;:22;;;;25169:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25253:19;25263:8;25253:9;:19::i;:::-;25088:192:::0;:::o;40275:87::-;40317:7;39206:20;40337:17;;40275:87;:::o;5768:157::-;5853:4;5892:25;5877:40;;;:11;:40;;;;5870:47;;5768:157;;;:::o;32682:127::-;32747:4;32799:1;32771:30;;:7;:16;32779:7;32771:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32764:37;;32682:127;;;:::o;22980:98::-;23033:7;23060:10;23053:17;;22980:98;:::o;36664:174::-;36766:2;36739:15;:24;36755:7;36739:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36822:7;36818:2;36784:46;;36793:23;36808:7;36793:14;:23::i;:::-;36784:46;;;;;;;;;;;;36664:174;;:::o;32976:348::-;33069:4;33094:16;33102:7;33094;:16::i;:::-;33086:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33170:13;33186:23;33201:7;33186:14;:23::i;:::-;33170:39;;33239:5;33228:16;;:7;:16;;;:51;;;;33272:7;33248:31;;:20;33260:7;33248:11;:20::i;:::-;:31;;;33228:51;:87;;;;33283:32;33300:5;33307:7;33283:16;:32::i;:::-;33228:87;33220:96;;;32976:348;;;;:::o;35968:578::-;36127:4;36100:31;;:23;36115:7;36100:14;:23::i;:::-;:31;;;36092:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36210:1;36196:16;;:2;:16;;;;36188:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36266:39;36287:4;36293:2;36297:7;36266:20;:39::i;:::-;36370:29;36387:1;36391:7;36370:8;:29::i;:::-;36431:1;36412:9;:15;36422:4;36412:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36460:1;36443:9;:13;36453:2;36443:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36491:2;36472:7;:16;36480:7;36472:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36530:7;36526:2;36511:27;;36520:4;36511:27;;;;;;;;;;;;35968:578;;;:::o;25288:173::-;25344:16;25363:6;;;;;;;;;;;25344:25;;25389:8;25380:6;;:17;;;;;;;;;;;;;;;;;;25444:8;25413:40;;25434:8;25413:40;;;;;;;;;;;;25333:128;25288:173;:::o;3538:114::-;3603:7;3630;:14;;;3623:21;;3538:114;;;:::o;3660:127::-;3767:1;3749:7;:14;;;:19;;;;;;;;;;;3660:127;:::o;33666:110::-;33742:26;33752:2;33756:7;33742:26;;;;;;;;;;;;:9;:26::i;:::-;33666:110;;:::o;32054:315::-;32211:28;32221:4;32227:2;32231:7;32211:9;:28::i;:::-;32258:48;32281:4;32287:2;32291:7;32300:5;32258:22;:48::i;:::-;32250:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32054:315;;;;:::o;41075:620::-;41154:27;41209:1;41203:2;:7;41199:50;;;41227:10;;;;;;;;;;;;;;;;;;;;;41199:50;41259:9;41271:2;41259:14;;41284:11;41306:69;41318:1;41313;:6;41306:69;;41336:5;;;;;:::i;:::-;;;;41361:2;41356:7;;;;;:::i;:::-;;;41306:69;;;41385:17;41415:3;41405:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41385:34;;41430:9;41442:3;41430:15;;41456:202;41469:1;41463:2;:7;41456:202;;41495:1;41491;:5;;;;:::i;:::-;41487:9;;41511:10;41553:2;41547;41542;:7;;;;:::i;:::-;41541:14;;;;:::i;:::-;41536:2;:19;;;;:::i;:::-;41525:2;:31;;;;:::i;:::-;41511:46;;41572:9;41591:4;41584:12;;41572:24;;41621:2;41611:4;41616:1;41611:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;41644:2;41638:8;;;;;:::i;:::-;;;41472:186;;41456:202;;;41682:4;41668:19;;;;;;41075:620;;;;:::o;38778:126::-;;;;:::o;34003:321::-;34133:18;34139:2;34143:7;34133:5;:18::i;:::-;34184:54;34215:1;34219:2;34223:7;34232:5;34184:22;:54::i;:::-;34162:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34003:321;;;:::o;37403:803::-;37558:4;37579:15;:2;:13;;;:15::i;:::-;37575:624;;;37631:2;37615:36;;;37652:12;:10;:12::i;:::-;37666:4;37672:7;37681:5;37615:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37611:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37878:1;37861:6;:13;:18;37857:272;;;37904:60;;;;;;;;;;:::i;:::-;;;;;;;;37857:272;38079:6;38073:13;38064:6;38060:2;38056:15;38049:38;37611:533;37748:45;;;37738:55;;;:6;:55;;;;37731:62;;;;;37575:624;38183:4;38176:11;;37403:803;;;;;;;:::o;34660:382::-;34754:1;34740:16;;:2;:16;;;;34732:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34813:16;34821:7;34813;:16::i;:::-;34812:17;34804:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34875:45;34904:1;34908:2;34912:7;34875:20;:45::i;:::-;34950:1;34933:9;:13;34943:2;34933:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34981:2;34962:7;:16;34970:7;34962:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35026:7;35022:2;35001:33;;35018:1;35001:33;;;;;;;;;;;;34660:382;;:::o;8764:387::-;8824:4;9032:12;9099:7;9087:20;9079:28;;9142:1;9135:4;:8;9128:15;;;8764:387;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;475:87;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;617:84;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;758:86;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;912:79;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:2;;1122:79;;:::i;:::-;1081:2;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1406:87;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:2;;;1613:79;;:::i;:::-;1575:2;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1565:263;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:2;;;1965:79;;:::i;:::-;1927:2;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1917:391;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:2;;;2462:79;;:::i;:::-;2424:2;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2414:519;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:2;;;3114:79;;:::i;:::-;3075:2;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:2;;;3698:79;;:::i;:::-;3662:2;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;3065:817;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:2;;;4016:79;;:::i;:::-;3978:2;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3968:388;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:2;;;4493:79;;:::i;:::-;4455:2;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4445:391;;;;;:::o;4842:323::-;4898:6;4947:2;4935:9;4926:7;4922:23;4918:32;4915:2;;;4953:79;;:::i;:::-;4915:2;5073:1;5098:50;5140:7;5131:6;5120:9;5116:22;5098:50;:::i;:::-;5088:60;;5044:114;4905:260;;;;:::o;5171:327::-;5229:6;5278:2;5266:9;5257:7;5253:23;5249:32;5246:2;;;5284:79;;:::i;:::-;5246:2;5404:1;5429:52;5473:7;5464:6;5453:9;5449:22;5429:52;:::i;:::-;5419:62;;5375:116;5236:262;;;;:::o;5504:349::-;5573:6;5622:2;5610:9;5601:7;5597:23;5593:32;5590:2;;;5628:79;;:::i;:::-;5590:2;5748:1;5773:63;5828:7;5819:6;5808:9;5804:22;5773:63;:::i;:::-;5763:73;;5719:127;5580:273;;;;:::o;5859:329::-;5918:6;5967:2;5955:9;5946:7;5942:23;5938:32;5935:2;;;5973:79;;:::i;:::-;5935:2;6093:1;6118:53;6163:7;6154:6;6143:9;6139:22;6118:53;:::i;:::-;6108:63;;6064:117;5925:263;;;;:::o;6194:118::-;6281:24;6299:5;6281:24;:::i;:::-;6276:3;6269:37;6259:53;;:::o;6318:109::-;6399:21;6414:5;6399:21;:::i;:::-;6394:3;6387:34;6377:50;;:::o;6433:360::-;6519:3;6547:38;6579:5;6547:38;:::i;:::-;6601:70;6664:6;6659:3;6601:70;:::i;:::-;6594:77;;6680:52;6725:6;6720:3;6713:4;6706:5;6702:16;6680:52;:::i;:::-;6757:29;6779:6;6757:29;:::i;:::-;6752:3;6748:39;6741:46;;6523:270;;;;;:::o;6799:364::-;6887:3;6915:39;6948:5;6915:39;:::i;:::-;6970:71;7034:6;7029:3;6970:71;:::i;:::-;6963:78;;7050:52;7095:6;7090:3;7083:4;7076:5;7072:16;7050:52;:::i;:::-;7127:29;7149:6;7127:29;:::i;:::-;7122:3;7118:39;7111:46;;6891:272;;;;;:::o;7169:377::-;7275:3;7303:39;7336:5;7303:39;:::i;:::-;7358:89;7440:6;7435:3;7358:89;:::i;:::-;7351:96;;7456:52;7501:6;7496:3;7489:4;7482:5;7478:16;7456:52;:::i;:::-;7533:6;7528:3;7524:16;7517:23;;7279:267;;;;;:::o;7552:366::-;7694:3;7715:67;7779:2;7774:3;7715:67;:::i;:::-;7708:74;;7791:93;7880:3;7791:93;:::i;:::-;7909:2;7904:3;7900:12;7893:19;;7698:220;;;:::o;7924:366::-;8066:3;8087:67;8151:2;8146:3;8087:67;:::i;:::-;8080:74;;8163:93;8252:3;8163:93;:::i;:::-;8281:2;8276:3;8272:12;8265:19;;8070:220;;;:::o;8296:366::-;8438:3;8459:67;8523:2;8518:3;8459:67;:::i;:::-;8452:74;;8535:93;8624:3;8535:93;:::i;:::-;8653:2;8648:3;8644:12;8637:19;;8442:220;;;:::o;8668:366::-;8810:3;8831:67;8895:2;8890:3;8831:67;:::i;:::-;8824:74;;8907:93;8996:3;8907:93;:::i;:::-;9025:2;9020:3;9016:12;9009:19;;8814:220;;;:::o;9040:366::-;9182:3;9203:67;9267:2;9262:3;9203:67;:::i;:::-;9196:74;;9279:93;9368:3;9279:93;:::i;:::-;9397:2;9392:3;9388:12;9381:19;;9186:220;;;:::o;9412:366::-;9554:3;9575:67;9639:2;9634:3;9575:67;:::i;:::-;9568:74;;9651:93;9740:3;9651:93;:::i;:::-;9769:2;9764:3;9760:12;9753:19;;9558:220;;;:::o;9784:366::-;9926:3;9947:67;10011:2;10006:3;9947:67;:::i;:::-;9940:74;;10023:93;10112:3;10023:93;:::i;:::-;10141:2;10136:3;10132:12;10125:19;;9930:220;;;:::o;10156:366::-;10298:3;10319:67;10383:2;10378:3;10319:67;:::i;:::-;10312:74;;10395:93;10484:3;10395:93;:::i;:::-;10513:2;10508:3;10504:12;10497:19;;10302:220;;;:::o;10528:366::-;10670:3;10691:67;10755:2;10750:3;10691:67;:::i;:::-;10684:74;;10767:93;10856:3;10767:93;:::i;:::-;10885:2;10880:3;10876:12;10869:19;;10674:220;;;:::o;10900:366::-;11042:3;11063:67;11127:2;11122:3;11063:67;:::i;:::-;11056:74;;11139:93;11228:3;11139:93;:::i;:::-;11257:2;11252:3;11248:12;11241:19;;11046:220;;;:::o;11272:366::-;11414:3;11435:67;11499:2;11494:3;11435:67;:::i;:::-;11428:74;;11511:93;11600:3;11511:93;:::i;:::-;11629:2;11624:3;11620:12;11613:19;;11418:220;;;:::o;11644:366::-;11786:3;11807:67;11871:2;11866:3;11807:67;:::i;:::-;11800:74;;11883:93;11972:3;11883:93;:::i;:::-;12001:2;11996:3;11992:12;11985:19;;11790:220;;;:::o;12016:366::-;12158:3;12179:67;12243:2;12238:3;12179:67;:::i;:::-;12172:74;;12255:93;12344:3;12255:93;:::i;:::-;12373:2;12368:3;12364:12;12357:19;;12162:220;;;:::o;12388:366::-;12530:3;12551:67;12615:2;12610:3;12551:67;:::i;:::-;12544:74;;12627:93;12716:3;12627:93;:::i;:::-;12745:2;12740:3;12736:12;12729:19;;12534:220;;;:::o;12760:366::-;12902:3;12923:67;12987:2;12982:3;12923:67;:::i;:::-;12916:74;;12999:93;13088:3;12999:93;:::i;:::-;13117:2;13112:3;13108:12;13101:19;;12906:220;;;:::o;13132:400::-;13292:3;13313:84;13395:1;13390:3;13313:84;:::i;:::-;13306:91;;13406:93;13495:3;13406:93;:::i;:::-;13524:1;13519:3;13515:11;13508:18;;13296:236;;;:::o;13538:366::-;13680:3;13701:67;13765:2;13760:3;13701:67;:::i;:::-;13694:74;;13777:93;13866:3;13777:93;:::i;:::-;13895:2;13890:3;13886:12;13879:19;;13684:220;;;:::o;13910:366::-;14052:3;14073:67;14137:2;14132:3;14073:67;:::i;:::-;14066:74;;14149:93;14238:3;14149:93;:::i;:::-;14267:2;14262:3;14258:12;14251:19;;14056:220;;;:::o;14282:366::-;14424:3;14445:67;14509:2;14504:3;14445:67;:::i;:::-;14438:74;;14521:93;14610:3;14521:93;:::i;:::-;14639:2;14634:3;14630:12;14623:19;;14428:220;;;:::o;14654:366::-;14796:3;14817:67;14881:2;14876:3;14817:67;:::i;:::-;14810:74;;14893:93;14982:3;14893:93;:::i;:::-;15011:2;15006:3;15002:12;14995:19;;14800:220;;;:::o;15026:366::-;15168:3;15189:67;15253:2;15248:3;15189:67;:::i;:::-;15182:74;;15265:93;15354:3;15265:93;:::i;:::-;15383:2;15378:3;15374:12;15367:19;;15172:220;;;:::o;15398:366::-;15540:3;15561:67;15625:2;15620:3;15561:67;:::i;:::-;15554:74;;15637:93;15726:3;15637:93;:::i;:::-;15755:2;15750:3;15746:12;15739:19;;15544:220;;;:::o;15770:366::-;15912:3;15933:67;15997:2;15992:3;15933:67;:::i;:::-;15926:74;;16009:93;16098:3;16009:93;:::i;:::-;16127:2;16122:3;16118:12;16111:19;;15916:220;;;:::o;16142:400::-;16302:3;16323:84;16405:1;16400:3;16323:84;:::i;:::-;16316:91;;16416:93;16505:3;16416:93;:::i;:::-;16534:1;16529:3;16525:11;16518:18;;16306:236;;;:::o;16548:118::-;16635:24;16653:5;16635:24;:::i;:::-;16630:3;16623:37;16613:53;;:::o;16672:967::-;17054:3;17076:95;17167:3;17158:6;17076:95;:::i;:::-;17069:102;;17188:148;17332:3;17188:148;:::i;:::-;17181:155;;17353:95;17444:3;17435:6;17353:95;:::i;:::-;17346:102;;17465:148;17609:3;17465:148;:::i;:::-;17458:155;;17630:3;17623:10;;17058:581;;;;;:::o;17645:222::-;17738:4;17776:2;17765:9;17761:18;17753:26;;17789:71;17857:1;17846:9;17842:17;17833:6;17789:71;:::i;:::-;17743:124;;;;:::o;17873:640::-;18068:4;18106:3;18095:9;18091:19;18083:27;;18120:71;18188:1;18177:9;18173:17;18164:6;18120:71;:::i;:::-;18201:72;18269:2;18258:9;18254:18;18245:6;18201:72;:::i;:::-;18283;18351:2;18340:9;18336:18;18327:6;18283:72;:::i;:::-;18402:9;18396:4;18392:20;18387:2;18376:9;18372:18;18365:48;18430:76;18501:4;18492:6;18430:76;:::i;:::-;18422:84;;18073:440;;;;;;;:::o;18519:210::-;18606:4;18644:2;18633:9;18629:18;18621:26;;18657:65;18719:1;18708:9;18704:17;18695:6;18657:65;:::i;:::-;18611:118;;;;:::o;18735:313::-;18848:4;18886:2;18875:9;18871:18;18863:26;;18935:9;18929:4;18925:20;18921:1;18910:9;18906:17;18899:47;18963:78;19036:4;19027:6;18963:78;:::i;:::-;18955:86;;18853:195;;;;:::o;19054:419::-;19220:4;19258:2;19247:9;19243:18;19235:26;;19307:9;19301:4;19297:20;19293:1;19282:9;19278:17;19271:47;19335:131;19461:4;19335:131;:::i;:::-;19327:139;;19225:248;;;:::o;19479:419::-;19645:4;19683:2;19672:9;19668:18;19660:26;;19732:9;19726:4;19722:20;19718:1;19707:9;19703:17;19696:47;19760:131;19886:4;19760:131;:::i;:::-;19752:139;;19650:248;;;:::o;19904:419::-;20070:4;20108:2;20097:9;20093:18;20085:26;;20157:9;20151:4;20147:20;20143:1;20132:9;20128:17;20121:47;20185:131;20311:4;20185:131;:::i;:::-;20177:139;;20075:248;;;:::o;20329:419::-;20495:4;20533:2;20522:9;20518:18;20510:26;;20582:9;20576:4;20572:20;20568:1;20557:9;20553:17;20546:47;20610:131;20736:4;20610:131;:::i;:::-;20602:139;;20500:248;;;:::o;20754:419::-;20920:4;20958:2;20947:9;20943:18;20935:26;;21007:9;21001:4;20997:20;20993:1;20982:9;20978:17;20971:47;21035:131;21161:4;21035:131;:::i;:::-;21027:139;;20925:248;;;:::o;21179:419::-;21345:4;21383:2;21372:9;21368:18;21360:26;;21432:9;21426:4;21422:20;21418:1;21407:9;21403:17;21396:47;21460:131;21586:4;21460:131;:::i;:::-;21452:139;;21350:248;;;:::o;21604:419::-;21770:4;21808:2;21797:9;21793:18;21785:26;;21857:9;21851:4;21847:20;21843:1;21832:9;21828:17;21821:47;21885:131;22011:4;21885:131;:::i;:::-;21877:139;;21775:248;;;:::o;22029:419::-;22195:4;22233:2;22222:9;22218:18;22210:26;;22282:9;22276:4;22272:20;22268:1;22257:9;22253:17;22246:47;22310:131;22436:4;22310:131;:::i;:::-;22302:139;;22200:248;;;:::o;22454:419::-;22620:4;22658:2;22647:9;22643:18;22635:26;;22707:9;22701:4;22697:20;22693:1;22682:9;22678:17;22671:47;22735:131;22861:4;22735:131;:::i;:::-;22727:139;;22625:248;;;:::o;22879:419::-;23045:4;23083:2;23072:9;23068:18;23060:26;;23132:9;23126:4;23122:20;23118:1;23107:9;23103:17;23096:47;23160:131;23286:4;23160:131;:::i;:::-;23152:139;;23050:248;;;:::o;23304:419::-;23470:4;23508:2;23497:9;23493:18;23485:26;;23557:9;23551:4;23547:20;23543:1;23532:9;23528:17;23521:47;23585:131;23711:4;23585:131;:::i;:::-;23577:139;;23475:248;;;:::o;23729:419::-;23895:4;23933:2;23922:9;23918:18;23910:26;;23982:9;23976:4;23972:20;23968:1;23957:9;23953:17;23946:47;24010:131;24136:4;24010:131;:::i;:::-;24002:139;;23900:248;;;:::o;24154:419::-;24320:4;24358:2;24347:9;24343:18;24335:26;;24407:9;24401:4;24397:20;24393:1;24382:9;24378:17;24371:47;24435:131;24561:4;24435:131;:::i;:::-;24427:139;;24325:248;;;:::o;24579:419::-;24745:4;24783:2;24772:9;24768:18;24760:26;;24832:9;24826:4;24822:20;24818:1;24807:9;24803:17;24796:47;24860:131;24986:4;24860:131;:::i;:::-;24852:139;;24750:248;;;:::o;25004:419::-;25170:4;25208:2;25197:9;25193:18;25185:26;;25257:9;25251:4;25247:20;25243:1;25232:9;25228:17;25221:47;25285:131;25411:4;25285:131;:::i;:::-;25277:139;;25175:248;;;:::o;25429:419::-;25595:4;25633:2;25622:9;25618:18;25610:26;;25682:9;25676:4;25672:20;25668:1;25657:9;25653:17;25646:47;25710:131;25836:4;25710:131;:::i;:::-;25702:139;;25600:248;;;:::o;25854:419::-;26020:4;26058:2;26047:9;26043:18;26035:26;;26107:9;26101:4;26097:20;26093:1;26082:9;26078:17;26071:47;26135:131;26261:4;26135:131;:::i;:::-;26127:139;;26025:248;;;:::o;26279:419::-;26445:4;26483:2;26472:9;26468:18;26460:26;;26532:9;26526:4;26522:20;26518:1;26507:9;26503:17;26496:47;26560:131;26686:4;26560:131;:::i;:::-;26552:139;;26450:248;;;:::o;26704:419::-;26870:4;26908:2;26897:9;26893:18;26885:26;;26957:9;26951:4;26947:20;26943:1;26932:9;26928:17;26921:47;26985:131;27111:4;26985:131;:::i;:::-;26977:139;;26875:248;;;:::o;27129:419::-;27295:4;27333:2;27322:9;27318:18;27310:26;;27382:9;27376:4;27372:20;27368:1;27357:9;27353:17;27346:47;27410:131;27536:4;27410:131;:::i;:::-;27402:139;;27300:248;;;:::o;27554:419::-;27720:4;27758:2;27747:9;27743:18;27735:26;;27807:9;27801:4;27797:20;27793:1;27782:9;27778:17;27771:47;27835:131;27961:4;27835:131;:::i;:::-;27827:139;;27725:248;;;:::o;27979:419::-;28145:4;28183:2;28172:9;28168:18;28160:26;;28232:9;28226:4;28222:20;28218:1;28207:9;28203:17;28196:47;28260:131;28386:4;28260:131;:::i;:::-;28252:139;;28150:248;;;:::o;28404:222::-;28497:4;28535:2;28524:9;28520:18;28512:26;;28548:71;28616:1;28605:9;28601:17;28592:6;28548:71;:::i;:::-;28502:124;;;;:::o;28632:129::-;28666:6;28693:20;;:::i;:::-;28683:30;;28722:33;28750:4;28742:6;28722:33;:::i;:::-;28673:88;;;:::o;28767:75::-;28800:6;28833:2;28827:9;28817:19;;28807:35;:::o;28848:307::-;28909:4;28999:18;28991:6;28988:30;28985:2;;;29021:18;;:::i;:::-;28985:2;29059:29;29081:6;29059:29;:::i;:::-;29051:37;;29143:4;29137;29133:15;29125:23;;28914:241;;;:::o;29161:98::-;29212:6;29246:5;29240:12;29230:22;;29219:40;;;:::o;29265:99::-;29317:6;29351:5;29345:12;29335:22;;29324:40;;;:::o;29370:168::-;29453:11;29487:6;29482:3;29475:19;29527:4;29522:3;29518:14;29503:29;;29465:73;;;;:::o;29544:169::-;29628:11;29662:6;29657:3;29650:19;29702:4;29697:3;29693:14;29678:29;;29640:73;;;;:::o;29719:148::-;29821:11;29858:3;29843:18;;29833:34;;;;:::o;29873:305::-;29913:3;29932:20;29950:1;29932:20;:::i;:::-;29927:25;;29966:20;29984:1;29966:20;:::i;:::-;29961:25;;30120:1;30052:66;30048:74;30045:1;30042:81;30039:2;;;30126:18;;:::i;:::-;30039:2;30170:1;30167;30163:9;30156:16;;29917:261;;;;:::o;30184:237::-;30222:3;30241:18;30257:1;30241:18;:::i;:::-;30236:23;;30273:18;30289:1;30273:18;:::i;:::-;30268:23;;30363:1;30357:4;30353:12;30350:1;30347:19;30344:2;;;30369:18;;:::i;:::-;30344:2;30413:1;30410;30406:9;30399:16;;30226:195;;;;:::o;30427:185::-;30467:1;30484:20;30502:1;30484:20;:::i;:::-;30479:25;;30518:20;30536:1;30518:20;:::i;:::-;30513:25;;30557:1;30547:2;;30562:18;;:::i;:::-;30547:2;30604:1;30601;30597:9;30592:14;;30469:143;;;;:::o;30618:348::-;30658:7;30681:20;30699:1;30681:20;:::i;:::-;30676:25;;30715:20;30733:1;30715:20;:::i;:::-;30710:25;;30903:1;30835:66;30831:74;30828:1;30825:81;30820:1;30813:9;30806:17;30802:105;30799:2;;;30910:18;;:::i;:::-;30799:2;30958:1;30955;30951:9;30940:20;;30666:300;;;;:::o;30972:191::-;31012:4;31032:20;31050:1;31032:20;:::i;:::-;31027:25;;31066:20;31084:1;31066:20;:::i;:::-;31061:25;;31105:1;31102;31099:8;31096:2;;;31110:18;;:::i;:::-;31096:2;31155:1;31152;31148:9;31140:17;;31017:146;;;;:::o;31169:96::-;31206:7;31235:24;31253:5;31235:24;:::i;:::-;31224:35;;31214:51;;;:::o;31271:90::-;31305:7;31348:5;31341:13;31334:21;31323:32;;31313:48;;;:::o;31367:149::-;31403:7;31443:66;31436:5;31432:78;31421:89;;31411:105;;;:::o;31522:126::-;31559:7;31599:42;31592:5;31588:54;31577:65;;31567:81;;;:::o;31654:77::-;31691:7;31720:5;31709:16;;31699:32;;;:::o;31737:86::-;31772:7;31812:4;31805:5;31801:16;31790:27;;31780:43;;;:::o;31829:154::-;31913:6;31908:3;31903;31890:30;31975:1;31966:6;31961:3;31957:16;31950:27;31880:103;;;:::o;31989:307::-;32057:1;32067:113;32081:6;32078:1;32075:13;32067:113;;;32166:1;32161:3;32157:11;32151:18;32147:1;32142:3;32138:11;32131:39;32103:2;32100:1;32096:10;32091:15;;32067:113;;;32198:6;32195:1;32192:13;32189:2;;;32278:1;32269:6;32264:3;32260:16;32253:27;32189:2;32038:258;;;;:::o;32302:320::-;32346:6;32383:1;32377:4;32373:12;32363:22;;32430:1;32424:4;32420:12;32451:18;32441:2;;32507:4;32499:6;32495:17;32485:27;;32441:2;32569;32561:6;32558:14;32538:18;32535:38;32532:2;;;32588:18;;:::i;:::-;32532:2;32353:269;;;;:::o;32628:281::-;32711:27;32733:4;32711:27;:::i;:::-;32703:6;32699:40;32841:6;32829:10;32826:22;32805:18;32793:10;32790:34;32787:62;32784:2;;;32852:18;;:::i;:::-;32784:2;32892:10;32888:2;32881:22;32671:238;;;:::o;32915:233::-;32954:3;32977:24;32995:5;32977:24;:::i;:::-;32968:33;;33023:66;33016:5;33013:77;33010:2;;;33093:18;;:::i;:::-;33010:2;33140:1;33133:5;33129:13;33122:20;;32958:190;;;:::o;33154:180::-;33202:77;33199:1;33192:88;33299:4;33296:1;33289:15;33323:4;33320:1;33313:15;33340:180;33388:77;33385:1;33378:88;33485:4;33482:1;33475:15;33509:4;33506:1;33499:15;33526:180;33574:77;33571:1;33564:88;33671:4;33668:1;33661:15;33695:4;33692:1;33685:15;33712:180;33760:77;33757:1;33750:88;33857:4;33854:1;33847:15;33881:4;33878:1;33871:15;33898:180;33946:77;33943:1;33936:88;34043:4;34040:1;34033:15;34067:4;34064:1;34057:15;34084:117;34193:1;34190;34183:12;34207:117;34316:1;34313;34306:12;34330:117;34439:1;34436;34429:12;34453:117;34562:1;34559;34552:12;34576:102;34617:6;34668:2;34664:7;34659:2;34652:5;34648:14;34644:28;34634:38;;34624:54;;;:::o;34684:237::-;34824:34;34820:1;34812:6;34808:14;34801:58;34893:20;34888:2;34880:6;34876:15;34869:45;34790:131;:::o;34927:225::-;35067:34;35063:1;35055:6;35051:14;35044:58;35136:8;35131:2;35123:6;35119:15;35112:33;35033:119;:::o;35158:178::-;35298:30;35294:1;35286:6;35282:14;35275:54;35264:72;:::o;35342:232::-;35482:34;35478:1;35470:6;35466:14;35459:58;35551:15;35546:2;35538:6;35534:15;35527:40;35448:126;:::o;35580:223::-;35720:34;35716:1;35708:6;35704:14;35697:58;35789:6;35784:2;35776:6;35772:15;35765:31;35686:117;:::o;35809:175::-;35949:27;35945:1;35937:6;35933:14;35926:51;35915:69;:::o;35990:174::-;36130:26;36126:1;36118:6;36114:14;36107:50;36096:68;:::o;36170:231::-;36310:34;36306:1;36298:6;36294:14;36287:58;36379:14;36374:2;36366:6;36362:15;36355:39;36276:125;:::o;36407:231::-;36547:34;36543:1;36535:6;36531:14;36524:58;36616:14;36611:2;36603:6;36599:15;36592:39;36513:125;:::o;36644:243::-;36784:34;36780:1;36772:6;36768:14;36761:58;36853:26;36848:2;36840:6;36836:15;36829:51;36750:137;:::o;36893:229::-;37033:34;37029:1;37021:6;37017:14;37010:58;37102:12;37097:2;37089:6;37085:15;37078:37;36999:123;:::o;37128:228::-;37268:34;37264:1;37256:6;37252:14;37245:58;37337:11;37332:2;37324:6;37320:15;37313:36;37234:122;:::o;37362:182::-;37502:34;37498:1;37490:6;37486:14;37479:58;37468:76;:::o;37550:172::-;37690:24;37686:1;37678:6;37674:14;37667:48;37656:66;:::o;37728:231::-;37868:34;37864:1;37856:6;37852:14;37845:58;37937:14;37932:2;37924:6;37920:15;37913:39;37834:125;:::o;37965:155::-;38105:7;38101:1;38093:6;38089:14;38082:31;38071:49;:::o;38126:182::-;38266:34;38262:1;38254:6;38250:14;38243:58;38232:76;:::o;38314:228::-;38454:34;38450:1;38442:6;38438:14;38431:58;38523:11;38518:2;38510:6;38506:15;38499:36;38420:122;:::o;38548:181::-;38688:33;38684:1;38676:6;38672:14;38665:57;38654:75;:::o;38735:220::-;38875:34;38871:1;38863:6;38859:14;38852:58;38944:3;38939:2;38931:6;38927:15;38920:28;38841:114;:::o;38961:236::-;39101:34;39097:1;39089:6;39085:14;39078:58;39170:19;39165:2;39157:6;39153:15;39146:44;39067:130;:::o;39203:181::-;39343:33;39339:1;39331:6;39327:14;39320:57;39309:75;:::o;39390:162::-;39530:14;39526:1;39518:6;39514:14;39507:38;39496:56;:::o;39558:151::-;39698:3;39694:1;39686:6;39682:14;39675:27;39664:45;:::o;39715:122::-;39788:24;39806:5;39788:24;:::i;:::-;39781:5;39778:35;39768:2;;39827:1;39824;39817:12;39768:2;39758:79;:::o;39843:116::-;39913:21;39928:5;39913:21;:::i;:::-;39906:5;39903:32;39893:2;;39949:1;39946;39939:12;39893:2;39883:76;:::o;39965:120::-;40037:23;40054:5;40037:23;:::i;:::-;40030:5;40027:34;40017:2;;40075:1;40072;40065:12;40017:2;40007:78;:::o;40091:122::-;40164:24;40182:5;40164:24;:::i;:::-;40157:5;40154:35;40144:2;;40203:1;40200;40193:12;40144:2;40134:79;:::o

Swarm Source

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