ETH Price: $3,399.52 (+6.32%)
Gas: 25 Gwei

Token

Bad Babies (BAD)
 

Overview

Max Total Supply

1,000 BAD

Holders

257

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 BAD
0x7406e7ffdde8937f0348b7af24fb853e649d3d77
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:
BadBabies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-22
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/BadBabies.sol

pragma solidity ^0.8.7;






contract BadBabies is ERC721Enumerable, Ownable, Pausable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private _babiesIds;

  uint256 public _price = 0.04 ether;
  uint256 public _preSalePrice = 0.03 ether;
  uint256 public _specialSalePrice = 0.02 ether;

  uint256 public _publicSaleDate = 0; // Public sale starts, pre sale ends
  uint256 public _preSaleDate = 0; // Pre sale starts, special ends
  uint256 public _specialSaleDate = 0; // Special Starts

  uint256 public _maxMintAmount = 20;

  uint256 public _supply = 10000;
  string private _uri;
  mapping(address => bool) private _whitelist;

  constructor(
    string memory uri_
  )
    ERC721("Bad Babies", "BAD")
  {
    _uri = uri_;
    _pause();
  }

  function transfer(address to, uint256 tokenId) external {
    _transfer(msg.sender, to, tokenId);
  }

  modifier requireConditions(uint256 amount) {
    require(
      amount <= _maxMintAmount,
      "Bad Babies: Mint amount over max mint amount"
    );
    require(
      msg.value >= (cost() * amount),
      "Bad Babies: msg.value less than price"
    );
    require(
      _babiesIds.current() + amount <= _supply,
      "Bad Babies: Supply exceeded"
    );
    if (block.timestamp >= _publicSaleDate) {
      _;
    } else if (block.timestamp >= _preSaleDate) {
      //We are in pre sale
      require(_babiesIds.current() + amount <= 1000, "Bad Babies: Supply exceeded");
      require(_whitelist[msg.sender], "Bad Babies: Not in whitelist");
      _;
    } else if (block.timestamp >= _specialSaleDate) {
      //We are on special sale
      require(_babiesIds.current() + amount <= 1000, "Bad Babies: Supply exceeded");
      require(_whitelist[msg.sender], "Bad Babies: Not in whitelist");
      _;
    } else {
      revert("Bad Babies: Mintin not allowed");
    }
    
  }

  function cost() public view returns (uint256) {
    if (block.timestamp >= _publicSaleDate) {
      //We are in public sale
      return _price;
    } else if (block.timestamp >= _preSaleDate) {
      //We are in pre sale
      return _preSalePrice;
    } else if (block.timestamp >= _specialSaleDate) {
      //We are in special sale
      return _specialSalePrice;
    } else {
      return 0;
    }
  }

  /**
        @dev Mint new token and maps to receiver
    */
  function mint(uint256 amount)
    external
    payable
    whenNotPaused
    requireConditions(amount) 
  {
    for (uint256 i = 0; i < amount; i++) {
      _babiesIds.increment();
      _safeMint(msg.sender, _babiesIds.current());
    }
  }

  function allTokensByOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerBalance = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerBalance);
    for (uint256 i; i < ownerBalance; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  /**
        @dev Base URI getter
        @return Base URI
    */
  function _baseURI() internal view virtual override returns (string memory) {
    return _uri;
  }

  /**
        @dev Get token URI by token ID, adds .json extension
        @return URI of the token metadata 
    */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json"))
        : "";
  }

  /*
     ██████╗ ██╗    ██╗███╗   ██╗███████╗██████╗ 
    ██╔═══██╗██║    ██║████╗  ██║██╔════╝██╔══██╗
    ██║   ██║██║ █╗ ██║██╔██╗ ██║█████╗  ██████╔╝
    ██║   ██║██║███╗██║██║╚██╗██║██╔══╝  ██╔══██╗
    ╚██████╔╝╚███╔███╔╝██║ ╚████║███████╗██║  ██║
     ╚═════╝  ╚══╝╚══╝ ╚═╝  ╚═══╝╚══════╝╚═╝  ╚═╝                               
    */

  /**
    @ dev Mint a new token and gift it
    @p aram to Address that will receive the token
     
    function gift(address to) external onlyOwner {
        mint_(to);
    }*/

  /**
    @dev Burn a token
    @param tokenId ID of the token to be burned
     */
  function burn(uint256 tokenId) external onlyOwner {
    require(
      _isApprovedOrOwner(_msgSender(), tokenId),
      "ERC721Burnable: caller is not owner nor approved"
    );
    _burn(tokenId);
  }

  /**
    @dev Change Base URI can be used to reveal NFTs
    @param uri_ String of the new uri
     */
  function changeBaseURI(string memory uri_) external onlyOwner {
    _uri = uri_;
  }

  /**
    @dev Withdraw ETH balance to the owner
     */
  function withdraw() external onlyOwner {
    payable(owner()).transfer(address(this).balance);
  }

  /**
    @dev Change supply
    @param supply_ New supply
     */
  function changeSupply(uint256 supply_) external onlyOwner {
    require(supply_ >= totalSupply());
    _supply = supply_;
  }

  function changeMaxMintAmount(uint256 amount_) external onlyOwner {
    _maxMintAmount = amount_;
  }

  /**
    @dev Change token price
    @param price_ New price for tokens (1e18)
     */
  function changePrice(uint256 price_) external onlyOwner {
    _price = price_;
  }

  function changePreSalePrice(uint256 price_) external onlyOwner {
    _preSalePrice = price_;
  }

  function changeSpecialPrice(uint256 price_) external onlyOwner {
    _specialSalePrice = price_;
  }

  function updateDates(uint256 specialSaleDate_, uint256 preSaleDate_, uint256 publicSaleDate_) external onlyOwner {
    _specialSaleDate = specialSaleDate_;
    _preSaleDate = preSaleDate_;
    _publicSaleDate = publicSaleDate_;
  }

  function addToWhitelist(address wallet) external onlyOwner {
    _whitelist[wallet] = true;
  }

  function addToWhitelist(address[] memory wallets) public onlyOwner {
    for (uint256 i = 0; i < wallets.length; i++) {
      _whitelist[wallets[i]] = true;
    }
  }

  function isWhitelisted(address wallet) public view returns(bool) {
    return _whitelist[wallet];
  }

  function removeFromWhitelist(address wallet) external onlyOwner {
    _whitelist[wallet] = false;
  }

  function removeFromWhitelist(address[] memory wallets) external onlyOwner {
    for (uint256 i = 0; i < wallets.length; i++) {
      _whitelist[wallets[i]] = false;
    }
  }

  function airdrop(address[] memory to, uint256[] memory amounts) external onlyOwner {
    for (uint256 w = 0; w < to.length; w++) {
      for (uint256 i = 0; i < amounts[w]; i++) {
        _babiesIds.increment();
        _safeMint(to[w], _babiesIds.current());
      }
    }
  }

  function pause() external onlyOwner {
    _pause();
  }

  function unPause() external onlyOwner {
    _unpause();
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_specialSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_specialSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"allTokensByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"changeMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"changePreSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"changeSpecialPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply_","type":"uint256"}],"name":"changeSupply","outputs":[],"stateMutability":"nonpayable","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":"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":"wallet","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"specialSaleDate_","type":"uint256"},{"internalType":"uint256","name":"preSaleDate_","type":"uint256"},{"internalType":"uint256","name":"publicSaleDate_","type":"uint256"}],"name":"updateDates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052668e1bc9bf040000600c55666a94d74f430000600d5566470de4df820000600e556000600f556000601055600060115560146012556127106013553480156200004c57600080fd5b5060405162005e9838038062005e98833981810160405281019062000072919062000448565b6040518060400160405280600a81526020017f42616420426162696573000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42414400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f69291906200031a565b5080600190805190602001906200010f9291906200031a565b50505062000132620001266200017d60201b60201c565b6200018560201b60201c565b6000600a60146101000a81548160ff0219169083151502179055508060149080519060200190620001659291906200031a565b50620001766200024b60201b60201c565b5062000702565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200025b6200030360201b60201c565b156200029e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029590620004ee565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002ea6200017d60201b60201c565b604051620002f99190620004d1565b60405180910390a1565b6000600a60149054906101000a900460ff16905090565b8280546200032890620005ea565b90600052602060002090601f0160209004810192826200034c576000855562000398565b82601f106200036757805160ff191683800117855562000398565b8280016001018555821562000398579182015b82811115620003975782518255916020019190600101906200037a565b5b509050620003a79190620003ab565b5090565b5b80821115620003c6576000816000905550600101620003ac565b5090565b6000620003e1620003db8462000539565b62000510565b9050828152602081018484840111156200040057620003ff620006b9565b5b6200040d848285620005b4565b509392505050565b600082601f8301126200042d576200042c620006b4565b5b81516200043f848260208601620003ca565b91505092915050565b600060208284031215620004615762000460620006c3565b5b600082015167ffffffffffffffff811115620004825762000481620006be565b5b620004908482850162000415565b91505092915050565b620004a48162000580565b82525050565b6000620004b96010836200056f565b9150620004c682620006d9565b602082019050919050565b6000602082019050620004e8600083018462000499565b92915050565b600060208201905081810360008301526200050981620004aa565b9050919050565b60006200051c6200052f565b90506200052a828262000620565b919050565b6000604051905090565b600067ffffffffffffffff82111562000557576200055662000685565b5b6200056282620006c8565b9050602081019050919050565b600082825260208201905092915050565b60006200058d8262000594565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620005d4578082015181840152602081019050620005b7565b83811115620005e4576000848401525b50505050565b600060028204905060018216806200060357607f821691505b602082108114156200061a576200061962000656565b5b50919050565b6200062b82620006c8565b810181811067ffffffffffffffff821117156200064d576200064c62000685565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b61578680620007126000396000f3fe6080604052600436106102ae5760003560e01c80636352211e11610175578063a22cb465116100dc578063c87b56dd11610095578063e64250f21161006f578063e64250f214610a75578063e985e9c514610a9e578063f2fde38b14610adb578063f7b188a514610b04576102ae565b8063c87b56dd146109e4578063e36ba2af14610a21578063e43252d714610a4c576102ae565b8063a22cb465146108ec578063a2b40d1914610915578063a9059cbb1461093e578063b5a6951c14610967578063b85a4bfb14610992578063b88d4fde146109bb576102ae565b80637f6497831161012e5780637f649783146108115780638456cb591461083a5780638ab1d681146108515780638da5cb5b1461087a57806395d89b41146108a5578063a0712d68146108d0576102ae565b80636352211e146106ef578063672434821461072c578063693f3b1a1461075557806370a0823114610780578063715018a6146107bd57806374cbed31146107d4576102ae565b806323b872dd1161021957806342842e0e116101d257806342842e0e146105e357806342966c681461060c5780634f6ccce7146106355780635356d4cd14610672578063548db1741461069b5780635c975abb146106c4576102ae565b806323b872dd146104d75780632f745c591461050057806339a0c6f91461053d57806339a7919f146105665780633af32abf1461058f5780633ccfd60b146105cc576102ae565b80630c430c221161026b5780630c430c22146103d75780630ecc9b281461040257806313faede61461042b578063159457901461045657806318160ddd14610481578063235b6ea1146104ac576102ae565b8063016d4975146102b357806301ffc9a7146102de57806302bcc4181461031b57806306fdde0314610346578063081812fc14610371578063095ea7b3146103ae575b600080fd5b3480156102bf57600080fd5b506102c8610b1b565b6040516102d59190614ab9565b60405180910390f35b3480156102ea57600080fd5b506103056004803603810190610300919061405b565b610b21565b604051610312919061473c565b60405180910390f35b34801561032757600080fd5b50610330610b9b565b60405161033d9190614ab9565b60405180910390f35b34801561035257600080fd5b5061035b610ba1565b6040516103689190614757565b60405180910390f35b34801561037d57600080fd5b50610398600480360381019061039391906140fe565b610c33565b6040516103a591906146b3565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613f5a565b610cb8565b005b3480156103e357600080fd5b506103ec610dd0565b6040516103f99190614ab9565b60405180910390f35b34801561040e57600080fd5b50610429600480360381019061042491906140fe565b610dd6565b005b34801561043757600080fd5b50610440610e5c565b60405161044d9190614ab9565b60405180910390f35b34801561046257600080fd5b5061046b610e9f565b6040516104789190614ab9565b60405180910390f35b34801561048d57600080fd5b50610496610ea5565b6040516104a39190614ab9565b60405180910390f35b3480156104b857600080fd5b506104c1610eb2565b6040516104ce9190614ab9565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613e44565b610eb8565b005b34801561050c57600080fd5b5061052760048036038101906105229190613f5a565b610f18565b6040516105349190614ab9565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f91906140b5565b610fbd565b005b34801561057257600080fd5b5061058d600480360381019061058891906140fe565b611053565b005b34801561059b57600080fd5b506105b660048036038101906105b19190613dd7565b6110ed565b6040516105c3919061473c565b60405180910390f35b3480156105d857600080fd5b506105e1611143565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190613e44565b61120f565b005b34801561061857600080fd5b50610633600480360381019061062e91906140fe565b61122f565b005b34801561064157600080fd5b5061065c600480360381019061065791906140fe565b611307565b6040516106699190614ab9565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906140fe565b611378565b005b3480156106a757600080fd5b506106c260048036038101906106bd9190613f9a565b6113fe565b005b3480156106d057600080fd5b506106d961150f565b6040516106e6919061473c565b60405180910390f35b3480156106fb57600080fd5b50610716600480360381019061071191906140fe565b611526565b60405161072391906146b3565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613fe3565b6115d8565b005b34801561076157600080fd5b5061076a6116e8565b6040516107779190614ab9565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613dd7565b6116ee565b6040516107b49190614ab9565b60405180910390f35b3480156107c957600080fd5b506107d26117a6565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613dd7565b61182e565b604051610808919061471a565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613f9a565b6118dc565b005b34801561084657600080fd5b5061084f6119ed565b005b34801561085d57600080fd5b5061087860048036038101906108739190613dd7565b611a73565b005b34801561088657600080fd5b5061088f611b4a565b60405161089c91906146b3565b60405180910390f35b3480156108b157600080fd5b506108ba611b74565b6040516108c79190614757565b60405180910390f35b6108ea60048036038101906108e591906140fe565b611c06565b005b3480156108f857600080fd5b50610913600480360381019061090e9190613f1a565b61202b565b005b34801561092157600080fd5b5061093c600480360381019061093791906140fe565b612041565b005b34801561094a57600080fd5b5061096560048036038101906109609190613f5a565b6120c7565b005b34801561097357600080fd5b5061097c6120d6565b6040516109899190614ab9565b60405180910390f35b34801561099e57600080fd5b506109b960048036038101906109b491906140fe565b6120dc565b005b3480156109c757600080fd5b506109e260048036038101906109dd9190613e97565b612162565b005b3480156109f057600080fd5b50610a0b6004803603810190610a0691906140fe565b6121c4565b604051610a189190614757565b60405180910390f35b348015610a2d57600080fd5b50610a3661226b565b604051610a439190614ab9565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190613dd7565b612271565b005b348015610a8157600080fd5b50610a9c6004803603810190610a97919061412b565b612348565b005b348015610aaa57600080fd5b50610ac56004803603810190610ac09190613e04565b6123de565b604051610ad2919061473c565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190613dd7565b612472565b005b348015610b1057600080fd5b50610b1961256a565b005b600d5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b945750610b93826125f0565b5b9050919050565b600e5481565b606060008054610bb090614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc90614dfa565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c3e826126d2565b610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490614979565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc382611526565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906149f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5361273e565b73ffffffffffffffffffffffffffffffffffffffff161480610d825750610d8181610d7c61273e565b6123de565b5b610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db8906148f9565b60405180910390fd5b610dcb8383612746565b505050565b60105481565b610dde61273e565b73ffffffffffffffffffffffffffffffffffffffff16610dfc611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990614999565b60405180910390fd5b80600e8190555050565b6000600f544210610e7157600c549050610e9c565b6010544210610e8457600d549050610e9c565b6011544210610e9757600e549050610e9c565b600090505b90565b60135481565b6000600880549050905090565b600c5481565b610ec9610ec361273e565b826127ff565b610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90614a19565b60405180910390fd5b610f138383836128dd565b505050565b6000610f23836116ee565b8210610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b906147b9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fc561273e565b73ffffffffffffffffffffffffffffffffffffffff16610fe3611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614999565b60405180910390fd5b806014908051906020019061104f929190613aaf565b5050565b61105b61273e565b73ffffffffffffffffffffffffffffffffffffffff16611079611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690614999565b60405180910390fd5b6110d7610ea5565b8110156110e357600080fd5b8060138190555050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61114b61273e565b73ffffffffffffffffffffffffffffffffffffffff16611169611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690614999565b60405180910390fd5b6111c7611b4a565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561120c573d6000803e3d6000fd5b50565b61122a83838360405180602001604052806000815250612162565b505050565b61123761273e565b73ffffffffffffffffffffffffffffffffffffffff16611255611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614999565b60405180910390fd5b6112bc6112b661273e565b826127ff565b6112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290614a59565b60405180910390fd5b61130481612b39565b50565b6000611311610ea5565b8210611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990614a39565b60405180910390fd5b6008828154811061136657611365614f93565b5b90600052602060002001549050919050565b61138061273e565b73ffffffffffffffffffffffffffffffffffffffff1661139e611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90614999565b60405180910390fd5b8060128190555050565b61140661273e565b73ffffffffffffffffffffffffffffffffffffffff16611424611b4a565b73ffffffffffffffffffffffffffffffffffffffff161461147a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147190614999565b60405180910390fd5b60005b815181101561150b5760006015600084848151811061149f5761149e614f93565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061150390614e5d565b91505061147d565b5050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690614939565b60405180910390fd5b80915050919050565b6115e061273e565b73ffffffffffffffffffffffffffffffffffffffff166115fe611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614999565b60405180910390fd5b60005b82518110156116e35760005b82828151811061167657611675614f93565b5b60200260200101518110156116cf5761168f600b612c4a565b6116bc8483815181106116a5576116a4614f93565b5b60200260200101516116b7600b612c60565b612c6e565b80806116c790614e5d565b915050611663565b5080806116db90614e5d565b915050611657565b505050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690614919565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ae61273e565b73ffffffffffffffffffffffffffffffffffffffff166117cc611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614999565b60405180910390fd5b61182c6000612c8c565b565b6060600061183b836116ee565b905060008167ffffffffffffffff81111561185957611858614fc2565b5b6040519080825280602002602001820160405280156118875781602001602082028036833780820191505090505b50905060005b828110156118d15761189f8582610f18565b8282815181106118b2576118b1614f93565b5b60200260200101818152505080806118c990614e5d565b91505061188d565b508092505050919050565b6118e461273e565b73ffffffffffffffffffffffffffffffffffffffff16611902611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614999565b60405180910390fd5b60005b81518110156119e95760016015600084848151811061197d5761197c614f93565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806119e190614e5d565b91505061195b565b5050565b6119f561273e565b73ffffffffffffffffffffffffffffffffffffffff16611a13611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090614999565b60405180910390fd5b611a71612d52565b565b611a7b61273e565b73ffffffffffffffffffffffffffffffffffffffff16611a99611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690614999565b60405180910390fd5b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b8390614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054611baf90614dfa565b8015611bfc5780601f10611bd157610100808354040283529160200191611bfc565b820191906000526020600020905b815481529060010190602001808311611bdf57829003601f168201915b5050505050905090565b611c0e61150f565b15611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c45906148d9565b60405180910390fd5b80601254811115611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b90614a79565b60405180910390fd5b80611c9d610e5c565b611ca79190614cb6565b341015611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce090614a99565b60405180910390fd5b60135481611cf7600b612c60565b611d019190614c2f565b1115611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990614779565b60405180910390fd5b600f544210611d8c5760005b82811015611d8657611d60600b612c4a565b611d7333611d6e600b612c60565b612c6e565b8080611d7e90614e5d565b915050611d4e565b50612027565b6010544210611ebb576103e881611da3600b612c60565b611dad9190614c2f565b1115611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de590614779565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e71906148b9565b60405180910390fd5b60005b82811015611eb557611e8f600b612c4a565b611ea233611e9d600b612c60565b612c6e565b8080611ead90614e5d565b915050611e7d565b50612026565b6011544210611fea576103e881611ed2600b612c60565b611edc9190614c2f565b1115611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490614779565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa0906148b9565b60405180910390fd5b60005b82811015611fe457611fbe600b612c4a565b611fd133611fcc600b612c60565b612c6e565b8080611fdc90614e5d565b915050611fac565b50612025565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614879565b60405180910390fd5b5b5b5050565b61203d61203661273e565b8383612df5565b5050565b61204961273e565b73ffffffffffffffffffffffffffffffffffffffff16612067611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490614999565b60405180910390fd5b80600c8190555050565b6120d23383836128dd565b5050565b600f5481565b6120e461273e565b73ffffffffffffffffffffffffffffffffffffffff16612102611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214f90614999565b60405180910390fd5b80600d8190555050565b61217361216d61273e565b836127ff565b6121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614a19565b60405180910390fd5b6121be84848484612f62565b50505050565b60606121cf826126d2565b61220e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612205906149d9565b60405180910390fd5b6000612218612fbe565b905060008151116122385760405180602001604052806000815250612263565b8061224284613050565b604051602001612253929190614684565b6040516020818303038152906040525b915050919050565b60115481565b61227961273e565b73ffffffffffffffffffffffffffffffffffffffff16612297611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e490614999565b60405180910390fd5b6001601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61235061273e565b73ffffffffffffffffffffffffffffffffffffffff1661236e611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614999565b60405180910390fd5b826011819055508160108190555080600f81905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61247a61273e565b73ffffffffffffffffffffffffffffffffffffffff16612498611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e590614999565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612555906147f9565b60405180910390fd5b61256781612c8c565b50565b61257261273e565b73ffffffffffffffffffffffffffffffffffffffff16612590611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614999565b60405180910390fd5b6125ee6131b1565b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126bb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126cb57506126ca82613253565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127b983611526565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061280a826126d2565b612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284090614899565b60405180910390fd5b600061285483611526565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128c357508373ffffffffffffffffffffffffffffffffffffffff166128ab84610c33565b73ffffffffffffffffffffffffffffffffffffffff16145b806128d457506128d381856123de565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128fd82611526565b73ffffffffffffffffffffffffffffffffffffffff1614612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294a906149b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ba90614839565b60405180910390fd5b6129ce8383836132bd565b6129d9600082612746565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a299190614d10565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a809190614c2f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612b4482611526565b9050612b52816000846132bd565b612b5d600083612746565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bad9190614d10565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612c888282604051806020016040528060008152506133d1565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d5a61150f565b15612d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d91906148d9565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612dde61273e565b604051612deb91906146b3565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b90614859565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f55919061473c565b60405180910390a3505050565b612f6d8484846128dd565b612f798484848461342c565b612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf906147d9565b60405180910390fd5b50505050565b606060148054612fcd90614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff990614dfa565b80156130465780601f1061301b57610100808354040283529160200191613046565b820191906000526020600020905b81548152906001019060200180831161302957829003601f168201915b5050505050905090565b60606000821415613098576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131ac565b600082905060005b600082146130ca5780806130b390614e5d565b915050600a826130c39190614c85565b91506130a0565b60008167ffffffffffffffff8111156130e6576130e5614fc2565b5b6040519080825280601f01601f1916602001820160405280156131185781602001600182028036833780820191505090505b5090505b600085146131a5576001826131319190614d10565b9150600a856131409190614ea6565b603061314c9190614c2f565b60f81b81838151811061316257613161614f93565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561319e9190614c85565b945061311c565b8093505050505b919050565b6131b961150f565b6131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef90614799565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61323c61273e565b60405161324991906146b3565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132c88383836135c3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561330b57613306816135c8565b61334a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613349576133488382613611565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338d576133888161377e565b6133cc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133cb576133ca828261384f565b5b5b505050565b6133db83836138ce565b6133e8600084848461342c565b613427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341e906147d9565b60405180910390fd5b505050565b600061344d8473ffffffffffffffffffffffffffffffffffffffff16613a9c565b156135b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261347661273e565b8786866040518563ffffffff1660e01b815260040161349894939291906146ce565b602060405180830381600087803b1580156134b257600080fd5b505af19250505080156134e357506040513d601f19601f820116820180604052508101906134e09190614088565b60015b613566573d8060008114613513576040519150601f19603f3d011682016040523d82523d6000602084013e613518565b606091505b5060008151141561355e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613555906147d9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135bb565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161361e846116ee565b6136289190614d10565b905060006007600084815260200190815260200160002054905081811461370d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137929190614d10565b90506000600960008481526020019081526020016000205490506000600883815481106137c2576137c1614f93565b5b9060005260206000200154905080600883815481106137e4576137e3614f93565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061383357613832614f64565b5b6001900381819060005260206000200160009055905550505050565b600061385a836116ee565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393590614959565b60405180910390fd5b613947816126d2565b15613987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397e90614819565b60405180910390fd5b613993600083836132bd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139e39190614c2f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613abb90614dfa565b90600052602060002090601f016020900481019282613add5760008555613b24565b82601f10613af657805160ff1916838001178555613b24565b82800160010185558215613b24579182015b82811115613b23578251825591602001919060010190613b08565b5b509050613b319190613b35565b5090565b5b80821115613b4e576000816000905550600101613b36565b5090565b6000613b65613b6084614af9565b614ad4565b90508083825260208201905082856020860282011115613b8857613b87614ff6565b5b60005b85811015613bb85781613b9e8882613cb6565b845260208401935060208301925050600181019050613b8b565b5050509392505050565b6000613bd5613bd084614b25565b614ad4565b90508083825260208201905082856020860282011115613bf857613bf7614ff6565b5b60005b85811015613c285781613c0e8882613dc2565b845260208401935060208301925050600181019050613bfb565b5050509392505050565b6000613c45613c4084614b51565b614ad4565b905082815260208101848484011115613c6157613c60614ffb565b5b613c6c848285614db8565b509392505050565b6000613c87613c8284614b82565b614ad4565b905082815260208101848484011115613ca357613ca2614ffb565b5b613cae848285614db8565b509392505050565b600081359050613cc5816156f4565b92915050565b600082601f830112613ce057613cdf614ff1565b5b8135613cf0848260208601613b52565b91505092915050565b600082601f830112613d0e57613d0d614ff1565b5b8135613d1e848260208601613bc2565b91505092915050565b600081359050613d368161570b565b92915050565b600081359050613d4b81615722565b92915050565b600081519050613d6081615722565b92915050565b600082601f830112613d7b57613d7a614ff1565b5b8135613d8b848260208601613c32565b91505092915050565b600082601f830112613da957613da8614ff1565b5b8135613db9848260208601613c74565b91505092915050565b600081359050613dd181615739565b92915050565b600060208284031215613ded57613dec615005565b5b6000613dfb84828501613cb6565b91505092915050565b60008060408385031215613e1b57613e1a615005565b5b6000613e2985828601613cb6565b9250506020613e3a85828601613cb6565b9150509250929050565b600080600060608486031215613e5d57613e5c615005565b5b6000613e6b86828701613cb6565b9350506020613e7c86828701613cb6565b9250506040613e8d86828701613dc2565b9150509250925092565b60008060008060808587031215613eb157613eb0615005565b5b6000613ebf87828801613cb6565b9450506020613ed087828801613cb6565b9350506040613ee187828801613dc2565b925050606085013567ffffffffffffffff811115613f0257613f01615000565b5b613f0e87828801613d66565b91505092959194509250565b60008060408385031215613f3157613f30615005565b5b6000613f3f85828601613cb6565b9250506020613f5085828601613d27565b9150509250929050565b60008060408385031215613f7157613f70615005565b5b6000613f7f85828601613cb6565b9250506020613f9085828601613dc2565b9150509250929050565b600060208284031215613fb057613faf615005565b5b600082013567ffffffffffffffff811115613fce57613fcd615000565b5b613fda84828501613ccb565b91505092915050565b60008060408385031215613ffa57613ff9615005565b5b600083013567ffffffffffffffff81111561401857614017615000565b5b61402485828601613ccb565b925050602083013567ffffffffffffffff81111561404557614044615000565b5b61405185828601613cf9565b9150509250929050565b60006020828403121561407157614070615005565b5b600061407f84828501613d3c565b91505092915050565b60006020828403121561409e5761409d615005565b5b60006140ac84828501613d51565b91505092915050565b6000602082840312156140cb576140ca615005565b5b600082013567ffffffffffffffff8111156140e9576140e8615000565b5b6140f584828501613d94565b91505092915050565b60006020828403121561411457614113615005565b5b600061412284828501613dc2565b91505092915050565b60008060006060848603121561414457614143615005565b5b600061415286828701613dc2565b935050602061416386828701613dc2565b925050604061417486828701613dc2565b9150509250925092565b600061418a8383614666565b60208301905092915050565b61419f81614d44565b82525050565b60006141b082614bc3565b6141ba8185614bf1565b93506141c583614bb3565b8060005b838110156141f65781516141dd888261417e565b97506141e883614be4565b9250506001810190506141c9565b5085935050505092915050565b61420c81614d56565b82525050565b600061421d82614bce565b6142278185614c02565b9350614237818560208601614dc7565b6142408161500a565b840191505092915050565b600061425682614bd9565b6142608185614c13565b9350614270818560208601614dc7565b6142798161500a565b840191505092915050565b600061428f82614bd9565b6142998185614c24565b93506142a9818560208601614dc7565b80840191505092915050565b60006142c2601b83614c13565b91506142cd8261501b565b602082019050919050565b60006142e5601483614c13565b91506142f082615044565b602082019050919050565b6000614308602b83614c13565b91506143138261506d565b604082019050919050565b600061432b603283614c13565b9150614336826150bc565b604082019050919050565b600061434e602683614c13565b91506143598261510b565b604082019050919050565b6000614371601c83614c13565b915061437c8261515a565b602082019050919050565b6000614394602483614c13565b915061439f82615183565b604082019050919050565b60006143b7601983614c13565b91506143c2826151d2565b602082019050919050565b60006143da601e83614c13565b91506143e5826151fb565b602082019050919050565b60006143fd602c83614c13565b915061440882615224565b604082019050919050565b6000614420601c83614c13565b915061442b82615273565b602082019050919050565b6000614443601083614c13565b915061444e8261529c565b602082019050919050565b6000614466603883614c13565b9150614471826152c5565b604082019050919050565b6000614489602a83614c13565b915061449482615314565b604082019050919050565b60006144ac602983614c13565b91506144b782615363565b604082019050919050565b60006144cf602083614c13565b91506144da826153b2565b602082019050919050565b60006144f2602c83614c13565b91506144fd826153db565b604082019050919050565b6000614515600583614c24565b91506145208261542a565b600582019050919050565b6000614538602083614c13565b915061454382615453565b602082019050919050565b600061455b602983614c13565b91506145668261547c565b604082019050919050565b600061457e602f83614c13565b9150614589826154cb565b604082019050919050565b60006145a1602183614c13565b91506145ac8261551a565b604082019050919050565b60006145c4603183614c13565b91506145cf82615569565b604082019050919050565b60006145e7602c83614c13565b91506145f2826155b8565b604082019050919050565b600061460a603083614c13565b915061461582615607565b604082019050919050565b600061462d602c83614c13565b915061463882615656565b604082019050919050565b6000614650602583614c13565b915061465b826156a5565b604082019050919050565b61466f81614dae565b82525050565b61467e81614dae565b82525050565b60006146908285614284565b915061469c8284614284565b91506146a782614508565b91508190509392505050565b60006020820190506146c86000830184614196565b92915050565b60006080820190506146e36000830187614196565b6146f06020830186614196565b6146fd6040830185614675565b818103606083015261470f8184614212565b905095945050505050565b6000602082019050818103600083015261473481846141a5565b905092915050565b60006020820190506147516000830184614203565b92915050565b60006020820190508181036000830152614771818461424b565b905092915050565b60006020820190508181036000830152614792816142b5565b9050919050565b600060208201905081810360008301526147b2816142d8565b9050919050565b600060208201905081810360008301526147d2816142fb565b9050919050565b600060208201905081810360008301526147f28161431e565b9050919050565b6000602082019050818103600083015261481281614341565b9050919050565b6000602082019050818103600083015261483281614364565b9050919050565b6000602082019050818103600083015261485281614387565b9050919050565b60006020820190508181036000830152614872816143aa565b9050919050565b60006020820190508181036000830152614892816143cd565b9050919050565b600060208201905081810360008301526148b2816143f0565b9050919050565b600060208201905081810360008301526148d281614413565b9050919050565b600060208201905081810360008301526148f281614436565b9050919050565b6000602082019050818103600083015261491281614459565b9050919050565b600060208201905081810360008301526149328161447c565b9050919050565b600060208201905081810360008301526149528161449f565b9050919050565b60006020820190508181036000830152614972816144c2565b9050919050565b60006020820190508181036000830152614992816144e5565b9050919050565b600060208201905081810360008301526149b28161452b565b9050919050565b600060208201905081810360008301526149d28161454e565b9050919050565b600060208201905081810360008301526149f281614571565b9050919050565b60006020820190508181036000830152614a1281614594565b9050919050565b60006020820190508181036000830152614a32816145b7565b9050919050565b60006020820190508181036000830152614a52816145da565b9050919050565b60006020820190508181036000830152614a72816145fd565b9050919050565b60006020820190508181036000830152614a9281614620565b9050919050565b60006020820190508181036000830152614ab281614643565b9050919050565b6000602082019050614ace6000830184614675565b92915050565b6000614ade614aef565b9050614aea8282614e2c565b919050565b6000604051905090565b600067ffffffffffffffff821115614b1457614b13614fc2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b4057614b3f614fc2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b6c57614b6b614fc2565b5b614b758261500a565b9050602081019050919050565b600067ffffffffffffffff821115614b9d57614b9c614fc2565b5b614ba68261500a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3a82614dae565b9150614c4583614dae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7a57614c79614ed7565b5b828201905092915050565b6000614c9082614dae565b9150614c9b83614dae565b925082614cab57614caa614f06565b5b828204905092915050565b6000614cc182614dae565b9150614ccc83614dae565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0557614d04614ed7565b5b828202905092915050565b6000614d1b82614dae565b9150614d2683614dae565b925082821015614d3957614d38614ed7565b5b828203905092915050565b6000614d4f82614d8e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614de5578082015181840152602081019050614dca565b83811115614df4576000848401525b50505050565b60006002820490506001821680614e1257607f821691505b60208210811415614e2657614e25614f35565b5b50919050565b614e358261500a565b810181811067ffffffffffffffff82111715614e5457614e53614fc2565b5b80604052505050565b6000614e6882614dae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e9b57614e9a614ed7565b5b600182019050919050565b6000614eb182614dae565b9150614ebc83614dae565b925082614ecc57614ecb614f06565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f426164204261626965733a20537570706c792065786365656465640000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f426164204261626965733a204d696e74696e206e6f7420616c6c6f7765640000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f426164204261626965733a204e6f7420696e2077686974656c69737400000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f426164204261626965733a204d696e7420616d6f756e74206f766572206d617860008201527f206d696e7420616d6f756e740000000000000000000000000000000000000000602082015250565b7f426164204261626965733a206d73672e76616c7565206c657373207468616e2060008201527f7072696365000000000000000000000000000000000000000000000000000000602082015250565b6156fd81614d44565b811461570857600080fd5b50565b61571481614d56565b811461571f57600080fd5b50565b61572b81614d62565b811461573657600080fd5b50565b61574281614dae565b811461574d57600080fd5b5056fea2646970667358221220fa8827327ef7fac53947fbd762150d63736ad586f7b724bc7a71ded8ac1ec6fa64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d585867466441475670346d6b394d45393134384d663154437636765138314476614d454b5a616b66526842412f00000000000000000000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80636352211e11610175578063a22cb465116100dc578063c87b56dd11610095578063e64250f21161006f578063e64250f214610a75578063e985e9c514610a9e578063f2fde38b14610adb578063f7b188a514610b04576102ae565b8063c87b56dd146109e4578063e36ba2af14610a21578063e43252d714610a4c576102ae565b8063a22cb465146108ec578063a2b40d1914610915578063a9059cbb1461093e578063b5a6951c14610967578063b85a4bfb14610992578063b88d4fde146109bb576102ae565b80637f6497831161012e5780637f649783146108115780638456cb591461083a5780638ab1d681146108515780638da5cb5b1461087a57806395d89b41146108a5578063a0712d68146108d0576102ae565b80636352211e146106ef578063672434821461072c578063693f3b1a1461075557806370a0823114610780578063715018a6146107bd57806374cbed31146107d4576102ae565b806323b872dd1161021957806342842e0e116101d257806342842e0e146105e357806342966c681461060c5780634f6ccce7146106355780635356d4cd14610672578063548db1741461069b5780635c975abb146106c4576102ae565b806323b872dd146104d75780632f745c591461050057806339a0c6f91461053d57806339a7919f146105665780633af32abf1461058f5780633ccfd60b146105cc576102ae565b80630c430c221161026b5780630c430c22146103d75780630ecc9b281461040257806313faede61461042b578063159457901461045657806318160ddd14610481578063235b6ea1146104ac576102ae565b8063016d4975146102b357806301ffc9a7146102de57806302bcc4181461031b57806306fdde0314610346578063081812fc14610371578063095ea7b3146103ae575b600080fd5b3480156102bf57600080fd5b506102c8610b1b565b6040516102d59190614ab9565b60405180910390f35b3480156102ea57600080fd5b506103056004803603810190610300919061405b565b610b21565b604051610312919061473c565b60405180910390f35b34801561032757600080fd5b50610330610b9b565b60405161033d9190614ab9565b60405180910390f35b34801561035257600080fd5b5061035b610ba1565b6040516103689190614757565b60405180910390f35b34801561037d57600080fd5b50610398600480360381019061039391906140fe565b610c33565b6040516103a591906146b3565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d09190613f5a565b610cb8565b005b3480156103e357600080fd5b506103ec610dd0565b6040516103f99190614ab9565b60405180910390f35b34801561040e57600080fd5b50610429600480360381019061042491906140fe565b610dd6565b005b34801561043757600080fd5b50610440610e5c565b60405161044d9190614ab9565b60405180910390f35b34801561046257600080fd5b5061046b610e9f565b6040516104789190614ab9565b60405180910390f35b34801561048d57600080fd5b50610496610ea5565b6040516104a39190614ab9565b60405180910390f35b3480156104b857600080fd5b506104c1610eb2565b6040516104ce9190614ab9565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613e44565b610eb8565b005b34801561050c57600080fd5b5061052760048036038101906105229190613f5a565b610f18565b6040516105349190614ab9565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f91906140b5565b610fbd565b005b34801561057257600080fd5b5061058d600480360381019061058891906140fe565b611053565b005b34801561059b57600080fd5b506105b660048036038101906105b19190613dd7565b6110ed565b6040516105c3919061473c565b60405180910390f35b3480156105d857600080fd5b506105e1611143565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190613e44565b61120f565b005b34801561061857600080fd5b50610633600480360381019061062e91906140fe565b61122f565b005b34801561064157600080fd5b5061065c600480360381019061065791906140fe565b611307565b6040516106699190614ab9565b60405180910390f35b34801561067e57600080fd5b50610699600480360381019061069491906140fe565b611378565b005b3480156106a757600080fd5b506106c260048036038101906106bd9190613f9a565b6113fe565b005b3480156106d057600080fd5b506106d961150f565b6040516106e6919061473c565b60405180910390f35b3480156106fb57600080fd5b50610716600480360381019061071191906140fe565b611526565b60405161072391906146b3565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613fe3565b6115d8565b005b34801561076157600080fd5b5061076a6116e8565b6040516107779190614ab9565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613dd7565b6116ee565b6040516107b49190614ab9565b60405180910390f35b3480156107c957600080fd5b506107d26117a6565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613dd7565b61182e565b604051610808919061471a565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613f9a565b6118dc565b005b34801561084657600080fd5b5061084f6119ed565b005b34801561085d57600080fd5b5061087860048036038101906108739190613dd7565b611a73565b005b34801561088657600080fd5b5061088f611b4a565b60405161089c91906146b3565b60405180910390f35b3480156108b157600080fd5b506108ba611b74565b6040516108c79190614757565b60405180910390f35b6108ea60048036038101906108e591906140fe565b611c06565b005b3480156108f857600080fd5b50610913600480360381019061090e9190613f1a565b61202b565b005b34801561092157600080fd5b5061093c600480360381019061093791906140fe565b612041565b005b34801561094a57600080fd5b5061096560048036038101906109609190613f5a565b6120c7565b005b34801561097357600080fd5b5061097c6120d6565b6040516109899190614ab9565b60405180910390f35b34801561099e57600080fd5b506109b960048036038101906109b491906140fe565b6120dc565b005b3480156109c757600080fd5b506109e260048036038101906109dd9190613e97565b612162565b005b3480156109f057600080fd5b50610a0b6004803603810190610a0691906140fe565b6121c4565b604051610a189190614757565b60405180910390f35b348015610a2d57600080fd5b50610a3661226b565b604051610a439190614ab9565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190613dd7565b612271565b005b348015610a8157600080fd5b50610a9c6004803603810190610a97919061412b565b612348565b005b348015610aaa57600080fd5b50610ac56004803603810190610ac09190613e04565b6123de565b604051610ad2919061473c565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190613dd7565b612472565b005b348015610b1057600080fd5b50610b1961256a565b005b600d5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b945750610b93826125f0565b5b9050919050565b600e5481565b606060008054610bb090614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdc90614dfa565b8015610c295780601f10610bfe57610100808354040283529160200191610c29565b820191906000526020600020905b815481529060010190602001808311610c0c57829003601f168201915b5050505050905090565b6000610c3e826126d2565b610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7490614979565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc382611526565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906149f9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5361273e565b73ffffffffffffffffffffffffffffffffffffffff161480610d825750610d8181610d7c61273e565b6123de565b5b610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db8906148f9565b60405180910390fd5b610dcb8383612746565b505050565b60105481565b610dde61273e565b73ffffffffffffffffffffffffffffffffffffffff16610dfc611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990614999565b60405180910390fd5b80600e8190555050565b6000600f544210610e7157600c549050610e9c565b6010544210610e8457600d549050610e9c565b6011544210610e9757600e549050610e9c565b600090505b90565b60135481565b6000600880549050905090565b600c5481565b610ec9610ec361273e565b826127ff565b610f08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eff90614a19565b60405180910390fd5b610f138383836128dd565b505050565b6000610f23836116ee565b8210610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b906147b9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fc561273e565b73ffffffffffffffffffffffffffffffffffffffff16610fe3611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611039576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103090614999565b60405180910390fd5b806014908051906020019061104f929190613aaf565b5050565b61105b61273e565b73ffffffffffffffffffffffffffffffffffffffff16611079611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690614999565b60405180910390fd5b6110d7610ea5565b8110156110e357600080fd5b8060138190555050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61114b61273e565b73ffffffffffffffffffffffffffffffffffffffff16611169611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690614999565b60405180910390fd5b6111c7611b4a565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561120c573d6000803e3d6000fd5b50565b61122a83838360405180602001604052806000815250612162565b505050565b61123761273e565b73ffffffffffffffffffffffffffffffffffffffff16611255611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614999565b60405180910390fd5b6112bc6112b661273e565b826127ff565b6112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290614a59565b60405180910390fd5b61130481612b39565b50565b6000611311610ea5565b8210611352576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134990614a39565b60405180910390fd5b6008828154811061136657611365614f93565b5b90600052602060002001549050919050565b61138061273e565b73ffffffffffffffffffffffffffffffffffffffff1661139e611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb90614999565b60405180910390fd5b8060128190555050565b61140661273e565b73ffffffffffffffffffffffffffffffffffffffff16611424611b4a565b73ffffffffffffffffffffffffffffffffffffffff161461147a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147190614999565b60405180910390fd5b60005b815181101561150b5760006015600084848151811061149f5761149e614f93565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061150390614e5d565b91505061147d565b5050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c690614939565b60405180910390fd5b80915050919050565b6115e061273e565b73ffffffffffffffffffffffffffffffffffffffff166115fe611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164b90614999565b60405180910390fd5b60005b82518110156116e35760005b82828151811061167657611675614f93565b5b60200260200101518110156116cf5761168f600b612c4a565b6116bc8483815181106116a5576116a4614f93565b5b60200260200101516116b7600b612c60565b612c6e565b80806116c790614e5d565b915050611663565b5080806116db90614e5d565b915050611657565b505050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690614919565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ae61273e565b73ffffffffffffffffffffffffffffffffffffffff166117cc611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614999565b60405180910390fd5b61182c6000612c8c565b565b6060600061183b836116ee565b905060008167ffffffffffffffff81111561185957611858614fc2565b5b6040519080825280602002602001820160405280156118875781602001602082028036833780820191505090505b50905060005b828110156118d15761189f8582610f18565b8282815181106118b2576118b1614f93565b5b60200260200101818152505080806118c990614e5d565b91505061188d565b508092505050919050565b6118e461273e565b73ffffffffffffffffffffffffffffffffffffffff16611902611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614999565b60405180910390fd5b60005b81518110156119e95760016015600084848151811061197d5761197c614f93565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806119e190614e5d565b91505061195b565b5050565b6119f561273e565b73ffffffffffffffffffffffffffffffffffffffff16611a13611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090614999565b60405180910390fd5b611a71612d52565b565b611a7b61273e565b73ffffffffffffffffffffffffffffffffffffffff16611a99611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690614999565b60405180910390fd5b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b8390614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054611baf90614dfa565b8015611bfc5780601f10611bd157610100808354040283529160200191611bfc565b820191906000526020600020905b815481529060010190602001808311611bdf57829003601f168201915b5050505050905090565b611c0e61150f565b15611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c45906148d9565b60405180910390fd5b80601254811115611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b90614a79565b60405180910390fd5b80611c9d610e5c565b611ca79190614cb6565b341015611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce090614a99565b60405180910390fd5b60135481611cf7600b612c60565b611d019190614c2f565b1115611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990614779565b60405180910390fd5b600f544210611d8c5760005b82811015611d8657611d60600b612c4a565b611d7333611d6e600b612c60565b612c6e565b8080611d7e90614e5d565b915050611d4e565b50612027565b6010544210611ebb576103e881611da3600b612c60565b611dad9190614c2f565b1115611dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de590614779565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e71906148b9565b60405180910390fd5b60005b82811015611eb557611e8f600b612c4a565b611ea233611e9d600b612c60565b612c6e565b8080611ead90614e5d565b915050611e7d565b50612026565b6011544210611fea576103e881611ed2600b612c60565b611edc9190614c2f565b1115611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490614779565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa0906148b9565b60405180910390fd5b60005b82811015611fe457611fbe600b612c4a565b611fd133611fcc600b612c60565b612c6e565b8080611fdc90614e5d565b915050611fac565b50612025565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201c90614879565b60405180910390fd5b5b5b5050565b61203d61203661273e565b8383612df5565b5050565b61204961273e565b73ffffffffffffffffffffffffffffffffffffffff16612067611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490614999565b60405180910390fd5b80600c8190555050565b6120d23383836128dd565b5050565b600f5481565b6120e461273e565b73ffffffffffffffffffffffffffffffffffffffff16612102611b4a565b73ffffffffffffffffffffffffffffffffffffffff1614612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214f90614999565b60405180910390fd5b80600d8190555050565b61217361216d61273e565b836127ff565b6121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614a19565b60405180910390fd5b6121be84848484612f62565b50505050565b60606121cf826126d2565b61220e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612205906149d9565b60405180910390fd5b6000612218612fbe565b905060008151116122385760405180602001604052806000815250612263565b8061224284613050565b604051602001612253929190614684565b6040516020818303038152906040525b915050919050565b60115481565b61227961273e565b73ffffffffffffffffffffffffffffffffffffffff16612297611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e490614999565b60405180910390fd5b6001601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61235061273e565b73ffffffffffffffffffffffffffffffffffffffff1661236e611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614999565b60405180910390fd5b826011819055508160108190555080600f81905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61247a61273e565b73ffffffffffffffffffffffffffffffffffffffff16612498611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e590614999565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612555906147f9565b60405180910390fd5b61256781612c8c565b50565b61257261273e565b73ffffffffffffffffffffffffffffffffffffffff16612590611b4a565b73ffffffffffffffffffffffffffffffffffffffff16146125e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125dd90614999565b60405180910390fd5b6125ee6131b1565b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126bb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126cb57506126ca82613253565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127b983611526565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061280a826126d2565b612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284090614899565b60405180910390fd5b600061285483611526565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128c357508373ffffffffffffffffffffffffffffffffffffffff166128ab84610c33565b73ffffffffffffffffffffffffffffffffffffffff16145b806128d457506128d381856123de565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128fd82611526565b73ffffffffffffffffffffffffffffffffffffffff1614612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294a906149b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ba90614839565b60405180910390fd5b6129ce8383836132bd565b6129d9600082612746565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a299190614d10565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a809190614c2f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612b4482611526565b9050612b52816000846132bd565b612b5d600083612746565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bad9190614d10565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612c888282604051806020016040528060008152506133d1565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d5a61150f565b15612d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d91906148d9565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612dde61273e565b604051612deb91906146b3565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5b90614859565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f55919061473c565b60405180910390a3505050565b612f6d8484846128dd565b612f798484848461342c565b612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf906147d9565b60405180910390fd5b50505050565b606060148054612fcd90614dfa565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff990614dfa565b80156130465780601f1061301b57610100808354040283529160200191613046565b820191906000526020600020905b81548152906001019060200180831161302957829003601f168201915b5050505050905090565b60606000821415613098576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131ac565b600082905060005b600082146130ca5780806130b390614e5d565b915050600a826130c39190614c85565b91506130a0565b60008167ffffffffffffffff8111156130e6576130e5614fc2565b5b6040519080825280601f01601f1916602001820160405280156131185781602001600182028036833780820191505090505b5090505b600085146131a5576001826131319190614d10565b9150600a856131409190614ea6565b603061314c9190614c2f565b60f81b81838151811061316257613161614f93565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561319e9190614c85565b945061311c565b8093505050505b919050565b6131b961150f565b6131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef90614799565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61323c61273e565b60405161324991906146b3565b60405180910390a1565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6132c88383836135c3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561330b57613306816135c8565b61334a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613349576133488382613611565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338d576133888161377e565b6133cc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146133cb576133ca828261384f565b5b5b505050565b6133db83836138ce565b6133e8600084848461342c565b613427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341e906147d9565b60405180910390fd5b505050565b600061344d8473ffffffffffffffffffffffffffffffffffffffff16613a9c565b156135b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261347661273e565b8786866040518563ffffffff1660e01b815260040161349894939291906146ce565b602060405180830381600087803b1580156134b257600080fd5b505af19250505080156134e357506040513d601f19601f820116820180604052508101906134e09190614088565b60015b613566573d8060008114613513576040519150601f19603f3d011682016040523d82523d6000602084013e613518565b606091505b5060008151141561355e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613555906147d9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506135bb565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161361e846116ee565b6136289190614d10565b905060006007600084815260200190815260200160002054905081811461370d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137929190614d10565b90506000600960008481526020019081526020016000205490506000600883815481106137c2576137c1614f93565b5b9060005260206000200154905080600883815481106137e4576137e3614f93565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061383357613832614f64565b5b6001900381819060005260206000200160009055905550505050565b600061385a836116ee565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393590614959565b60405180910390fd5b613947816126d2565b15613987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161397e90614819565b60405180910390fd5b613993600083836132bd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139e39190614c2f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613abb90614dfa565b90600052602060002090601f016020900481019282613add5760008555613b24565b82601f10613af657805160ff1916838001178555613b24565b82800160010185558215613b24579182015b82811115613b23578251825591602001919060010190613b08565b5b509050613b319190613b35565b5090565b5b80821115613b4e576000816000905550600101613b36565b5090565b6000613b65613b6084614af9565b614ad4565b90508083825260208201905082856020860282011115613b8857613b87614ff6565b5b60005b85811015613bb85781613b9e8882613cb6565b845260208401935060208301925050600181019050613b8b565b5050509392505050565b6000613bd5613bd084614b25565b614ad4565b90508083825260208201905082856020860282011115613bf857613bf7614ff6565b5b60005b85811015613c285781613c0e8882613dc2565b845260208401935060208301925050600181019050613bfb565b5050509392505050565b6000613c45613c4084614b51565b614ad4565b905082815260208101848484011115613c6157613c60614ffb565b5b613c6c848285614db8565b509392505050565b6000613c87613c8284614b82565b614ad4565b905082815260208101848484011115613ca357613ca2614ffb565b5b613cae848285614db8565b509392505050565b600081359050613cc5816156f4565b92915050565b600082601f830112613ce057613cdf614ff1565b5b8135613cf0848260208601613b52565b91505092915050565b600082601f830112613d0e57613d0d614ff1565b5b8135613d1e848260208601613bc2565b91505092915050565b600081359050613d368161570b565b92915050565b600081359050613d4b81615722565b92915050565b600081519050613d6081615722565b92915050565b600082601f830112613d7b57613d7a614ff1565b5b8135613d8b848260208601613c32565b91505092915050565b600082601f830112613da957613da8614ff1565b5b8135613db9848260208601613c74565b91505092915050565b600081359050613dd181615739565b92915050565b600060208284031215613ded57613dec615005565b5b6000613dfb84828501613cb6565b91505092915050565b60008060408385031215613e1b57613e1a615005565b5b6000613e2985828601613cb6565b9250506020613e3a85828601613cb6565b9150509250929050565b600080600060608486031215613e5d57613e5c615005565b5b6000613e6b86828701613cb6565b9350506020613e7c86828701613cb6565b9250506040613e8d86828701613dc2565b9150509250925092565b60008060008060808587031215613eb157613eb0615005565b5b6000613ebf87828801613cb6565b9450506020613ed087828801613cb6565b9350506040613ee187828801613dc2565b925050606085013567ffffffffffffffff811115613f0257613f01615000565b5b613f0e87828801613d66565b91505092959194509250565b60008060408385031215613f3157613f30615005565b5b6000613f3f85828601613cb6565b9250506020613f5085828601613d27565b9150509250929050565b60008060408385031215613f7157613f70615005565b5b6000613f7f85828601613cb6565b9250506020613f9085828601613dc2565b9150509250929050565b600060208284031215613fb057613faf615005565b5b600082013567ffffffffffffffff811115613fce57613fcd615000565b5b613fda84828501613ccb565b91505092915050565b60008060408385031215613ffa57613ff9615005565b5b600083013567ffffffffffffffff81111561401857614017615000565b5b61402485828601613ccb565b925050602083013567ffffffffffffffff81111561404557614044615000565b5b61405185828601613cf9565b9150509250929050565b60006020828403121561407157614070615005565b5b600061407f84828501613d3c565b91505092915050565b60006020828403121561409e5761409d615005565b5b60006140ac84828501613d51565b91505092915050565b6000602082840312156140cb576140ca615005565b5b600082013567ffffffffffffffff8111156140e9576140e8615000565b5b6140f584828501613d94565b91505092915050565b60006020828403121561411457614113615005565b5b600061412284828501613dc2565b91505092915050565b60008060006060848603121561414457614143615005565b5b600061415286828701613dc2565b935050602061416386828701613dc2565b925050604061417486828701613dc2565b9150509250925092565b600061418a8383614666565b60208301905092915050565b61419f81614d44565b82525050565b60006141b082614bc3565b6141ba8185614bf1565b93506141c583614bb3565b8060005b838110156141f65781516141dd888261417e565b97506141e883614be4565b9250506001810190506141c9565b5085935050505092915050565b61420c81614d56565b82525050565b600061421d82614bce565b6142278185614c02565b9350614237818560208601614dc7565b6142408161500a565b840191505092915050565b600061425682614bd9565b6142608185614c13565b9350614270818560208601614dc7565b6142798161500a565b840191505092915050565b600061428f82614bd9565b6142998185614c24565b93506142a9818560208601614dc7565b80840191505092915050565b60006142c2601b83614c13565b91506142cd8261501b565b602082019050919050565b60006142e5601483614c13565b91506142f082615044565b602082019050919050565b6000614308602b83614c13565b91506143138261506d565b604082019050919050565b600061432b603283614c13565b9150614336826150bc565b604082019050919050565b600061434e602683614c13565b91506143598261510b565b604082019050919050565b6000614371601c83614c13565b915061437c8261515a565b602082019050919050565b6000614394602483614c13565b915061439f82615183565b604082019050919050565b60006143b7601983614c13565b91506143c2826151d2565b602082019050919050565b60006143da601e83614c13565b91506143e5826151fb565b602082019050919050565b60006143fd602c83614c13565b915061440882615224565b604082019050919050565b6000614420601c83614c13565b915061442b82615273565b602082019050919050565b6000614443601083614c13565b915061444e8261529c565b602082019050919050565b6000614466603883614c13565b9150614471826152c5565b604082019050919050565b6000614489602a83614c13565b915061449482615314565b604082019050919050565b60006144ac602983614c13565b91506144b782615363565b604082019050919050565b60006144cf602083614c13565b91506144da826153b2565b602082019050919050565b60006144f2602c83614c13565b91506144fd826153db565b604082019050919050565b6000614515600583614c24565b91506145208261542a565b600582019050919050565b6000614538602083614c13565b915061454382615453565b602082019050919050565b600061455b602983614c13565b91506145668261547c565b604082019050919050565b600061457e602f83614c13565b9150614589826154cb565b604082019050919050565b60006145a1602183614c13565b91506145ac8261551a565b604082019050919050565b60006145c4603183614c13565b91506145cf82615569565b604082019050919050565b60006145e7602c83614c13565b91506145f2826155b8565b604082019050919050565b600061460a603083614c13565b915061461582615607565b604082019050919050565b600061462d602c83614c13565b915061463882615656565b604082019050919050565b6000614650602583614c13565b915061465b826156a5565b604082019050919050565b61466f81614dae565b82525050565b61467e81614dae565b82525050565b60006146908285614284565b915061469c8284614284565b91506146a782614508565b91508190509392505050565b60006020820190506146c86000830184614196565b92915050565b60006080820190506146e36000830187614196565b6146f06020830186614196565b6146fd6040830185614675565b818103606083015261470f8184614212565b905095945050505050565b6000602082019050818103600083015261473481846141a5565b905092915050565b60006020820190506147516000830184614203565b92915050565b60006020820190508181036000830152614771818461424b565b905092915050565b60006020820190508181036000830152614792816142b5565b9050919050565b600060208201905081810360008301526147b2816142d8565b9050919050565b600060208201905081810360008301526147d2816142fb565b9050919050565b600060208201905081810360008301526147f28161431e565b9050919050565b6000602082019050818103600083015261481281614341565b9050919050565b6000602082019050818103600083015261483281614364565b9050919050565b6000602082019050818103600083015261485281614387565b9050919050565b60006020820190508181036000830152614872816143aa565b9050919050565b60006020820190508181036000830152614892816143cd565b9050919050565b600060208201905081810360008301526148b2816143f0565b9050919050565b600060208201905081810360008301526148d281614413565b9050919050565b600060208201905081810360008301526148f281614436565b9050919050565b6000602082019050818103600083015261491281614459565b9050919050565b600060208201905081810360008301526149328161447c565b9050919050565b600060208201905081810360008301526149528161449f565b9050919050565b60006020820190508181036000830152614972816144c2565b9050919050565b60006020820190508181036000830152614992816144e5565b9050919050565b600060208201905081810360008301526149b28161452b565b9050919050565b600060208201905081810360008301526149d28161454e565b9050919050565b600060208201905081810360008301526149f281614571565b9050919050565b60006020820190508181036000830152614a1281614594565b9050919050565b60006020820190508181036000830152614a32816145b7565b9050919050565b60006020820190508181036000830152614a52816145da565b9050919050565b60006020820190508181036000830152614a72816145fd565b9050919050565b60006020820190508181036000830152614a9281614620565b9050919050565b60006020820190508181036000830152614ab281614643565b9050919050565b6000602082019050614ace6000830184614675565b92915050565b6000614ade614aef565b9050614aea8282614e2c565b919050565b6000604051905090565b600067ffffffffffffffff821115614b1457614b13614fc2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b4057614b3f614fc2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614b6c57614b6b614fc2565b5b614b758261500a565b9050602081019050919050565b600067ffffffffffffffff821115614b9d57614b9c614fc2565b5b614ba68261500a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3a82614dae565b9150614c4583614dae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c7a57614c79614ed7565b5b828201905092915050565b6000614c9082614dae565b9150614c9b83614dae565b925082614cab57614caa614f06565b5b828204905092915050565b6000614cc182614dae565b9150614ccc83614dae565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d0557614d04614ed7565b5b828202905092915050565b6000614d1b82614dae565b9150614d2683614dae565b925082821015614d3957614d38614ed7565b5b828203905092915050565b6000614d4f82614d8e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614de5578082015181840152602081019050614dca565b83811115614df4576000848401525b50505050565b60006002820490506001821680614e1257607f821691505b60208210811415614e2657614e25614f35565b5b50919050565b614e358261500a565b810181811067ffffffffffffffff82111715614e5457614e53614fc2565b5b80604052505050565b6000614e6882614dae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e9b57614e9a614ed7565b5b600182019050919050565b6000614eb182614dae565b9150614ebc83614dae565b925082614ecc57614ecb614f06565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f426164204261626965733a20537570706c792065786365656465640000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f426164204261626965733a204d696e74696e206e6f7420616c6c6f7765640000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f426164204261626965733a204e6f7420696e2077686974656c69737400000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f426164204261626965733a204d696e7420616d6f756e74206f766572206d617860008201527f206d696e7420616d6f756e740000000000000000000000000000000000000000602082015250565b7f426164204261626965733a206d73672e76616c7565206c657373207468616e2060008201527f7072696365000000000000000000000000000000000000000000000000000000602082015250565b6156fd81614d44565b811461570857600080fd5b50565b61571481614d56565b811461571f57600080fd5b50565b61572b81614d62565b811461573657600080fd5b50565b61574281614dae565b811461574d57600080fd5b5056fea2646970667358221220fa8827327ef7fac53947fbd762150d63736ad586f7b724bc7a71ded8ac1ec6fa64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d585867466441475670346d6b394d45393134384d663154437636765138314476614d454b5a616b66526842412f00000000000000000000

-----Decoded View---------------
Arg [0] : uri_ (string): ipfs://QmXXgFdAGVp4mk9ME9148Mf1TCv6vQ81DvaMEKZakfRhBA/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d585867466441475670346d6b394d45393134384d663154
Arg [3] : 437636765138314476614d454b5a616b66526842412f00000000000000000000


Deployed Bytecode Sourcemap

48270:7429:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48486:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42049:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48532:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29543:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31102:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30625:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48660:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54252:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50186:418;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48830:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42689:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48447:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31852:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42357:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53395:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53724:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54880:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53547:100;;;;;;;;;;;;;:::i;:::-;;32262:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53074:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42879:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53858:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55098:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5614:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29237:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55282:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48789:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28967:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8513:103;;;;;;;;;;;;;:::i;:::-;;50932:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54704:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55572:57;;;;;;;;;;;;;:::i;:::-;;54989:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7862:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29712:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50675:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31395:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54058:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49062:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48584:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54148:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32518:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51577:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48729:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54601:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54360:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31621:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8771:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55635:61;;;;;;;;;;;;;:::i;:::-;;48486:41;;;;:::o;42049:224::-;42151:4;42190:35;42175:50;;;:11;:50;;;;:90;;;;42229:36;42253:11;42229:23;:36::i;:::-;42175:90;42168:97;;42049:224;;;:::o;48532:45::-;;;;:::o;29543:100::-;29597:13;29630:5;29623:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29543:100;:::o;31102:221::-;31178:7;31206:16;31214:7;31206;:16::i;:::-;31198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31291:15;:24;31307:7;31291:24;;;;;;;;;;;;;;;;;;;;;31284:31;;31102:221;;;:::o;30625:411::-;30706:13;30722:23;30737:7;30722:14;:23::i;:::-;30706:39;;30770:5;30764:11;;:2;:11;;;;30756:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30864:5;30848:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30873:37;30890:5;30897:12;:10;:12::i;:::-;30873:16;:37::i;:::-;30848:62;30826:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31007:21;31016:2;31020:7;31007:8;:21::i;:::-;30695:341;30625:411;;:::o;48660:31::-;;;;:::o;54252:102::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54342:6:::1;54322:17;:26;;;;54252:102:::0;:::o;50186:418::-;50223:7;50262:15;;50243;:34;50239:360;;50326:6;;50319:13;;;;50239:360;50369:12;;50350:15;:31;50346:253;;50427:13;;50420:20;;;;50346:253;50477:16;;50458:15;:35;50454:145;;50543:17;;50536:24;;;;50454:145;50590:1;50583:8;;50186:418;;:::o;48830:30::-;;;;:::o;42689:113::-;42750:7;42777:10;:17;;;;42770:24;;42689:113;:::o;48447:34::-;;;;:::o;31852:339::-;32047:41;32066:12;:10;:12::i;:::-;32080:7;32047:18;:41::i;:::-;32039:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32155:28;32165:4;32171:2;32175:7;32155:9;:28::i;:::-;31852:339;;;:::o;42357:256::-;42454:7;42490:23;42507:5;42490:16;:23::i;:::-;42482:5;:31;42474:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42579:12;:19;42592:5;42579:19;;;;;;;;;;;;;;;:26;42599:5;42579:26;;;;;;;;;;;;42572:33;;42357:256;;;;:::o;53395:86::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53471:4:::1;53464;:11;;;;;;;;;;;;:::i;:::-;;53395:86:::0;:::o;53724:128::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53808:13:::1;:11;:13::i;:::-;53797:7;:24;;53789:33;;;::::0;::::1;;53839:7;53829;:17;;;;53724:128:::0;:::o;54880:103::-;54939:4;54959:10;:18;54970:6;54959:18;;;;;;;;;;;;;;;;;;;;;;;;;54952:25;;54880:103;;;:::o;53547:100::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53601:7:::1;:5;:7::i;:::-;53593:25;;:48;53619:21;53593:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53547:100::o:0;32262:185::-;32400:39;32417:4;32423:2;32427:7;32400:39;;;;;;;;;;;;:16;:39::i;:::-;32262:185;;;:::o;53074:207::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53147:41:::1;53166:12;:10;:12::i;:::-;53180:7;53147:18;:41::i;:::-;53131:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;53261:14;53267:7;53261:5;:14::i;:::-;53074:207:::0;:::o;42879:233::-;42954:7;42990:30;:28;:30::i;:::-;42982:5;:38;42974:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43087:10;43098:5;43087:17;;;;;;;;:::i;:::-;;;;;;;;;;43080:24;;42879:233;;;:::o;53858:102::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53947:7:::1;53930:14;:24;;;;53858:102:::0;:::o;55098:178::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55184:9:::1;55179:92;55203:7;:14;55199:1;:18;55179:92;;;55258:5;55233:10;:22;55244:7;55252:1;55244:10;;;;;;;;:::i;:::-;;;;;;;;55233:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;55219:3;;;;;:::i;:::-;;;;55179:92;;;;55098:178:::0;:::o;5614:86::-;5661:4;5685:7;;;;;;;;;;;5678:14;;5614:86;:::o;29237:239::-;29309:7;29329:13;29345:7;:16;29353:7;29345:16;;;;;;;;;;;;;;;;;;;;;29329:32;;29397:1;29380:19;;:5;:19;;;;29372:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29463:5;29456:12;;;29237:239;;;:::o;55282:284::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55377:9:::1;55372:189;55396:2;:9;55392:1;:13;55372:189;;;55426:9;55421:133;55445:7;55453:1;55445:10;;;;;;;;:::i;:::-;;;;;;;;55441:1;:14;55421:133;;;55473:22;:10;:20;:22::i;:::-;55506:38;55516:2;55519:1;55516:5;;;;;;;;:::i;:::-;;;;;;;;55523:20;:10;:18;:20::i;:::-;55506:9;:38::i;:::-;55457:3;;;;;:::i;:::-;;;;55421:133;;;;55407:3;;;;;:::i;:::-;;;;55372:189;;;;55282:284:::0;;:::o;48789:34::-;;;;:::o;28967:208::-;29039:7;29084:1;29067:19;;:5;:19;;;;29059:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29151:9;:16;29161:5;29151:16;;;;;;;;;;;;;;;;29144:23;;28967:208;;;:::o;8513:103::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8578:30:::1;8605:1;8578:18;:30::i;:::-;8513:103::o:0;50932:342::-;51010:16;51038:20;51061:17;51071:6;51061:9;:17::i;:::-;51038:40;;51085:25;51127:12;51113:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51085:55;;51152:9;51147:100;51167:12;51163:1;:16;51147:100;;;51209:30;51229:6;51237:1;51209:19;:30::i;:::-;51195:8;51204:1;51195:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;51181:3;;;;;:::i;:::-;;;;51147:100;;;;51260:8;51253:15;;;;50932:342;;;:::o;54704:170::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54783:9:::1;54778:91;54802:7;:14;54798:1;:18;54778:91;;;54857:4;54832:10;:22;54843:7;54851:1;54843:10;;;;;;;;:::i;:::-;;;;;;;;54832:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54818:3;;;;;:::i;:::-;;;;54778:91;;;;54704:170:::0;:::o;55572:57::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55615:8:::1;:6;:8::i;:::-;55572:57::o:0;54989:103::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55081:5:::1;55060:10;:18;55071:6;55060:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;54989:103:::0;:::o;7862:87::-;7908:7;7935:6;;;;;;;;;;;7928:13;;7862:87;:::o;29712:104::-;29768:13;29801:7;29794:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29712:104;:::o;50675:251::-;5940:8;:6;:8::i;:::-;5939:9;5931:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50774:6:::1;49247:14;;49237:6;:24;;49221:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;49369:6;49360;:4;:6::i;:::-;:15;;;;:::i;:::-;49346:9;:30;;49330:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;49487:7;;49477:6;49454:20;:10;:18;:20::i;:::-;:29;;;;:::i;:::-;:40;;49438:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;49569:15;;49550;:34;49546:623;;50798:9:::2;50793:128;50817:6;50813:1;:10;50793:128;;;50839:22;:10;:20;:22::i;:::-;50870:43;50880:10;50892:20;:10;:18;:20::i;:::-;50870:9;:43::i;:::-;50825:3;;;;;:::i;:::-;;;;50793:128;;;;49546:623:::1;;;49633:12;;49614:15;:31;49610:559;;49725:4;49715:6;49692:20;:10;:18;:20::i;:::-;:29;;;;:::i;:::-;:37;;49684:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;49778:10;:22;49789:10;49778:22;;;;;;;;;;;;;;;;;;;;;;;;;49770:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50798:9:::2;50793:128;50817:6;50813:1;:10;50793:128;;;50839:22;:10;:20;:22::i;:::-;50870:43;50880:10;50892:20;:10;:18;:20::i;:::-;50870:9;:43::i;:::-;50825:3;;;;;:::i;:::-;;;;50793:128;;;;49610:559:::1;;;49880:16;;49861:15;:35;49857:312;;49980:4;49970:6;49947:20;:10;:18;:20::i;:::-;:29;;;;:::i;:::-;:37;;49939:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50033:10;:22;50044:10;50033:22;;;;;;;;;;;;;;;;;;;;;;;;;50025:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50798:9:::2;50793:128;50817:6;50813:1;:10;50793:128;;;50839:22;:10;:20;:22::i;:::-;50870:43;50880:10;50892:20;:10;:18;:20::i;:::-;50870:9;:43::i;:::-;50825:3;;;;;:::i;:::-;;;;50793:128;;;;49857:312:::1;;;50121:40;;;;;;;;;;:::i;:::-;;;;;;;;49857:312;49610:559;49546:623;5980:1;50675:251:::0;:::o;31395:155::-;31490:52;31509:12;:10;:12::i;:::-;31523:8;31533;31490:18;:52::i;:::-;31395:155;;:::o;54058:84::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54130:6:::1;54121;:15;;;;54058:84:::0;:::o;49062:103::-;49125:34;49135:10;49147:2;49151:7;49125:9;:34::i;:::-;49062:103;;:::o;48584:34::-;;;;:::o;54148:98::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54234:6:::1;54218:13;:22;;;;54148:98:::0;:::o;32518:328::-;32693:41;32712:12;:10;:12::i;:::-;32726:7;32693:18;:41::i;:::-;32685:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32799:39;32813:4;32819:2;32823:7;32832:5;32799:13;:39::i;:::-;32518:328;;;;:::o;51577:401::-;51675:13;51716:16;51724:7;51716;:16::i;:::-;51700:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51804:21;51828:10;:8;:10::i;:::-;51804:34;;51883:1;51865:7;51859:21;:25;:113;;;;;;;;;;;;;;;;;51920:7;51929:18;:7;:16;:18::i;:::-;51903:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51859:113;51845:127;;;51577:401;;;:::o;48729:35::-;;;;:::o;54601:97::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54688:4:::1;54667:10;:18;54678:6;54667:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;54601:97:::0;:::o;54360:235::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54499:16:::1;54480;:35;;;;54537:12;54522;:27;;;;54574:15;54556;:33;;;;54360:235:::0;;;:::o;31621:164::-;31718:4;31742:18;:25;31761:5;31742:25;;;;;;;;;;;;;;;:35;31768:8;31742:35;;;;;;;;;;;;;;;;;;;;;;;;;31735:42;;31621:164;;;;:::o;8771:201::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8880:1:::1;8860:22;;:8;:22;;;;8852:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8936:28;8955:8;8936:18;:28::i;:::-;8771:201:::0;:::o;55635:61::-;8093:12;:10;:12::i;:::-;8082:23;;:7;:5;:7::i;:::-;:23;;;8074:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55680:10:::1;:8;:10::i;:::-;55635:61::o:0;28598:305::-;28700:4;28752:25;28737:40;;;:11;:40;;;;:105;;;;28809:33;28794:48;;;:11;:48;;;;28737:105;:158;;;;28859:36;28883:11;28859:23;:36::i;:::-;28737:158;28717:178;;28598:305;;;:::o;34356:127::-;34421:4;34473:1;34445:30;;:7;:16;34453:7;34445:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34438:37;;34356:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;38338:174::-;38440:2;38413:15;:24;38429:7;38413:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38496:7;38492:2;38458:46;;38467:23;38482:7;38467:14;:23::i;:::-;38458:46;;;;;;;;;;;;38338:174;;:::o;34650:348::-;34743:4;34768:16;34776:7;34768;:16::i;:::-;34760:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34844:13;34860:23;34875:7;34860:14;:23::i;:::-;34844:39;;34913:5;34902:16;;:7;:16;;;:51;;;;34946:7;34922:31;;:20;34934:7;34922:11;:20::i;:::-;:31;;;34902:51;:87;;;;34957:32;34974:5;34981:7;34957:16;:32::i;:::-;34902:87;34894:96;;;34650:348;;;;:::o;37642:578::-;37801:4;37774:31;;:23;37789:7;37774:14;:23::i;:::-;:31;;;37766:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37884:1;37870:16;;:2;:16;;;;37862:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37940:39;37961:4;37967:2;37971:7;37940:20;:39::i;:::-;38044:29;38061:1;38065:7;38044:8;:29::i;:::-;38105:1;38086:9;:15;38096:4;38086:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38134:1;38117:9;:13;38127:2;38117:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38165:2;38146:7;:16;38154:7;38146:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38204:7;38200:2;38185:27;;38194:4;38185:27;;;;;;;;;;;;37642:578;;;:::o;36945:360::-;37005:13;37021:23;37036:7;37021:14;:23::i;:::-;37005:39;;37057:48;37078:5;37093:1;37097:7;37057:20;:48::i;:::-;37146:29;37163:1;37167:7;37146:8;:29::i;:::-;37208:1;37188:9;:16;37198:5;37188:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;37227:7;:16;37235:7;37227:16;;;;;;;;;;;;37220:23;;;;;;;;;;;37289:7;37285:1;37261:36;;37270:5;37261:36;;;;;;;;;;;;36994:311;36945:360;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;35340:110::-;35416:26;35426:2;35430:7;35416:26;;;;;;;;;;;;:9;:26::i;:::-;35340:110;;:::o;9132:191::-;9206:16;9225:6;;;;;;;;;;;9206:25;;9251:8;9242:6;;:17;;;;;;;;;;;;;;;;;;9306:8;9275:40;;9296:8;9275:40;;;;;;;;;;;;9195:128;9132:191;:::o;6414:118::-;5940:8;:6;:8::i;:::-;5939:9;5931:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;6484:4:::1;6474:7;;:14;;;;;;;;;;;;;;;;;;6504:20;6511:12;:10;:12::i;:::-;6504:20;;;;;;:::i;:::-;;;;;;;;6414:118::o:0;38654:315::-;38809:8;38800:17;;:5;:17;;;;38792:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38896:8;38858:18;:25;38877:5;38858:25;;;;;;;;;;;;;;;:35;38884:8;38858:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38942:8;38920:41;;38935:5;38920:41;;;38952:8;38920:41;;;;;;:::i;:::-;;;;;;;;38654:315;;;:::o;33728:::-;33885:28;33895:4;33901:2;33905:7;33885:9;:28::i;:::-;33932:48;33955:4;33961:2;33965:7;33974:5;33932:22;:48::i;:::-;33924:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33728:315;;;;:::o;51351:99::-;51411:13;51440:4;51433:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51351:99;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;6673:120::-;6217:8;:6;:8::i;:::-;6209:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;6742:5:::1;6732:7;;:15;;;;;;;;;;;;;;;;;;6763:22;6772:12;:10;:12::i;:::-;6763:22;;;;;;:::i;:::-;;;;;;;;6673:120::o:0;20294:157::-;20379:4;20418:25;20403:40;;;:11;:40;;;;20396:47;;20294:157;;;:::o;43725:589::-;43869:45;43896:4;43902:2;43906:7;43869:26;:45::i;:::-;43947:1;43931:18;;:4;:18;;;43927:187;;;43966:40;43998:7;43966:31;:40::i;:::-;43927:187;;;44036:2;44028:10;;:4;:10;;;44024:90;;44055:47;44088:4;44094:7;44055:32;:47::i;:::-;44024:90;43927:187;44142:1;44128:16;;:2;:16;;;44124:183;;;44161:45;44198:7;44161:36;:45::i;:::-;44124:183;;;44234:4;44228:10;;:2;:10;;;44224:83;;44255:40;44283:2;44287:7;44255:27;:40::i;:::-;44224:83;44124:183;43725:589;;;:::o;35677:321::-;35807:18;35813:2;35817:7;35807:5;:18::i;:::-;35858:54;35889:1;35893:2;35897:7;35906:5;35858:22;:54::i;:::-;35836:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;35677:321;;;:::o;39534:799::-;39689:4;39710:15;:2;:13;;;:15::i;:::-;39706:620;;;39762:2;39746:36;;;39783:12;:10;:12::i;:::-;39797:4;39803:7;39812:5;39746:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39742:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40005:1;39988:6;:13;:18;39984:272;;;40031:60;;;;;;;;;;:::i;:::-;;;;;;;;39984:272;40206:6;40200:13;40191:6;40187:2;40183:15;40176:38;39742:529;39879:41;;;39869:51;;;:6;:51;;;;39862:58;;;;;39706:620;40310:4;40303:11;;39534:799;;;;;;;:::o;40905:126::-;;;;:::o;45037:164::-;45141:10;:17;;;;45114:15;:24;45130:7;45114:24;;;;;;;;;;;:44;;;;45169:10;45185:7;45169:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45037:164;:::o;45828:988::-;46094:22;46144:1;46119:22;46136:4;46119:16;:22::i;:::-;:26;;;;:::i;:::-;46094:51;;46156:18;46177:17;:26;46195:7;46177:26;;;;;;;;;;;;46156:47;;46324:14;46310:10;:28;46306:328;;46355:19;46377:12;:18;46390:4;46377:18;;;;;;;;;;;;;;;:34;46396:14;46377:34;;;;;;;;;;;;46355:56;;46461:11;46428:12;:18;46441:4;46428:18;;;;;;;;;;;;;;;:30;46447:10;46428:30;;;;;;;;;;;:44;;;;46578:10;46545:17;:30;46563:11;46545:30;;;;;;;;;;;:43;;;;46340:294;46306:328;46730:17;:26;46748:7;46730:26;;;;;;;;;;;46723:33;;;46774:12;:18;46787:4;46774:18;;;;;;;;;;;;;;;:34;46793:14;46774:34;;;;;;;;;;;46767:41;;;45909:907;;45828:988;;:::o;47111:1079::-;47364:22;47409:1;47389:10;:17;;;;:21;;;;:::i;:::-;47364:46;;47421:18;47442:15;:24;47458:7;47442:24;;;;;;;;;;;;47421:45;;47793:19;47815:10;47826:14;47815:26;;;;;;;;:::i;:::-;;;;;;;;;;47793:48;;47879:11;47854:10;47865;47854:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;47990:10;47959:15;:28;47975:11;47959:28;;;;;;;;;;;:41;;;;48131:15;:24;48147:7;48131:24;;;;;;;;;;;48124:31;;;48166:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47182:1008;;;47111:1079;:::o;44615:221::-;44700:14;44717:20;44734:2;44717:16;:20::i;:::-;44700:37;;44775:7;44748:12;:16;44761:2;44748:16;;;;;;;;;;;;;;;:24;44765:6;44748:24;;;;;;;;;;;:34;;;;44822:6;44793:17;:26;44811:7;44793:26;;;;;;;;;;;:35;;;;44689:147;44615:221;;:::o;36334:382::-;36428:1;36414:16;;:2;:16;;;;36406:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36487:16;36495:7;36487;:16::i;:::-;36486:17;36478:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36549:45;36578:1;36582:2;36586:7;36549:20;:45::i;:::-;36624:1;36607:9;:13;36617:2;36607:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36655:2;36636:7;:16;36644:7;36636:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36700:7;36696:2;36675:33;;36692:1;36675:33;;;;;;;;;;;;36334:382;;:::o;10150:387::-;10210:4;10418:12;10485:7;10473:20;10465:28;;10528:1;10521:4;:8;10514:15;;;10150:387;;;:::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;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:539::-;7980:6;8029:2;8017:9;8008:7;8004:23;8000:32;7997:119;;;8035:79;;:::i;:::-;7997:119;8183:1;8172:9;8168:17;8155:31;8213:18;8205:6;8202:30;8199:117;;;8235:79;;:::i;:::-;8199:117;8340:78;8410:7;8401:6;8390:9;8386:22;8340:78;:::i;:::-;8330:88;;8126:302;7896:539;;;;:::o;8441:894::-;8559:6;8567;8616:2;8604:9;8595:7;8591:23;8587:32;8584:119;;;8622:79;;:::i;:::-;8584:119;8770:1;8759:9;8755:17;8742:31;8800:18;8792:6;8789:30;8786:117;;;8822:79;;:::i;:::-;8786:117;8927:78;8997:7;8988:6;8977:9;8973:22;8927:78;:::i;:::-;8917:88;;8713:302;9082:2;9071:9;9067:18;9054:32;9113:18;9105:6;9102:30;9099:117;;;9135:79;;:::i;:::-;9099:117;9240:78;9310:7;9301:6;9290:9;9286:22;9240:78;:::i;:::-;9230:88;;9025:303;8441:894;;;;;:::o;9341:327::-;9399:6;9448:2;9436:9;9427:7;9423:23;9419:32;9416:119;;;9454:79;;:::i;:::-;9416:119;9574:1;9599:52;9643:7;9634:6;9623:9;9619:22;9599:52;:::i;:::-;9589:62;;9545:116;9341:327;;;;:::o;9674:349::-;9743:6;9792:2;9780:9;9771:7;9767:23;9763:32;9760:119;;;9798:79;;:::i;:::-;9760:119;9918:1;9943:63;9998:7;9989:6;9978:9;9974:22;9943:63;:::i;:::-;9933:73;;9889:127;9674:349;;;;:::o;10029:509::-;10098:6;10147:2;10135:9;10126:7;10122:23;10118:32;10115:119;;;10153:79;;:::i;:::-;10115:119;10301:1;10290:9;10286:17;10273:31;10331:18;10323:6;10320:30;10317:117;;;10353:79;;:::i;:::-;10317:117;10458:63;10513:7;10504:6;10493:9;10489:22;10458:63;:::i;:::-;10448:73;;10244:287;10029:509;;;;:::o;10544:329::-;10603:6;10652:2;10640:9;10631:7;10627:23;10623:32;10620:119;;;10658:79;;:::i;:::-;10620:119;10778:1;10803:53;10848:7;10839:6;10828:9;10824:22;10803:53;:::i;:::-;10793:63;;10749:117;10544:329;;;;:::o;10879:619::-;10956:6;10964;10972;11021:2;11009:9;11000:7;10996:23;10992:32;10989:119;;;11027:79;;:::i;:::-;10989:119;11147:1;11172:53;11217:7;11208:6;11197:9;11193:22;11172:53;:::i;:::-;11162:63;;11118:117;11274:2;11300:53;11345:7;11336:6;11325:9;11321:22;11300:53;:::i;:::-;11290:63;;11245:118;11402:2;11428:53;11473:7;11464:6;11453:9;11449:22;11428:53;:::i;:::-;11418:63;;11373:118;10879:619;;;;;:::o;11504:179::-;11573:10;11594:46;11636:3;11628:6;11594:46;:::i;:::-;11672:4;11667:3;11663:14;11649:28;;11504:179;;;;:::o;11689:118::-;11776:24;11794:5;11776:24;:::i;:::-;11771:3;11764:37;11689:118;;:::o;11843:732::-;11962:3;11991:54;12039:5;11991:54;:::i;:::-;12061:86;12140:6;12135:3;12061:86;:::i;:::-;12054:93;;12171:56;12221:5;12171:56;:::i;:::-;12250:7;12281:1;12266:284;12291:6;12288:1;12285:13;12266:284;;;12367:6;12361:13;12394:63;12453:3;12438:13;12394:63;:::i;:::-;12387:70;;12480:60;12533:6;12480:60;:::i;:::-;12470:70;;12326:224;12313:1;12310;12306:9;12301:14;;12266:284;;;12270:14;12566:3;12559:10;;11967:608;;;11843:732;;;;:::o;12581:109::-;12662:21;12677:5;12662:21;:::i;:::-;12657:3;12650:34;12581:109;;:::o;12696:360::-;12782:3;12810:38;12842:5;12810:38;:::i;:::-;12864:70;12927:6;12922:3;12864:70;:::i;:::-;12857:77;;12943:52;12988:6;12983:3;12976:4;12969:5;12965:16;12943:52;:::i;:::-;13020:29;13042:6;13020:29;:::i;:::-;13015:3;13011:39;13004:46;;12786:270;12696:360;;;;:::o;13062:364::-;13150:3;13178:39;13211:5;13178:39;:::i;:::-;13233:71;13297:6;13292:3;13233:71;:::i;:::-;13226:78;;13313:52;13358:6;13353:3;13346:4;13339:5;13335:16;13313:52;:::i;:::-;13390:29;13412:6;13390:29;:::i;:::-;13385:3;13381:39;13374:46;;13154:272;13062:364;;;;:::o;13432:377::-;13538:3;13566:39;13599:5;13566:39;:::i;:::-;13621:89;13703:6;13698:3;13621:89;:::i;:::-;13614:96;;13719:52;13764:6;13759:3;13752:4;13745:5;13741:16;13719:52;:::i;:::-;13796:6;13791:3;13787:16;13780:23;;13542:267;13432:377;;;;:::o;13815:366::-;13957:3;13978:67;14042:2;14037:3;13978:67;:::i;:::-;13971:74;;14054:93;14143:3;14054:93;:::i;:::-;14172:2;14167:3;14163:12;14156:19;;13815:366;;;:::o;14187:::-;14329:3;14350:67;14414:2;14409:3;14350:67;:::i;:::-;14343:74;;14426:93;14515:3;14426:93;:::i;:::-;14544:2;14539:3;14535:12;14528:19;;14187:366;;;:::o;14559:::-;14701:3;14722:67;14786:2;14781:3;14722:67;:::i;:::-;14715:74;;14798:93;14887:3;14798:93;:::i;:::-;14916:2;14911:3;14907:12;14900:19;;14559:366;;;:::o;14931:::-;15073:3;15094:67;15158:2;15153:3;15094:67;:::i;:::-;15087:74;;15170:93;15259:3;15170:93;:::i;:::-;15288:2;15283:3;15279:12;15272:19;;14931:366;;;:::o;15303:::-;15445:3;15466:67;15530:2;15525:3;15466:67;:::i;:::-;15459:74;;15542:93;15631:3;15542:93;:::i;:::-;15660:2;15655:3;15651:12;15644:19;;15303:366;;;:::o;15675:::-;15817:3;15838:67;15902:2;15897:3;15838:67;:::i;:::-;15831:74;;15914:93;16003:3;15914:93;:::i;:::-;16032:2;16027:3;16023:12;16016:19;;15675:366;;;:::o;16047:::-;16189:3;16210:67;16274:2;16269:3;16210:67;:::i;:::-;16203:74;;16286:93;16375:3;16286:93;:::i;:::-;16404:2;16399:3;16395:12;16388:19;;16047:366;;;:::o;16419:::-;16561:3;16582:67;16646:2;16641:3;16582:67;:::i;:::-;16575:74;;16658:93;16747:3;16658:93;:::i;:::-;16776:2;16771:3;16767:12;16760:19;;16419:366;;;:::o;16791:::-;16933:3;16954:67;17018:2;17013:3;16954:67;:::i;:::-;16947:74;;17030:93;17119:3;17030:93;:::i;:::-;17148:2;17143:3;17139:12;17132:19;;16791:366;;;:::o;17163:::-;17305:3;17326:67;17390:2;17385:3;17326:67;:::i;:::-;17319:74;;17402:93;17491:3;17402:93;:::i;:::-;17520:2;17515:3;17511:12;17504:19;;17163:366;;;:::o;17535:::-;17677:3;17698:67;17762:2;17757:3;17698:67;:::i;:::-;17691:74;;17774:93;17863:3;17774:93;:::i;:::-;17892:2;17887:3;17883:12;17876:19;;17535:366;;;:::o;17907:::-;18049:3;18070:67;18134:2;18129:3;18070:67;:::i;:::-;18063:74;;18146:93;18235:3;18146:93;:::i;:::-;18264:2;18259:3;18255:12;18248:19;;17907:366;;;:::o;18279:::-;18421:3;18442:67;18506:2;18501:3;18442:67;:::i;:::-;18435:74;;18518:93;18607:3;18518:93;:::i;:::-;18636:2;18631:3;18627:12;18620:19;;18279:366;;;:::o;18651:::-;18793:3;18814:67;18878:2;18873:3;18814:67;:::i;:::-;18807:74;;18890:93;18979:3;18890:93;:::i;:::-;19008:2;19003:3;18999:12;18992:19;;18651:366;;;:::o;19023:::-;19165:3;19186:67;19250:2;19245:3;19186:67;:::i;:::-;19179:74;;19262:93;19351:3;19262:93;:::i;:::-;19380:2;19375:3;19371:12;19364:19;;19023:366;;;:::o;19395:::-;19537:3;19558:67;19622:2;19617:3;19558:67;:::i;:::-;19551:74;;19634:93;19723:3;19634:93;:::i;:::-;19752:2;19747:3;19743:12;19736:19;;19395:366;;;:::o;19767:::-;19909:3;19930:67;19994:2;19989:3;19930:67;:::i;:::-;19923:74;;20006:93;20095:3;20006:93;:::i;:::-;20124:2;20119:3;20115:12;20108:19;;19767:366;;;:::o;20139:400::-;20299:3;20320:84;20402:1;20397:3;20320:84;:::i;:::-;20313:91;;20413:93;20502:3;20413:93;:::i;:::-;20531:1;20526:3;20522:11;20515:18;;20139:400;;;:::o;20545:366::-;20687:3;20708:67;20772:2;20767:3;20708:67;:::i;:::-;20701:74;;20784:93;20873:3;20784:93;:::i;:::-;20902:2;20897:3;20893:12;20886:19;;20545:366;;;:::o;20917:::-;21059:3;21080:67;21144:2;21139:3;21080:67;:::i;:::-;21073:74;;21156:93;21245:3;21156:93;:::i;:::-;21274:2;21269:3;21265:12;21258:19;;20917:366;;;:::o;21289:::-;21431:3;21452:67;21516:2;21511:3;21452:67;:::i;:::-;21445:74;;21528:93;21617:3;21528:93;:::i;:::-;21646:2;21641:3;21637:12;21630:19;;21289:366;;;:::o;21661:::-;21803:3;21824:67;21888:2;21883:3;21824:67;:::i;:::-;21817:74;;21900:93;21989:3;21900:93;:::i;:::-;22018:2;22013:3;22009:12;22002:19;;21661:366;;;:::o;22033:::-;22175:3;22196:67;22260:2;22255:3;22196:67;:::i;:::-;22189:74;;22272:93;22361:3;22272:93;:::i;:::-;22390:2;22385:3;22381:12;22374:19;;22033:366;;;:::o;22405:::-;22547:3;22568:67;22632:2;22627:3;22568:67;:::i;:::-;22561:74;;22644:93;22733:3;22644:93;:::i;:::-;22762:2;22757:3;22753:12;22746:19;;22405:366;;;:::o;22777:::-;22919:3;22940:67;23004:2;22999:3;22940:67;:::i;:::-;22933:74;;23016:93;23105:3;23016:93;:::i;:::-;23134:2;23129:3;23125:12;23118:19;;22777:366;;;:::o;23149:::-;23291:3;23312:67;23376:2;23371:3;23312:67;:::i;:::-;23305:74;;23388:93;23477:3;23388:93;:::i;:::-;23506:2;23501:3;23497:12;23490:19;;23149:366;;;:::o;23521:::-;23663:3;23684:67;23748:2;23743:3;23684:67;:::i;:::-;23677:74;;23760:93;23849:3;23760:93;:::i;:::-;23878:2;23873:3;23869:12;23862:19;;23521:366;;;:::o;23893:108::-;23970:24;23988:5;23970:24;:::i;:::-;23965:3;23958:37;23893:108;;:::o;24007:118::-;24094:24;24112:5;24094:24;:::i;:::-;24089:3;24082:37;24007:118;;:::o;24131:701::-;24412:3;24434:95;24525:3;24516:6;24434:95;:::i;:::-;24427:102;;24546:95;24637:3;24628:6;24546:95;:::i;:::-;24539:102;;24658:148;24802:3;24658:148;:::i;:::-;24651:155;;24823:3;24816:10;;24131:701;;;;;:::o;24838:222::-;24931:4;24969:2;24958:9;24954:18;24946:26;;24982:71;25050:1;25039:9;25035:17;25026:6;24982:71;:::i;:::-;24838:222;;;;:::o;25066:640::-;25261:4;25299:3;25288:9;25284:19;25276:27;;25313:71;25381:1;25370:9;25366:17;25357:6;25313:71;:::i;:::-;25394:72;25462:2;25451:9;25447:18;25438:6;25394:72;:::i;:::-;25476;25544:2;25533:9;25529:18;25520:6;25476:72;:::i;:::-;25595:9;25589:4;25585:20;25580:2;25569:9;25565:18;25558:48;25623:76;25694:4;25685:6;25623:76;:::i;:::-;25615:84;;25066:640;;;;;;;:::o;25712:373::-;25855:4;25893:2;25882:9;25878:18;25870:26;;25942:9;25936:4;25932:20;25928:1;25917:9;25913:17;25906:47;25970:108;26073:4;26064:6;25970:108;:::i;:::-;25962:116;;25712:373;;;;:::o;26091:210::-;26178:4;26216:2;26205:9;26201:18;26193:26;;26229:65;26291:1;26280:9;26276:17;26267:6;26229:65;:::i;:::-;26091:210;;;;:::o;26307:313::-;26420:4;26458:2;26447:9;26443:18;26435:26;;26507:9;26501:4;26497:20;26493:1;26482:9;26478:17;26471:47;26535:78;26608:4;26599:6;26535:78;:::i;:::-;26527:86;;26307:313;;;;:::o;26626:419::-;26792:4;26830:2;26819:9;26815:18;26807:26;;26879:9;26873:4;26869:20;26865:1;26854:9;26850:17;26843:47;26907:131;27033:4;26907:131;:::i;:::-;26899:139;;26626:419;;;:::o;27051:::-;27217:4;27255:2;27244:9;27240:18;27232:26;;27304:9;27298:4;27294:20;27290:1;27279:9;27275:17;27268:47;27332:131;27458:4;27332:131;:::i;:::-;27324:139;;27051:419;;;:::o;27476:::-;27642:4;27680:2;27669:9;27665:18;27657:26;;27729:9;27723:4;27719:20;27715:1;27704:9;27700:17;27693:47;27757:131;27883:4;27757:131;:::i;:::-;27749:139;;27476:419;;;:::o;27901:::-;28067:4;28105:2;28094:9;28090:18;28082:26;;28154:9;28148:4;28144:20;28140:1;28129:9;28125:17;28118:47;28182:131;28308:4;28182:131;:::i;:::-;28174:139;;27901:419;;;:::o;28326:::-;28492:4;28530:2;28519:9;28515:18;28507:26;;28579:9;28573:4;28569:20;28565:1;28554:9;28550:17;28543:47;28607:131;28733:4;28607:131;:::i;:::-;28599:139;;28326:419;;;:::o;28751:::-;28917:4;28955:2;28944:9;28940:18;28932:26;;29004:9;28998:4;28994:20;28990:1;28979:9;28975:17;28968:47;29032:131;29158:4;29032:131;:::i;:::-;29024:139;;28751:419;;;:::o;29176:::-;29342:4;29380:2;29369:9;29365:18;29357:26;;29429:9;29423:4;29419:20;29415:1;29404:9;29400:17;29393:47;29457:131;29583:4;29457:131;:::i;:::-;29449:139;;29176:419;;;:::o;29601:::-;29767:4;29805:2;29794:9;29790:18;29782:26;;29854:9;29848:4;29844:20;29840:1;29829:9;29825:17;29818:47;29882:131;30008:4;29882:131;:::i;:::-;29874:139;;29601:419;;;:::o;30026:::-;30192:4;30230:2;30219:9;30215:18;30207:26;;30279:9;30273:4;30269:20;30265:1;30254:9;30250:17;30243:47;30307:131;30433:4;30307:131;:::i;:::-;30299:139;;30026:419;;;:::o;30451:::-;30617:4;30655:2;30644:9;30640:18;30632:26;;30704:9;30698:4;30694:20;30690:1;30679:9;30675:17;30668:47;30732:131;30858:4;30732:131;:::i;:::-;30724:139;;30451:419;;;:::o;30876:::-;31042:4;31080:2;31069:9;31065:18;31057:26;;31129:9;31123:4;31119:20;31115:1;31104:9;31100:17;31093:47;31157:131;31283:4;31157:131;:::i;:::-;31149:139;;30876:419;;;:::o;31301:::-;31467:4;31505:2;31494:9;31490:18;31482:26;;31554:9;31548:4;31544:20;31540:1;31529:9;31525:17;31518:47;31582:131;31708:4;31582:131;:::i;:::-;31574:139;;31301:419;;;:::o;31726:::-;31892:4;31930:2;31919:9;31915:18;31907:26;;31979:9;31973:4;31969:20;31965:1;31954:9;31950:17;31943:47;32007:131;32133:4;32007:131;:::i;:::-;31999:139;;31726:419;;;:::o;32151:::-;32317:4;32355:2;32344:9;32340:18;32332:26;;32404:9;32398:4;32394:20;32390:1;32379:9;32375:17;32368:47;32432:131;32558:4;32432:131;:::i;:::-;32424:139;;32151:419;;;:::o;32576:::-;32742:4;32780:2;32769:9;32765:18;32757:26;;32829:9;32823:4;32819:20;32815:1;32804:9;32800:17;32793:47;32857:131;32983:4;32857:131;:::i;:::-;32849:139;;32576:419;;;:::o;33001:::-;33167:4;33205:2;33194:9;33190:18;33182:26;;33254:9;33248:4;33244:20;33240:1;33229:9;33225:17;33218:47;33282:131;33408:4;33282:131;:::i;:::-;33274:139;;33001:419;;;:::o;33426:::-;33592:4;33630:2;33619:9;33615:18;33607:26;;33679:9;33673:4;33669:20;33665:1;33654:9;33650:17;33643:47;33707:131;33833:4;33707:131;:::i;:::-;33699:139;;33426:419;;;:::o;33851:::-;34017:4;34055:2;34044:9;34040:18;34032:26;;34104:9;34098:4;34094:20;34090:1;34079:9;34075:17;34068:47;34132:131;34258:4;34132:131;:::i;:::-;34124:139;;33851:419;;;:::o;34276:::-;34442:4;34480:2;34469:9;34465:18;34457:26;;34529:9;34523:4;34519:20;34515:1;34504:9;34500:17;34493:47;34557:131;34683:4;34557:131;:::i;:::-;34549:139;;34276:419;;;:::o;34701:::-;34867:4;34905:2;34894:9;34890:18;34882:26;;34954:9;34948:4;34944:20;34940:1;34929:9;34925:17;34918:47;34982:131;35108:4;34982:131;:::i;:::-;34974:139;;34701:419;;;:::o;35126:::-;35292:4;35330:2;35319:9;35315:18;35307:26;;35379:9;35373:4;35369:20;35365:1;35354:9;35350:17;35343:47;35407:131;35533:4;35407:131;:::i;:::-;35399:139;;35126:419;;;:::o;35551:::-;35717:4;35755:2;35744:9;35740:18;35732:26;;35804:9;35798:4;35794:20;35790:1;35779:9;35775:17;35768:47;35832:131;35958:4;35832:131;:::i;:::-;35824:139;;35551:419;;;:::o;35976:::-;36142:4;36180:2;36169:9;36165:18;36157:26;;36229:9;36223:4;36219:20;36215:1;36204:9;36200:17;36193:47;36257:131;36383:4;36257:131;:::i;:::-;36249:139;;35976:419;;;:::o;36401:::-;36567:4;36605:2;36594:9;36590:18;36582:26;;36654:9;36648:4;36644:20;36640:1;36629:9;36625:17;36618:47;36682:131;36808:4;36682:131;:::i;:::-;36674:139;;36401:419;;;:::o;36826:::-;36992:4;37030:2;37019:9;37015:18;37007:26;;37079:9;37073:4;37069:20;37065:1;37054:9;37050:17;37043:47;37107:131;37233:4;37107:131;:::i;:::-;37099:139;;36826:419;;;:::o;37251:::-;37417:4;37455:2;37444:9;37440:18;37432:26;;37504:9;37498:4;37494:20;37490:1;37479:9;37475:17;37468:47;37532:131;37658:4;37532:131;:::i;:::-;37524:139;;37251:419;;;:::o;37676:222::-;37769:4;37807:2;37796:9;37792:18;37784:26;;37820:71;37888:1;37877:9;37873:17;37864:6;37820:71;:::i;:::-;37676:222;;;;:::o;37904:129::-;37938:6;37965:20;;:::i;:::-;37955:30;;37994:33;38022:4;38014:6;37994:33;:::i;:::-;37904:129;;;:::o;38039:75::-;38072:6;38105:2;38099:9;38089:19;;38039:75;:::o;38120:311::-;38197:4;38287:18;38279:6;38276:30;38273:56;;;38309:18;;:::i;:::-;38273:56;38359:4;38351:6;38347:17;38339:25;;38419:4;38413;38409:15;38401:23;;38120:311;;;:::o;38437:::-;38514:4;38604:18;38596:6;38593:30;38590:56;;;38626:18;;:::i;:::-;38590:56;38676:4;38668:6;38664:17;38656:25;;38736:4;38730;38726:15;38718:23;;38437:311;;;:::o;38754:307::-;38815:4;38905:18;38897:6;38894:30;38891:56;;;38927:18;;:::i;:::-;38891:56;38965:29;38987:6;38965:29;:::i;:::-;38957:37;;39049:4;39043;39039:15;39031:23;;38754:307;;;:::o;39067:308::-;39129:4;39219:18;39211:6;39208:30;39205:56;;;39241:18;;:::i;:::-;39205:56;39279:29;39301:6;39279:29;:::i;:::-;39271:37;;39363:4;39357;39353:15;39345:23;;39067:308;;;:::o;39381:132::-;39448:4;39471:3;39463:11;;39501:4;39496:3;39492:14;39484:22;;39381:132;;;:::o;39519:114::-;39586:6;39620:5;39614:12;39604:22;;39519:114;;;:::o;39639:98::-;39690:6;39724:5;39718:12;39708:22;;39639:98;;;:::o;39743:99::-;39795:6;39829:5;39823:12;39813:22;;39743:99;;;:::o;39848:113::-;39918:4;39950;39945:3;39941:14;39933:22;;39848:113;;;:::o;39967:184::-;40066:11;40100:6;40095:3;40088:19;40140:4;40135:3;40131:14;40116:29;;39967:184;;;;:::o;40157:168::-;40240:11;40274:6;40269:3;40262:19;40314:4;40309:3;40305:14;40290:29;;40157:168;;;;:::o;40331:169::-;40415:11;40449:6;40444:3;40437:19;40489:4;40484:3;40480:14;40465:29;;40331:169;;;;:::o;40506:148::-;40608:11;40645:3;40630:18;;40506:148;;;;:::o;40660:305::-;40700:3;40719:20;40737:1;40719:20;:::i;:::-;40714:25;;40753:20;40771:1;40753:20;:::i;:::-;40748:25;;40907:1;40839:66;40835:74;40832:1;40829:81;40826:107;;;40913:18;;:::i;:::-;40826:107;40957:1;40954;40950:9;40943:16;;40660:305;;;;:::o;40971:185::-;41011:1;41028:20;41046:1;41028:20;:::i;:::-;41023:25;;41062:20;41080:1;41062:20;:::i;:::-;41057:25;;41101:1;41091:35;;41106:18;;:::i;:::-;41091:35;41148:1;41145;41141:9;41136:14;;40971:185;;;;:::o;41162:348::-;41202:7;41225:20;41243:1;41225:20;:::i;:::-;41220:25;;41259:20;41277:1;41259:20;:::i;:::-;41254:25;;41447:1;41379:66;41375:74;41372:1;41369:81;41364:1;41357:9;41350:17;41346:105;41343:131;;;41454:18;;:::i;:::-;41343:131;41502:1;41499;41495:9;41484:20;;41162:348;;;;:::o;41516:191::-;41556:4;41576:20;41594:1;41576:20;:::i;:::-;41571:25;;41610:20;41628:1;41610:20;:::i;:::-;41605:25;;41649:1;41646;41643:8;41640:34;;;41654:18;;:::i;:::-;41640:34;41699:1;41696;41692:9;41684:17;;41516:191;;;;:::o;41713:96::-;41750:7;41779:24;41797:5;41779:24;:::i;:::-;41768:35;;41713:96;;;:::o;41815:90::-;41849:7;41892:5;41885:13;41878:21;41867:32;;41815:90;;;:::o;41911:149::-;41947:7;41987:66;41980:5;41976:78;41965:89;;41911:149;;;:::o;42066:126::-;42103:7;42143:42;42136:5;42132:54;42121:65;;42066:126;;;:::o;42198:77::-;42235:7;42264:5;42253:16;;42198:77;;;:::o;42281:154::-;42365:6;42360:3;42355;42342:30;42427:1;42418:6;42413:3;42409:16;42402:27;42281:154;;;:::o;42441:307::-;42509:1;42519:113;42533:6;42530:1;42527:13;42519:113;;;42618:1;42613:3;42609:11;42603:18;42599:1;42594:3;42590:11;42583:39;42555:2;42552:1;42548:10;42543:15;;42519:113;;;42650:6;42647:1;42644:13;42641:101;;;42730:1;42721:6;42716:3;42712:16;42705:27;42641:101;42490:258;42441:307;;;:::o;42754:320::-;42798:6;42835:1;42829:4;42825:12;42815:22;;42882:1;42876:4;42872:12;42903:18;42893:81;;42959:4;42951:6;42947:17;42937:27;;42893:81;43021:2;43013:6;43010:14;42990:18;42987:38;42984:84;;;43040:18;;:::i;:::-;42984:84;42805:269;42754:320;;;:::o;43080:281::-;43163:27;43185:4;43163:27;:::i;:::-;43155:6;43151:40;43293:6;43281:10;43278:22;43257:18;43245:10;43242:34;43239:62;43236:88;;;43304:18;;:::i;:::-;43236:88;43344:10;43340:2;43333:22;43123:238;43080:281;;:::o;43367:233::-;43406:3;43429:24;43447:5;43429:24;:::i;:::-;43420:33;;43475:66;43468:5;43465:77;43462:103;;;43545:18;;:::i;:::-;43462:103;43592:1;43585:5;43581:13;43574:20;;43367:233;;;:::o;43606:176::-;43638:1;43655:20;43673:1;43655:20;:::i;:::-;43650:25;;43689:20;43707:1;43689:20;:::i;:::-;43684:25;;43728:1;43718:35;;43733:18;;:::i;:::-;43718:35;43774:1;43771;43767:9;43762:14;;43606:176;;;;:::o;43788:180::-;43836:77;43833:1;43826:88;43933:4;43930:1;43923:15;43957:4;43954:1;43947:15;43974:180;44022:77;44019:1;44012:88;44119:4;44116:1;44109:15;44143:4;44140:1;44133:15;44160:180;44208:77;44205:1;44198:88;44305:4;44302:1;44295:15;44329:4;44326:1;44319:15;44346:180;44394:77;44391:1;44384:88;44491:4;44488:1;44481:15;44515:4;44512:1;44505:15;44532:180;44580:77;44577:1;44570:88;44677:4;44674:1;44667:15;44701:4;44698:1;44691:15;44718:180;44766:77;44763:1;44756:88;44863:4;44860:1;44853:15;44887:4;44884:1;44877:15;44904:117;45013:1;45010;45003:12;45027:117;45136:1;45133;45126:12;45150:117;45259:1;45256;45249:12;45273:117;45382:1;45379;45372:12;45396:117;45505:1;45502;45495:12;45519:102;45560:6;45611:2;45607:7;45602:2;45595:5;45591:14;45587:28;45577:38;;45519:102;;;:::o;45627:177::-;45767:29;45763:1;45755:6;45751:14;45744:53;45627:177;:::o;45810:170::-;45950:22;45946:1;45938:6;45934:14;45927:46;45810:170;:::o;45986:230::-;46126:34;46122:1;46114:6;46110:14;46103:58;46195:13;46190:2;46182:6;46178:15;46171:38;45986:230;:::o;46222:237::-;46362:34;46358:1;46350:6;46346:14;46339:58;46431:20;46426:2;46418:6;46414:15;46407:45;46222:237;:::o;46465:225::-;46605:34;46601:1;46593:6;46589:14;46582:58;46674:8;46669:2;46661:6;46657:15;46650:33;46465:225;:::o;46696:178::-;46836:30;46832:1;46824:6;46820:14;46813:54;46696:178;:::o;46880:223::-;47020:34;47016:1;47008:6;47004:14;46997:58;47089:6;47084:2;47076:6;47072:15;47065:31;46880:223;:::o;47109:175::-;47249:27;47245:1;47237:6;47233:14;47226:51;47109:175;:::o;47290:180::-;47430:32;47426:1;47418:6;47414:14;47407:56;47290:180;:::o;47476:231::-;47616:34;47612:1;47604:6;47600:14;47593:58;47685:14;47680:2;47672:6;47668:15;47661:39;47476:231;:::o;47713:178::-;47853:30;47849:1;47841:6;47837:14;47830:54;47713:178;:::o;47897:166::-;48037:18;48033:1;48025:6;48021:14;48014:42;47897:166;:::o;48069:243::-;48209:34;48205:1;48197:6;48193:14;48186:58;48278:26;48273:2;48265:6;48261:15;48254:51;48069:243;:::o;48318:229::-;48458:34;48454:1;48446:6;48442:14;48435:58;48527:12;48522:2;48514:6;48510:15;48503:37;48318:229;:::o;48553:228::-;48693:34;48689:1;48681:6;48677:14;48670:58;48762:11;48757:2;48749:6;48745:15;48738:36;48553:228;:::o;48787:182::-;48927:34;48923:1;48915:6;48911:14;48904:58;48787:182;:::o;48975:231::-;49115:34;49111:1;49103:6;49099:14;49092:58;49184:14;49179:2;49171:6;49167:15;49160:39;48975:231;:::o;49212:155::-;49352:7;49348:1;49340:6;49336:14;49329:31;49212:155;:::o;49373:182::-;49513:34;49509:1;49501:6;49497:14;49490:58;49373:182;:::o;49561:228::-;49701:34;49697:1;49689:6;49685:14;49678:58;49770:11;49765:2;49757:6;49753:15;49746:36;49561:228;:::o;49795:234::-;49935:34;49931:1;49923:6;49919:14;49912:58;50004:17;49999:2;49991:6;49987:15;49980:42;49795:234;:::o;50035:220::-;50175:34;50171:1;50163:6;50159:14;50152:58;50244:3;50239:2;50231:6;50227:15;50220:28;50035:220;:::o;50261:236::-;50401:34;50397:1;50389:6;50385:14;50378:58;50470:19;50465:2;50457:6;50453:15;50446:44;50261:236;:::o;50503:231::-;50643:34;50639:1;50631:6;50627:14;50620:58;50712:14;50707:2;50699:6;50695:15;50688:39;50503:231;:::o;50740:235::-;50880:34;50876:1;50868:6;50864:14;50857:58;50949:18;50944:2;50936:6;50932:15;50925:43;50740:235;:::o;50981:231::-;51121:34;51117:1;51109:6;51105:14;51098:58;51190:14;51185:2;51177:6;51173:15;51166:39;50981:231;:::o;51218:224::-;51358:34;51354:1;51346:6;51342:14;51335:58;51427:7;51422:2;51414:6;51410:15;51403:32;51218:224;:::o;51448:122::-;51521:24;51539:5;51521:24;:::i;:::-;51514:5;51511:35;51501:63;;51560:1;51557;51550:12;51501:63;51448:122;:::o;51576:116::-;51646:21;51661:5;51646:21;:::i;:::-;51639:5;51636:32;51626:60;;51682:1;51679;51672:12;51626:60;51576:116;:::o;51698:120::-;51770:23;51787:5;51770:23;:::i;:::-;51763:5;51760:34;51750:62;;51808:1;51805;51798:12;51750:62;51698:120;:::o;51824:122::-;51897:24;51915:5;51897:24;:::i;:::-;51890:5;51887:35;51877:63;;51936:1;51933;51926:12;51877:63;51824:122;:::o

Swarm Source

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