ETH Price: $3,108.61 (+1.30%)
Gas: 8 Gwei

Token

FAUST Fiend (FIEND)
 

Overview

Max Total Supply

5,000 FIEND

Holders

2,091

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
12277.eth
Balance
2 FIEND
0x0108f918D430758A0B0d8CB8c1E30BF29E2bbc9f
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:
FaustFiends

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

/// 
///     _ ,  ___     _ _    _ ,          ___        
///   ,- -  -   -_, - - /  - -    -_-/  -   ---___- 
///  _||_  (  ~/||    ('||  ||   (_ /      (' ||    
/// ' ||   (  / ||   (( ||--||  (_ --_    ((  ||    
///   ||    \/==||   (( ||--||    --_ )  ((   ||    
///   |,    /_ _||   (( /   ||   _/  ))   (( //     
/// _-/    (  - \\,    -___-\\, (_-_-       -____-  
///                                                 
///   A SINFUL JOURNEY.                                                


// 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 (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// 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 (last updated v4.7.0) (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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/faust-fiends.sol



/// 
///     _ ,  ___     _ _    _ ,          ___        
///   ,- -  -   -_, - - /  - -    -_-/  -   ---___- 
///  _||_  (  ~/||    ('||  ||   (_ /      (' ||    
/// ' ||   (  / ||   (( ||--||  (_ --_    ((  ||    
///   ||    \/==||   (( ||--||    --_ )  ((   ||    
///   |,    /_ _||   (( /   ||   _/  ))   (( //     
/// _-/    (  - \\,    -___-\\, (_-_-       -____-  
///                                                 
///   A SINFUL JOURNEY.                                                


pragma solidity >=0.7.0 <0.9.0;




contract FaustFiends 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;
  uint256 public maxSupply = 5000;
  uint256 public maxMintAmountPerTx = 2;
  uint256 public maxMintAmountPerWhitelistTx = 3;

  bool public whitelistMintEnabled = false;
  bool public publicMintEnabled = false;
  bool public revealed = false;

  mapping(address => bool) whitelist;

  mapping(address => bool) whitelistMinted;
  mapping(address => bool) publicMinted;

  constructor() ERC721("FAUST Fiend", "FIEND") {
    setHiddenMetadataUri("ipfs://QmQvta82BtPyNKE1TFMS4yjS3pdNfxFr7TwaMTqEFtArag/unrevealed.json");
    setCost(0);
    mintExistingHolders();
  }

  modifier onlyWhitelisted() {
    require(isWhitelisted(msg.sender), "You are not whitelisted");
    _;
  }

  modifier hasNotWhitelistMinted() {
    require(!whitelistMinted[msg.sender], "You have already minted during whitelist mint.");
    _;
  }

  modifier hasNotPublicMinted() {
    require(!publicMinted[msg.sender], "You have already minted during public mint.");
    _;
  }

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

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

  function isWhitelisted(address _address) public view returns (bool) {
      return whitelist[_address];
  }

  function hasWhitelistMinted(address _address) public view returns (bool) {
      return whitelistMinted[_address];
  }

  function hasPublicMinted(address _address) public view returns (bool) {
      return publicMinted[_address];
  }

    function whitelistAdd(address _address) public onlyOwner {
        whitelist[_address] = true;
    }

    function whitelistAddMultiple(address[] memory users) public onlyOwner {
        for (uint i = 0; i < users.length; i++) {
            whitelist[users[i]] = true;
        }
    }

    function whitelistRemove(address _address) public onlyOwner {
        whitelist[_address] = false;
    }

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

  function mint(uint256 _mintAmount) public payable publicMintCompliance(_mintAmount) hasNotPublicMinted {
    require(publicMintEnabled, "Public minting not enabled!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");

    _mintLoop(msg.sender, _mintAmount);
    publicMinted[msg.sender] = true;
  }

  function whitelistMint(uint256 _mintAmount) public payable whitelistMintCompliance(_mintAmount) onlyWhitelisted hasNotWhitelistMinted{
    require(whitelistMintEnabled, "Whitelist minting not enabled!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");

    _mintLoop(msg.sender, _mintAmount);
    whitelistMinted[msg.sender] = true;
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public publicMintCompliance(_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;
  }
  
  // POWER UP OUR FIENDS COMING FROM THE FANTOM NETWORK
  function mintExistingHolders() internal {
      require(supply.current() == 0, "Tokens have already been minted!");
      address[81] memory existingHolders = [
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0xCAc7a3aA77b2Cb5a07c9f33c9B7118101770e410,
          0x6524E9B964978b86Ad6AA5B11374864926f0cfa5,
          0xE9d53d1e63925517b9dE2e0d724B91D88ABf6917,
          0xf4b01D989f81382b0690ccf5165A29B406679B00,

          0x4eBa0f6c0436013ae4759d3cC20D5b9970AE7735,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x5F13B17024C14D6D10D5F4c6A04c0877e0C3E50B,

          0x5F13B17024C14D6D10D5F4c6A04c0877e0C3E50B,
          0x08BCb4de5407B97cC1eb05f8331e88D35F74Ab83,
          0x08BCb4de5407B97cC1eb05f8331e88D35F74Ab83,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x33Cf3A4Fe0AeDfE3A85C2845395A438baba7702e,

          0xB5cC3308C8E0F12fCCCa72e0fA3C8C20518c11e7,
          0x4201fD30BC90689Dcb0E36177Cc2485B3177bbaE,
          0x22559E54E1702C27A99E03b8437482fCf1686113,
          0x22559E54E1702C27A99E03b8437482fCf1686113,
          0x7a0EF482134aa53468850A7b117EcA38A6a3003D,

          0x04B7dBD17a817d22eBD9B35A9a210D8e6E59a7CE,
          0xf2d696E7b3e040B160D658dE02C00A4Ef5Be1bC0,
          0xA7E1af033A471d37b7f5A495bF342418822cD979,
          0xA6f051653fB75dC3756f10209E2D0941fcB586e9,
          0x6524E9B964978b86Ad6AA5B11374864926f0cfa5,
          
          0x9eC99B98Fb35aB8bdaB4C37880759816180874De,
          0x4209F11186318DBca71996Fd5842bcA214b3269F,
          0x4553448E66559c825eca1E9B6b1A6D8556e8F584,
          0xA9Ea60Bb786e9F12b29bB44ba73a38418e0A365b,
          0x64C12292045246c4B01e44Ff79763749eC397d70,

          0xe15bE2C6771713077500d29634EB19D20BBb8BB1,
          0x51Ca42fb14C727e2E026Df8dab8Be684bfB3ED9A,
          0xB73C27e8f39CFd94bb1fF6F30Ccf41351E989df9,
          0x21E61C2905C0B1d3760984Bb5dC19915557e3Ed4,
          0x9448D4fDfAB5Ae18302c49ab8599EC744A0e743C,
          
          0xFFB671f107328B9dc46BA9aa5c9396D63CB95488,
          0x21E61C2905C0B1d3760984Bb5dC19915557e3Ed4,
          0x21E61C2905C0B1d3760984Bb5dC19915557e3Ed4,
          0x9448D4fDfAB5Ae18302c49ab8599EC744A0e743C,
          0x5F13B17024C14D6D10D5F4c6A04c0877e0C3E50B,

          0x0026dd985dA16f70E9D9cF739b08C6cdF6A7f407,
          0xf4E6232d2f86Bd3399D956b3892d6B1893e1e06E,
          0x59E5fe3a536d2fa69614E0A0692F5C6e3D6dCbfc,
          0x59E5fe3a536d2fa69614E0A0692F5C6e3D6dCbfc,
          0x21E61C2905C0B1d3760984Bb5dC19915557e3Ed4,

          0x21E61C2905C0B1d3760984Bb5dC19915557e3Ed4,
          0x4553448E66559c825eca1E9B6b1A6D8556e8F584,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x51Ca42fb14C727e2E026Df8dab8Be684bfB3ED9A,
          0x6d79af750b839414F63966288e40c8E7fBA3F0CF,
          
          0xE80cc1600Bfc4994f42cdbcBFc783A560e40e81a,
          0xe69DAb397b59f52dC8B65C01533a17538a07E2dD,
          0xe69DAb397b59f52dC8B65C01533a17538a07E2dD,
          0x5bB4c1c7B1149e236cA28A41Ac24528b0B35f9c5,
          0x02bfd87Fb5b3a7a2e643C0aF9a72e88E0F868077,

          0x7d6423C5077B2540Fafd6258CE93314048DBE41c,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0xc030ad321418b559227Bc444d81DFeCF6fdaDC14,
          
          0xa802c75E4B00a239F18d238e7054aE058506d221,
          0x038B2e8c7DbcD053f749edB6c2cDF25CA3C6bEde,
          0x59E5fe3a536d2fa69614E0A0692F5C6e3D6dCbfc,
          0x3214e141bdAe08Be1f382A885cf3d2a448A5E780,
          0xfa16125e504c10DF4d0bd6942d5c3932F76E9918,
          
          0xCc879Ab4DE63FC7Be6aAca522285D6F5d816278e,
          0x8FDe1AC3a0459b4f7b3659c7a1df355F49601176,
          0xA9Ea60Bb786e9F12b29bB44ba73a38418e0A365b,
          0xafe47D6f287cE1397f6D1af56868ce8981D555e8,
          0xFb2EB8734F57bDEa9cbF2956972f25c0a704862e,
          
          0xF9542D1D4b7356A774eEb7FDdF7efD92B78bDE51,
          0x0F6b73e16C8cF8BAC1EA69b50e142c2edB8f1c96,
          0x857D5884FC42CEa646bD62Cc84F806aEB9a2AE6F,
          0x8Cc1226540EB7Da70BD230BB4bfaEeBd3Ff053cb,
          0xb96A1688DDCE8da1F2e2aDD33962768224E39E4C,
          
          0xb96A1688DDCE8da1F2e2aDD33962768224E39E4C
      ];

      for (uint256 i = 0; i < existingHolders.length; i++) {
        supply.increment();
        _safeMint(existingHolders[i], supply.current());
      }
  }

  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 setPublicMintEnabled(bool _state) public onlyOwner {
    publicMintEnabled = _state;
  }

  function setWhitelistMintEnabled(bool _state) public onlyOwner {
    whitelistMintEnabled = _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; 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":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasPublicMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"hasWhitelistMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","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":"maxMintAmountPerWhitelistTx","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":[{"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":"publicMintEnabled","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":"bool","name":"_state","type":"bool"}],"name":"setPublicMintEnabled","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":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelistAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"whitelistAddMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelistRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b92919062001fde565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600990805190602001906200007992919062001fde565b50611388600c556002600d556003600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff021916908315150217905550348015620000e857600080fd5b506040518060400160405280600b81526020017f4641555354204669656e640000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4649454e4400000000000000000000000000000000000000000000000000000081525081600090805190602001906200016d92919062001fde565b5080600190805190602001906200018692919062001fde565b505050620001a96200019d620001fb60201b60201c565b6200020360201b60201c565b620001d360405180608001604052806045815260200162006e9160459139620002c960201b60201c565b620001e56000620002f560201b60201c565b620001f56200030f60201b60201c565b62002659565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d962001a1e60201b60201c565b80600a9080519060200190620002f192919062001fde565b5050565b6200030562001a1e60201b60201c565b80600b8190555050565b600062000328600762001aaf60201b62001f7b1760201c565b146200036b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036290620022d9565b60405180910390fd5b600060405180610a200160405280738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173cac7a3aa77b2cb5a07c9f33c9b7118101770e41073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736524e9b964978b86ad6aa5b11374864926f0cfa573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e9d53d1e63925517b9de2e0d724b91d88abf691773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173f4b01d989f81382b0690ccf5165a29b406679b0073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734eba0f6c0436013ae4759d3cc20d5b9970ae773573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735f13b17024c14d6d10d5f4c6a04c0877e0c3e50b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735f13b17024c14d6d10d5f4c6a04c0877e0c3e50b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017308bcb4de5407b97cc1eb05f8331e88d35f74ab8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017308bcb4de5407b97cc1eb05f8331e88d35f74ab8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017333cf3a4fe0aedfe3a85c2845395a438baba7702e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b5cc3308c8e0f12fccca72e0fa3c8c20518c11e773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734201fd30bc90689dcb0e36177cc2485b3177bbae73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017322559e54e1702c27a99e03b8437482fcf168611373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017322559e54e1702c27a99e03b8437482fcf168611373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737a0ef482134aa53468850a7b117eca38a6a3003d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017304b7dbd17a817d22ebd9b35a9a210d8e6e59a7ce73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173f2d696e7b3e040b160d658de02c00a4ef5be1bc073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a7e1af033a471d37b7f5a495bf342418822cd97973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a6f051653fb75dc3756f10209e2d0941fcb586e973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736524e9b964978b86ad6aa5b11374864926f0cfa573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739ec99b98fb35ab8bdab4c37880759816180874de73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734209f11186318dbca71996fd5842bca214b3269f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734553448e66559c825eca1e9b6b1a6d8556e8f58473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a9ea60bb786e9f12b29bb44ba73a38418e0a365b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017364c12292045246c4b01e44ff79763749ec397d7073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e15be2c6771713077500d29634eb19d20bbb8bb173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017351ca42fb14c727e2e026df8dab8be684bfb3ed9a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b73c27e8f39cfd94bb1ff6f30ccf41351e989df973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017321e61c2905c0b1d3760984bb5dc19915557e3ed473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739448d4fdfab5ae18302c49ab8599ec744a0e743c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ffb671f107328b9dc46ba9aa5c9396d63cb9548873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017321e61c2905c0b1d3760984bb5dc19915557e3ed473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017321e61c2905c0b1d3760984bb5dc19915557e3ed473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739448d4fdfab5ae18302c49ab8599ec744a0e743c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735f13b17024c14d6d10d5f4c6a04c0877e0c3e50b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017226dd985da16f70e9d9cf739b08c6cdf6a7f40773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173f4e6232d2f86bd3399d956b3892d6b1893e1e06e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017359e5fe3a536d2fa69614e0a0692f5c6e3d6dcbfc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017359e5fe3a536d2fa69614e0a0692f5c6e3d6dcbfc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017321e61c2905c0b1d3760984bb5dc19915557e3ed473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017321e61c2905c0b1d3760984bb5dc19915557e3ed473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001734553448e66559c825eca1e9b6b1a6d8556e8f58473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017351ca42fb14c727e2e026df8dab8be684bfb3ed9a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001736d79af750b839414f63966288e40c8e7fba3f0cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e80cc1600bfc4994f42cdbcbfc783a560e40e81a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e69dab397b59f52dc8b65c01533a17538a07e2dd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173e69dab397b59f52dc8b65c01533a17538a07e2dd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001735bb4c1c7b1149e236ca28a41ac24528b0b35f9c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017302bfd87fb5b3a7a2e643c0af9a72e88e0f86807773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001737d6423c5077b2540fafd6258ce93314048dbe41c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c030ad321418b559227bc444d81dfecf6fdadc1473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a802c75e4b00a239f18d238e7054ae058506d22173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173038b2e8c7dbcd053f749edb6c2cdf25ca3c6bede73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020017359e5fe3a536d2fa69614e0a0692f5c6e3d6dcbfc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001733214e141bdae08be1f382a885cf3d2a448a5e78073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173fa16125e504c10df4d0bd6942d5c3932f76e991873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173cc879ab4de63fc7be6aaca522285d6f5d816278e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738fde1ac3a0459b4f7b3659c7a1df355f4960117673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a9ea60bb786e9f12b29bb44ba73a38418e0a365b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173afe47d6f287ce1397f6d1af56868ce8981d555e873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173fb2eb8734f57bdea9cbf2956972f25c0a704862e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173f9542d1d4b7356a774eeb7fddf7efd92b78bde5173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730f6b73e16c8cf8bac1ea69b50e142c2edb8f1c9673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173857d5884fc42cea646bd62cc84f806aeb9a2ae6f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001738cc1226540eb7da70bd230bb4bfaeebd3ff053cb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b96a1688ddce8da1f2e2add33962768224e39e4c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173b96a1688ddce8da1f2e2add33962768224e39e4c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250905060005b605181101562001a1a57620019c2600762001abd60201b62001f891760201c565b62001a04828260518110620019dc57620019db62002507565b5b6020020151620019f8600762001aaf60201b62001f7b1760201c565b62001ad360201b60201c565b808062001a11906200245b565b915050620019a1565b5050565b62001a2e620001fb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662001a5462001af960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462001aad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001aa490620022b7565b60405180910390fd5b565b600081600001549050919050565b6001816000016000828254019250508190555050565b62001af582826040518060200160405280600081525062001b2360201b60201c565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62001b35838362001b9160201b60201c565b62001b4a600084848462001d8b60201b60201c565b62001b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b839062002251565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001c04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001bfb9062002295565b60405180910390fd5b62001c158162001f4560201b60201c565b1562001c58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001c4f9062002273565b60405180910390fd5b62001c6c6000838362001fb160201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462001cbe919062002328565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a462001d876000838362001fb660201b60201c565b5050565b600062001db98473ffffffffffffffffffffffffffffffffffffffff1662001fbb60201b62001f9f1760201c565b1562001f38578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262001deb620001fb60201b60201c565b8786866040518563ffffffff1660e01b815260040162001e0f9493929190620021fd565b602060405180830381600087803b15801562001e2a57600080fd5b505af192505050801562001e5e57506040513d601f19601f8201168201806040525081019062001e5b9190620020a5565b60015b62001ee7573d806000811462001e91576040519150601f19603f3d011682016040523d82523d6000602084013e62001e96565b606091505b5060008151141562001edf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ed69062002251565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062001f3d565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805462001fec9062002425565b90600052602060002090601f0160209004810192826200201057600085556200205c565b82601f106200202b57805160ff19168380011785556200205c565b828001600101855582156200205c579182015b828111156200205b5782518255916020019190600101906200203e565b5b5090506200206b91906200206f565b5090565b5b808211156200208a57600081600090555060010162002070565b5090565b6000815190506200209f816200263f565b92915050565b600060208284031215620020be57620020bd62002536565b5b6000620020ce848285016200208e565b91505092915050565b620020e28162002385565b82525050565b6000620020f582620022fb565b62002101818562002306565b935062002113818560208601620023ef565b6200211e816200253b565b840191505092915050565b60006200213860328362002317565b915062002145826200254c565b604082019050919050565b60006200215f601c8362002317565b91506200216c826200259b565b602082019050919050565b60006200218660208362002317565b91506200219382620025c4565b602082019050919050565b6000620021ad60208362002317565b9150620021ba82620025ed565b602082019050919050565b6000620021d460208362002317565b9150620021e18262002616565b602082019050919050565b620021f781620023e5565b82525050565b6000608082019050620022146000830187620020d7565b620022236020830186620020d7565b620022326040830185620021ec565b8181036060830152620022468184620020e8565b905095945050505050565b600060208201905081810360008301526200226c8162002129565b9050919050565b600060208201905081810360008301526200228e8162002150565b9050919050565b60006020820190508181036000830152620022b08162002177565b9050919050565b60006020820190508181036000830152620022d2816200219e565b9050919050565b60006020820190508181036000830152620022f481620021c5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200233582620023e5565b91506200234283620023e5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200237a5762002379620024a9565b5b828201905092915050565b60006200239282620023c5565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200240f578082015181840152602081019050620023f2565b838111156200241f576000848401525b50505050565b600060028204905060018216806200243e57607f821691505b60208210811415620024555762002454620024d8565b5b50919050565b60006200246882620023e5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200249e576200249d620024a9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e73206861766520616c7265616479206265656e206d696e74656421600082015250565b6200264a8162002399565b81146200265657600080fd5b50565b61482880620026696000396000f3fe60806040526004361061027c5760003560e01c806370a082311161014f578063a45ba8e7116100c1578063cc2bd85f1161007a578063cc2bd85f14610977578063d5abeb01146109a2578063e0a80853146109cd578063e985e9c5146109f6578063efbd73f414610a33578063f2fde38b14610a5c5761027c565b8063a45ba8e71461086b578063a932ed0d14610896578063b071401b146108bf578063b767a098146108e8578063b88d4fde14610911578063c87b56dd1461093a5761027c565b80638be61d50116101135780638be61d50146107685780638da5cb5b146107a557806394354fd0146107d057806395d89b41146107fb578063a0712d6814610826578063a22cb465146108425761027c565b806370a08231146106a6578063715018a6146106e35780637ec4a659146106fa578063818668d714610723578063868ff4a21461074c5761027c565b80633af32abf116101f357806351830227116101ac5780635183022714610594578063524fa7b9146105bf5780635503a0e8146105e857806362b99ad4146106135780636352211e1461063e5780636caede3d1461067b5761027c565b80633af32abf146104885780633ccfd60b146104c557806342842e0e146104dc578063438b63001461050557806344a0d68a146105425780634fdd43cb1461056b5761027c565b80630f4161aa116102455780630f4161aa1461038c57806313faede6146103b757806316ba10e0146103e257806318160ddd1461040b57806323b872dd1461043657806337ec3e591461045f5761027c565b80624fc7ce1461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a3919061305e565b610a85565b6040516102b591906139b5565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613297565b610adb565b6040516102f291906139b5565b60405180910390f35b34801561030757600080fd5b50610310610bbd565b60405161031d91906139d0565b60405180910390f35b34801561033257600080fd5b5061034d6004803603810190610348919061333a565b610c4f565b60405161035a919061392c565b60405180910390f35b34801561036f57600080fd5b5061038a600480360381019061038591906131e1565b610c95565b005b34801561039857600080fd5b506103a1610dad565b6040516103ae91906139b5565b60405180910390f35b3480156103c357600080fd5b506103cc610dc0565b6040516103d99190613cf2565b60405180910390f35b3480156103ee57600080fd5b50610409600480360381019061040491906132f1565b610dc6565b005b34801561041757600080fd5b50610420610de8565b60405161042d9190613cf2565b60405180910390f35b34801561044257600080fd5b5061045d600480360381019061045891906130cb565b610df9565b005b34801561046b57600080fd5b5061048660048036038101906104819190613221565b610e59565b005b34801561049457600080fd5b506104af60048036038101906104aa919061305e565b610ef6565b6040516104bc91906139b5565b60405180910390f35b3480156104d157600080fd5b506104da610f4c565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906130cb565b610fd4565b005b34801561051157600080fd5b5061052c6004803603810190610527919061305e565b610ff4565b6040516105399190613993565b60405180910390f35b34801561054e57600080fd5b506105696004803603810190610564919061333a565b6110ff565b005b34801561057757600080fd5b50610592600480360381019061058d91906132f1565b611111565b005b3480156105a057600080fd5b506105a9611133565b6040516105b691906139b5565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e1919061305e565b611146565b005b3480156105f457600080fd5b506105fd6111a9565b60405161060a91906139d0565b60405180910390f35b34801561061f57600080fd5b50610628611237565b60405161063591906139d0565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061333a565b6112c5565b604051610672919061392c565b60405180910390f35b34801561068757600080fd5b50610690611377565b60405161069d91906139b5565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c8919061305e565b61138a565b6040516106da9190613cf2565b60405180910390f35b3480156106ef57600080fd5b506106f8611442565b005b34801561070657600080fd5b50610721600480360381019061071c91906132f1565b611456565b005b34801561072f57600080fd5b5061074a6004803603810190610745919061326a565b611478565b005b6107666004803603810190610761919061333a565b61149d565b005b34801561077457600080fd5b5061078f600480360381019061078a919061305e565b611722565b60405161079c91906139b5565b60405180910390f35b3480156107b157600080fd5b506107ba611778565b6040516107c7919061392c565b60405180910390f35b3480156107dc57600080fd5b506107e56117a2565b6040516107f29190613cf2565b60405180910390f35b34801561080757600080fd5b506108106117a8565b60405161081d91906139d0565b60405180910390f35b610840600480360381019061083b919061333a565b61183a565b005b34801561084e57600080fd5b50610869600480360381019061086491906131a1565b611a77565b005b34801561087757600080fd5b50610880611a8d565b60405161088d91906139d0565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b8919061305e565b611b1b565b005b3480156108cb57600080fd5b506108e660048036038101906108e1919061333a565b611b7e565b005b3480156108f457600080fd5b5061090f600480360381019061090a919061326a565b611b90565b005b34801561091d57600080fd5b506109386004803603810190610933919061311e565b611bb5565b005b34801561094657600080fd5b50610961600480360381019061095c919061333a565b611c17565b60405161096e91906139d0565b60405180910390f35b34801561098357600080fd5b5061098c611d70565b6040516109999190613cf2565b60405180910390f35b3480156109ae57600080fd5b506109b7611d76565b6040516109c49190613cf2565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef919061326a565b611d7c565b005b348015610a0257600080fd5b50610a1d6004803603810190610a18919061308b565b611da1565b604051610a2a91906139b5565b60405180910390f35b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613367565b611e35565b005b348015610a6857600080fd5b50610a836004803603810190610a7e919061305e565b611ef7565b005b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bb65750610bb582611fc2565b5b9050919050565b606060008054610bcc90614027565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf890614027565b8015610c455780601f10610c1a57610100808354040283529160200191610c45565b820191906000526020600020905b815481529060010190602001808311610c2857829003601f168201915b5050505050905090565b6000610c5a8261202c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ca0826112c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613c32565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d30612077565b73ffffffffffffffffffffffffffffffffffffffff161480610d5f5750610d5e81610d59612077565b611da1565b5b610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590613b72565b60405180910390fd5b610da8838361207f565b505050565b600f60019054906101000a900460ff1681565b600b5481565b610dce612138565b8060099080519060200190610de4929190612dd4565b5050565b6000610df46007611f7b565b905090565b610e0a610e04612077565b826121b6565b610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613cb2565b60405180910390fd5b610e5483838361224b565b505050565b610e61612138565b60005b8151811015610ef257600160106000848481518110610e8657610e85614191565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610eea9061408a565b915050610e64565b5050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f54612138565b6000610f5e611778565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f8190613917565b60006040518083038185875af1925050503d8060008114610fbe576040519150601f19603f3d011682016040523d82523d6000602084013e610fc3565b606091505b5050905080610fd157600080fd5b50565b610fef83838360405180602001604052806000815250611bb5565b505050565b606060006110018361138a565b905060008167ffffffffffffffff81111561101f5761101e6141c0565b5b60405190808252806020026020018201604052801561104d5781602001602082028036833780820191505090505b50905060006001905060005b838110801561106a5750600c548211155b156110f357600061107a836112c5565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110df57828483815181106110c4576110c3614191565b5b60200260200101818152505081806110db9061408a565b9250505b82806110ea9061408a565b93505050611059565b82945050505050919050565b611107612138565b80600b8190555050565b611119612138565b80600a908051906020019061112f929190612dd4565b5050565b600f60029054906101000a900460ff1681565b61114e612138565b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600980546111b690614027565b80601f01602080910402602001604051908101604052809291908181526020018280546111e290614027565b801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b505050505081565b6008805461124490614027565b80601f016020809104026020016040519081016040528092919081815260200182805461127090614027565b80156112bd5780601f10611292576101008083540402835291602001916112bd565b820191906000526020600020905b8154815290600101906020018083116112a057829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613c12565b60405180910390fd5b80915050919050565b600f60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290613b52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144a612138565b61145460006124b2565b565b61145e612138565b8060089080519060200190611474929190612dd4565b5050565b611480612138565b80600f60016101000a81548160ff02191690831515021790555050565b806000811180156114b05750600e548111155b6114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e690613b12565b60405180910390fd5b600c54816114fd6007611f7b565b6115079190613e5c565b1115611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f906139f2565b60405180910390fd5b61155133610ef6565b611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613bb2565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613c72565b60405180910390fd5b600f60009054906101000a900460ff1661166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390613b32565b60405180910390fd5b81600b5461167a9190613ee3565b3410156116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390613cd2565b60405180910390fd5b6116c63383612578565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546117b790614027565b80601f01602080910402602001604051908101604052809291908181526020018280546117e390614027565b80156118305780601f1061180557610100808354040283529160200191611830565b820191906000526020600020905b81548152906001019060200180831161181357829003601f168201915b5050505050905090565b8060008111801561184d5750600d548111155b61188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613ab2565b60405180910390fd5b600c548161189a6007611f7b565b6118a49190613e5c565b11156118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc90613c52565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990613c92565b60405180910390fd5b600f60019054906101000a900460ff166119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890613a52565b60405180910390fd5b81600b546119cf9190613ee3565b341015611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890613cd2565b60405180910390fd5b611a1b3383612578565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611a89611a82612077565b83836125b8565b5050565b600a8054611a9a90614027565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac690614027565b8015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b505050505081565b611b23612138565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611b86612138565b80600d8190555050565b611b98612138565b80600f60006101000a81548160ff02191690831515021790555050565b611bc6611bc0612077565b836121b6565b611c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc90613cb2565b60405180910390fd5b611c1184848484612725565b50505050565b6060611c2282612781565b611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5890613bf2565b60405180910390fd5b60001515600f60029054906101000a900460ff1615151415611d0f57600a8054611c8a90614027565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb690614027565b8015611d035780601f10611cd857610100808354040283529160200191611d03565b820191906000526020600020905b815481529060010190602001808311611ce657829003601f168201915b50505050509050611d6b565b6000611d196127ed565b90506000815111611d395760405180602001604052806000815250611d67565b80611d438461287f565b6009604051602001611d57939291906138e6565b6040516020818303038152906040525b9150505b919050565b600e5481565b600c5481565b611d84612138565b80600f60026101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611e485750600d548111155b611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e90613ab2565b60405180910390fd5b600c5481611e956007611f7b565b611e9f9190613e5c565b1115611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed790613c52565b60405180910390fd5b611ee8612138565b611ef28284612578565b505050565b611eff612138565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690613a32565b60405180910390fd5b611f78816124b2565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61203581612781565b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b90613c12565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120f2836112c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612140612077565b73ffffffffffffffffffffffffffffffffffffffff1661215e611778565b73ffffffffffffffffffffffffffffffffffffffff16146121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90613bd2565b60405180910390fd5b565b6000806121c2836112c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061220457506122038185611da1565b5b8061224257508373ffffffffffffffffffffffffffffffffffffffff1661222a84610c4f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661226b826112c5565b73ffffffffffffffffffffffffffffffffffffffff16146122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890613a72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890613ad2565b60405180910390fd5b61233c8383836129e0565b61234760008261207f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123979190613f3d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123ee9190613e5c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124ad8383836129e5565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156125b35761258d6007611f89565b6125a08361259b6007611f7b565b6129ea565b80806125ab9061408a565b91505061257b565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e90613af2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161271891906139b5565b60405180910390a3505050565b61273084848461224b565b61273c84848484612a08565b61277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290613a12565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600880546127fc90614027565b80601f016020809104026020016040519081016040528092919081815260200182805461282890614027565b80156128755780601f1061284a57610100808354040283529160200191612875565b820191906000526020600020905b81548152906001019060200180831161285857829003601f168201915b5050505050905090565b606060008214156128c7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129db565b600082905060005b600082146128f95780806128e29061408a565b915050600a826128f29190613eb2565b91506128cf565b60008167ffffffffffffffff811115612915576129146141c0565b5b6040519080825280601f01601f1916602001820160405280156129475781602001600182028036833780820191505090505b5090505b600085146129d4576001826129609190613f3d565b9150600a8561296f91906140d3565b603061297b9190613e5c565b60f81b81838151811061299157612990614191565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129cd9190613eb2565b945061294b565b8093505050505b919050565b505050565b505050565b612a04828260405180602001604052806000815250612b9f565b5050565b6000612a298473ffffffffffffffffffffffffffffffffffffffff16611f9f565b15612b92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a52612077565b8786866040518563ffffffff1660e01b8152600401612a749493929190613947565b602060405180830381600087803b158015612a8e57600080fd5b505af1925050508015612abf57506040513d601f19601f82011682018060405250810190612abc91906132c4565b60015b612b42573d8060008114612aef576040519150601f19603f3d011682016040523d82523d6000602084013e612af4565b606091505b50600081511415612b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3190613a12565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b97565b600190505b949350505050565b612ba98383612bfa565b612bb66000848484612a08565b612bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bec90613a12565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6190613b92565b60405180910390fd5b612c7381612781565b15612cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caa90613a92565b60405180910390fd5b612cbf600083836129e0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d0f9190613e5c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dd0600083836129e5565b5050565b828054612de090614027565b90600052602060002090601f016020900481019282612e025760008555612e49565b82601f10612e1b57805160ff1916838001178555612e49565b82800160010185558215612e49579182015b82811115612e48578251825591602001919060010190612e2d565b5b509050612e569190612e5a565b5090565b5b80821115612e73576000816000905550600101612e5b565b5090565b6000612e8a612e8584613d32565b613d0d565b90508083825260208201905082856020860282011115612ead57612eac6141f4565b5b60005b85811015612edd5781612ec38882612f6b565b845260208401935060208301925050600181019050612eb0565b5050509392505050565b6000612efa612ef584613d5e565b613d0d565b905082815260208101848484011115612f1657612f156141f9565b5b612f21848285613fe5565b509392505050565b6000612f3c612f3784613d8f565b613d0d565b905082815260208101848484011115612f5857612f576141f9565b5b612f63848285613fe5565b509392505050565b600081359050612f7a81614796565b92915050565b600082601f830112612f9557612f946141ef565b5b8135612fa5848260208601612e77565b91505092915050565b600081359050612fbd816147ad565b92915050565b600081359050612fd2816147c4565b92915050565b600081519050612fe7816147c4565b92915050565b600082601f830112613002576130016141ef565b5b8135613012848260208601612ee7565b91505092915050565b600082601f8301126130305761302f6141ef565b5b8135613040848260208601612f29565b91505092915050565b600081359050613058816147db565b92915050565b60006020828403121561307457613073614203565b5b600061308284828501612f6b565b91505092915050565b600080604083850312156130a2576130a1614203565b5b60006130b085828601612f6b565b92505060206130c185828601612f6b565b9150509250929050565b6000806000606084860312156130e4576130e3614203565b5b60006130f286828701612f6b565b935050602061310386828701612f6b565b925050604061311486828701613049565b9150509250925092565b6000806000806080858703121561313857613137614203565b5b600061314687828801612f6b565b945050602061315787828801612f6b565b935050604061316887828801613049565b925050606085013567ffffffffffffffff811115613189576131886141fe565b5b61319587828801612fed565b91505092959194509250565b600080604083850312156131b8576131b7614203565b5b60006131c685828601612f6b565b92505060206131d785828601612fae565b9150509250929050565b600080604083850312156131f8576131f7614203565b5b600061320685828601612f6b565b925050602061321785828601613049565b9150509250929050565b60006020828403121561323757613236614203565b5b600082013567ffffffffffffffff811115613255576132546141fe565b5b61326184828501612f80565b91505092915050565b6000602082840312156132805761327f614203565b5b600061328e84828501612fae565b91505092915050565b6000602082840312156132ad576132ac614203565b5b60006132bb84828501612fc3565b91505092915050565b6000602082840312156132da576132d9614203565b5b60006132e884828501612fd8565b91505092915050565b60006020828403121561330757613306614203565b5b600082013567ffffffffffffffff811115613325576133246141fe565b5b6133318482850161301b565b91505092915050565b6000602082840312156133505761334f614203565b5b600061335e84828501613049565b91505092915050565b6000806040838503121561337e5761337d614203565b5b600061338c85828601613049565b925050602061339d85828601612f6b565b9150509250929050565b60006133b383836138c8565b60208301905092915050565b6133c881613f71565b82525050565b60006133d982613de5565b6133e38185613e13565b93506133ee83613dc0565b8060005b8381101561341f57815161340688826133a7565b975061341183613e06565b9250506001810190506133f2565b5085935050505092915050565b61343581613f83565b82525050565b600061344682613df0565b6134508185613e24565b9350613460818560208601613ff4565b61346981614208565b840191505092915050565b600061347f82613dfb565b6134898185613e40565b9350613499818560208601613ff4565b6134a281614208565b840191505092915050565b60006134b882613dfb565b6134c28185613e51565b93506134d2818560208601613ff4565b80840191505092915050565b600081546134eb81614027565b6134f58186613e51565b94506001821660008114613510576001811461352157613554565b60ff19831686528186019350613554565b61352a85613dd0565b60005b8381101561354c5781548189015260018201915060208101905061352d565b838801955050505b50505092915050565b600061356a601e83613e40565b915061357582614219565b602082019050919050565b600061358d603283613e40565b915061359882614242565b604082019050919050565b60006135b0602683613e40565b91506135bb82614291565b604082019050919050565b60006135d3601b83613e40565b91506135de826142e0565b602082019050919050565b60006135f6602583613e40565b915061360182614309565b604082019050919050565b6000613619601c83613e40565b915061362482614358565b602082019050919050565b600061363c601483613e40565b915061364782614381565b602082019050919050565b600061365f602483613e40565b915061366a826143aa565b604082019050919050565b6000613682601983613e40565b915061368d826143f9565b602082019050919050565b60006136a5601e83613e40565b91506136b082614422565b602082019050919050565b60006136c8601e83613e40565b91506136d38261444b565b602082019050919050565b60006136eb602983613e40565b91506136f682614474565b604082019050919050565b600061370e603e83613e40565b9150613719826144c3565b604082019050919050565b6000613731602083613e40565b915061373c82614512565b602082019050919050565b6000613754601783613e40565b915061375f8261453b565b602082019050919050565b6000613777602083613e40565b915061378282614564565b602082019050919050565b600061379a602f83613e40565b91506137a58261458d565b604082019050919050565b60006137bd601883613e40565b91506137c8826145dc565b602082019050919050565b60006137e0602183613e40565b91506137eb82614605565b604082019050919050565b6000613803600083613e35565b915061380e82614654565b600082019050919050565b6000613826601483613e40565b915061383182614657565b602082019050919050565b6000613849602e83613e40565b915061385482614680565b604082019050919050565b600061386c602b83613e40565b9150613877826146cf565b604082019050919050565b600061388f602e83613e40565b915061389a8261471e565b604082019050919050565b60006138b2601383613e40565b91506138bd8261476d565b602082019050919050565b6138d181613fdb565b82525050565b6138e081613fdb565b82525050565b60006138f282866134ad565b91506138fe82856134ad565b915061390a82846134de565b9150819050949350505050565b6000613922826137f6565b9150819050919050565b600060208201905061394160008301846133bf565b92915050565b600060808201905061395c60008301876133bf565b61396960208301866133bf565b61397660408301856138d7565b8181036060830152613988818461343b565b905095945050505050565b600060208201905081810360008301526139ad81846133ce565b905092915050565b60006020820190506139ca600083018461342c565b92915050565b600060208201905081810360008301526139ea8184613474565b905092915050565b60006020820190508181036000830152613a0b8161355d565b9050919050565b60006020820190508181036000830152613a2b81613580565b9050919050565b60006020820190508181036000830152613a4b816135a3565b9050919050565b60006020820190508181036000830152613a6b816135c6565b9050919050565b60006020820190508181036000830152613a8b816135e9565b9050919050565b60006020820190508181036000830152613aab8161360c565b9050919050565b60006020820190508181036000830152613acb8161362f565b9050919050565b60006020820190508181036000830152613aeb81613652565b9050919050565b60006020820190508181036000830152613b0b81613675565b9050919050565b60006020820190508181036000830152613b2b81613698565b9050919050565b60006020820190508181036000830152613b4b816136bb565b9050919050565b60006020820190508181036000830152613b6b816136de565b9050919050565b60006020820190508181036000830152613b8b81613701565b9050919050565b60006020820190508181036000830152613bab81613724565b9050919050565b60006020820190508181036000830152613bcb81613747565b9050919050565b60006020820190508181036000830152613beb8161376a565b9050919050565b60006020820190508181036000830152613c0b8161378d565b9050919050565b60006020820190508181036000830152613c2b816137b0565b9050919050565b60006020820190508181036000830152613c4b816137d3565b9050919050565b60006020820190508181036000830152613c6b81613819565b9050919050565b60006020820190508181036000830152613c8b8161383c565b9050919050565b60006020820190508181036000830152613cab8161385f565b9050919050565b60006020820190508181036000830152613ccb81613882565b9050919050565b60006020820190508181036000830152613ceb816138a5565b9050919050565b6000602082019050613d0760008301846138d7565b92915050565b6000613d17613d28565b9050613d238282614059565b919050565b6000604051905090565b600067ffffffffffffffff821115613d4d57613d4c6141c0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d7957613d786141c0565b5b613d8282614208565b9050602081019050919050565b600067ffffffffffffffff821115613daa57613da96141c0565b5b613db382614208565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e6782613fdb565b9150613e7283613fdb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ea757613ea6614104565b5b828201905092915050565b6000613ebd82613fdb565b9150613ec883613fdb565b925082613ed857613ed7614133565b5b828204905092915050565b6000613eee82613fdb565b9150613ef983613fdb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3257613f31614104565b5b828202905092915050565b6000613f4882613fdb565b9150613f5383613fdb565b925082821015613f6657613f65614104565b5b828203905092915050565b6000613f7c82613fbb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614012578082015181840152602081019050613ff7565b83811115614021576000848401525b50505050565b6000600282049050600182168061403f57607f821691505b6020821081141561405357614052614162565b5b50919050565b61406282614208565b810181811067ffffffffffffffff82111715614081576140806141c0565b5b80604052505050565b600061409582613fdb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140c8576140c7614104565b5b600182019050919050565b60006140de82613fdb565b91506140e983613fdb565b9250826140f9576140f8614133565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d61782077686974656c69737420737570706c79206578636565646564210000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74696e67206e6f7420656e61626c6564210000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c69642077686974656c697374206d696e7420616d6f756e74210000600082015250565b7f57686974656c697374206d696e74696e67206e6f7420656e61626c6564210000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f596f75206861766520616c7265616479206d696e74656420647572696e67207760008201527f686974656c697374206d696e742e000000000000000000000000000000000000602082015250565b7f596f75206861766520616c7265616479206d696e74656420647572696e67207060008201527f75626c6963206d696e742e000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61479f81613f71565b81146147aa57600080fd5b50565b6147b681613f83565b81146147c157600080fd5b50565b6147cd81613f8f565b81146147d857600080fd5b50565b6147e481613fdb565b81146147ef57600080fd5b5056fea264697066735822122001458e49842eb61a1250066987e3a06472df5efe4a3d4b7f65e51b411ca5281a64736f6c63430008070033697066733a2f2f516d517674613832427450794e4b453154464d5334796a533370644e66784672375477614d5471454674417261672f756e72657665616c65642e6a736f6e

Deployed Bytecode

0x60806040526004361061027c5760003560e01c806370a082311161014f578063a45ba8e7116100c1578063cc2bd85f1161007a578063cc2bd85f14610977578063d5abeb01146109a2578063e0a80853146109cd578063e985e9c5146109f6578063efbd73f414610a33578063f2fde38b14610a5c5761027c565b8063a45ba8e71461086b578063a932ed0d14610896578063b071401b146108bf578063b767a098146108e8578063b88d4fde14610911578063c87b56dd1461093a5761027c565b80638be61d50116101135780638be61d50146107685780638da5cb5b146107a557806394354fd0146107d057806395d89b41146107fb578063a0712d6814610826578063a22cb465146108425761027c565b806370a08231146106a6578063715018a6146106e35780637ec4a659146106fa578063818668d714610723578063868ff4a21461074c5761027c565b80633af32abf116101f357806351830227116101ac5780635183022714610594578063524fa7b9146105bf5780635503a0e8146105e857806362b99ad4146106135780636352211e1461063e5780636caede3d1461067b5761027c565b80633af32abf146104885780633ccfd60b146104c557806342842e0e146104dc578063438b63001461050557806344a0d68a146105425780634fdd43cb1461056b5761027c565b80630f4161aa116102455780630f4161aa1461038c57806313faede6146103b757806316ba10e0146103e257806318160ddd1461040b57806323b872dd1461043657806337ec3e591461045f5761027c565b80624fc7ce1461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a3919061305e565b610a85565b6040516102b591906139b5565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613297565b610adb565b6040516102f291906139b5565b60405180910390f35b34801561030757600080fd5b50610310610bbd565b60405161031d91906139d0565b60405180910390f35b34801561033257600080fd5b5061034d6004803603810190610348919061333a565b610c4f565b60405161035a919061392c565b60405180910390f35b34801561036f57600080fd5b5061038a600480360381019061038591906131e1565b610c95565b005b34801561039857600080fd5b506103a1610dad565b6040516103ae91906139b5565b60405180910390f35b3480156103c357600080fd5b506103cc610dc0565b6040516103d99190613cf2565b60405180910390f35b3480156103ee57600080fd5b50610409600480360381019061040491906132f1565b610dc6565b005b34801561041757600080fd5b50610420610de8565b60405161042d9190613cf2565b60405180910390f35b34801561044257600080fd5b5061045d600480360381019061045891906130cb565b610df9565b005b34801561046b57600080fd5b5061048660048036038101906104819190613221565b610e59565b005b34801561049457600080fd5b506104af60048036038101906104aa919061305e565b610ef6565b6040516104bc91906139b5565b60405180910390f35b3480156104d157600080fd5b506104da610f4c565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906130cb565b610fd4565b005b34801561051157600080fd5b5061052c6004803603810190610527919061305e565b610ff4565b6040516105399190613993565b60405180910390f35b34801561054e57600080fd5b506105696004803603810190610564919061333a565b6110ff565b005b34801561057757600080fd5b50610592600480360381019061058d91906132f1565b611111565b005b3480156105a057600080fd5b506105a9611133565b6040516105b691906139b5565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e1919061305e565b611146565b005b3480156105f457600080fd5b506105fd6111a9565b60405161060a91906139d0565b60405180910390f35b34801561061f57600080fd5b50610628611237565b60405161063591906139d0565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061333a565b6112c5565b604051610672919061392c565b60405180910390f35b34801561068757600080fd5b50610690611377565b60405161069d91906139b5565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c8919061305e565b61138a565b6040516106da9190613cf2565b60405180910390f35b3480156106ef57600080fd5b506106f8611442565b005b34801561070657600080fd5b50610721600480360381019061071c91906132f1565b611456565b005b34801561072f57600080fd5b5061074a6004803603810190610745919061326a565b611478565b005b6107666004803603810190610761919061333a565b61149d565b005b34801561077457600080fd5b5061078f600480360381019061078a919061305e565b611722565b60405161079c91906139b5565b60405180910390f35b3480156107b157600080fd5b506107ba611778565b6040516107c7919061392c565b60405180910390f35b3480156107dc57600080fd5b506107e56117a2565b6040516107f29190613cf2565b60405180910390f35b34801561080757600080fd5b506108106117a8565b60405161081d91906139d0565b60405180910390f35b610840600480360381019061083b919061333a565b61183a565b005b34801561084e57600080fd5b50610869600480360381019061086491906131a1565b611a77565b005b34801561087757600080fd5b50610880611a8d565b60405161088d91906139d0565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b8919061305e565b611b1b565b005b3480156108cb57600080fd5b506108e660048036038101906108e1919061333a565b611b7e565b005b3480156108f457600080fd5b5061090f600480360381019061090a919061326a565b611b90565b005b34801561091d57600080fd5b506109386004803603810190610933919061311e565b611bb5565b005b34801561094657600080fd5b50610961600480360381019061095c919061333a565b611c17565b60405161096e91906139d0565b60405180910390f35b34801561098357600080fd5b5061098c611d70565b6040516109999190613cf2565b60405180910390f35b3480156109ae57600080fd5b506109b7611d76565b6040516109c49190613cf2565b60405180910390f35b3480156109d957600080fd5b506109f460048036038101906109ef919061326a565b611d7c565b005b348015610a0257600080fd5b50610a1d6004803603810190610a18919061308b565b611da1565b604051610a2a91906139b5565b60405180910390f35b348015610a3f57600080fd5b50610a5a6004803603810190610a559190613367565b611e35565b005b348015610a6857600080fd5b50610a836004803603810190610a7e919061305e565b611ef7565b005b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bb65750610bb582611fc2565b5b9050919050565b606060008054610bcc90614027565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf890614027565b8015610c455780601f10610c1a57610100808354040283529160200191610c45565b820191906000526020600020905b815481529060010190602001808311610c2857829003601f168201915b5050505050905090565b6000610c5a8261202c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ca0826112c5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613c32565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d30612077565b73ffffffffffffffffffffffffffffffffffffffff161480610d5f5750610d5e81610d59612077565b611da1565b5b610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9590613b72565b60405180910390fd5b610da8838361207f565b505050565b600f60019054906101000a900460ff1681565b600b5481565b610dce612138565b8060099080519060200190610de4929190612dd4565b5050565b6000610df46007611f7b565b905090565b610e0a610e04612077565b826121b6565b610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613cb2565b60405180910390fd5b610e5483838361224b565b505050565b610e61612138565b60005b8151811015610ef257600160106000848481518110610e8657610e85614191565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610eea9061408a565b915050610e64565b5050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f54612138565b6000610f5e611778565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f8190613917565b60006040518083038185875af1925050503d8060008114610fbe576040519150601f19603f3d011682016040523d82523d6000602084013e610fc3565b606091505b5050905080610fd157600080fd5b50565b610fef83838360405180602001604052806000815250611bb5565b505050565b606060006110018361138a565b905060008167ffffffffffffffff81111561101f5761101e6141c0565b5b60405190808252806020026020018201604052801561104d5781602001602082028036833780820191505090505b50905060006001905060005b838110801561106a5750600c548211155b156110f357600061107a836112c5565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110df57828483815181106110c4576110c3614191565b5b60200260200101818152505081806110db9061408a565b9250505b82806110ea9061408a565b93505050611059565b82945050505050919050565b611107612138565b80600b8190555050565b611119612138565b80600a908051906020019061112f929190612dd4565b5050565b600f60029054906101000a900460ff1681565b61114e612138565b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600980546111b690614027565b80601f01602080910402602001604051908101604052809291908181526020018280546111e290614027565b801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b505050505081565b6008805461124490614027565b80601f016020809104026020016040519081016040528092919081815260200182805461127090614027565b80156112bd5780601f10611292576101008083540402835291602001916112bd565b820191906000526020600020905b8154815290600101906020018083116112a057829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613c12565b60405180910390fd5b80915050919050565b600f60009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290613b52565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144a612138565b61145460006124b2565b565b61145e612138565b8060089080519060200190611474929190612dd4565b5050565b611480612138565b80600f60016101000a81548160ff02191690831515021790555050565b806000811180156114b05750600e548111155b6114ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e690613b12565b60405180910390fd5b600c54816114fd6007611f7b565b6115079190613e5c565b1115611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f906139f2565b60405180910390fd5b61155133610ef6565b611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613bb2565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613c72565b60405180910390fd5b600f60009054906101000a900460ff1661166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390613b32565b60405180910390fd5b81600b5461167a9190613ee3565b3410156116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390613cd2565b60405180910390fd5b6116c63383612578565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b6060600180546117b790614027565b80601f01602080910402602001604051908101604052809291908181526020018280546117e390614027565b80156118305780601f1061180557610100808354040283529160200191611830565b820191906000526020600020905b81548152906001019060200180831161181357829003601f168201915b5050505050905090565b8060008111801561184d5750600d548111155b61188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613ab2565b60405180910390fd5b600c548161189a6007611f7b565b6118a49190613e5c565b11156118e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dc90613c52565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990613c92565b60405180910390fd5b600f60019054906101000a900460ff166119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b890613a52565b60405180910390fd5b81600b546119cf9190613ee3565b341015611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0890613cd2565b60405180910390fd5b611a1b3383612578565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611a89611a82612077565b83836125b8565b5050565b600a8054611a9a90614027565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac690614027565b8015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b505050505081565b611b23612138565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611b86612138565b80600d8190555050565b611b98612138565b80600f60006101000a81548160ff02191690831515021790555050565b611bc6611bc0612077565b836121b6565b611c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc90613cb2565b60405180910390fd5b611c1184848484612725565b50505050565b6060611c2282612781565b611c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5890613bf2565b60405180910390fd5b60001515600f60029054906101000a900460ff1615151415611d0f57600a8054611c8a90614027565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb690614027565b8015611d035780601f10611cd857610100808354040283529160200191611d03565b820191906000526020600020905b815481529060010190602001808311611ce657829003601f168201915b50505050509050611d6b565b6000611d196127ed565b90506000815111611d395760405180602001604052806000815250611d67565b80611d438461287f565b6009604051602001611d57939291906138e6565b6040516020818303038152906040525b9150505b919050565b600e5481565b600c5481565b611d84612138565b80600f60026101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b81600081118015611e485750600d548111155b611e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7e90613ab2565b60405180910390fd5b600c5481611e956007611f7b565b611e9f9190613e5c565b1115611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed790613c52565b60405180910390fd5b611ee8612138565b611ef28284612578565b505050565b611eff612138565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690613a32565b60405180910390fd5b611f78816124b2565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61203581612781565b612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b90613c12565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120f2836112c5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612140612077565b73ffffffffffffffffffffffffffffffffffffffff1661215e611778565b73ffffffffffffffffffffffffffffffffffffffff16146121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90613bd2565b60405180910390fd5b565b6000806121c2836112c5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061220457506122038185611da1565b5b8061224257508373ffffffffffffffffffffffffffffffffffffffff1661222a84610c4f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661226b826112c5565b73ffffffffffffffffffffffffffffffffffffffff16146122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890613a72565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890613ad2565b60405180910390fd5b61233c8383836129e0565b61234760008261207f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123979190613f3d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123ee9190613e5c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124ad8383836129e5565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156125b35761258d6007611f89565b6125a08361259b6007611f7b565b6129ea565b80806125ab9061408a565b91505061257b565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261e90613af2565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161271891906139b5565b60405180910390a3505050565b61273084848461224b565b61273c84848484612a08565b61277b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277290613a12565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600880546127fc90614027565b80601f016020809104026020016040519081016040528092919081815260200182805461282890614027565b80156128755780601f1061284a57610100808354040283529160200191612875565b820191906000526020600020905b81548152906001019060200180831161285857829003601f168201915b5050505050905090565b606060008214156128c7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129db565b600082905060005b600082146128f95780806128e29061408a565b915050600a826128f29190613eb2565b91506128cf565b60008167ffffffffffffffff811115612915576129146141c0565b5b6040519080825280601f01601f1916602001820160405280156129475781602001600182028036833780820191505090505b5090505b600085146129d4576001826129609190613f3d565b9150600a8561296f91906140d3565b603061297b9190613e5c565b60f81b81838151811061299157612990614191565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129cd9190613eb2565b945061294b565b8093505050505b919050565b505050565b505050565b612a04828260405180602001604052806000815250612b9f565b5050565b6000612a298473ffffffffffffffffffffffffffffffffffffffff16611f9f565b15612b92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a52612077565b8786866040518563ffffffff1660e01b8152600401612a749493929190613947565b602060405180830381600087803b158015612a8e57600080fd5b505af1925050508015612abf57506040513d601f19601f82011682018060405250810190612abc91906132c4565b60015b612b42573d8060008114612aef576040519150601f19603f3d011682016040523d82523d6000602084013e612af4565b606091505b50600081511415612b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3190613a12565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b97565b600190505b949350505050565b612ba98383612bfa565b612bb66000848484612a08565b612bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bec90613a12565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6190613b92565b60405180910390fd5b612c7381612781565b15612cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caa90613a92565b60405180910390fd5b612cbf600083836129e0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d0f9190613e5c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612dd0600083836129e5565b5050565b828054612de090614027565b90600052602060002090601f016020900481019282612e025760008555612e49565b82601f10612e1b57805160ff1916838001178555612e49565b82800160010185558215612e49579182015b82811115612e48578251825591602001919060010190612e2d565b5b509050612e569190612e5a565b5090565b5b80821115612e73576000816000905550600101612e5b565b5090565b6000612e8a612e8584613d32565b613d0d565b90508083825260208201905082856020860282011115612ead57612eac6141f4565b5b60005b85811015612edd5781612ec38882612f6b565b845260208401935060208301925050600181019050612eb0565b5050509392505050565b6000612efa612ef584613d5e565b613d0d565b905082815260208101848484011115612f1657612f156141f9565b5b612f21848285613fe5565b509392505050565b6000612f3c612f3784613d8f565b613d0d565b905082815260208101848484011115612f5857612f576141f9565b5b612f63848285613fe5565b509392505050565b600081359050612f7a81614796565b92915050565b600082601f830112612f9557612f946141ef565b5b8135612fa5848260208601612e77565b91505092915050565b600081359050612fbd816147ad565b92915050565b600081359050612fd2816147c4565b92915050565b600081519050612fe7816147c4565b92915050565b600082601f830112613002576130016141ef565b5b8135613012848260208601612ee7565b91505092915050565b600082601f8301126130305761302f6141ef565b5b8135613040848260208601612f29565b91505092915050565b600081359050613058816147db565b92915050565b60006020828403121561307457613073614203565b5b600061308284828501612f6b565b91505092915050565b600080604083850312156130a2576130a1614203565b5b60006130b085828601612f6b565b92505060206130c185828601612f6b565b9150509250929050565b6000806000606084860312156130e4576130e3614203565b5b60006130f286828701612f6b565b935050602061310386828701612f6b565b925050604061311486828701613049565b9150509250925092565b6000806000806080858703121561313857613137614203565b5b600061314687828801612f6b565b945050602061315787828801612f6b565b935050604061316887828801613049565b925050606085013567ffffffffffffffff811115613189576131886141fe565b5b61319587828801612fed565b91505092959194509250565b600080604083850312156131b8576131b7614203565b5b60006131c685828601612f6b565b92505060206131d785828601612fae565b9150509250929050565b600080604083850312156131f8576131f7614203565b5b600061320685828601612f6b565b925050602061321785828601613049565b9150509250929050565b60006020828403121561323757613236614203565b5b600082013567ffffffffffffffff811115613255576132546141fe565b5b61326184828501612f80565b91505092915050565b6000602082840312156132805761327f614203565b5b600061328e84828501612fae565b91505092915050565b6000602082840312156132ad576132ac614203565b5b60006132bb84828501612fc3565b91505092915050565b6000602082840312156132da576132d9614203565b5b60006132e884828501612fd8565b91505092915050565b60006020828403121561330757613306614203565b5b600082013567ffffffffffffffff811115613325576133246141fe565b5b6133318482850161301b565b91505092915050565b6000602082840312156133505761334f614203565b5b600061335e84828501613049565b91505092915050565b6000806040838503121561337e5761337d614203565b5b600061338c85828601613049565b925050602061339d85828601612f6b565b9150509250929050565b60006133b383836138c8565b60208301905092915050565b6133c881613f71565b82525050565b60006133d982613de5565b6133e38185613e13565b93506133ee83613dc0565b8060005b8381101561341f57815161340688826133a7565b975061341183613e06565b9250506001810190506133f2565b5085935050505092915050565b61343581613f83565b82525050565b600061344682613df0565b6134508185613e24565b9350613460818560208601613ff4565b61346981614208565b840191505092915050565b600061347f82613dfb565b6134898185613e40565b9350613499818560208601613ff4565b6134a281614208565b840191505092915050565b60006134b882613dfb565b6134c28185613e51565b93506134d2818560208601613ff4565b80840191505092915050565b600081546134eb81614027565b6134f58186613e51565b94506001821660008114613510576001811461352157613554565b60ff19831686528186019350613554565b61352a85613dd0565b60005b8381101561354c5781548189015260018201915060208101905061352d565b838801955050505b50505092915050565b600061356a601e83613e40565b915061357582614219565b602082019050919050565b600061358d603283613e40565b915061359882614242565b604082019050919050565b60006135b0602683613e40565b91506135bb82614291565b604082019050919050565b60006135d3601b83613e40565b91506135de826142e0565b602082019050919050565b60006135f6602583613e40565b915061360182614309565b604082019050919050565b6000613619601c83613e40565b915061362482614358565b602082019050919050565b600061363c601483613e40565b915061364782614381565b602082019050919050565b600061365f602483613e40565b915061366a826143aa565b604082019050919050565b6000613682601983613e40565b915061368d826143f9565b602082019050919050565b60006136a5601e83613e40565b91506136b082614422565b602082019050919050565b60006136c8601e83613e40565b91506136d38261444b565b602082019050919050565b60006136eb602983613e40565b91506136f682614474565b604082019050919050565b600061370e603e83613e40565b9150613719826144c3565b604082019050919050565b6000613731602083613e40565b915061373c82614512565b602082019050919050565b6000613754601783613e40565b915061375f8261453b565b602082019050919050565b6000613777602083613e40565b915061378282614564565b602082019050919050565b600061379a602f83613e40565b91506137a58261458d565b604082019050919050565b60006137bd601883613e40565b91506137c8826145dc565b602082019050919050565b60006137e0602183613e40565b91506137eb82614605565b604082019050919050565b6000613803600083613e35565b915061380e82614654565b600082019050919050565b6000613826601483613e40565b915061383182614657565b602082019050919050565b6000613849602e83613e40565b915061385482614680565b604082019050919050565b600061386c602b83613e40565b9150613877826146cf565b604082019050919050565b600061388f602e83613e40565b915061389a8261471e565b604082019050919050565b60006138b2601383613e40565b91506138bd8261476d565b602082019050919050565b6138d181613fdb565b82525050565b6138e081613fdb565b82525050565b60006138f282866134ad565b91506138fe82856134ad565b915061390a82846134de565b9150819050949350505050565b6000613922826137f6565b9150819050919050565b600060208201905061394160008301846133bf565b92915050565b600060808201905061395c60008301876133bf565b61396960208301866133bf565b61397660408301856138d7565b8181036060830152613988818461343b565b905095945050505050565b600060208201905081810360008301526139ad81846133ce565b905092915050565b60006020820190506139ca600083018461342c565b92915050565b600060208201905081810360008301526139ea8184613474565b905092915050565b60006020820190508181036000830152613a0b8161355d565b9050919050565b60006020820190508181036000830152613a2b81613580565b9050919050565b60006020820190508181036000830152613a4b816135a3565b9050919050565b60006020820190508181036000830152613a6b816135c6565b9050919050565b60006020820190508181036000830152613a8b816135e9565b9050919050565b60006020820190508181036000830152613aab8161360c565b9050919050565b60006020820190508181036000830152613acb8161362f565b9050919050565b60006020820190508181036000830152613aeb81613652565b9050919050565b60006020820190508181036000830152613b0b81613675565b9050919050565b60006020820190508181036000830152613b2b81613698565b9050919050565b60006020820190508181036000830152613b4b816136bb565b9050919050565b60006020820190508181036000830152613b6b816136de565b9050919050565b60006020820190508181036000830152613b8b81613701565b9050919050565b60006020820190508181036000830152613bab81613724565b9050919050565b60006020820190508181036000830152613bcb81613747565b9050919050565b60006020820190508181036000830152613beb8161376a565b9050919050565b60006020820190508181036000830152613c0b8161378d565b9050919050565b60006020820190508181036000830152613c2b816137b0565b9050919050565b60006020820190508181036000830152613c4b816137d3565b9050919050565b60006020820190508181036000830152613c6b81613819565b9050919050565b60006020820190508181036000830152613c8b8161383c565b9050919050565b60006020820190508181036000830152613cab8161385f565b9050919050565b60006020820190508181036000830152613ccb81613882565b9050919050565b60006020820190508181036000830152613ceb816138a5565b9050919050565b6000602082019050613d0760008301846138d7565b92915050565b6000613d17613d28565b9050613d238282614059565b919050565b6000604051905090565b600067ffffffffffffffff821115613d4d57613d4c6141c0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613d7957613d786141c0565b5b613d8282614208565b9050602081019050919050565b600067ffffffffffffffff821115613daa57613da96141c0565b5b613db382614208565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e6782613fdb565b9150613e7283613fdb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ea757613ea6614104565b5b828201905092915050565b6000613ebd82613fdb565b9150613ec883613fdb565b925082613ed857613ed7614133565b5b828204905092915050565b6000613eee82613fdb565b9150613ef983613fdb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3257613f31614104565b5b828202905092915050565b6000613f4882613fdb565b9150613f5383613fdb565b925082821015613f6657613f65614104565b5b828203905092915050565b6000613f7c82613fbb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614012578082015181840152602081019050613ff7565b83811115614021576000848401525b50505050565b6000600282049050600182168061403f57607f821691505b6020821081141561405357614052614162565b5b50919050565b61406282614208565b810181811067ffffffffffffffff82111715614081576140806141c0565b5b80604052505050565b600061409582613fdb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140c8576140c7614104565b5b600182019050919050565b60006140de82613fdb565b91506140e983613fdb565b9250826140f9576140f8614133565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d61782077686974656c69737420737570706c79206578636565646564210000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d696e74696e67206e6f7420656e61626c6564210000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c69642077686974656c697374206d696e7420616d6f756e74210000600082015250565b7f57686974656c697374206d696e74696e67206e6f7420656e61626c6564210000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f596f75206861766520616c7265616479206d696e74656420647572696e67207760008201527f686974656c697374206d696e742e000000000000000000000000000000000000602082015250565b7f596f75206861766520616c7265616479206d696e74656420647572696e67207060008201527f75626c6963206d696e742e000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61479f81613f71565b81146147aa57600080fd5b50565b6147b681613f83565b81146147c157600080fd5b50565b6147cd81613f8f565b81146147d857600080fd5b50565b6147e481613fdb565b81146147ef57600080fd5b5056fea264697066735822122001458e49842eb61a1250066987e3a06472df5efe4a3d4b7f65e51b411ca5281a64736f6c63430008070033

Deployed Bytecode Sourcemap

40476:10975:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42390:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26695:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27622:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29135:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28652:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40942:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40742:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50669:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43050:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29835:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42748:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42275:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50991:137;;;;;;;;;;;;;:::i;:::-;;30242:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44013:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45241:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50425:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40984:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42638:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40664:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40631:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27333:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40897:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27064:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7231:103;;;;;;;;;;;;;:::i;:::-;;50563:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50775:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43475:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42516:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6583:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40802:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27791:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43145:324;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29378:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40702:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42938:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50289:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50880:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30498:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44654:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40844:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40766:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45154:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29604:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43846:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7489:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42390:120;42457:4;42479:15;:25;42495:8;42479:25;;;;;;;;;;;;;;;;;;;;;;;;;42472:32;;42390:120;;;:::o;26695:305::-;26797:4;26849:25;26834:40;;;:11;:40;;;;:105;;;;26906:33;26891:48;;;:11;:48;;;;26834:105;:158;;;;26956:36;26980:11;26956:23;:36::i;:::-;26834:158;26814:178;;26695:305;;;:::o;27622:100::-;27676:13;27709:5;27702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27622:100;:::o;29135:171::-;29211:7;29231:23;29246:7;29231:14;:23::i;:::-;29274:15;:24;29290:7;29274:24;;;;;;;;;;;;;;;;;;;;;29267:31;;29135:171;;;:::o;28652:417::-;28733:13;28749:23;28764:7;28749:14;:23::i;:::-;28733:39;;28797:5;28791:11;;:2;:11;;;;28783:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28891:5;28875:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28900:37;28917:5;28924:12;:10;:12::i;:::-;28900:16;:37::i;:::-;28875:62;28853:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;29040:21;29049:2;29053:7;29040:8;:21::i;:::-;28722:347;28652:417;;:::o;40942:37::-;;;;;;;;;;;;;:::o;40742:19::-;;;;:::o;50669:100::-;6469:13;:11;:13::i;:::-;50753:10:::1;50741:9;:22;;;;;;;;;;;;:::i;:::-;;50669:100:::0;:::o;43050:89::-;43094:7;43117:16;:6;:14;:16::i;:::-;43110:23;;43050:89;:::o;29835:336::-;30030:41;30049:12;:10;:12::i;:::-;30063:7;30030:18;:41::i;:::-;30022:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30135:28;30145:4;30151:2;30155:7;30135:9;:28::i;:::-;29835:336;;;:::o;42748:182::-;6469:13;:11;:13::i;:::-;42835:6:::1;42830:93;42851:5;:12;42847:1;:16;42830:93;;;42907:4;42885:9;:19;42895:5;42901:1;42895:8;;;;;;;;:::i;:::-;;;;;;;;42885:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;42865:3;;;;;:::i;:::-;;;;42830:93;;;;42748:182:::0;:::o;42275:109::-;42337:4;42359:9;:19;42369:8;42359:19;;;;;;;;;;;;;;;;;;;;;;;;;42352:26;;42275:109;;;:::o;50991:137::-;6469:13;:11;:13::i;:::-;51036:7:::1;51057;:5;:7::i;:::-;51049:21;;51078;51049:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51035:69;;;51119:2;51111:11;;;::::0;::::1;;51028:100;50991:137::o:0;30242:185::-;30380:39;30397:4;30403:2;30407:7;30380:39;;;;;;;;;;;;:16;:39::i;:::-;30242:185;;;:::o;44013:635::-;44088:16;44116:23;44142:17;44152:6;44142:9;:17::i;:::-;44116:43;;44166:30;44213:15;44199:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44166:63;;44236:22;44261:1;44236:26;;44269:23;44305:309;44330:15;44312;:33;:64;;;;;44367:9;;44349:14;:27;;44312:64;44305:309;;;44387:25;44415:23;44423:14;44415:7;:23::i;:::-;44387:51;;44474:6;44453:27;;:17;:27;;;44449:131;;;44526:14;44493:13;44507:15;44493:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;44553:17;;;;;:::i;:::-;;;;44449:131;44590:16;;;;;:::i;:::-;;;;44378:236;44305:309;;;44629:13;44622:20;;;;;;44013:635;;;:::o;45241:74::-;6469:13;:11;:13::i;:::-;45304:5:::1;45297:4;:12;;;;45241:74:::0;:::o;50425:132::-;6469:13;:11;:13::i;:::-;50533:18:::1;50513:17;:38;;;;;;;;;;;;:::i;:::-;;50425:132:::0;:::o;40984:28::-;;;;;;;;;;;;;:::o;42638:102::-;6469:13;:11;:13::i;:::-;42728:4:::1;42706:9;:19;42716:8;42706:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;42638:102:::0;:::o;40664:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40631:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27333:222::-;27405:7;27425:13;27441:7;:16;27449:7;27441:16;;;;;;;;;;;;;;;;;;;;;27425:32;;27493:1;27476:19;;:5;:19;;;;27468:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;27542:5;27535:12;;;27333:222;;;:::o;40897:40::-;;;;;;;;;;;;;:::o;27064:207::-;27136:7;27181:1;27164:19;;:5;:19;;;;27156:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27247:9;:16;27257:5;27247:16;;;;;;;;;;;;;;;;27240:23;;27064:207;;;:::o;7231:103::-;6469:13;:11;:13::i;:::-;7296:30:::1;7323:1;7296:18;:30::i;:::-;7231:103::o:0;50563:100::-;6469:13;:11;:13::i;:::-;50647:10:::1;50635:9;:22;;;;;;;;;;;;:::i;:::-;;50563:100:::0;:::o;50775:99::-;6469:13;:11;:13::i;:::-;50862:6:::1;50842:17;;:26;;;;;;;;;;;;;;;;;;50775:99:::0;:::o;43475:363::-;43558:11;41834:1;41820:11;:15;:61;;;;;41854:27;;41839:11;:42;;41820:61;41812:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;41965:9;;41950:11;41931:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;41923:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;41393:25:::1;41407:10;41393:13;:25::i;:::-;41385:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41515:15:::2;:27;41531:10;41515:27;;;;;;;;;;;;;;;;;;;;;;;;;41514:28;41506:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43623:20:::3;;;;;;;;;;;43615:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43713:11;43706:4;;:18;;;;:::i;:::-;43693:9;:31;;43685:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43757:34;43767:10;43779:11;43757:9;:34::i;:::-;43828:4;43798:15;:27;43814:10;43798:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;43475:363:::0;;:::o;42516:114::-;42580:4;42602:12;:22;42615:8;42602:22;;;;;;;;;;;;;;;;;;;;;;;;;42595:29;;42516:114;;;:::o;6583:87::-;6629:7;6656:6;;;;;;;;;;;6649:13;;6583:87;:::o;40802:37::-;;;;:::o;27791:104::-;27847:13;27880:7;27873:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27791:104;:::o;43145:324::-;43216:11;42109:1;42095:11;:15;:52;;;;;42129:18;;42114:11;:33;;42095:52;42087:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42221:9;;42206:11;42187:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;42179:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41659:12:::1;:24;41672:10;41659:24;;;;;;;;;;;;;;;;;;;;;;;;;41658:25;41650:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43263:17:::2;;;;;;;;;;;43255:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;43347:11;43340:4;;:18;;;;:::i;:::-;43327:9;:31;;43319:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43391:34;43401:10;43413:11;43391:9;:34::i;:::-;43459:4;43432:12;:24;43445:10;43432:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;43145:324:::0;;:::o;29378:155::-;29473:52;29492:12;:10;:12::i;:::-;29506:8;29516;29473:18;:52::i;:::-;29378:155;;:::o;40702:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42938:106::-;6469:13;:11;:13::i;:::-;43031:5:::1;43009:9;:19;43019:8;43009:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;42938:106:::0;:::o;50289:130::-;6469:13;:11;:13::i;:::-;50394:19:::1;50373:18;:40;;;;50289:130:::0;:::o;50880:105::-;6469:13;:11;:13::i;:::-;50973:6:::1;50950:20;;:29;;;;;;;;;;;;;;;;;;50880:105:::0;:::o;30498:323::-;30672:41;30691:12;:10;:12::i;:::-;30705:7;30672:18;:41::i;:::-;30664:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30775:38;30789:4;30795:2;30799:7;30808:4;30775:13;:38::i;:::-;30498:323;;;;:::o;44654:494::-;44753:13;44794:17;44802:8;44794:7;:17::i;:::-;44778:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;44901:5;44889:17;;:8;;;;;;;;;;;:17;;;44885:64;;;44924:17;44917:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44885:64;44957:28;44988:10;:8;:10::i;:::-;44957:41;;45043:1;45018:14;45012:28;:32;:130;;;;;;;;;;;;;;;;;45080:14;45096:19;:8;:17;:19::i;:::-;45117:9;45063:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45012:130;45005:137;;;44654:494;;;;:::o;40844:46::-;;;;:::o;40766:31::-;;;;:::o;45154:81::-;6469:13;:11;:13::i;:::-;45223:6:::1;45212:8;;:17;;;;;;;;;;;;;;;;;;45154:81:::0;:::o;29604:164::-;29701:4;29725:18;:25;29744:5;29725:25;;;;;;;;;;;;;;;:35;29751:8;29725:35;;;;;;;;;;;;;;;;;;;;;;;;;29718:42;;29604:164;;;;:::o;43846:161::-;43938:11;42109:1;42095:11;:15;:52;;;;;42129:18;;42114:11;:33;;42095:52;42087:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42221:9;;42206:11;42187:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;42179:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:13:::1;:11;:13::i;:::-;43968:33:::2;43978:9;43989:11;43968:9;:33::i;:::-;43846:161:::0;;;:::o;7489:201::-;6469:13;:11;:13::i;:::-;7598:1:::1;7578:22;;:8;:22;;;;7570:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7654:28;7673:8;7654:18;:28::i;:::-;7489:201:::0;:::o;1365:114::-;1430:7;1457;:14;;;1450:21;;1365:114;;;:::o;1487:127::-;1594:1;1576:7;:14;;;:19;;;;;;;;;;;1487:127;:::o;9281:326::-;9341:4;9598:1;9576:7;:19;;;:23;9569:30;;9281:326;;;:::o;19437:157::-;19522:4;19561:25;19546:40;;;:11;:40;;;;19539:47;;19437:157;;;:::o;37110:135::-;37192:16;37200:7;37192;:16::i;:::-;37184:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37110:135;:::o;5134:98::-;5187:7;5214:10;5207:17;;5134:98;:::o;36389:174::-;36491:2;36464:15;:24;36480:7;36464:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36547:7;36543:2;36509:46;;36518:23;36533:7;36518:14;:23::i;:::-;36509:46;;;;;;;;;;;;36389:174;;:::o;6748:132::-;6823:12;:10;:12::i;:::-;6812:23;;:7;:5;:7::i;:::-;:23;;;6804:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6748:132::o;32622:264::-;32715:4;32732:13;32748:23;32763:7;32748:14;:23::i;:::-;32732:39;;32801:5;32790:16;;:7;:16;;;:52;;;;32810:32;32827:5;32834:7;32810:16;:32::i;:::-;32790:52;:87;;;;32870:7;32846:31;;:20;32858:7;32846:11;:20::i;:::-;:31;;;32790:87;32782:96;;;32622:264;;;;:::o;35645:625::-;35804:4;35777:31;;:23;35792:7;35777:14;:23::i;:::-;:31;;;35769:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35883:1;35869:16;;:2;:16;;;;35861:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35939:39;35960:4;35966:2;35970:7;35939:20;:39::i;:::-;36043:29;36060:1;36064:7;36043:8;:29::i;:::-;36104:1;36085:9;:15;36095:4;36085:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36133:1;36116:9;:13;36126:2;36116:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36164:2;36145:7;:16;36153:7;36145:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36203:7;36199:2;36184:27;;36193:4;36184:27;;;;;;;;;;;;36224:38;36244:4;36250:2;36254:7;36224:19;:38::i;:::-;35645:625;;;:::o;7850:191::-;7924:16;7943:6;;;;;;;;;;;7924:25;;7969:8;7960:6;;:17;;;;;;;;;;;;;;;;;;8024:8;7993:40;;8014:8;7993:40;;;;;;;;;;;;7913:128;7850:191;:::o;51134:204::-;51214:9;51209:124;51233:11;51229:1;:15;51209:124;;;51260:18;:6;:16;:18::i;:::-;51287:38;51297:9;51308:16;:6;:14;:16::i;:::-;51287:9;:38::i;:::-;51246:3;;;;;:::i;:::-;;;;51209:124;;;;51134:204;;:::o;36706:315::-;36861:8;36852:17;;:5;:17;;;;36844:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36948:8;36910:18;:25;36929:5;36910:25;;;;;;;;;;;;;;;:35;36936:8;36910:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36994:8;36972:41;;36987:5;36972:41;;;37004:8;36972:41;;;;;;:::i;:::-;;;;;;;;36706:315;;;:::o;31702:313::-;31858:28;31868:4;31874:2;31878:7;31858:9;:28::i;:::-;31905:47;31928:4;31934:2;31938:7;31947:4;31905:22;:47::i;:::-;31897:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31702:313;;;;:::o;32328:127::-;32393:4;32445:1;32417:30;;:7;:16;32425:7;32417:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32410:37;;32328:127;;;:::o;51344:104::-;51404:13;51433:9;51426:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51344:104;:::o;2388:723::-;2444:13;2674:1;2665:5;:10;2661:53;;;2692:10;;;;;;;;;;;;;;;;;;;;;2661:53;2724:12;2739:5;2724:20;;2755:14;2780:78;2795:1;2787:4;:9;2780:78;;2813:8;;;;;:::i;:::-;;;;2844:2;2836:10;;;;;:::i;:::-;;;2780:78;;;2868:19;2900:6;2890:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:39;;2918:154;2934:1;2925:5;:10;2918:154;;2962:1;2952:11;;;;;:::i;:::-;;;3029:2;3021:5;:10;;;;:::i;:::-;3008:2;:24;;;;:::i;:::-;2995:39;;2978:6;2985;2978:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3058:2;3049:11;;;;;:::i;:::-;;;2918:154;;;3096:6;3082:21;;;;;2388:723;;;;:::o;39234:126::-;;;;:::o;39745:125::-;;;;:::o;33228:110::-;33304:26;33314:2;33318:7;33304:26;;;;;;;;;;;;:9;:26::i;:::-;33228:110;;:::o;37809:853::-;37963:4;37984:15;:2;:13;;;:15::i;:::-;37980:675;;;38036:2;38020:36;;;38057:12;:10;:12::i;:::-;38071:4;38077:7;38086:4;38020:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38016:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38278:1;38261:6;:13;:18;38257:328;;;38304:60;;;;;;;;;;:::i;:::-;;;;;;;;38257:328;38535:6;38529:13;38520:6;38516:2;38512:15;38505:38;38016:584;38152:41;;;38142:51;;;:6;:51;;;;38135:58;;;;;37980:675;38639:4;38632:11;;37809:853;;;;;;;:::o;33565:319::-;33694:18;33700:2;33704:7;33694:5;:18::i;:::-;33745:53;33776:1;33780:2;33784:7;33793:4;33745:22;:53::i;:::-;33723:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;33565:319;;;:::o;34220:439::-;34314:1;34300:16;;:2;:16;;;;34292:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34373:16;34381:7;34373;:16::i;:::-;34372:17;34364:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34435:45;34464:1;34468:2;34472:7;34435:20;:45::i;:::-;34510:1;34493:9;:13;34503:2;34493:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34541:2;34522:7;:16;34530:7;34522:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34586:7;34582:2;34561:33;;34578:1;34561:33;;;;;;;;;;;;34607:44;34635:1;34639:2;34643:7;34607:19;:44::i;:::-;34220:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:323::-;7359:6;7408:2;7396:9;7387:7;7383:23;7379:32;7376:119;;;7414:79;;:::i;:::-;7376:119;7534:1;7559:50;7601:7;7592:6;7581:9;7577:22;7559:50;:::i;:::-;7549:60;;7505:114;7303:323;;;;:::o;7632:327::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:52;7934:7;7925:6;7914:9;7910:22;7890:52;:::i;:::-;7880:62;;7836:116;7632:327;;;;:::o;7965:349::-;8034:6;8083:2;8071:9;8062:7;8058:23;8054:32;8051:119;;;8089:79;;:::i;:::-;8051:119;8209:1;8234:63;8289:7;8280:6;8269:9;8265:22;8234:63;:::i;:::-;8224:73;;8180:127;7965:349;;;;:::o;8320:509::-;8389:6;8438:2;8426:9;8417:7;8413:23;8409:32;8406:119;;;8444:79;;:::i;:::-;8406:119;8592:1;8581:9;8577:17;8564:31;8622:18;8614:6;8611:30;8608:117;;;8644:79;;:::i;:::-;8608:117;8749:63;8804:7;8795:6;8784:9;8780:22;8749:63;:::i;:::-;8739:73;;8535:287;8320:509;;;;:::o;8835:329::-;8894:6;8943:2;8931:9;8922:7;8918:23;8914:32;8911:119;;;8949:79;;:::i;:::-;8911:119;9069:1;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9040:117;8835:329;;;;:::o;9170:474::-;9238:6;9246;9295:2;9283:9;9274:7;9270:23;9266:32;9263:119;;;9301:79;;:::i;:::-;9263:119;9421:1;9446:53;9491:7;9482:6;9471:9;9467:22;9446:53;:::i;:::-;9436:63;;9392:117;9548:2;9574:53;9619:7;9610:6;9599:9;9595:22;9574:53;:::i;:::-;9564:63;;9519:118;9170:474;;;;;:::o;9650:179::-;9719:10;9740:46;9782:3;9774:6;9740:46;:::i;:::-;9818:4;9813:3;9809:14;9795:28;;9650:179;;;;:::o;9835:118::-;9922:24;9940:5;9922:24;:::i;:::-;9917:3;9910:37;9835:118;;:::o;9989:732::-;10108:3;10137:54;10185:5;10137:54;:::i;:::-;10207:86;10286:6;10281:3;10207:86;:::i;:::-;10200:93;;10317:56;10367:5;10317:56;:::i;:::-;10396:7;10427:1;10412:284;10437:6;10434:1;10431:13;10412:284;;;10513:6;10507:13;10540:63;10599:3;10584:13;10540:63;:::i;:::-;10533:70;;10626:60;10679:6;10626:60;:::i;:::-;10616:70;;10472:224;10459:1;10456;10452:9;10447:14;;10412:284;;;10416:14;10712:3;10705:10;;10113:608;;;9989:732;;;;:::o;10727:109::-;10808:21;10823:5;10808:21;:::i;:::-;10803:3;10796:34;10727:109;;:::o;10842:360::-;10928:3;10956:38;10988:5;10956:38;:::i;:::-;11010:70;11073:6;11068:3;11010:70;:::i;:::-;11003:77;;11089:52;11134:6;11129:3;11122:4;11115:5;11111:16;11089:52;:::i;:::-;11166:29;11188:6;11166:29;:::i;:::-;11161:3;11157:39;11150:46;;10932:270;10842:360;;;;:::o;11208:364::-;11296:3;11324:39;11357:5;11324:39;:::i;:::-;11379:71;11443:6;11438:3;11379:71;:::i;:::-;11372:78;;11459:52;11504:6;11499:3;11492:4;11485:5;11481:16;11459:52;:::i;:::-;11536:29;11558:6;11536:29;:::i;:::-;11531:3;11527:39;11520:46;;11300:272;11208:364;;;;:::o;11578:377::-;11684:3;11712:39;11745:5;11712:39;:::i;:::-;11767:89;11849:6;11844:3;11767:89;:::i;:::-;11760:96;;11865:52;11910:6;11905:3;11898:4;11891:5;11887:16;11865:52;:::i;:::-;11942:6;11937:3;11933:16;11926:23;;11688:267;11578:377;;;;:::o;11985:845::-;12088:3;12125:5;12119:12;12154:36;12180:9;12154:36;:::i;:::-;12206:89;12288:6;12283:3;12206:89;:::i;:::-;12199:96;;12326:1;12315:9;12311:17;12342:1;12337:137;;;;12488:1;12483:341;;;;12304:520;;12337:137;12421:4;12417:9;12406;12402:25;12397:3;12390:38;12457:6;12452:3;12448:16;12441:23;;12337:137;;12483:341;12550:38;12582:5;12550:38;:::i;:::-;12610:1;12624:154;12638:6;12635:1;12632:13;12624:154;;;12712:7;12706:14;12702:1;12697:3;12693:11;12686:35;12762:1;12753:7;12749:15;12738:26;;12660:4;12657:1;12653:12;12648:17;;12624:154;;;12807:6;12802:3;12798:16;12791:23;;12490:334;;12304:520;;12092:738;;11985:845;;;;:::o;12836:366::-;12978:3;12999:67;13063:2;13058:3;12999:67;:::i;:::-;12992:74;;13075:93;13164:3;13075:93;:::i;:::-;13193:2;13188:3;13184:12;13177:19;;12836:366;;;:::o;13208:::-;13350:3;13371:67;13435:2;13430:3;13371:67;:::i;:::-;13364:74;;13447:93;13536:3;13447:93;:::i;:::-;13565:2;13560:3;13556:12;13549:19;;13208:366;;;:::o;13580:::-;13722:3;13743:67;13807:2;13802:3;13743:67;:::i;:::-;13736:74;;13819:93;13908:3;13819:93;:::i;:::-;13937:2;13932:3;13928:12;13921:19;;13580:366;;;:::o;13952:::-;14094:3;14115:67;14179:2;14174:3;14115:67;:::i;:::-;14108:74;;14191:93;14280:3;14191:93;:::i;:::-;14309:2;14304:3;14300:12;14293:19;;13952:366;;;:::o;14324:::-;14466:3;14487:67;14551:2;14546:3;14487:67;:::i;:::-;14480:74;;14563:93;14652:3;14563:93;:::i;:::-;14681:2;14676:3;14672:12;14665:19;;14324:366;;;:::o;14696:::-;14838:3;14859:67;14923:2;14918:3;14859:67;:::i;:::-;14852:74;;14935:93;15024:3;14935:93;:::i;:::-;15053:2;15048:3;15044:12;15037:19;;14696:366;;;:::o;15068:::-;15210:3;15231:67;15295:2;15290:3;15231:67;:::i;:::-;15224:74;;15307:93;15396:3;15307:93;:::i;:::-;15425:2;15420:3;15416:12;15409:19;;15068:366;;;:::o;15440:::-;15582:3;15603:67;15667:2;15662:3;15603:67;:::i;:::-;15596:74;;15679:93;15768:3;15679:93;:::i;:::-;15797:2;15792:3;15788:12;15781:19;;15440:366;;;:::o;15812:::-;15954:3;15975:67;16039:2;16034:3;15975:67;:::i;:::-;15968:74;;16051:93;16140:3;16051:93;:::i;:::-;16169:2;16164:3;16160:12;16153:19;;15812:366;;;:::o;16184:::-;16326:3;16347:67;16411:2;16406:3;16347:67;:::i;:::-;16340:74;;16423:93;16512:3;16423:93;:::i;:::-;16541:2;16536:3;16532:12;16525:19;;16184:366;;;:::o;16556:::-;16698:3;16719:67;16783:2;16778:3;16719:67;:::i;:::-;16712:74;;16795:93;16884:3;16795:93;:::i;:::-;16913:2;16908:3;16904:12;16897:19;;16556:366;;;:::o;16928:::-;17070:3;17091:67;17155:2;17150:3;17091:67;:::i;:::-;17084:74;;17167:93;17256:3;17167:93;:::i;:::-;17285:2;17280:3;17276:12;17269:19;;16928:366;;;:::o;17300:::-;17442:3;17463:67;17527:2;17522:3;17463:67;:::i;:::-;17456:74;;17539:93;17628:3;17539:93;:::i;:::-;17657:2;17652:3;17648:12;17641:19;;17300:366;;;:::o;17672:::-;17814:3;17835:67;17899:2;17894:3;17835:67;:::i;:::-;17828:74;;17911:93;18000:3;17911:93;:::i;:::-;18029:2;18024:3;18020:12;18013:19;;17672:366;;;:::o;18044:::-;18186:3;18207:67;18271:2;18266:3;18207:67;:::i;:::-;18200:74;;18283:93;18372:3;18283:93;:::i;:::-;18401:2;18396:3;18392:12;18385:19;;18044:366;;;:::o;18416:::-;18558:3;18579:67;18643:2;18638:3;18579:67;:::i;:::-;18572:74;;18655:93;18744:3;18655:93;:::i;:::-;18773:2;18768:3;18764:12;18757:19;;18416:366;;;:::o;18788:::-;18930:3;18951:67;19015:2;19010:3;18951:67;:::i;:::-;18944:74;;19027:93;19116:3;19027:93;:::i;:::-;19145:2;19140:3;19136:12;19129:19;;18788:366;;;:::o;19160:::-;19302:3;19323:67;19387:2;19382:3;19323:67;:::i;:::-;19316:74;;19399:93;19488:3;19399:93;:::i;:::-;19517:2;19512:3;19508:12;19501:19;;19160:366;;;:::o;19532:::-;19674:3;19695:67;19759:2;19754:3;19695:67;:::i;:::-;19688:74;;19771:93;19860:3;19771:93;:::i;:::-;19889:2;19884:3;19880:12;19873:19;;19532:366;;;:::o;19904:398::-;20063:3;20084:83;20165:1;20160:3;20084:83;:::i;:::-;20077:90;;20176:93;20265:3;20176:93;:::i;:::-;20294:1;20289:3;20285:11;20278:18;;19904:398;;;:::o;20308:366::-;20450:3;20471:67;20535:2;20530:3;20471:67;:::i;:::-;20464:74;;20547:93;20636:3;20547:93;:::i;:::-;20665:2;20660:3;20656:12;20649:19;;20308:366;;;:::o;20680:::-;20822:3;20843:67;20907:2;20902:3;20843:67;:::i;:::-;20836:74;;20919:93;21008:3;20919:93;:::i;:::-;21037:2;21032:3;21028:12;21021:19;;20680:366;;;:::o;21052:::-;21194:3;21215:67;21279:2;21274:3;21215:67;:::i;:::-;21208:74;;21291:93;21380:3;21291:93;:::i;:::-;21409:2;21404:3;21400:12;21393:19;;21052:366;;;:::o;21424:::-;21566:3;21587:67;21651:2;21646:3;21587:67;:::i;:::-;21580:74;;21663:93;21752:3;21663:93;:::i;:::-;21781:2;21776:3;21772:12;21765:19;;21424:366;;;:::o;21796:::-;21938:3;21959:67;22023:2;22018:3;21959:67;:::i;:::-;21952:74;;22035:93;22124:3;22035:93;:::i;:::-;22153:2;22148:3;22144:12;22137:19;;21796:366;;;:::o;22168:108::-;22245:24;22263:5;22245:24;:::i;:::-;22240:3;22233:37;22168:108;;:::o;22282:118::-;22369:24;22387:5;22369:24;:::i;:::-;22364:3;22357:37;22282:118;;:::o;22406:589::-;22631:3;22653:95;22744:3;22735:6;22653:95;:::i;:::-;22646:102;;22765:95;22856:3;22847:6;22765:95;:::i;:::-;22758:102;;22877:92;22965:3;22956:6;22877:92;:::i;:::-;22870:99;;22986:3;22979:10;;22406:589;;;;;;:::o;23001:379::-;23185:3;23207:147;23350:3;23207:147;:::i;:::-;23200:154;;23371:3;23364:10;;23001:379;;;:::o;23386:222::-;23479:4;23517:2;23506:9;23502:18;23494:26;;23530:71;23598:1;23587:9;23583:17;23574:6;23530:71;:::i;:::-;23386:222;;;;:::o;23614:640::-;23809:4;23847:3;23836:9;23832:19;23824:27;;23861:71;23929:1;23918:9;23914:17;23905:6;23861:71;:::i;:::-;23942:72;24010:2;23999:9;23995:18;23986:6;23942:72;:::i;:::-;24024;24092:2;24081:9;24077:18;24068:6;24024:72;:::i;:::-;24143:9;24137:4;24133:20;24128:2;24117:9;24113:18;24106:48;24171:76;24242:4;24233:6;24171:76;:::i;:::-;24163:84;;23614:640;;;;;;;:::o;24260:373::-;24403:4;24441:2;24430:9;24426:18;24418:26;;24490:9;24484:4;24480:20;24476:1;24465:9;24461:17;24454:47;24518:108;24621:4;24612:6;24518:108;:::i;:::-;24510:116;;24260:373;;;;:::o;24639:210::-;24726:4;24764:2;24753:9;24749:18;24741:26;;24777:65;24839:1;24828:9;24824:17;24815:6;24777:65;:::i;:::-;24639:210;;;;:::o;24855:313::-;24968:4;25006:2;24995:9;24991:18;24983:26;;25055:9;25049:4;25045:20;25041:1;25030:9;25026:17;25019:47;25083:78;25156:4;25147:6;25083:78;:::i;:::-;25075:86;;24855:313;;;;:::o;25174:419::-;25340:4;25378:2;25367:9;25363:18;25355:26;;25427:9;25421:4;25417:20;25413:1;25402:9;25398:17;25391:47;25455:131;25581:4;25455:131;:::i;:::-;25447:139;;25174:419;;;:::o;25599:::-;25765:4;25803:2;25792:9;25788:18;25780:26;;25852:9;25846:4;25842:20;25838:1;25827:9;25823:17;25816:47;25880:131;26006:4;25880:131;:::i;:::-;25872:139;;25599:419;;;:::o;26024:::-;26190:4;26228:2;26217:9;26213:18;26205:26;;26277:9;26271:4;26267:20;26263:1;26252:9;26248:17;26241:47;26305:131;26431:4;26305:131;:::i;:::-;26297:139;;26024:419;;;:::o;26449:::-;26615:4;26653:2;26642:9;26638:18;26630:26;;26702:9;26696:4;26692:20;26688:1;26677:9;26673:17;26666:47;26730:131;26856:4;26730:131;:::i;:::-;26722:139;;26449:419;;;:::o;26874:::-;27040:4;27078:2;27067:9;27063:18;27055:26;;27127:9;27121:4;27117:20;27113:1;27102:9;27098:17;27091:47;27155:131;27281:4;27155:131;:::i;:::-;27147:139;;26874:419;;;:::o;27299:::-;27465:4;27503:2;27492:9;27488:18;27480:26;;27552:9;27546:4;27542:20;27538:1;27527:9;27523:17;27516:47;27580:131;27706:4;27580:131;:::i;:::-;27572:139;;27299:419;;;:::o;27724:::-;27890:4;27928:2;27917:9;27913:18;27905:26;;27977:9;27971:4;27967:20;27963:1;27952:9;27948:17;27941:47;28005:131;28131:4;28005:131;:::i;:::-;27997:139;;27724:419;;;:::o;28149:::-;28315:4;28353:2;28342:9;28338:18;28330:26;;28402:9;28396:4;28392:20;28388:1;28377:9;28373:17;28366:47;28430:131;28556:4;28430:131;:::i;:::-;28422:139;;28149:419;;;:::o;28574:::-;28740:4;28778:2;28767:9;28763:18;28755:26;;28827:9;28821:4;28817:20;28813:1;28802:9;28798:17;28791:47;28855:131;28981:4;28855:131;:::i;:::-;28847:139;;28574:419;;;:::o;28999:::-;29165:4;29203:2;29192:9;29188:18;29180:26;;29252:9;29246:4;29242:20;29238:1;29227:9;29223:17;29216:47;29280:131;29406:4;29280:131;:::i;:::-;29272:139;;28999:419;;;:::o;29424:::-;29590:4;29628:2;29617:9;29613:18;29605:26;;29677:9;29671:4;29667:20;29663:1;29652:9;29648:17;29641:47;29705:131;29831:4;29705:131;:::i;:::-;29697:139;;29424:419;;;:::o;29849:::-;30015:4;30053:2;30042:9;30038:18;30030:26;;30102:9;30096:4;30092:20;30088:1;30077:9;30073:17;30066:47;30130:131;30256:4;30130:131;:::i;:::-;30122:139;;29849:419;;;:::o;30274:::-;30440:4;30478:2;30467:9;30463:18;30455:26;;30527:9;30521:4;30517:20;30513:1;30502:9;30498:17;30491:47;30555:131;30681:4;30555:131;:::i;:::-;30547:139;;30274:419;;;:::o;30699:::-;30865:4;30903:2;30892:9;30888:18;30880:26;;30952:9;30946:4;30942:20;30938:1;30927:9;30923:17;30916:47;30980:131;31106:4;30980:131;:::i;:::-;30972:139;;30699:419;;;:::o;31124:::-;31290:4;31328:2;31317:9;31313:18;31305:26;;31377:9;31371:4;31367:20;31363:1;31352:9;31348:17;31341:47;31405:131;31531:4;31405:131;:::i;:::-;31397:139;;31124:419;;;:::o;31549:::-;31715:4;31753:2;31742:9;31738:18;31730:26;;31802:9;31796:4;31792:20;31788:1;31777:9;31773:17;31766:47;31830:131;31956:4;31830:131;:::i;:::-;31822:139;;31549:419;;;:::o;31974:::-;32140:4;32178:2;32167:9;32163:18;32155:26;;32227:9;32221:4;32217:20;32213:1;32202:9;32198:17;32191:47;32255:131;32381:4;32255:131;:::i;:::-;32247:139;;31974:419;;;:::o;32399:::-;32565:4;32603:2;32592:9;32588:18;32580:26;;32652:9;32646:4;32642:20;32638:1;32627:9;32623:17;32616:47;32680:131;32806:4;32680:131;:::i;:::-;32672:139;;32399:419;;;:::o;32824:::-;32990:4;33028:2;33017:9;33013:18;33005:26;;33077:9;33071:4;33067:20;33063:1;33052:9;33048:17;33041:47;33105:131;33231:4;33105:131;:::i;:::-;33097:139;;32824:419;;;:::o;33249:::-;33415:4;33453:2;33442:9;33438:18;33430:26;;33502:9;33496:4;33492:20;33488:1;33477:9;33473:17;33466:47;33530:131;33656:4;33530:131;:::i;:::-;33522:139;;33249:419;;;:::o;33674:::-;33840:4;33878:2;33867:9;33863:18;33855:26;;33927:9;33921:4;33917:20;33913:1;33902:9;33898:17;33891:47;33955:131;34081:4;33955:131;:::i;:::-;33947:139;;33674:419;;;:::o;34099:::-;34265:4;34303:2;34292:9;34288:18;34280:26;;34352:9;34346:4;34342:20;34338:1;34327:9;34323:17;34316:47;34380:131;34506:4;34380:131;:::i;:::-;34372:139;;34099:419;;;:::o;34524:::-;34690:4;34728:2;34717:9;34713:18;34705:26;;34777:9;34771:4;34767:20;34763:1;34752:9;34748:17;34741:47;34805:131;34931:4;34805:131;:::i;:::-;34797:139;;34524:419;;;:::o;34949:::-;35115:4;35153:2;35142:9;35138:18;35130:26;;35202:9;35196:4;35192:20;35188:1;35177:9;35173:17;35166:47;35230:131;35356:4;35230:131;:::i;:::-;35222:139;;34949:419;;;:::o;35374:222::-;35467:4;35505:2;35494:9;35490:18;35482:26;;35518:71;35586:1;35575:9;35571:17;35562:6;35518:71;:::i;:::-;35374:222;;;;:::o;35602:129::-;35636:6;35663:20;;:::i;:::-;35653:30;;35692:33;35720:4;35712:6;35692:33;:::i;:::-;35602:129;;;:::o;35737:75::-;35770:6;35803:2;35797:9;35787:19;;35737:75;:::o;35818:311::-;35895:4;35985:18;35977:6;35974:30;35971:56;;;36007:18;;:::i;:::-;35971:56;36057:4;36049:6;36045:17;36037:25;;36117:4;36111;36107:15;36099:23;;35818:311;;;:::o;36135:307::-;36196:4;36286:18;36278:6;36275:30;36272:56;;;36308:18;;:::i;:::-;36272:56;36346:29;36368:6;36346:29;:::i;:::-;36338:37;;36430:4;36424;36420:15;36412:23;;36135:307;;;:::o;36448:308::-;36510:4;36600:18;36592:6;36589:30;36586:56;;;36622:18;;:::i;:::-;36586:56;36660:29;36682:6;36660:29;:::i;:::-;36652:37;;36744:4;36738;36734:15;36726:23;;36448:308;;;:::o;36762:132::-;36829:4;36852:3;36844:11;;36882:4;36877:3;36873:14;36865:22;;36762:132;;;:::o;36900:141::-;36949:4;36972:3;36964:11;;36995:3;36992:1;36985:14;37029:4;37026:1;37016:18;37008:26;;36900:141;;;:::o;37047:114::-;37114:6;37148:5;37142:12;37132:22;;37047:114;;;:::o;37167:98::-;37218:6;37252:5;37246:12;37236:22;;37167:98;;;:::o;37271:99::-;37323:6;37357:5;37351:12;37341:22;;37271:99;;;:::o;37376:113::-;37446:4;37478;37473:3;37469:14;37461:22;;37376:113;;;:::o;37495:184::-;37594:11;37628:6;37623:3;37616:19;37668:4;37663:3;37659:14;37644:29;;37495:184;;;;:::o;37685:168::-;37768:11;37802:6;37797:3;37790:19;37842:4;37837:3;37833:14;37818:29;;37685:168;;;;:::o;37859:147::-;37960:11;37997:3;37982:18;;37859:147;;;;:::o;38012:169::-;38096:11;38130:6;38125:3;38118:19;38170:4;38165:3;38161:14;38146:29;;38012:169;;;;:::o;38187:148::-;38289:11;38326:3;38311:18;;38187:148;;;;:::o;38341:305::-;38381:3;38400:20;38418:1;38400:20;:::i;:::-;38395:25;;38434:20;38452:1;38434:20;:::i;:::-;38429:25;;38588:1;38520:66;38516:74;38513:1;38510:81;38507:107;;;38594:18;;:::i;:::-;38507:107;38638:1;38635;38631:9;38624:16;;38341:305;;;;:::o;38652:185::-;38692:1;38709:20;38727:1;38709:20;:::i;:::-;38704:25;;38743:20;38761:1;38743:20;:::i;:::-;38738:25;;38782:1;38772:35;;38787:18;;:::i;:::-;38772:35;38829:1;38826;38822:9;38817:14;;38652:185;;;;:::o;38843:348::-;38883:7;38906:20;38924:1;38906:20;:::i;:::-;38901:25;;38940:20;38958:1;38940:20;:::i;:::-;38935:25;;39128:1;39060:66;39056:74;39053:1;39050:81;39045:1;39038:9;39031:17;39027:105;39024:131;;;39135:18;;:::i;:::-;39024:131;39183:1;39180;39176:9;39165:20;;38843:348;;;;:::o;39197:191::-;39237:4;39257:20;39275:1;39257:20;:::i;:::-;39252:25;;39291:20;39309:1;39291:20;:::i;:::-;39286:25;;39330:1;39327;39324:8;39321:34;;;39335:18;;:::i;:::-;39321:34;39380:1;39377;39373:9;39365:17;;39197:191;;;;:::o;39394:96::-;39431:7;39460:24;39478:5;39460:24;:::i;:::-;39449:35;;39394:96;;;:::o;39496:90::-;39530:7;39573:5;39566:13;39559:21;39548:32;;39496:90;;;:::o;39592:149::-;39628:7;39668:66;39661:5;39657:78;39646:89;;39592:149;;;:::o;39747:126::-;39784:7;39824:42;39817:5;39813:54;39802:65;;39747:126;;;:::o;39879:77::-;39916:7;39945:5;39934:16;;39879:77;;;:::o;39962:154::-;40046:6;40041:3;40036;40023:30;40108:1;40099:6;40094:3;40090:16;40083:27;39962:154;;;:::o;40122:307::-;40190:1;40200:113;40214:6;40211:1;40208:13;40200:113;;;40299:1;40294:3;40290:11;40284:18;40280:1;40275:3;40271:11;40264:39;40236:2;40233:1;40229:10;40224:15;;40200:113;;;40331:6;40328:1;40325:13;40322:101;;;40411:1;40402:6;40397:3;40393:16;40386:27;40322:101;40171:258;40122:307;;;:::o;40435:320::-;40479:6;40516:1;40510:4;40506:12;40496:22;;40563:1;40557:4;40553:12;40584:18;40574:81;;40640:4;40632:6;40628:17;40618:27;;40574:81;40702:2;40694:6;40691:14;40671:18;40668:38;40665:84;;;40721:18;;:::i;:::-;40665:84;40486:269;40435:320;;;:::o;40761:281::-;40844:27;40866:4;40844:27;:::i;:::-;40836:6;40832:40;40974:6;40962:10;40959:22;40938:18;40926:10;40923:34;40920:62;40917:88;;;40985:18;;:::i;:::-;40917:88;41025:10;41021:2;41014:22;40804:238;40761:281;;:::o;41048:233::-;41087:3;41110:24;41128:5;41110:24;:::i;:::-;41101:33;;41156:66;41149:5;41146:77;41143:103;;;41226:18;;:::i;:::-;41143:103;41273:1;41266:5;41262:13;41255:20;;41048:233;;;:::o;41287:176::-;41319:1;41336:20;41354:1;41336:20;:::i;:::-;41331:25;;41370:20;41388:1;41370:20;:::i;:::-;41365:25;;41409:1;41399:35;;41414:18;;:::i;:::-;41399:35;41455:1;41452;41448:9;41443:14;;41287:176;;;;:::o;41469:180::-;41517:77;41514:1;41507:88;41614:4;41611:1;41604:15;41638:4;41635:1;41628:15;41655:180;41703:77;41700:1;41693:88;41800:4;41797:1;41790:15;41824:4;41821:1;41814:15;41841:180;41889:77;41886:1;41879:88;41986:4;41983:1;41976:15;42010:4;42007:1;42000:15;42027:180;42075:77;42072:1;42065:88;42172:4;42169:1;42162:15;42196:4;42193:1;42186:15;42213:180;42261:77;42258:1;42251:88;42358:4;42355:1;42348:15;42382:4;42379:1;42372:15;42399:117;42508:1;42505;42498:12;42522:117;42631:1;42628;42621:12;42645:117;42754:1;42751;42744:12;42768:117;42877:1;42874;42867:12;42891:117;43000:1;42997;42990:12;43014:102;43055:6;43106:2;43102:7;43097:2;43090:5;43086:14;43082:28;43072:38;;43014:102;;;:::o;43122:180::-;43262:32;43258:1;43250:6;43246:14;43239:56;43122:180;:::o;43308:237::-;43448:34;43444:1;43436:6;43432:14;43425:58;43517:20;43512:2;43504:6;43500:15;43493:45;43308:237;:::o;43551:225::-;43691:34;43687:1;43679:6;43675:14;43668:58;43760:8;43755:2;43747:6;43743:15;43736:33;43551:225;:::o;43782:177::-;43922:29;43918:1;43910:6;43906:14;43899:53;43782:177;:::o;43965:224::-;44105:34;44101:1;44093:6;44089:14;44082:58;44174:7;44169:2;44161:6;44157:15;44150:32;43965:224;:::o;44195:178::-;44335:30;44331:1;44323:6;44319:14;44312:54;44195:178;:::o;44379:170::-;44519:22;44515:1;44507:6;44503:14;44496:46;44379:170;:::o;44555:223::-;44695:34;44691:1;44683:6;44679:14;44672:58;44764:6;44759:2;44751:6;44747:15;44740:31;44555:223;:::o;44784:175::-;44924:27;44920:1;44912:6;44908:14;44901:51;44784:175;:::o;44965:180::-;45105:32;45101:1;45093:6;45089:14;45082:56;44965:180;:::o;45151:::-;45291:32;45287:1;45279:6;45275:14;45268:56;45151:180;:::o;45337:228::-;45477:34;45473:1;45465:6;45461:14;45454:58;45546:11;45541:2;45533:6;45529:15;45522:36;45337:228;:::o;45571:249::-;45711:34;45707:1;45699:6;45695:14;45688:58;45780:32;45775:2;45767:6;45763:15;45756:57;45571:249;:::o;45826:182::-;45966:34;45962:1;45954:6;45950:14;45943:58;45826:182;:::o;46014:173::-;46154:25;46150:1;46142:6;46138:14;46131:49;46014:173;:::o;46193:182::-;46333:34;46329:1;46321:6;46317:14;46310:58;46193:182;:::o;46381:234::-;46521:34;46517:1;46509:6;46505:14;46498:58;46590:17;46585:2;46577:6;46573:15;46566:42;46381:234;:::o;46621:174::-;46761:26;46757:1;46749:6;46745:14;46738:50;46621:174;:::o;46801:220::-;46941:34;46937:1;46929:6;46925:14;46918:58;47010:3;47005:2;46997:6;46993:15;46986:28;46801:220;:::o;47027:114::-;;:::o;47147:170::-;47287:22;47283:1;47275:6;47271:14;47264:46;47147:170;:::o;47323:233::-;47463:34;47459:1;47451:6;47447:14;47440:58;47532:16;47527:2;47519:6;47515:15;47508:41;47323:233;:::o;47562:230::-;47702:34;47698:1;47690:6;47686:14;47679:58;47771:13;47766:2;47758:6;47754:15;47747:38;47562:230;:::o;47798:233::-;47938:34;47934:1;47926:6;47922:14;47915:58;48007:16;48002:2;47994:6;47990:15;47983:41;47798:233;:::o;48037:169::-;48177:21;48173:1;48165:6;48161:14;48154:45;48037:169;:::o;48212:122::-;48285:24;48303:5;48285:24;:::i;:::-;48278:5;48275:35;48265:63;;48324:1;48321;48314:12;48265:63;48212:122;:::o;48340:116::-;48410:21;48425:5;48410:21;:::i;:::-;48403:5;48400:32;48390:60;;48446:1;48443;48436:12;48390:60;48340:116;:::o;48462:120::-;48534:23;48551:5;48534:23;:::i;:::-;48527:5;48524:34;48514:62;;48572:1;48569;48562:12;48514:62;48462:120;:::o;48588:122::-;48661:24;48679:5;48661:24;:::i;:::-;48654:5;48651:35;48641:63;;48700:1;48697;48690:12;48641:63;48588:122;:::o

Swarm Source

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