ETH Price: $2,667.42 (+1.79%)

Token

GenericHero (GHL)
 

Overview

Max Total Supply

575 GHL

Holders

186

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 GHL
0x58a1e1012b891bf8526fb57786102c21c379d626
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:
GenericHero

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-11
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/GenericHero.sol


pragma solidity >=0.7.0 <0.9.0;


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

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.06 ether;
  uint256 public maxSupply = 6990;
  uint256 public maxMintAmountPerTx = 5;
  uint256 public mintBonusMultiplier = 2;

  bool public paused = true;
  bool public revealed = false;

  constructor() ERC721("GenericHero", "GHL") {
    setHiddenMetadataUri("ipfs://QmREFcGFuVJTh8H9okQuubvJMqH3YJdSCSc6esU5EDcmta");
  }

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

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

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");

    _mintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

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

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);
      
      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;
        ownedTokenIndex++;
      }
      currentTokenId++;
    }
    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

   function setMintBonusMultiplier(uint256 _mintBonusMultiplier) public onlyOwner {
    mintBonusMultiplier = _mintBonusMultiplier;
  }

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

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintBonusMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintBonusMultiplier","type":"uint256"}],"name":"setMintBonusMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b9291906200036c565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060099080519060200190620000799291906200036c565b5066d529ae9e860000600b55611b4e600c556005600d556002600e556001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff021916908315150217905550348015620000d857600080fd5b506040518060400160405280600b81526020017f47656e657269634865726f0000000000000000000000000000000000000000008152506040518060400160405280600381526020017f47484c000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200015d9291906200036c565b508060019080519060200190620001769291906200036c565b505050620001996200018d620001c960201b60201c565b620001d160201b60201c565b620001c3604051806060016040528060358152602001620047d7603591396200029760201b60201c565b62000504565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002a7620001c960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002cd6200034260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000326576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200031d906200047d565b60405180910390fd5b80600a90805190602001906200033e9291906200036c565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200037a90620004ce565b90600052602060002090601f0160209004810192826200039e5760008555620003ea565b82601f10620003b957805160ff1916838001178555620003ea565b82800160010185558215620003ea579182015b82811115620003e9578251825591602001919060010190620003cc565b5b509050620003f99190620003fd565b5090565b5b8082111562000418576000816000905550600101620003fe565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620004656020836200041c565b915062000472826200042d565b602082019050919050565b60006020820190508181036000830152620004988162000456565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004e757607f821691505b60208210811415620004fe57620004fd6200049f565b5b50919050565b6142c380620005146000396000f3fe6080604052600436106102255760003560e01c806362b99ad411610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107d2578063e0a80853146107fd578063e985e9c514610826578063efbd73f414610863578063f2fde38b1461088c57610225565b8063a22cb465146106ef578063a45ba8e714610718578063b071401b14610743578063b88d4fde1461076c578063c87b56dd1461079557610225565b80637ec4a659116100f25780637ec4a659146106295780638da5cb5b1461065257806394354fd01461067d57806395d89b41146106a8578063a0712d68146106d357610225565b806362b99ad41461056d5780636352211e1461059857806370a08231146105d5578063715018a61461061257610225565b806323b872dd116101b157806344a0d68a1161017557806344a0d68a1461049a5780634fdd43cb146104c357806351830227146104ec5780635503a0e8146105175780635c975abb1461054257610225565b806323b872dd146103c95780633b7ef328146103f25780633ccfd60b1461041d57806342842e0e14610434578063438b63001461045d57610225565b806313faede6116101f857806313faede6146102f8578063158786701461032357806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612c20565b6108b5565b60405161025e9190612c68565b60405180910390f35b34801561027357600080fd5b5061027c610997565b6040516102899190612d1c565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612d74565b610a29565b6040516102c69190612de2565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e29565b610aae565b005b34801561030457600080fd5b5061030d610bc6565b60405161031a9190612e78565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190612d74565b610bcc565b005b34801561035857600080fd5b50610373600480360381019061036e9190612fc8565b610c52565b005b34801561038157600080fd5b5061039c6004803603810190610397919061303d565b610ce8565b005b3480156103aa57600080fd5b506103b3610d81565b6040516103c09190612e78565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb919061306a565b610d92565b005b3480156103fe57600080fd5b50610407610df2565b6040516104149190612e78565b60405180910390f35b34801561042957600080fd5b50610432610df8565b005b34801561044057600080fd5b5061045b6004803603810190610456919061306a565b610ef4565b005b34801561046957600080fd5b50610484600480360381019061047f91906130bd565b610f14565b60405161049191906131a8565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190612d74565b61101f565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612fc8565b6110a5565b005b3480156104f857600080fd5b5061050161113b565b60405161050e9190612c68565b60405180910390f35b34801561052357600080fd5b5061052c61114e565b6040516105399190612d1c565b60405180910390f35b34801561054e57600080fd5b506105576111dc565b6040516105649190612c68565b60405180910390f35b34801561057957600080fd5b506105826111ef565b60405161058f9190612d1c565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190612d74565b61127d565b6040516105cc9190612de2565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906130bd565b61132f565b6040516106099190612e78565b60405180910390f35b34801561061e57600080fd5b506106276113e7565b005b34801561063557600080fd5b50610650600480360381019061064b9190612fc8565b61146f565b005b34801561065e57600080fd5b50610667611505565b6040516106749190612de2565b60405180910390f35b34801561068957600080fd5b5061069261152f565b60405161069f9190612e78565b60405180910390f35b3480156106b457600080fd5b506106bd611535565b6040516106ca9190612d1c565b60405180910390f35b6106ed60048036038101906106e89190612d74565b6115c7565b005b3480156106fb57600080fd5b50610716600480360381019061071191906131ca565b611720565b005b34801561072457600080fd5b5061072d611736565b60405161073a9190612d1c565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190612d74565b6117c4565b005b34801561077857600080fd5b50610793600480360381019061078e91906132ab565b61184a565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190612d74565b6118ac565b6040516107c99190612d1c565b60405180910390f35b3480156107de57600080fd5b506107e7611a05565b6040516107f49190612e78565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f919061303d565b611a0b565b005b34801561083257600080fd5b5061084d6004803603810190610848919061332e565b611aa4565b60405161085a9190612c68565b60405180910390f35b34801561086f57600080fd5b5061088a6004803603810190610885919061336e565b611b38565b005b34801561089857600080fd5b506108b360048036038101906108ae91906130bd565b611c6e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f82611d66565b5b9050919050565b6060600080546109a6906133dd565b80601f01602080910402602001604051908101604052809291908181526020018280546109d2906133dd565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a3482611dd0565b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90613481565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab98261127d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613513565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b49611e3c565b73ffffffffffffffffffffffffffffffffffffffff161480610b785750610b7781610b72611e3c565b611aa4565b5b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906135a5565b60405180910390fd5b610bc18383611e44565b505050565b600b5481565b610bd4611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610bf2611505565b73ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90613611565b60405180910390fd5b80600e8190555050565b610c5a611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610c78611505565b73ffffffffffffffffffffffffffffffffffffffff1614610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613611565b60405180910390fd5b8060099080519060200190610ce4929190612b11565b5050565b610cf0611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610d0e611505565b73ffffffffffffffffffffffffffffffffffffffff1614610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613611565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610d8d6007611efd565b905090565b610da3610d9d611e3c565b82611f0b565b610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd9906136a3565b60405180910390fd5b610ded838383611fe9565b505050565b600e5481565b610e00611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610e1e611505565b73ffffffffffffffffffffffffffffffffffffffff1614610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90613611565b60405180910390fd5b6000610e7e611505565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ea1906136f4565b60006040518083038185875af1925050503d8060008114610ede576040519150601f19603f3d011682016040523d82523d6000602084013e610ee3565b606091505b5050905080610ef157600080fd5b50565b610f0f8383836040518060200160405280600081525061184a565b505050565b60606000610f218361132f565b905060008167ffffffffffffffff811115610f3f57610f3e612e9d565b5b604051908082528060200260200182016040528015610f6d5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610f8a5750600c548211155b15611013576000610f9a8361127d565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fff5782848381518110610fe457610fe3613709565b5b6020026020010181815250508180610ffb90613767565b9250505b828061100a90613767565b93505050610f79565b82945050505050919050565b611027611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611045611505565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613611565b60405180910390fd5b80600b8190555050565b6110ad611e3c565b73ffffffffffffffffffffffffffffffffffffffff166110cb611505565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890613611565b60405180910390fd5b80600a9080519060200190611137929190612b11565b5050565b600f60019054906101000a900460ff1681565b6009805461115b906133dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611187906133dd565b80156111d45780601f106111a9576101008083540402835291602001916111d4565b820191906000526020600020905b8154815290600101906020018083116111b757829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b600880546111fc906133dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611228906133dd565b80156112755780601f1061124a57610100808354040283529160200191611275565b820191906000526020600020905b81548152906001019060200180831161125857829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613822565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906138b4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113ef611e3c565b73ffffffffffffffffffffffffffffffffffffffff1661140d611505565b73ffffffffffffffffffffffffffffffffffffffff1614611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613611565b60405180910390fd5b61146d6000612245565b565b611477611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611495611505565b73ffffffffffffffffffffffffffffffffffffffff16146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290613611565b60405180910390fd5b8060089080519060200190611501929190612b11565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b606060018054611544906133dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611570906133dd565b80156115bd5780601f10611592576101008083540402835291602001916115bd565b820191906000526020600020905b8154815290600101906020018083116115a057829003601f168201915b5050505050905090565b806000811180156115da5750600d548111155b611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161090613920565b60405180910390fd5b600c54816116276007611efd565b6116319190613940565b1115611672576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611669906139e2565b60405180910390fd5b600f60009054906101000a900460ff16156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b990613a4e565b60405180910390fd5b81600b546116d09190613a6e565b341015611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990613b14565b60405180910390fd5b61171c338361230b565b5050565b61173261172b611e3c565b8383612358565b5050565b600a8054611743906133dd565b80601f016020809104026020016040519081016040528092919081815260200182805461176f906133dd565b80156117bc5780601f10611791576101008083540402835291602001916117bc565b820191906000526020600020905b81548152906001019060200180831161179f57829003601f168201915b505050505081565b6117cc611e3c565b73ffffffffffffffffffffffffffffffffffffffff166117ea611505565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790613611565b60405180910390fd5b80600d8190555050565b61185b611855611e3c565b83611f0b565b61189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906136a3565b60405180910390fd5b6118a6848484846124c5565b50505050565b60606118b782611dd0565b6118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed90613ba6565b60405180910390fd5b60001515600f60019054906101000a900460ff16151514156119a457600a805461191f906133dd565b80601f016020809104026020016040519081016040528092919081815260200182805461194b906133dd565b80156119985780601f1061196d57610100808354040283529160200191611998565b820191906000526020600020905b81548152906001019060200180831161197b57829003601f168201915b50505050509050611a00565b60006119ae612521565b905060008151116119ce57604051806020016040528060008152506119fc565b806119d8846125b3565b60096040516020016119ec93929190613c96565b6040516020818303038152906040525b9150505b919050565b600c5481565b611a13611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611a31611505565b73ffffffffffffffffffffffffffffffffffffffff1614611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90613611565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611b4b5750600d548111155b611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8190613920565b60405180910390fd5b600c5481611b986007611efd565b611ba29190613940565b1115611be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bda906139e2565b60405180910390fd5b611beb611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611c09611505565b73ffffffffffffffffffffffffffffffffffffffff1614611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613611565b60405180910390fd5b611c69828461230b565b505050565b611c76611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611c94611505565b73ffffffffffffffffffffffffffffffffffffffff1614611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190613611565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5190613d39565b60405180910390fd5b611d6381612245565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611eb78361127d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611f1682611dd0565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c90613dcb565b60405180910390fd5b6000611f608361127d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fcf57508373ffffffffffffffffffffffffffffffffffffffff16611fb784610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fe05750611fdf8185611aa4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120098261127d565b73ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690613e5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690613eef565b60405180910390fd5b6120da838383612714565b6120e5600082611e44565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121359190613f0f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218c9190613940565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b600e548261231c9190613a6e565b8110156123535761232d6007612719565b6123408361233b6007611efd565b61272f565b808061234b90613767565b91505061230e565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be90613f8f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124b89190612c68565b60405180910390a3505050565b6124d0848484611fe9565b6124dc8484848461274d565b61251b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251290614021565b60405180910390fd5b50505050565b606060088054612530906133dd565b80601f016020809104026020016040519081016040528092919081815260200182805461255c906133dd565b80156125a95780601f1061257e576101008083540402835291602001916125a9565b820191906000526020600020905b81548152906001019060200180831161258c57829003601f168201915b5050505050905090565b606060008214156125fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061270f565b600082905060005b6000821461262d57808061261690613767565b915050600a826126269190614070565b9150612603565b60008167ffffffffffffffff81111561264957612648612e9d565b5b6040519080825280601f01601f19166020018201604052801561267b5781602001600182028036833780820191505090505b5090505b60008514612708576001826126949190613f0f565b9150600a856126a391906140a1565b60306126af9190613940565b60f81b8183815181106126c5576126c4613709565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127019190614070565b945061267f565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b6127498282604051806020016040528060008152506128d5565b5050565b600061276e8473ffffffffffffffffffffffffffffffffffffffff16612930565b156128c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612797611e3c565b8786866040518563ffffffff1660e01b81526004016127b99493929190614127565b6020604051808303816000875af19250505080156127f557506040513d601f19601f820116820180604052508101906127f29190614188565b60015b612878573d8060008114612825576040519150601f19603f3d011682016040523d82523d6000602084013e61282a565b606091505b50600081511415612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790614021565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128cd565b600190505b949350505050565b6128df8383612943565b6128ec600084848461274d565b61292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290614021565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614201565b60405180910390fd5b6129bc81611dd0565b156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f39061426d565b60405180910390fd5b612a0860008383612714565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a589190613940565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b1d906133dd565b90600052602060002090601f016020900481019282612b3f5760008555612b86565b82601f10612b5857805160ff1916838001178555612b86565b82800160010185558215612b86579182015b82811115612b85578251825591602001919060010190612b6a565b5b509050612b939190612b97565b5090565b5b80821115612bb0576000816000905550600101612b98565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bfd81612bc8565b8114612c0857600080fd5b50565b600081359050612c1a81612bf4565b92915050565b600060208284031215612c3657612c35612bbe565b5b6000612c4484828501612c0b565b91505092915050565b60008115159050919050565b612c6281612c4d565b82525050565b6000602082019050612c7d6000830184612c59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cbd578082015181840152602081019050612ca2565b83811115612ccc576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cee82612c83565b612cf88185612c8e565b9350612d08818560208601612c9f565b612d1181612cd2565b840191505092915050565b60006020820190508181036000830152612d368184612ce3565b905092915050565b6000819050919050565b612d5181612d3e565b8114612d5c57600080fd5b50565b600081359050612d6e81612d48565b92915050565b600060208284031215612d8a57612d89612bbe565b5b6000612d9884828501612d5f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dcc82612da1565b9050919050565b612ddc81612dc1565b82525050565b6000602082019050612df76000830184612dd3565b92915050565b612e0681612dc1565b8114612e1157600080fd5b50565b600081359050612e2381612dfd565b92915050565b60008060408385031215612e4057612e3f612bbe565b5b6000612e4e85828601612e14565b9250506020612e5f85828601612d5f565b9150509250929050565b612e7281612d3e565b82525050565b6000602082019050612e8d6000830184612e69565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed582612cd2565b810181811067ffffffffffffffff82111715612ef457612ef3612e9d565b5b80604052505050565b6000612f07612bb4565b9050612f138282612ecc565b919050565b600067ffffffffffffffff821115612f3357612f32612e9d565b5b612f3c82612cd2565b9050602081019050919050565b82818337600083830152505050565b6000612f6b612f6684612f18565b612efd565b905082815260208101848484011115612f8757612f86612e98565b5b612f92848285612f49565b509392505050565b600082601f830112612faf57612fae612e93565b5b8135612fbf848260208601612f58565b91505092915050565b600060208284031215612fde57612fdd612bbe565b5b600082013567ffffffffffffffff811115612ffc57612ffb612bc3565b5b61300884828501612f9a565b91505092915050565b61301a81612c4d565b811461302557600080fd5b50565b60008135905061303781613011565b92915050565b60006020828403121561305357613052612bbe565b5b600061306184828501613028565b91505092915050565b60008060006060848603121561308357613082612bbe565b5b600061309186828701612e14565b93505060206130a286828701612e14565b92505060406130b386828701612d5f565b9150509250925092565b6000602082840312156130d3576130d2612bbe565b5b60006130e184828501612e14565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61311f81612d3e565b82525050565b60006131318383613116565b60208301905092915050565b6000602082019050919050565b6000613155826130ea565b61315f81856130f5565b935061316a83613106565b8060005b8381101561319b5781516131828882613125565b975061318d8361313d565b92505060018101905061316e565b5085935050505092915050565b600060208201905081810360008301526131c2818461314a565b905092915050565b600080604083850312156131e1576131e0612bbe565b5b60006131ef85828601612e14565b925050602061320085828601613028565b9150509250929050565b600067ffffffffffffffff82111561322557613224612e9d565b5b61322e82612cd2565b9050602081019050919050565b600061324e6132498461320a565b612efd565b90508281526020810184848401111561326a57613269612e98565b5b613275848285612f49565b509392505050565b600082601f83011261329257613291612e93565b5b81356132a284826020860161323b565b91505092915050565b600080600080608085870312156132c5576132c4612bbe565b5b60006132d387828801612e14565b94505060206132e487828801612e14565b93505060406132f587828801612d5f565b925050606085013567ffffffffffffffff81111561331657613315612bc3565b5b6133228782880161327d565b91505092959194509250565b6000806040838503121561334557613344612bbe565b5b600061335385828601612e14565b925050602061336485828601612e14565b9150509250929050565b6000806040838503121561338557613384612bbe565b5b600061339385828601612d5f565b92505060206133a485828601612e14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133f557607f821691505b60208210811415613409576134086133ae565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061346b602c83612c8e565b91506134768261340f565b604082019050919050565b6000602082019050818103600083015261349a8161345e565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134fd602183612c8e565b9150613508826134a1565b604082019050919050565b6000602082019050818103600083015261352c816134f0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061358f603883612c8e565b915061359a82613533565b604082019050919050565b600060208201905081810360008301526135be81613582565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135fb602083612c8e565b9150613606826135c5565b602082019050919050565b6000602082019050818103600083015261362a816135ee565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061368d603183612c8e565b915061369882613631565b604082019050919050565b600060208201905081810360008301526136bc81613680565b9050919050565b600081905092915050565b50565b60006136de6000836136c3565b91506136e9826136ce565b600082019050919050565b60006136ff826136d1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377282612d3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137a5576137a4613738565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061380c602983612c8e565b9150613817826137b0565b604082019050919050565b6000602082019050818103600083015261383b816137ff565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061389e602a83612c8e565b91506138a982613842565b604082019050919050565b600060208201905081810360008301526138cd81613891565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061390a601483612c8e565b9150613915826138d4565b602082019050919050565b60006020820190508181036000830152613939816138fd565b9050919050565b600061394b82612d3e565b915061395683612d3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561398b5761398a613738565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006139cc601483612c8e565b91506139d782613996565b602082019050919050565b600060208201905081810360008301526139fb816139bf565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613a38601783612c8e565b9150613a4382613a02565b602082019050919050565b60006020820190508181036000830152613a6781613a2b565b9050919050565b6000613a7982612d3e565b9150613a8483612d3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613abd57613abc613738565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613afe601383612c8e565b9150613b0982613ac8565b602082019050919050565b60006020820190508181036000830152613b2d81613af1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b90602f83612c8e565b9150613b9b82613b34565b604082019050919050565b60006020820190508181036000830152613bbf81613b83565b9050919050565b600081905092915050565b6000613bdc82612c83565b613be68185613bc6565b9350613bf6818560208601612c9f565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613c24816133dd565b613c2e8186613bc6565b94506001821660008114613c495760018114613c5a57613c8d565b60ff19831686528186019350613c8d565b613c6385613c02565b60005b83811015613c8557815481890152600182019150602081019050613c66565b838801955050505b50505092915050565b6000613ca28286613bd1565b9150613cae8285613bd1565b9150613cba8284613c17565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d23602683612c8e565b9150613d2e82613cc7565b604082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613db5602c83612c8e565b9150613dc082613d59565b604082019050919050565b60006020820190508181036000830152613de481613da8565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613e47602983612c8e565b9150613e5282613deb565b604082019050919050565b60006020820190508181036000830152613e7681613e3a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613ed9602483612c8e565b9150613ee482613e7d565b604082019050919050565b60006020820190508181036000830152613f0881613ecc565b9050919050565b6000613f1a82612d3e565b9150613f2583612d3e565b925082821015613f3857613f37613738565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f79601983612c8e565b9150613f8482613f43565b602082019050919050565b60006020820190508181036000830152613fa881613f6c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061400b603283612c8e565b915061401682613faf565b604082019050919050565b6000602082019050818103600083015261403a81613ffe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061407b82612d3e565b915061408683612d3e565b92508261409657614095614041565b5b828204905092915050565b60006140ac82612d3e565b91506140b783612d3e565b9250826140c7576140c6614041565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140f9826140d2565b61410381856140dd565b9350614113818560208601612c9f565b61411c81612cd2565b840191505092915050565b600060808201905061413c6000830187612dd3565b6141496020830186612dd3565b6141566040830185612e69565b818103606083015261416881846140ee565b905095945050505050565b60008151905061418281612bf4565b92915050565b60006020828403121561419e5761419d612bbe565b5b60006141ac84828501614173565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141eb602083612c8e565b91506141f6826141b5565b602082019050919050565b6000602082019050818103600083015261421a816141de565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614257601c83612c8e565b915061426282614221565b602082019050919050565b600060208201905081810360008301526142868161424a565b905091905056fea26469706673582212205c14a4b9d7cdf4bef6d1ac6b78803268951c145567ab3fed8da61a4705fcf85e64736f6c634300080a0033697066733a2f2f516d52454663474675564a54683848396f6b51757562764a4d714833594a645343536336657355354544636d7461

Deployed Bytecode

0x6080604052600436106102255760003560e01c806362b99ad411610123578063a22cb465116100ab578063d5abeb011161006f578063d5abeb01146107d2578063e0a80853146107fd578063e985e9c514610826578063efbd73f414610863578063f2fde38b1461088c57610225565b8063a22cb465146106ef578063a45ba8e714610718578063b071401b14610743578063b88d4fde1461076c578063c87b56dd1461079557610225565b80637ec4a659116100f25780637ec4a659146106295780638da5cb5b1461065257806394354fd01461067d57806395d89b41146106a8578063a0712d68146106d357610225565b806362b99ad41461056d5780636352211e1461059857806370a08231146105d5578063715018a61461061257610225565b806323b872dd116101b157806344a0d68a1161017557806344a0d68a1461049a5780634fdd43cb146104c357806351830227146104ec5780635503a0e8146105175780635c975abb1461054257610225565b806323b872dd146103c95780633b7ef328146103f25780633ccfd60b1461041d57806342842e0e14610434578063438b63001461045d57610225565b806313faede6116101f857806313faede6146102f8578063158786701461032357806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612c20565b6108b5565b60405161025e9190612c68565b60405180910390f35b34801561027357600080fd5b5061027c610997565b6040516102899190612d1c565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612d74565b610a29565b6040516102c69190612de2565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e29565b610aae565b005b34801561030457600080fd5b5061030d610bc6565b60405161031a9190612e78565b60405180910390f35b34801561032f57600080fd5b5061034a60048036038101906103459190612d74565b610bcc565b005b34801561035857600080fd5b50610373600480360381019061036e9190612fc8565b610c52565b005b34801561038157600080fd5b5061039c6004803603810190610397919061303d565b610ce8565b005b3480156103aa57600080fd5b506103b3610d81565b6040516103c09190612e78565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb919061306a565b610d92565b005b3480156103fe57600080fd5b50610407610df2565b6040516104149190612e78565b60405180910390f35b34801561042957600080fd5b50610432610df8565b005b34801561044057600080fd5b5061045b6004803603810190610456919061306a565b610ef4565b005b34801561046957600080fd5b50610484600480360381019061047f91906130bd565b610f14565b60405161049191906131a8565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190612d74565b61101f565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612fc8565b6110a5565b005b3480156104f857600080fd5b5061050161113b565b60405161050e9190612c68565b60405180910390f35b34801561052357600080fd5b5061052c61114e565b6040516105399190612d1c565b60405180910390f35b34801561054e57600080fd5b506105576111dc565b6040516105649190612c68565b60405180910390f35b34801561057957600080fd5b506105826111ef565b60405161058f9190612d1c565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba9190612d74565b61127d565b6040516105cc9190612de2565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f791906130bd565b61132f565b6040516106099190612e78565b60405180910390f35b34801561061e57600080fd5b506106276113e7565b005b34801561063557600080fd5b50610650600480360381019061064b9190612fc8565b61146f565b005b34801561065e57600080fd5b50610667611505565b6040516106749190612de2565b60405180910390f35b34801561068957600080fd5b5061069261152f565b60405161069f9190612e78565b60405180910390f35b3480156106b457600080fd5b506106bd611535565b6040516106ca9190612d1c565b60405180910390f35b6106ed60048036038101906106e89190612d74565b6115c7565b005b3480156106fb57600080fd5b50610716600480360381019061071191906131ca565b611720565b005b34801561072457600080fd5b5061072d611736565b60405161073a9190612d1c565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190612d74565b6117c4565b005b34801561077857600080fd5b50610793600480360381019061078e91906132ab565b61184a565b005b3480156107a157600080fd5b506107bc60048036038101906107b79190612d74565b6118ac565b6040516107c99190612d1c565b60405180910390f35b3480156107de57600080fd5b506107e7611a05565b6040516107f49190612e78565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f919061303d565b611a0b565b005b34801561083257600080fd5b5061084d6004803603810190610848919061332e565b611aa4565b60405161085a9190612c68565b60405180910390f35b34801561086f57600080fd5b5061088a6004803603810190610885919061336e565b611b38565b005b34801561089857600080fd5b506108b360048036038101906108ae91906130bd565b611c6e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f82611d66565b5b9050919050565b6060600080546109a6906133dd565b80601f01602080910402602001604051908101604052809291908181526020018280546109d2906133dd565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a3482611dd0565b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90613481565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ab98261127d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190613513565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b49611e3c565b73ffffffffffffffffffffffffffffffffffffffff161480610b785750610b7781610b72611e3c565b611aa4565b5b610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae906135a5565b60405180910390fd5b610bc18383611e44565b505050565b600b5481565b610bd4611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610bf2611505565b73ffffffffffffffffffffffffffffffffffffffff1614610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90613611565b60405180910390fd5b80600e8190555050565b610c5a611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610c78611505565b73ffffffffffffffffffffffffffffffffffffffff1614610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590613611565b60405180910390fd5b8060099080519060200190610ce4929190612b11565b5050565b610cf0611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610d0e611505565b73ffffffffffffffffffffffffffffffffffffffff1614610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613611565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610d8d6007611efd565b905090565b610da3610d9d611e3c565b82611f0b565b610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd9906136a3565b60405180910390fd5b610ded838383611fe9565b505050565b600e5481565b610e00611e3c565b73ffffffffffffffffffffffffffffffffffffffff16610e1e611505565b73ffffffffffffffffffffffffffffffffffffffff1614610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90613611565b60405180910390fd5b6000610e7e611505565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ea1906136f4565b60006040518083038185875af1925050503d8060008114610ede576040519150601f19603f3d011682016040523d82523d6000602084013e610ee3565b606091505b5050905080610ef157600080fd5b50565b610f0f8383836040518060200160405280600081525061184a565b505050565b60606000610f218361132f565b905060008167ffffffffffffffff811115610f3f57610f3e612e9d565b5b604051908082528060200260200182016040528015610f6d5781602001602082028036833780820191505090505b50905060006001905060005b8381108015610f8a5750600c548211155b15611013576000610f9a8361127d565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fff5782848381518110610fe457610fe3613709565b5b6020026020010181815250508180610ffb90613767565b9250505b828061100a90613767565b93505050610f79565b82945050505050919050565b611027611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611045611505565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613611565b60405180910390fd5b80600b8190555050565b6110ad611e3c565b73ffffffffffffffffffffffffffffffffffffffff166110cb611505565b73ffffffffffffffffffffffffffffffffffffffff1614611121576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111890613611565b60405180910390fd5b80600a9080519060200190611137929190612b11565b5050565b600f60019054906101000a900460ff1681565b6009805461115b906133dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611187906133dd565b80156111d45780601f106111a9576101008083540402835291602001916111d4565b820191906000526020600020905b8154815290600101906020018083116111b757829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b600880546111fc906133dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611228906133dd565b80156112755780601f1061124a57610100808354040283529160200191611275565b820191906000526020600020905b81548152906001019060200180831161125857829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613822565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906138b4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113ef611e3c565b73ffffffffffffffffffffffffffffffffffffffff1661140d611505565b73ffffffffffffffffffffffffffffffffffffffff1614611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613611565b60405180910390fd5b61146d6000612245565b565b611477611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611495611505565b73ffffffffffffffffffffffffffffffffffffffff16146114eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e290613611565b60405180910390fd5b8060089080519060200190611501929190612b11565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b606060018054611544906133dd565b80601f0160208091040260200160405190810160405280929190818152602001828054611570906133dd565b80156115bd5780601f10611592576101008083540402835291602001916115bd565b820191906000526020600020905b8154815290600101906020018083116115a057829003601f168201915b5050505050905090565b806000811180156115da5750600d548111155b611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161090613920565b60405180910390fd5b600c54816116276007611efd565b6116319190613940565b1115611672576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611669906139e2565b60405180910390fd5b600f60009054906101000a900460ff16156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b990613a4e565b60405180910390fd5b81600b546116d09190613a6e565b341015611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170990613b14565b60405180910390fd5b61171c338361230b565b5050565b61173261172b611e3c565b8383612358565b5050565b600a8054611743906133dd565b80601f016020809104026020016040519081016040528092919081815260200182805461176f906133dd565b80156117bc5780601f10611791576101008083540402835291602001916117bc565b820191906000526020600020905b81548152906001019060200180831161179f57829003601f168201915b505050505081565b6117cc611e3c565b73ffffffffffffffffffffffffffffffffffffffff166117ea611505565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790613611565b60405180910390fd5b80600d8190555050565b61185b611855611e3c565b83611f0b565b61189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906136a3565b60405180910390fd5b6118a6848484846124c5565b50505050565b60606118b782611dd0565b6118f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ed90613ba6565b60405180910390fd5b60001515600f60019054906101000a900460ff16151514156119a457600a805461191f906133dd565b80601f016020809104026020016040519081016040528092919081815260200182805461194b906133dd565b80156119985780601f1061196d57610100808354040283529160200191611998565b820191906000526020600020905b81548152906001019060200180831161197b57829003601f168201915b50505050509050611a00565b60006119ae612521565b905060008151116119ce57604051806020016040528060008152506119fc565b806119d8846125b3565b60096040516020016119ec93929190613c96565b6040516020818303038152906040525b9150505b919050565b600c5481565b611a13611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611a31611505565b73ffffffffffffffffffffffffffffffffffffffff1614611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90613611565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611b4b5750600d548111155b611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8190613920565b60405180910390fd5b600c5481611b986007611efd565b611ba29190613940565b1115611be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bda906139e2565b60405180910390fd5b611beb611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611c09611505565b73ffffffffffffffffffffffffffffffffffffffff1614611c5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5690613611565b60405180910390fd5b611c69828461230b565b505050565b611c76611e3c565b73ffffffffffffffffffffffffffffffffffffffff16611c94611505565b73ffffffffffffffffffffffffffffffffffffffff1614611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190613611565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5190613d39565b60405180910390fd5b611d6381612245565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611eb78361127d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611f1682611dd0565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c90613dcb565b60405180910390fd5b6000611f608361127d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fcf57508373ffffffffffffffffffffffffffffffffffffffff16611fb784610a29565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fe05750611fdf8185611aa4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120098261127d565b73ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690613e5d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690613eef565b60405180910390fd5b6120da838383612714565b6120e5600082611e44565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121359190613f0f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218c9190613940565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b600e548261231c9190613a6e565b8110156123535761232d6007612719565b6123408361233b6007611efd565b61272f565b808061234b90613767565b91505061230e565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be90613f8f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124b89190612c68565b60405180910390a3505050565b6124d0848484611fe9565b6124dc8484848461274d565b61251b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251290614021565b60405180910390fd5b50505050565b606060088054612530906133dd565b80601f016020809104026020016040519081016040528092919081815260200182805461255c906133dd565b80156125a95780601f1061257e576101008083540402835291602001916125a9565b820191906000526020600020905b81548152906001019060200180831161258c57829003601f168201915b5050505050905090565b606060008214156125fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061270f565b600082905060005b6000821461262d57808061261690613767565b915050600a826126269190614070565b9150612603565b60008167ffffffffffffffff81111561264957612648612e9d565b5b6040519080825280601f01601f19166020018201604052801561267b5781602001600182028036833780820191505090505b5090505b60008514612708576001826126949190613f0f565b9150600a856126a391906140a1565b60306126af9190613940565b60f81b8183815181106126c5576126c4613709565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127019190614070565b945061267f565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b6127498282604051806020016040528060008152506128d5565b5050565b600061276e8473ffffffffffffffffffffffffffffffffffffffff16612930565b156128c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612797611e3c565b8786866040518563ffffffff1660e01b81526004016127b99493929190614127565b6020604051808303816000875af19250505080156127f557506040513d601f19601f820116820180604052508101906127f29190614188565b60015b612878573d8060008114612825576040519150601f19603f3d011682016040523d82523d6000602084013e61282a565b606091505b50600081511415612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790614021565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128cd565b600190505b949350505050565b6128df8383612943565b6128ec600084848461274d565b61292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290614021565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614201565b60405180910390fd5b6129bc81611dd0565b156129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f39061426d565b60405180910390fd5b612a0860008383612714565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a589190613940565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b1d906133dd565b90600052602060002090601f016020900481019282612b3f5760008555612b86565b82601f10612b5857805160ff1916838001178555612b86565b82800160010185558215612b86579182015b82811115612b85578251825591602001919060010190612b6a565b5b509050612b939190612b97565b5090565b5b80821115612bb0576000816000905550600101612b98565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bfd81612bc8565b8114612c0857600080fd5b50565b600081359050612c1a81612bf4565b92915050565b600060208284031215612c3657612c35612bbe565b5b6000612c4484828501612c0b565b91505092915050565b60008115159050919050565b612c6281612c4d565b82525050565b6000602082019050612c7d6000830184612c59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cbd578082015181840152602081019050612ca2565b83811115612ccc576000848401525b50505050565b6000601f19601f8301169050919050565b6000612cee82612c83565b612cf88185612c8e565b9350612d08818560208601612c9f565b612d1181612cd2565b840191505092915050565b60006020820190508181036000830152612d368184612ce3565b905092915050565b6000819050919050565b612d5181612d3e565b8114612d5c57600080fd5b50565b600081359050612d6e81612d48565b92915050565b600060208284031215612d8a57612d89612bbe565b5b6000612d9884828501612d5f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dcc82612da1565b9050919050565b612ddc81612dc1565b82525050565b6000602082019050612df76000830184612dd3565b92915050565b612e0681612dc1565b8114612e1157600080fd5b50565b600081359050612e2381612dfd565b92915050565b60008060408385031215612e4057612e3f612bbe565b5b6000612e4e85828601612e14565b9250506020612e5f85828601612d5f565b9150509250929050565b612e7281612d3e565b82525050565b6000602082019050612e8d6000830184612e69565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed582612cd2565b810181811067ffffffffffffffff82111715612ef457612ef3612e9d565b5b80604052505050565b6000612f07612bb4565b9050612f138282612ecc565b919050565b600067ffffffffffffffff821115612f3357612f32612e9d565b5b612f3c82612cd2565b9050602081019050919050565b82818337600083830152505050565b6000612f6b612f6684612f18565b612efd565b905082815260208101848484011115612f8757612f86612e98565b5b612f92848285612f49565b509392505050565b600082601f830112612faf57612fae612e93565b5b8135612fbf848260208601612f58565b91505092915050565b600060208284031215612fde57612fdd612bbe565b5b600082013567ffffffffffffffff811115612ffc57612ffb612bc3565b5b61300884828501612f9a565b91505092915050565b61301a81612c4d565b811461302557600080fd5b50565b60008135905061303781613011565b92915050565b60006020828403121561305357613052612bbe565b5b600061306184828501613028565b91505092915050565b60008060006060848603121561308357613082612bbe565b5b600061309186828701612e14565b93505060206130a286828701612e14565b92505060406130b386828701612d5f565b9150509250925092565b6000602082840312156130d3576130d2612bbe565b5b60006130e184828501612e14565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61311f81612d3e565b82525050565b60006131318383613116565b60208301905092915050565b6000602082019050919050565b6000613155826130ea565b61315f81856130f5565b935061316a83613106565b8060005b8381101561319b5781516131828882613125565b975061318d8361313d565b92505060018101905061316e565b5085935050505092915050565b600060208201905081810360008301526131c2818461314a565b905092915050565b600080604083850312156131e1576131e0612bbe565b5b60006131ef85828601612e14565b925050602061320085828601613028565b9150509250929050565b600067ffffffffffffffff82111561322557613224612e9d565b5b61322e82612cd2565b9050602081019050919050565b600061324e6132498461320a565b612efd565b90508281526020810184848401111561326a57613269612e98565b5b613275848285612f49565b509392505050565b600082601f83011261329257613291612e93565b5b81356132a284826020860161323b565b91505092915050565b600080600080608085870312156132c5576132c4612bbe565b5b60006132d387828801612e14565b94505060206132e487828801612e14565b93505060406132f587828801612d5f565b925050606085013567ffffffffffffffff81111561331657613315612bc3565b5b6133228782880161327d565b91505092959194509250565b6000806040838503121561334557613344612bbe565b5b600061335385828601612e14565b925050602061336485828601612e14565b9150509250929050565b6000806040838503121561338557613384612bbe565b5b600061339385828601612d5f565b92505060206133a485828601612e14565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133f557607f821691505b60208210811415613409576134086133ae565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061346b602c83612c8e565b91506134768261340f565b604082019050919050565b6000602082019050818103600083015261349a8161345e565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134fd602183612c8e565b9150613508826134a1565b604082019050919050565b6000602082019050818103600083015261352c816134f0565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061358f603883612c8e565b915061359a82613533565b604082019050919050565b600060208201905081810360008301526135be81613582565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135fb602083612c8e565b9150613606826135c5565b602082019050919050565b6000602082019050818103600083015261362a816135ee565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061368d603183612c8e565b915061369882613631565b604082019050919050565b600060208201905081810360008301526136bc81613680565b9050919050565b600081905092915050565b50565b60006136de6000836136c3565b91506136e9826136ce565b600082019050919050565b60006136ff826136d1565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061377282612d3e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137a5576137a4613738565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061380c602983612c8e565b9150613817826137b0565b604082019050919050565b6000602082019050818103600083015261383b816137ff565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061389e602a83612c8e565b91506138a982613842565b604082019050919050565b600060208201905081810360008301526138cd81613891565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b600061390a601483612c8e565b9150613915826138d4565b602082019050919050565b60006020820190508181036000830152613939816138fd565b9050919050565b600061394b82612d3e565b915061395683612d3e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561398b5761398a613738565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b60006139cc601483612c8e565b91506139d782613996565b602082019050919050565b600060208201905081810360008301526139fb816139bf565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000613a38601783612c8e565b9150613a4382613a02565b602082019050919050565b60006020820190508181036000830152613a6781613a2b565b9050919050565b6000613a7982612d3e565b9150613a8483612d3e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613abd57613abc613738565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000613afe601383612c8e565b9150613b0982613ac8565b602082019050919050565b60006020820190508181036000830152613b2d81613af1565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613b90602f83612c8e565b9150613b9b82613b34565b604082019050919050565b60006020820190508181036000830152613bbf81613b83565b9050919050565b600081905092915050565b6000613bdc82612c83565b613be68185613bc6565b9350613bf6818560208601612c9f565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613c24816133dd565b613c2e8186613bc6565b94506001821660008114613c495760018114613c5a57613c8d565b60ff19831686528186019350613c8d565b613c6385613c02565b60005b83811015613c8557815481890152600182019150602081019050613c66565b838801955050505b50505092915050565b6000613ca28286613bd1565b9150613cae8285613bd1565b9150613cba8284613c17565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613d23602683612c8e565b9150613d2e82613cc7565b604082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613db5602c83612c8e565b9150613dc082613d59565b604082019050919050565b60006020820190508181036000830152613de481613da8565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613e47602983612c8e565b9150613e5282613deb565b604082019050919050565b60006020820190508181036000830152613e7681613e3a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613ed9602483612c8e565b9150613ee482613e7d565b604082019050919050565b60006020820190508181036000830152613f0881613ecc565b9050919050565b6000613f1a82612d3e565b9150613f2583612d3e565b925082821015613f3857613f37613738565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f79601983612c8e565b9150613f8482613f43565b602082019050919050565b60006020820190508181036000830152613fa881613f6c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061400b603283612c8e565b915061401682613faf565b604082019050919050565b6000602082019050818103600083015261403a81613ffe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061407b82612d3e565b915061408683612d3e565b92508261409657614095614041565b5b828204905092915050565b60006140ac82612d3e565b91506140b783612d3e565b9250826140c7576140c6614041565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140f9826140d2565b61410381856140dd565b9350614113818560208601612c9f565b61411c81612cd2565b840191505092915050565b600060808201905061413c6000830187612dd3565b6141496020830186612dd3565b6141566040830185612e69565b818103606083015261416881846140ee565b905095945050505050565b60008151905061418281612bf4565b92915050565b60006020828403121561419e5761419d612bbe565b5b60006141ac84828501614173565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141eb602083612c8e565b91506141f6826141b5565b602082019050919050565b6000602082019050818103600083015261421a816141de565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614257601c83612c8e565b915061426282614221565b602082019050919050565b600060208201905081810360008301526142868161424a565b905091905056fea26469706673582212205c14a4b9d7cdf4bef6d1ac6b78803268951c145567ab3fed8da61a4705fcf85e64736f6c634300080a0033

Deployed Bytecode Sourcemap

37757:3884:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25240:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26185:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27744:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27267:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38023:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40447:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40967:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41073:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38627:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28494:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38138:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41156:137;;;;;;;;;;;;;:::i;:::-;;28904:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39138:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40366:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40723:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38213:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37945:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38183:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37912:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25879:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25609:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6228:103;;;;;;;;;;;;;:::i;:::-;;40861:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5577:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38096:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26354:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38722:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28037:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37983:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40587:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29160:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39779:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38060:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40279:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28263:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38977:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6486:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25240:305;25342:4;25394:25;25379:40;;;:11;:40;;;;:105;;;;25451:33;25436:48;;;:11;:48;;;;25379:105;:158;;;;25501:36;25525:11;25501:23;:36::i;:::-;25379:158;25359:178;;25240:305;;;:::o;26185:100::-;26239:13;26272:5;26265:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26185:100;:::o;27744:221::-;27820:7;27848:16;27856:7;27848;:16::i;:::-;27840:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27933:15;:24;27949:7;27933:24;;;;;;;;;;;;;;;;;;;;;27926:31;;27744:221;;;:::o;27267:411::-;27348:13;27364:23;27379:7;27364:14;:23::i;:::-;27348:39;;27412:5;27406:11;;:2;:11;;;;27398:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27506:5;27490:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27515:37;27532:5;27539:12;:10;:12::i;:::-;27515:16;:37::i;:::-;27490:62;27468:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27649:21;27658:2;27662:7;27649:8;:21::i;:::-;27337:341;27267:411;;:::o;38023:32::-;;;;:::o;40447:134::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40555:20:::1;40533:19;:42;;;;40447:134:::0;:::o;40967:100::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41051:10:::1;41039:9;:22;;;;;;;;;;;;:::i;:::-;;40967:100:::0;:::o;41073:77::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41138:6:::1;41129;;:15;;;;;;;;;;;;;;;;;;41073:77:::0;:::o;38627:89::-;38671:7;38694:16;:6;:14;:16::i;:::-;38687:23;;38627:89;:::o;28494:339::-;28689:41;28708:12;:10;:12::i;:::-;28722:7;28689:18;:41::i;:::-;28681:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28797:28;28807:4;28813:2;28817:7;28797:9;:28::i;:::-;28494:339;;;:::o;38138:38::-;;;;:::o;41156:137::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41201:7:::1;41222;:5;:7::i;:::-;41214:21;;41243;41214:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41200:69;;;41284:2;41276:11;;;::::0;::::1;;41193:100;41156:137::o:0;28904:185::-;29042:39;29059:4;29065:2;29069:7;29042:39;;;;;;;;;;;;:16;:39::i;:::-;28904:185;;;:::o;39138:635::-;39213:16;39241:23;39267:17;39277:6;39267:9;:17::i;:::-;39241:43;;39291:30;39338:15;39324:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39291:63;;39361:22;39386:1;39361:26;;39394:23;39430:311;39455:15;39437;:33;:64;;;;;39492:9;;39474:14;:27;;39437:64;39430:311;;;39512:25;39540:23;39548:14;39540:7;:23::i;:::-;39512:51;;39605:6;39584:27;;:17;:27;;;39580:129;;;39657:14;39624:13;39638:15;39624:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;39682:17;;;;;:::i;:::-;;;;39580:129;39717:16;;;;;:::i;:::-;;;;39503:238;39430:311;;;39754:13;39747:20;;;;;;39138:635;;;:::o;40366:74::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40429:5:::1;40422:4;:12;;;;40366:74:::0;:::o;40723:132::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40831:18:::1;40811:17;:38;;;;;;;;;;;;:::i;:::-;;40723:132:::0;:::o;38213:28::-;;;;;;;;;;;;;:::o;37945:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38183:25::-;;;;;;;;;;;;;:::o;37912:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25879:239::-;25951:7;25971:13;25987:7;:16;25995:7;25987:16;;;;;;;;;;;;;;;;;;;;;25971:32;;26039:1;26022:19;;:5;:19;;;;26014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26105:5;26098:12;;;25879:239;;;:::o;25609:208::-;25681:7;25726:1;25709:19;;:5;:19;;;;25701:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25793:9;:16;25803:5;25793:16;;;;;;;;;;;;;;;;25786:23;;25609:208;;;:::o;6228:103::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6293:30:::1;6320:1;6293:18;:30::i;:::-;6228:103::o:0;40861:100::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40945:10:::1;40933:9;:22;;;;;;;;;;;;:::i;:::-;;40861:100:::0;:::o;5577:87::-;5623:7;5650:6;;;;;;;;;;;5643:13;;5577:87;:::o;38096:37::-;;;;:::o;26354:104::-;26410:13;26443:7;26436:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26354:104;:::o;38722:247::-;38787:11;38461:1;38447:11;:15;:52;;;;;38481:18;;38466:11;:33;;38447:52;38439:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38573:9;;38558:11;38539:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;38531:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38816:6:::1;;;;;;;;;;;38815:7;38807:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38885:11;38878:4;;:18;;;;:::i;:::-;38865:9;:31;;38857:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38929:34;38939:10;38951:11;38929:9;:34::i;:::-;38722:247:::0;;:::o;28037:155::-;28132:52;28151:12;:10;:12::i;:::-;28165:8;28175;28132:18;:52::i;:::-;28037:155;;:::o;37983:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40587:130::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40692:19:::1;40671:18;:40;;;;40587:130:::0;:::o;29160:328::-;29335:41;29354:12;:10;:12::i;:::-;29368:7;29335:18;:41::i;:::-;29327:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29441:39;29455:4;29461:2;29465:7;29474:5;29441:13;:39::i;:::-;29160:328;;;;:::o;39779:494::-;39878:13;39919:17;39927:8;39919:7;:17::i;:::-;39903:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;40026:5;40014:17;;:8;;;;;;;;;;;:17;;;40010:64;;;40049:17;40042:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40010:64;40082:28;40113:10;:8;:10::i;:::-;40082:41;;40168:1;40143:14;40137:28;:32;:130;;;;;;;;;;;;;;;;;40205:14;40221:19;:8;:17;:19::i;:::-;40242:9;40188:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40137:130;40130:137;;;39779:494;;;;:::o;38060:31::-;;;;:::o;40279:81::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40348:6:::1;40337:8;;:17;;;;;;;;;;;;;;;;;;40279:81:::0;:::o;28263:164::-;28360:4;28384:18;:25;28403:5;28384:25;;;;;;;;;;;;;;;:35;28410:8;28384:35;;;;;;;;;;;;;;;;;;;;;;;;;28377:42;;28263:164;;;;:::o;38977:155::-;39063:11;38461:1;38447:11;:15;:52;;;;;38481:18;;38466:11;:33;;38447:52;38439:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38573:9;;38558:11;38539:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;38531:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5808:12:::1;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39093:33:::2;39103:9;39114:11;39093:9;:33::i;:::-;38977:155:::0;;;:::o;6486:201::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6595:1:::1;6575:22;;:8;:22;;;;6567:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6651:28;6670:8;6651:18;:28::i;:::-;6486:201:::0;:::o;18009:157::-;18094:4;18133:25;18118:40;;;:11;:40;;;;18111:47;;18009:157;;;:::o;30998:127::-;31063:4;31115:1;31087:30;;:7;:16;31095:7;31087:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31080:37;;30998:127;;;:::o;4301:98::-;4354:7;4381:10;4374:17;;4301:98;:::o;34980:174::-;35082:2;35055:15;:24;35071:7;35055:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35138:7;35134:2;35100:46;;35109:23;35124:7;35109:14;:23::i;:::-;35100:46;;;;;;;;;;;;34980:174;;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;31292:348::-;31385:4;31410:16;31418:7;31410;:16::i;:::-;31402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31486:13;31502:23;31517:7;31502:14;:23::i;:::-;31486:39;;31555:5;31544:16;;:7;:16;;;:51;;;;31588:7;31564:31;;:20;31576:7;31564:11;:20::i;:::-;:31;;;31544:51;:87;;;;31599:32;31616:5;31623:7;31599:16;:32::i;:::-;31544:87;31536:96;;;31292:348;;;;:::o;34284:578::-;34443:4;34416:31;;:23;34431:7;34416:14;:23::i;:::-;:31;;;34408:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34526:1;34512:16;;:2;:16;;;;34504:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34582:39;34603:4;34609:2;34613:7;34582:20;:39::i;:::-;34686:29;34703:1;34707:7;34686:8;:29::i;:::-;34747:1;34728:9;:15;34738:4;34728:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34776:1;34759:9;:13;34769:2;34759:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34807:2;34788:7;:16;34796:7;34788:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34846:7;34842:2;34827:27;;34836:4;34827:27;;;;;;;;;;;;34284:578;;;:::o;6847:191::-;6921:16;6940:6;;;;;;;;;;;6921:25;;6966:8;6957:6;;:17;;;;;;;;;;;;;;;;;;7021:8;6990:40;;7011:8;6990:40;;;;;;;;;;;;6910:128;6847:191;:::o;41299:229::-;41380:9;41375:148;41414:19;;41400:11;:33;;;;:::i;:::-;41395:1;:39;41375:148;;;41450:18;:6;:16;:18::i;:::-;41477:38;41487:9;41498:16;:6;:14;:16::i;:::-;41477:9;:38::i;:::-;41436:3;;;;;:::i;:::-;;;;41375:148;;;;41299:229;;:::o;35296:315::-;35451:8;35442:17;;:5;:17;;;;35434:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35538:8;35500:18;:25;35519:5;35500:25;;;;;;;;;;;;;;;:35;35526:8;35500:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35584:8;35562:41;;35577:5;35562:41;;;35594:8;35562:41;;;;;;:::i;:::-;;;;;;;;35296:315;;;:::o;30370:::-;30527:28;30537:4;30543:2;30547:7;30527:9;:28::i;:::-;30574:48;30597:4;30603:2;30607:7;30616:5;30574:22;:48::i;:::-;30566:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30370:315;;;;:::o;41534:104::-;41594:13;41623:9;41616:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41534:104;:::o;1863:723::-;1919:13;2149:1;2140:5;:10;2136:53;;;2167:10;;;;;;;;;;;;;;;;;;;;;2136:53;2199:12;2214:5;2199:20;;2230:14;2255:78;2270:1;2262:4;:9;2255:78;;2288:8;;;;;:::i;:::-;;;;2319:2;2311:10;;;;;:::i;:::-;;;2255:78;;;2343:19;2375:6;2365:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:39;;2393:154;2409:1;2400:5;:10;2393:154;;2437:1;2427:11;;;;;:::i;:::-;;;2504:2;2496:5;:10;;;;:::i;:::-;2483:2;:24;;;;:::i;:::-;2470:39;;2453:6;2460;2453:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2533:2;2524:11;;;;;:::i;:::-;;;2393:154;;;2571:6;2557:21;;;;;1863:723;;;;:::o;37547:126::-;;;;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;31982:110::-;32058:26;32068:2;32072:7;32058:26;;;;;;;;;;;;:9;:26::i;:::-;31982:110;;:::o;36176:799::-;36331:4;36352:15;:2;:13;;;:15::i;:::-;36348:620;;;36404:2;36388:36;;;36425:12;:10;:12::i;:::-;36439:4;36445:7;36454:5;36388:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36384:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36647:1;36630:6;:13;:18;36626:272;;;36673:60;;;;;;;;;;:::i;:::-;;;;;;;;36626:272;36848:6;36842:13;36833:6;36829:2;36825:15;36818:38;36384:529;36521:41;;;36511:51;;;:6;:51;;;;36504:58;;;;;36348:620;36952:4;36945:11;;36176:799;;;;;;;:::o;32319:321::-;32449:18;32455:2;32459:7;32449:5;:18::i;:::-;32500:54;32531:1;32535:2;32539:7;32548:5;32500:22;:54::i;:::-;32478:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32319:321;;;:::o;7865:387::-;7925:4;8133:12;8200:7;8188:20;8180:28;;8243:1;8236:4;:8;8229:15;;;7865:387;;;:::o;32976:382::-;33070:1;33056:16;;:2;:16;;;;33048:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33129:16;33137:7;33129;:16::i;:::-;33128:17;33120:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33191:45;33220:1;33224:2;33228:7;33191:20;:45::i;:::-;33266:1;33249:9;:13;33259:2;33249:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33297:2;33278:7;:16;33286:7;33278:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33342:7;33338:2;33317:33;;33334:1;33317:33;;;;;;;;;;;;32976:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:329::-;9185:6;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9126:329;;;;:::o;9461:114::-;9528:6;9562:5;9556:12;9546:22;;9461:114;;;:::o;9581:184::-;9680:11;9714:6;9709:3;9702:19;9754:4;9749:3;9745:14;9730:29;;9581:184;;;;:::o;9771:132::-;9838:4;9861:3;9853:11;;9891:4;9886:3;9882:14;9874:22;;9771:132;;;:::o;9909:108::-;9986:24;10004:5;9986:24;:::i;:::-;9981:3;9974:37;9909:108;;:::o;10023:179::-;10092:10;10113:46;10155:3;10147:6;10113:46;:::i;:::-;10191:4;10186:3;10182:14;10168:28;;10023:179;;;;:::o;10208:113::-;10278:4;10310;10305:3;10301:14;10293:22;;10208:113;;;:::o;10357:732::-;10476:3;10505:54;10553:5;10505:54;:::i;:::-;10575:86;10654:6;10649:3;10575:86;:::i;:::-;10568:93;;10685:56;10735:5;10685:56;:::i;:::-;10764:7;10795:1;10780:284;10805:6;10802:1;10799:13;10780:284;;;10881:6;10875:13;10908:63;10967:3;10952:13;10908:63;:::i;:::-;10901:70;;10994:60;11047:6;10994:60;:::i;:::-;10984:70;;10840:224;10827:1;10824;10820:9;10815:14;;10780:284;;;10784:14;11080:3;11073:10;;10481:608;;;10357:732;;;;:::o;11095:373::-;11238:4;11276:2;11265:9;11261:18;11253:26;;11325:9;11319:4;11315:20;11311:1;11300:9;11296:17;11289:47;11353:108;11456:4;11447:6;11353:108;:::i;:::-;11345:116;;11095:373;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:::-;14531:6;14539;14588:2;14576:9;14567:7;14563:23;14559:32;14556:119;;;14594:79;;:::i;:::-;14556:119;14714:1;14739:53;14784:7;14775:6;14764:9;14760:22;14739:53;:::i;:::-;14729:63;;14685:117;14841:2;14867:53;14912:7;14903:6;14892:9;14888:22;14867:53;:::i;:::-;14857:63;;14812:118;14463:474;;;;;:::o;14943:180::-;14991:77;14988:1;14981:88;15088:4;15085:1;15078:15;15112:4;15109:1;15102:15;15129:320;15173:6;15210:1;15204:4;15200:12;15190:22;;15257:1;15251:4;15247:12;15278:18;15268:81;;15334:4;15326:6;15322:17;15312:27;;15268:81;15396:2;15388:6;15385:14;15365:18;15362:38;15359:84;;;15415:18;;:::i;:::-;15359:84;15180:269;15129:320;;;:::o;15455:231::-;15595:34;15591:1;15583:6;15579:14;15572:58;15664:14;15659:2;15651:6;15647:15;15640:39;15455:231;:::o;15692:366::-;15834:3;15855:67;15919:2;15914:3;15855:67;:::i;:::-;15848:74;;15931:93;16020:3;15931:93;:::i;:::-;16049:2;16044:3;16040:12;16033:19;;15692:366;;;:::o;16064:419::-;16230:4;16268:2;16257:9;16253:18;16245:26;;16317:9;16311:4;16307:20;16303:1;16292:9;16288:17;16281:47;16345:131;16471:4;16345:131;:::i;:::-;16337:139;;16064:419;;;:::o;16489:220::-;16629:34;16625:1;16617:6;16613:14;16606:58;16698:3;16693:2;16685:6;16681:15;16674:28;16489:220;:::o;16715:366::-;16857:3;16878:67;16942:2;16937:3;16878:67;:::i;:::-;16871:74;;16954:93;17043:3;16954:93;:::i;:::-;17072:2;17067:3;17063:12;17056:19;;16715:366;;;:::o;17087:419::-;17253:4;17291:2;17280:9;17276:18;17268:26;;17340:9;17334:4;17330:20;17326:1;17315:9;17311:17;17304:47;17368:131;17494:4;17368:131;:::i;:::-;17360:139;;17087:419;;;:::o;17512:243::-;17652:34;17648:1;17640:6;17636:14;17629:58;17721:26;17716:2;17708:6;17704:15;17697:51;17512:243;:::o;17761:366::-;17903:3;17924:67;17988:2;17983:3;17924:67;:::i;:::-;17917:74;;18000:93;18089:3;18000:93;:::i;:::-;18118:2;18113:3;18109:12;18102:19;;17761:366;;;:::o;18133:419::-;18299:4;18337:2;18326:9;18322:18;18314:26;;18386:9;18380:4;18376:20;18372:1;18361:9;18357:17;18350:47;18414:131;18540:4;18414:131;:::i;:::-;18406:139;;18133:419;;;:::o;18558:182::-;18698:34;18694:1;18686:6;18682:14;18675:58;18558:182;:::o;18746:366::-;18888:3;18909:67;18973:2;18968:3;18909:67;:::i;:::-;18902:74;;18985:93;19074:3;18985:93;:::i;:::-;19103:2;19098:3;19094:12;19087:19;;18746:366;;;:::o;19118:419::-;19284:4;19322:2;19311:9;19307:18;19299:26;;19371:9;19365:4;19361:20;19357:1;19346:9;19342:17;19335:47;19399:131;19525:4;19399:131;:::i;:::-;19391:139;;19118:419;;;:::o;19543:236::-;19683:34;19679:1;19671:6;19667:14;19660:58;19752:19;19747:2;19739:6;19735:15;19728:44;19543:236;:::o;19785:366::-;19927:3;19948:67;20012:2;20007:3;19948:67;:::i;:::-;19941:74;;20024:93;20113:3;20024:93;:::i;:::-;20142:2;20137:3;20133:12;20126:19;;19785:366;;;:::o;20157:419::-;20323:4;20361:2;20350:9;20346:18;20338:26;;20410:9;20404:4;20400:20;20396:1;20385:9;20381:17;20374:47;20438:131;20564:4;20438:131;:::i;:::-;20430:139;;20157:419;;;:::o;20582:147::-;20683:11;20720:3;20705:18;;20582:147;;;;:::o;20735:114::-;;:::o;20855:398::-;21014:3;21035:83;21116:1;21111:3;21035:83;:::i;:::-;21028:90;;21127:93;21216:3;21127:93;:::i;:::-;21245:1;21240:3;21236:11;21229:18;;20855:398;;;:::o;21259:379::-;21443:3;21465:147;21608:3;21465:147;:::i;:::-;21458:154;;21629:3;21622:10;;21259:379;;;:::o;21644:180::-;21692:77;21689:1;21682:88;21789:4;21786:1;21779:15;21813:4;21810:1;21803:15;21830:180;21878:77;21875:1;21868:88;21975:4;21972:1;21965:15;21999:4;21996:1;21989:15;22016:233;22055:3;22078:24;22096:5;22078:24;:::i;:::-;22069:33;;22124:66;22117:5;22114:77;22111:103;;;22194:18;;:::i;:::-;22111:103;22241:1;22234:5;22230:13;22223:20;;22016:233;;;:::o;22255:228::-;22395:34;22391:1;22383:6;22379:14;22372:58;22464:11;22459:2;22451:6;22447:15;22440:36;22255:228;:::o;22489:366::-;22631:3;22652:67;22716:2;22711:3;22652:67;:::i;:::-;22645:74;;22728:93;22817:3;22728:93;:::i;:::-;22846:2;22841:3;22837:12;22830:19;;22489:366;;;:::o;22861:419::-;23027:4;23065:2;23054:9;23050:18;23042:26;;23114:9;23108:4;23104:20;23100:1;23089:9;23085:17;23078:47;23142:131;23268:4;23142:131;:::i;:::-;23134:139;;22861:419;;;:::o;23286:229::-;23426:34;23422:1;23414:6;23410:14;23403:58;23495:12;23490:2;23482:6;23478:15;23471:37;23286:229;:::o;23521:366::-;23663:3;23684:67;23748:2;23743:3;23684:67;:::i;:::-;23677:74;;23760:93;23849:3;23760:93;:::i;:::-;23878:2;23873:3;23869:12;23862:19;;23521:366;;;:::o;23893:419::-;24059:4;24097:2;24086:9;24082:18;24074:26;;24146:9;24140:4;24136:20;24132:1;24121:9;24117:17;24110:47;24174:131;24300:4;24174:131;:::i;:::-;24166:139;;23893:419;;;:::o;24318:170::-;24458:22;24454:1;24446:6;24442:14;24435:46;24318:170;:::o;24494:366::-;24636:3;24657:67;24721:2;24716:3;24657:67;:::i;:::-;24650:74;;24733:93;24822:3;24733:93;:::i;:::-;24851:2;24846:3;24842:12;24835:19;;24494:366;;;:::o;24866:419::-;25032:4;25070:2;25059:9;25055:18;25047:26;;25119:9;25113:4;25109:20;25105:1;25094:9;25090:17;25083:47;25147:131;25273:4;25147:131;:::i;:::-;25139:139;;24866:419;;;:::o;25291:305::-;25331:3;25350:20;25368:1;25350:20;:::i;:::-;25345:25;;25384:20;25402:1;25384:20;:::i;:::-;25379:25;;25538:1;25470:66;25466:74;25463:1;25460:81;25457:107;;;25544:18;;:::i;:::-;25457:107;25588:1;25585;25581:9;25574:16;;25291:305;;;;:::o;25602:170::-;25742:22;25738:1;25730:6;25726:14;25719:46;25602:170;:::o;25778:366::-;25920:3;25941:67;26005:2;26000:3;25941:67;:::i;:::-;25934:74;;26017:93;26106:3;26017:93;:::i;:::-;26135:2;26130:3;26126:12;26119:19;;25778:366;;;:::o;26150:419::-;26316:4;26354:2;26343:9;26339:18;26331:26;;26403:9;26397:4;26393:20;26389:1;26378:9;26374:17;26367:47;26431:131;26557:4;26431:131;:::i;:::-;26423:139;;26150:419;;;:::o;26575:173::-;26715:25;26711:1;26703:6;26699:14;26692:49;26575:173;:::o;26754:366::-;26896:3;26917:67;26981:2;26976:3;26917:67;:::i;:::-;26910:74;;26993:93;27082:3;26993:93;:::i;:::-;27111:2;27106:3;27102:12;27095:19;;26754:366;;;:::o;27126:419::-;27292:4;27330:2;27319:9;27315:18;27307:26;;27379:9;27373:4;27369:20;27365:1;27354:9;27350:17;27343:47;27407:131;27533:4;27407:131;:::i;:::-;27399:139;;27126:419;;;:::o;27551:348::-;27591:7;27614:20;27632:1;27614:20;:::i;:::-;27609:25;;27648:20;27666:1;27648:20;:::i;:::-;27643:25;;27836:1;27768:66;27764:74;27761:1;27758:81;27753:1;27746:9;27739:17;27735:105;27732:131;;;27843:18;;:::i;:::-;27732:131;27891:1;27888;27884:9;27873:20;;27551:348;;;;:::o;27905:169::-;28045:21;28041:1;28033:6;28029:14;28022:45;27905:169;:::o;28080:366::-;28222:3;28243:67;28307:2;28302:3;28243:67;:::i;:::-;28236:74;;28319:93;28408:3;28319:93;:::i;:::-;28437:2;28432:3;28428:12;28421:19;;28080:366;;;:::o;28452:419::-;28618:4;28656:2;28645:9;28641:18;28633:26;;28705:9;28699:4;28695:20;28691:1;28680:9;28676:17;28669:47;28733:131;28859:4;28733:131;:::i;:::-;28725:139;;28452:419;;;:::o;28877:234::-;29017:34;29013:1;29005:6;29001:14;28994:58;29086:17;29081:2;29073:6;29069:15;29062:42;28877:234;:::o;29117:366::-;29259:3;29280:67;29344:2;29339:3;29280:67;:::i;:::-;29273:74;;29356:93;29445:3;29356:93;:::i;:::-;29474:2;29469:3;29465:12;29458:19;;29117:366;;;:::o;29489:419::-;29655:4;29693:2;29682:9;29678:18;29670:26;;29742:9;29736:4;29732:20;29728:1;29717:9;29713:17;29706:47;29770:131;29896:4;29770:131;:::i;:::-;29762:139;;29489:419;;;:::o;29914:148::-;30016:11;30053:3;30038:18;;29914:148;;;;:::o;30068:377::-;30174:3;30202:39;30235:5;30202:39;:::i;:::-;30257:89;30339:6;30334:3;30257:89;:::i;:::-;30250:96;;30355:52;30400:6;30395:3;30388:4;30381:5;30377:16;30355:52;:::i;:::-;30432:6;30427:3;30423:16;30416:23;;30178:267;30068:377;;;;:::o;30451:141::-;30500:4;30523:3;30515:11;;30546:3;30543:1;30536:14;30580:4;30577:1;30567:18;30559:26;;30451:141;;;:::o;30622:845::-;30725:3;30762:5;30756:12;30791:36;30817:9;30791:36;:::i;:::-;30843:89;30925:6;30920:3;30843:89;:::i;:::-;30836:96;;30963:1;30952:9;30948:17;30979:1;30974:137;;;;31125:1;31120:341;;;;30941:520;;30974:137;31058:4;31054:9;31043;31039:25;31034:3;31027:38;31094:6;31089:3;31085:16;31078:23;;30974:137;;31120:341;31187:38;31219:5;31187:38;:::i;:::-;31247:1;31261:154;31275:6;31272:1;31269:13;31261:154;;;31349:7;31343:14;31339:1;31334:3;31330:11;31323:35;31399:1;31390:7;31386:15;31375:26;;31297:4;31294:1;31290:12;31285:17;;31261:154;;;31444:6;31439:3;31435:16;31428:23;;31127:334;;30941:520;;30729:738;;30622:845;;;;:::o;31473:589::-;31698:3;31720:95;31811:3;31802:6;31720:95;:::i;:::-;31713:102;;31832:95;31923:3;31914:6;31832:95;:::i;:::-;31825:102;;31944:92;32032:3;32023:6;31944:92;:::i;:::-;31937:99;;32053:3;32046:10;;31473:589;;;;;;:::o;32068:225::-;32208:34;32204:1;32196:6;32192:14;32185:58;32277:8;32272:2;32264:6;32260:15;32253:33;32068:225;:::o;32299:366::-;32441:3;32462:67;32526:2;32521:3;32462:67;:::i;:::-;32455:74;;32538:93;32627:3;32538:93;:::i;:::-;32656:2;32651:3;32647:12;32640:19;;32299:366;;;:::o;32671:419::-;32837:4;32875:2;32864:9;32860:18;32852:26;;32924:9;32918:4;32914:20;32910:1;32899:9;32895:17;32888:47;32952:131;33078:4;32952:131;:::i;:::-;32944:139;;32671:419;;;:::o;33096:231::-;33236:34;33232:1;33224:6;33220:14;33213:58;33305:14;33300:2;33292:6;33288:15;33281:39;33096:231;:::o;33333:366::-;33475:3;33496:67;33560:2;33555:3;33496:67;:::i;:::-;33489:74;;33572:93;33661:3;33572:93;:::i;:::-;33690:2;33685:3;33681:12;33674:19;;33333:366;;;:::o;33705:419::-;33871:4;33909:2;33898:9;33894:18;33886:26;;33958:9;33952:4;33948:20;33944:1;33933:9;33929:17;33922:47;33986:131;34112:4;33986:131;:::i;:::-;33978:139;;33705:419;;;:::o;34130:228::-;34270:34;34266:1;34258:6;34254:14;34247:58;34339:11;34334:2;34326:6;34322:15;34315:36;34130:228;:::o;34364:366::-;34506:3;34527:67;34591:2;34586:3;34527:67;:::i;:::-;34520:74;;34603:93;34692:3;34603:93;:::i;:::-;34721:2;34716:3;34712:12;34705:19;;34364:366;;;:::o;34736:419::-;34902:4;34940:2;34929:9;34925:18;34917:26;;34989:9;34983:4;34979:20;34975:1;34964:9;34960:17;34953:47;35017:131;35143:4;35017:131;:::i;:::-;35009:139;;34736:419;;;:::o;35161:223::-;35301:34;35297:1;35289:6;35285:14;35278:58;35370:6;35365:2;35357:6;35353:15;35346:31;35161:223;:::o;35390:366::-;35532:3;35553:67;35617:2;35612:3;35553:67;:::i;:::-;35546:74;;35629:93;35718:3;35629:93;:::i;:::-;35747:2;35742:3;35738:12;35731:19;;35390:366;;;:::o;35762:419::-;35928:4;35966:2;35955:9;35951:18;35943:26;;36015:9;36009:4;36005:20;36001:1;35990:9;35986:17;35979:47;36043:131;36169:4;36043:131;:::i;:::-;36035:139;;35762:419;;;:::o;36187:191::-;36227:4;36247:20;36265:1;36247:20;:::i;:::-;36242:25;;36281:20;36299:1;36281:20;:::i;:::-;36276:25;;36320:1;36317;36314:8;36311:34;;;36325:18;;:::i;:::-;36311:34;36370:1;36367;36363:9;36355:17;;36187:191;;;;:::o;36384:175::-;36524:27;36520:1;36512:6;36508:14;36501:51;36384:175;:::o;36565:366::-;36707:3;36728:67;36792:2;36787:3;36728:67;:::i;:::-;36721:74;;36804:93;36893:3;36804:93;:::i;:::-;36922:2;36917:3;36913:12;36906:19;;36565:366;;;:::o;36937:419::-;37103:4;37141:2;37130:9;37126:18;37118:26;;37190:9;37184:4;37180:20;37176:1;37165:9;37161:17;37154:47;37218:131;37344:4;37218:131;:::i;:::-;37210:139;;36937:419;;;:::o;37362:237::-;37502:34;37498:1;37490:6;37486:14;37479:58;37571:20;37566:2;37558:6;37554:15;37547:45;37362:237;:::o;37605:366::-;37747:3;37768:67;37832:2;37827:3;37768:67;:::i;:::-;37761:74;;37844:93;37933:3;37844:93;:::i;:::-;37962:2;37957:3;37953:12;37946:19;;37605:366;;;:::o;37977:419::-;38143:4;38181:2;38170:9;38166:18;38158:26;;38230:9;38224:4;38220:20;38216:1;38205:9;38201:17;38194:47;38258:131;38384:4;38258:131;:::i;:::-;38250:139;;37977:419;;;:::o;38402:180::-;38450:77;38447:1;38440:88;38547:4;38544:1;38537:15;38571:4;38568:1;38561:15;38588:185;38628:1;38645:20;38663:1;38645:20;:::i;:::-;38640:25;;38679:20;38697:1;38679:20;:::i;:::-;38674:25;;38718:1;38708:35;;38723:18;;:::i;:::-;38708:35;38765:1;38762;38758:9;38753:14;;38588:185;;;;:::o;38779:176::-;38811:1;38828:20;38846:1;38828:20;:::i;:::-;38823:25;;38862:20;38880:1;38862:20;:::i;:::-;38857:25;;38901:1;38891:35;;38906:18;;:::i;:::-;38891:35;38947:1;38944;38940:9;38935:14;;38779:176;;;;:::o;38961:98::-;39012:6;39046:5;39040:12;39030:22;;38961:98;;;:::o;39065:168::-;39148:11;39182:6;39177:3;39170:19;39222:4;39217:3;39213:14;39198:29;;39065:168;;;;:::o;39239:360::-;39325:3;39353:38;39385:5;39353:38;:::i;:::-;39407:70;39470:6;39465:3;39407:70;:::i;:::-;39400:77;;39486:52;39531:6;39526:3;39519:4;39512:5;39508:16;39486:52;:::i;:::-;39563:29;39585:6;39563:29;:::i;:::-;39558:3;39554:39;39547:46;;39329:270;39239:360;;;;:::o;39605:640::-;39800:4;39838:3;39827:9;39823:19;39815:27;;39852:71;39920:1;39909:9;39905:17;39896:6;39852:71;:::i;:::-;39933:72;40001:2;39990:9;39986:18;39977:6;39933:72;:::i;:::-;40015;40083:2;40072:9;40068:18;40059:6;40015:72;:::i;:::-;40134:9;40128:4;40124:20;40119:2;40108:9;40104:18;40097:48;40162:76;40233:4;40224:6;40162:76;:::i;:::-;40154:84;;39605:640;;;;;;;:::o;40251:141::-;40307:5;40338:6;40332:13;40323:22;;40354:32;40380:5;40354:32;:::i;:::-;40251:141;;;;:::o;40398:349::-;40467:6;40516:2;40504:9;40495:7;40491:23;40487:32;40484:119;;;40522:79;;:::i;:::-;40484:119;40642:1;40667:63;40722:7;40713:6;40702:9;40698:22;40667:63;:::i;:::-;40657:73;;40613:127;40398:349;;;;:::o;40753:182::-;40893:34;40889:1;40881:6;40877:14;40870:58;40753:182;:::o;40941:366::-;41083:3;41104:67;41168:2;41163:3;41104:67;:::i;:::-;41097:74;;41180:93;41269:3;41180:93;:::i;:::-;41298:2;41293:3;41289:12;41282:19;;40941:366;;;:::o;41313:419::-;41479:4;41517:2;41506:9;41502:18;41494:26;;41566:9;41560:4;41556:20;41552:1;41541:9;41537:17;41530:47;41594:131;41720:4;41594:131;:::i;:::-;41586:139;;41313:419;;;:::o;41738:178::-;41878:30;41874:1;41866:6;41862:14;41855:54;41738:178;:::o;41922:366::-;42064:3;42085:67;42149:2;42144:3;42085:67;:::i;:::-;42078:74;;42161:93;42250:3;42161:93;:::i;:::-;42279:2;42274:3;42270:12;42263:19;;41922:366;;;:::o;42294:419::-;42460:4;42498:2;42487:9;42483:18;42475:26;;42547:9;42541:4;42537:20;42533:1;42522:9;42518:17;42511:47;42575:131;42701:4;42575:131;:::i;:::-;42567:139;;42294:419;;;:::o

Swarm Source

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