ETH Price: $3,307.73 (-3.03%)
Gas: 12 Gwei

Token

SunBlocksTraining1 (SBLOCKST1)
 

Overview

Max Total Supply

186 SBLOCKST1

Holders

124

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SBLOCKST1
0xb054b847d2b3d193956ee8b7d4beebd940e55d8c
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:
SunBlocksTraining1

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, OSL-3.0 license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/Counters.sol
pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/WithLimitedSupply.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// @title A token tracker that limits the token supply and increments token IDs on each new mint.
abstract contract WithLimitedSupply {
    using Counters for Counters.Counter;

    // Keeps track of how many we have minted
    Counters.Counter private _tokenCount;

    /// @dev The maximum count of tokens this token tracker will hold.
    uint256 private _maxSupply;

    /// Instanciate the contract
    /// @param totalSupply_ how many tokens this collection should hold
    constructor (uint256 totalSupply_) {
        _maxSupply = totalSupply_;
    }

    /// @dev Get the max Supply
    /// @return the maximum token count
    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }

    /// @dev Get the current token count
    /// @return the created token count
    function tokenCount() public view returns (uint256) {
        return _tokenCount.current();
    }

    /// @dev Check whether tokens are still available
    /// @return the available token count
    function availableTokenCount() public view returns (uint256) {
        return maxSupply() - tokenCount();
    }

    /// @dev Increment the token count and fetch the latest count
    /// @return the next token id
    function nextToken() internal virtual ensureAvailability returns (uint256) {
        uint256 token = _tokenCount.current();

        _tokenCount.increment();

        return token;
    }

    /// @dev Check whether another token is still available
    modifier ensureAvailability() {
        require(availableTokenCount() > 0, "No more tokens available");
        _;
    }

    /// @param amount Check whether number of tokens are still available
    /// @dev Check whether tokens are still available
    modifier ensureAvailabilityFor(uint256 amount) {
        require(availableTokenCount() >= amount, "Requested number of tokens not available");
        _;
    }
}
// File: contracts/RandomlyAssigned.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// @title Randomly assign tokenIDs from a given set of tokens.
abstract contract RandomlyAssigned is WithLimitedSupply {
    // Used for random index assignment
    mapping(uint256 => uint256) private tokenMatrix;

    // The initial token ID
    uint256 private startFrom;

    /// Instanciate the contract
    /// @param _maxSupply how many tokens this collection should hold
    /// @param _startFrom the tokenID with which to start counting
    constructor (uint256 _maxSupply, uint256 _startFrom)
        WithLimitedSupply(_maxSupply)
    {
        startFrom = _startFrom;
    }

    /// Get the next token ID
    /// @dev Randomly gets a new token ID and keeps track of the ones that are still available.
    /// @return the next token ID
    function nextToken() internal override ensureAvailability returns (uint256) {
        uint256 maxIndex = maxSupply() - tokenCount();
        uint256 random = uint256(keccak256(
            abi.encodePacked(
                msg.sender,
                block.coinbase,
                block.difficulty,
                block.gaslimit,
                block.timestamp
            )
        )) % maxIndex;

        uint256 value = 0;
        if (tokenMatrix[random] == 0) {
            // If this matrix position is empty, set the value to the generated random number.
            value = random;
        } else {
            // Otherwise, use the previously stored number from the matrix.
            value = tokenMatrix[random];
        }

        // If the last available tokenID is still unused...
        if (tokenMatrix[maxIndex - 1] == 0) {
            // ...store that ID in the current matrix position.
            tokenMatrix[random] = maxIndex - 1;
        } else {
            // ...otherwise copy over the stored number to the current matrix position.
            tokenMatrix[random] = tokenMatrix[maxIndex - 1];
        }

        // Increment counts
        super.nextToken();

        return value + startFrom;
    }
}

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



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/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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/extensions/IERC721Metadata.sol
pragma solidity ^0.8.0;
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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



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: @openzeppelin/contracts/utils/Pausable.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SunBlocksTraining1 is ERC721Enumerable, Ownable, RandomlyAssigned {
  using Strings for uint256;

  string public baseExtension = ".json";
  uint256 public cost = 0.042 ether;
  uint256 public maxBlocksSupply = 5555;

  uint256 public maxPresaleMintAmount = 5;

  uint256 public maxMintAmount = 10;

  bool public isPresaleActive = false;
  bool public isFreeMintActive = false;
  bool public isPublicSaleActive = false;
 // bool public paused = false;
 // bool public publicPaused = true;

  uint public freeMintSupplyMinted = 0;
  uint public freeMintMaxSupply = 1130; //1110 SunGapers + 20 SunGap Collectors whitelisted in fremintList


  uint public genesisSupplyMinted = 0;
  uint public genesisMaxSupply = 555; //555 Genesis items Collectors whitelisted in genesisFremintList


  uint public publicSupplyMinted = 0; //Used for public and whitelist mints
  uint public publicMaxSupply = 3870;  //Used for public and whitelist mints


  mapping(address => uint256) public whitelist;
  mapping(address => uint256) public freeMintWhitelist;
  mapping(address => uint256) public genesisWhitelist;

  uint public numberWhitlisted = 0;
  uint public numberFreeMintWhitlisted = 0;

  string public baseURI;

  constructor(
  ) ERC721("SunBlocksTraining1", "SBLOCKST1")
  RandomlyAssigned(5555, 1) {
  }

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

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function mint(uint256 _mintAmount) public payable {
    require(isPublicSaleActive, "Public Sale is not active");
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(totalSupply() + _mintAmount <= maxBlocksSupply);
    require(publicSupplyMinted + _mintAmount <= publicMaxSupply);
    require(msg.value >= cost * _mintAmount);

    for (uint256 i = 1; i <= _mintAmount; i++) {
      uint256 mintIndex = nextToken();

      _safeMint(_msgSender(), mintIndex);
    }

    publicSupplyMinted = publicSupplyMinted + _mintAmount;
  }

  function presaleMint(uint256 _mintAmount) external payable {
      require(isPresaleActive, "Presale is not active");
      require(_mintAmount > 0);
      require(_mintAmount <= maxPresaleMintAmount);
      require(totalSupply() + _mintAmount <= maxBlocksSupply);
      require(publicSupplyMinted + _mintAmount <= publicMaxSupply);
      require(msg.value >= cost * _mintAmount);

      uint256 senderLimit = whitelist[msg.sender];

      require(senderLimit > 0, "You have no tokens left");
      require(_mintAmount <= senderLimit, "Your max token holding exceeded");


      for (uint256 i = 0; i < _mintAmount; i++) {
        uint256 mintIndex = nextToken();
        _safeMint(_msgSender(), mintIndex);
        senderLimit -= 1;
      }

      publicSupplyMinted = publicSupplyMinted + _mintAmount;
      whitelist[msg.sender] = senderLimit;
  }


  function freeMint(uint256 _mintAmount) external payable {
      require(isFreeMintActive, "Freemint is not active");
      require(_mintAmount > 0);
      require(_mintAmount <= maxMintAmount);
      require(totalSupply() + _mintAmount <= maxBlocksSupply);
      require(freeMintSupplyMinted + _mintAmount <= freeMintMaxSupply);

      uint256 senderLimit = freeMintWhitelist[msg.sender];

      require(senderLimit > 0, "You have no tokens left");
      require(_mintAmount <= senderLimit, "Your max token holding exceeded");


      for (uint256 i = 0; i < _mintAmount; i++) {
        uint256 mintIndex = nextToken();
        _safeMint(_msgSender(), mintIndex);
        senderLimit -= 1;
      }

      freeMintSupplyMinted = freeMintSupplyMinted + _mintAmount;
      freeMintWhitelist[msg.sender] = senderLimit;
  }

  function genesisFreeMint(uint256 _mintAmount) external payable {
      require(isPresaleActive, "Genesis Freemint is not active");
      require(_mintAmount > 0);
      require(_mintAmount <= maxMintAmount);
      require(totalSupply() + _mintAmount <= maxBlocksSupply);
      require(genesisSupplyMinted + _mintAmount <= genesisMaxSupply);

      uint256 senderLimit = genesisWhitelist[msg.sender];

      require(senderLimit > 0, "You have no tokens left");
      require(_mintAmount <= senderLimit, "Your max token holding exceeded");


      for (uint256 i = 0; i < _mintAmount; i++) {
        uint256 mintIndex = nextToken();
        _safeMint(_msgSender(), mintIndex);
        senderLimit -= 1;
      }

      genesisSupplyMinted = genesisSupplyMinted + _mintAmount;
      genesisWhitelist[msg.sender] = senderLimit;
  }


  function addWhitelist(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) external onlyOwner {
      require(_addrs.length == _limit.length);
      for (uint256 i = 0; i < _addrs.length; i++) {
          whitelist[_addrs[i]] = _limit[i];
          numberWhitlisted++;
      }
  }

  function addFreeMintWhitelist(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) external onlyOwner {
      require(_addrs.length == _limit.length);
      for (uint256 i = 0; i < _addrs.length; i++) {
          freeMintWhitelist[_addrs[i]] = _limit[i];
          numberFreeMintWhitlisted++;
      }
  }

  function updateWhitelist(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) external onlyOwner {
      require(_addrs.length == _limit.length);
       uint256 whitelistLength = numberWhitlisted;
      for (uint256 i = whitelistLength; i < _addrs.length+whitelistLength; i++) {
          whitelist[_addrs[i]] = _limit[i];
          numberWhitlisted++;
      }
  }

  function updateFreeMintWhitelist(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) external onlyOwner {
      require(_addrs.length == _limit.length);
       uint256 freeMintWhitelistLength = numberFreeMintWhitlisted;
      for (uint256 i = freeMintWhitelistLength; i < _addrs.length+freeMintWhitelistLength; i++) {
          freeMintWhitelist[_addrs[i]] = _limit[i];
          numberFreeMintWhitlisted++;
      }
  }

  function addGenesisMintWhitelist(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) external onlyOwner {
      require(_addrs.length == _limit.length);
      for (uint256 i = 0; i < _addrs.length; i++) {
          genesisWhitelist[_addrs[i]] = _limit[i];
      }
  }

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

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

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }
  //only owner


    function togglePresaleStatus() external onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    function toggleFreeMintStatus() external onlyOwner {
        isFreeMintActive = !isFreeMintActive;
    }

    function togglePublicSaleStatus() external onlyOwner {
        isPublicSaleActive = !isPublicSaleActive;
    }

  function withdraw() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"addFreeMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"addGenesisMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeMintMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"genesisFreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"genesisMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisWhitelist","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":[],"name":"isFreeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBlocksSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberFreeMintWhitlisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberWhitlisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","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":[],"name":"toggleFreeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","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":"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":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"updateFreeMintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f908051906020019062000051929190620002a2565b50669536c7089100006010556115b36011556005601255600a6013556000601460006101000a81548160ff0219169083151502179055506000601460016101000a81548160ff0219169083151502179055506000601460026101000a81548160ff021916908315150217905550600060155561046a601655600060175561022b6018556000601955610f1e601a556000601e556000601f55348015620000f657600080fd5b506115b36001816040518060400160405280601281526020017f53756e426c6f636b73547261696e696e673100000000000000000000000000008152506040518060400160405280600981526020017f53424c4f434b5354310000000000000000000000000000000000000000000000815250816000908051906020019062000181929190620002a2565b5080600190805190602001906200019a929190620002a2565b505050620001bd620001b1620001d460201b60201c565b620001dc60201b60201c565b80600c819055505080600e819055505050620003b7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b09062000352565b90600052602060002090601f016020900481019282620002d4576000855562000320565b82601f10620002ef57805160ff191683800117855562000320565b8280016001018555821562000320579182015b828111156200031f57825182559160200191906001019062000302565b5b5090506200032f919062000333565b5090565b5b808211156200034e57600081600090555060010162000334565b5090565b600060028204905060018216806200036b57607f821691505b6020821081141562000382576200038162000388565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b4080620003c76000396000f3fe6080604052600436106103765760003560e01c8063715018a6116101d1578063b88d4fde11610102578063c9b298f1116100a0578063e14ca3531161006f578063e14ca35314610c79578063e985e9c514610ca4578063f2fde38b14610ce1578063ff12ec7414610d0a57610376565b8063c9b298f114610bde578063cbd53d8d14610bfa578063d5abeb0114610c23578063dccfbe4d14610c4e57610376565b8063c4da788e116100dc578063c4da788e14610b10578063c668286214610b4d578063c87b56dd14610b78578063c94f387014610bb557610376565b8063b88d4fde14610aa7578063b9ad9fde14610ad0578063bc1ebce114610ae757610376565b806388f627f71161016f5780639b19251a116101495780639b19251a146109fa5780639f181b5e14610a37578063a0712d6814610a62578063a22cb46514610a7e57610376565b806388f627f7146109795780638da5cb5b146109a457806395d89b41146109cf57610376565b80637ac3ad7d116101ab5780637ac3ad7d146108f05780637bffb4ce1461091b5780637c928fe914610932578063854807561461094e57610376565b8063715018a61461088357806378cbcf231461089a5780637a5b85c1146108c557610376565b80633ccfd60b116102ab578063540e40a21161024957806360d938dc1161022357806360d938dc146107b35780636352211e146107de5780636c0360eb1461081b57806370a082311461084657610376565b8063540e40a21461073457806355f804b31461075f5780635fa965531461078857610376565b8063438b630011610285578063438b63001461067357806347b8827f146106b05780634f6ccce7146106db5780635200cafb1461071857610376565b80633ccfd60b1461061557806342842e0e1461061f578063431005271461064857610376565b806313faede611610318578063221a7588116102f2578063221a75881461055b578063239c70ae1461058457806323b872dd146105af5780632f745c59146105d857610376565b806313faede6146104da57806318160ddd146105055780631e84c4131461053057610376565b8063081812fc11610354578063081812fc1461040c57806308e7e9b514610449578063092ca2d014610474578063095ea7b3146104b157610376565b806301ffc9a71461037b578063050414bb146103b857806306fdde03146103e1575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d919061444c565b610d21565b6040516103af9190614bb9565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da91906143cb565b610d9b565b005b3480156103ed57600080fd5b506103f6610eed565b6040516104039190614bd4565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e91906144ef565b610f7f565b6040516104409190614b30565b60405180910390f35b34801561045557600080fd5b5061045e611004565b60405161046b9190614f16565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190614208565b61100a565b6040516104a89190614f16565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d3919061438b565b611022565b005b3480156104e657600080fd5b506104ef61113a565b6040516104fc9190614f16565b60405180910390f35b34801561051157600080fd5b5061051a611140565b6040516105279190614f16565b60405180910390f35b34801561053c57600080fd5b5061054561114d565b6040516105529190614bb9565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d91906143cb565b611160565b005b34801561059057600080fd5b506105996112c8565b6040516105a69190614f16565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d19190614275565b6112ce565b005b3480156105e457600080fd5b506105ff60048036038101906105fa919061438b565b61132e565b60405161060c9190614f16565b60405180910390f35b61061d6113d3565b005b34801561062b57600080fd5b5061064660048036038101906106419190614275565b61148f565b005b34801561065457600080fd5b5061065d6114af565b60405161066a9190614f16565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190614208565b6114b5565b6040516106a79190614b97565b60405180910390f35b3480156106bc57600080fd5b506106c5611563565b6040516106d29190614f16565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd91906144ef565b611569565b60405161070f9190614f16565b60405180910390f35b610732600480360381019061072d91906144ef565b6115da565b005b34801561074057600080fd5b506107496117f4565b6040516107569190614f16565b60405180910390f35b34801561076b57600080fd5b50610786600480360381019061078191906144a6565b6117fa565b005b34801561079457600080fd5b5061079d611890565b6040516107aa9190614f16565b60405180910390f35b3480156107bf57600080fd5b506107c8611896565b6040516107d59190614bb9565b60405180910390f35b3480156107ea57600080fd5b50610805600480360381019061080091906144ef565b6118a9565b6040516108129190614b30565b60405180910390f35b34801561082757600080fd5b5061083061195b565b60405161083d9190614bd4565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190614208565b6119e9565b60405161087a9190614f16565b60405180910390f35b34801561088f57600080fd5b50610898611aa1565b005b3480156108a657600080fd5b506108af611b29565b6040516108bc9190614f16565b60405180910390f35b3480156108d157600080fd5b506108da611b2f565b6040516108e79190614bb9565b60405180910390f35b3480156108fc57600080fd5b50610905611b42565b6040516109129190614f16565b60405180910390f35b34801561092757600080fd5b50610930611b48565b005b61094c600480360381019061094791906144ef565b611bf0565b005b34801561095a57600080fd5b50610963611e0a565b6040516109709190614f16565b60405180910390f35b34801561098557600080fd5b5061098e611e10565b60405161099b9190614f16565b60405180910390f35b3480156109b057600080fd5b506109b9611e16565b6040516109c69190614b30565b60405180910390f35b3480156109db57600080fd5b506109e4611e40565b6040516109f19190614bd4565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190614208565b611ed2565b604051610a2e9190614f16565b60405180910390f35b348015610a4357600080fd5b50610a4c611eea565b604051610a599190614f16565b60405180910390f35b610a7c6004803603810190610a7791906144ef565b611efb565b005b348015610a8a57600080fd5b50610aa56004803603810190610aa0919061434b565b612014565b005b348015610ab357600080fd5b50610ace6004803603810190610ac991906142c8565b612195565b005b348015610adc57600080fd5b50610ae56121f7565b005b348015610af357600080fd5b50610b0e6004803603810190610b0991906143cb565b61229f565b005b348015610b1c57600080fd5b50610b376004803603810190610b329190614208565b6123d9565b604051610b449190614f16565b60405180910390f35b348015610b5957600080fd5b50610b626123f1565b604051610b6f9190614bd4565b60405180910390f35b348015610b8457600080fd5b50610b9f6004803603810190610b9a91906144ef565b61247f565b604051610bac9190614bd4565b60405180910390f35b348015610bc157600080fd5b50610bdc6004803603810190610bd791906143cb565b612529565b005b610bf86004803603810190610bf391906144ef565b612691565b005b348015610c0657600080fd5b50610c216004803603810190610c1c91906143cb565b6128c5565b005b348015610c2f57600080fd5b50610c38612a17565b604051610c459190614f16565b60405180910390f35b348015610c5a57600080fd5b50610c63612a21565b604051610c709190614f16565b60405180910390f35b348015610c8557600080fd5b50610c8e612a27565b604051610c9b9190614f16565b60405180910390f35b348015610cb057600080fd5b50610ccb6004803603810190610cc69190614235565b612a48565b604051610cd89190614bb9565b60405180910390f35b348015610ced57600080fd5b50610d086004803603810190610d039190614208565b612adc565b005b348015610d1657600080fd5b50610d1f612bd4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d945750610d9382612c7c565b5b9050919050565b610da3612d5e565b73ffffffffffffffffffffffffffffffffffffffff16610dc1611e16565b73ffffffffffffffffffffffffffffffffffffffff1614610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90614e16565b60405180910390fd5b818190508484905014610e2957600080fd5b60005b84849050811015610ee657828282818110610e4a57610e496153ff565b5b90506020020135601b6000878785818110610e6857610e676153ff565b5b9050602002016020810190610e7d9190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e6000815480929190610ece90615289565b91905055508080610ede90615289565b915050610e2c565b5050505050565b606060008054610efc90615226565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2890615226565b8015610f755780601f10610f4a57610100808354040283529160200191610f75565b820191906000526020600020905b815481529060010190602001808311610f5857829003601f168201915b5050505050905090565b6000610f8a82612d66565b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614df6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601e5481565b601c6020528060005260406000206000915090505481565b600061102d826118a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590614e76565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110bd612d5e565b73ffffffffffffffffffffffffffffffffffffffff1614806110ec57506110eb816110e6612d5e565b612a48565b5b61112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290614d76565b60405180910390fd5b6111358383612dd2565b505050565b60105481565b6000600880549050905090565b601460029054906101000a900460ff1681565b611168612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611186611e16565b73ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390614e16565b60405180910390fd5b8181905084849050146111ee57600080fd5b6000601f54905060008190505b818686905061120a9190615049565b8110156112c057838382818110611224576112236153ff565b5b90506020020135601c6000888885818110611242576112416153ff565b5b90506020020160208101906112579190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601f60008154809291906112a890615289565b919050555080806112b890615289565b9150506111fb565b505050505050565b60135481565b6112df6112d9612d5e565b82612e8b565b61131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590614eb6565b60405180910390fd5b611329838383612f69565b505050565b6000611339836119e9565b821061137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614c36565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113db612d5e565b73ffffffffffffffffffffffffffffffffffffffff166113f9611e16565b73ffffffffffffffffffffffffffffffffffffffff161461144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690614e16565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061148d57600080fd5b565b6114aa83838360405180602001604052806000815250612195565b505050565b60155481565b606060006114c2836119e9565b905060008167ffffffffffffffff8111156114e0576114df61542e565b5b60405190808252806020026020018201604052801561150e5781602001602082028036833780820191505090505b50905060005b8281101561155857611526858261132e565b828281518110611539576115386153ff565b5b602002602001018181525050808061155090615289565b915050611514565b508092505050919050565b60175481565b6000611573611140565b82106115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614ed6565b60405180910390fd5b600882815481106115c8576115c76153ff565b5b90600052602060002001549050919050565b601460009054906101000a900460ff16611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162090614e96565b60405180910390fd5b6000811161163657600080fd5b60135481111561164557600080fd5b60115481611651611140565b61165b9190615049565b111561166657600080fd5b601854816017546116779190615049565b111561168257600080fd5b6000601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614c16565b60405180910390fd5b8082111561174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390614c76565b60405180910390fd5b60005b828110156117975760006117616131c5565b905061177461176e612d5e565b82613353565b600183611781919061512a565b925050808061178f90615289565b91505061174f565b50816017546117a69190615049565b60178190555080601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60185481565b611802612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611820611e16565b73ffffffffffffffffffffffffffffffffffffffff1614611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d90614e16565b60405180910390fd5b806020908051906020019061188c929190613f70565b5050565b601f5481565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614db6565b60405180910390fd5b80915050919050565b6020805461196890615226565b80601f016020809104026020016040519081016040528092919081815260200182805461199490615226565b80156119e15780601f106119b6576101008083540402835291602001916119e1565b820191906000526020600020905b8154815290600101906020018083116119c457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5190614d96565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611aa9612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611ac7611e16565b73ffffffffffffffffffffffffffffffffffffffff1614611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490614e16565b60405180910390fd5b611b276000613371565b565b601a5481565b601460019054906101000a900460ff1681565b60165481565b611b50612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611b6e611e16565b73ffffffffffffffffffffffffffffffffffffffff1614611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb90614e16565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b601460019054906101000a900460ff16611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3690614bf6565b60405180910390fd5b60008111611c4c57600080fd5b601354811115611c5b57600080fd5b60115481611c67611140565b611c719190615049565b1115611c7c57600080fd5b60165481601554611c8d9190615049565b1115611c9857600080fd5b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690614c16565b60405180910390fd5b80821115611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990614c76565b60405180910390fd5b60005b82811015611dad576000611d776131c5565b9050611d8a611d84612d5e565b82613353565b600183611d97919061512a565b9250508080611da590615289565b915050611d65565b5081601554611dbc9190615049565b60158190555080601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60125481565b60195481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e4f90615226565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7b90615226565b8015611ec85780601f10611e9d57610100808354040283529160200191611ec8565b820191906000526020600020905b815481529060010190602001808311611eab57829003601f168201915b5050505050905090565b601b6020528060005260406000206000915090505481565b6000611ef6600b613437565b905090565b601460029054906101000a900460ff16611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190614cd6565b60405180910390fd5b60008111611f5757600080fd5b601354811115611f6657600080fd5b60115481611f72611140565b611f7c9190615049565b1115611f8757600080fd5b601a5481601954611f989190615049565b1115611fa357600080fd5b80601054611fb191906150d0565b341015611fbd57600080fd5b6000600190505b818111611ffc576000611fd56131c5565b9050611fe8611fe2612d5e565b82613353565b508080611ff490615289565b915050611fc4565b508060195461200b9190615049565b60198190555050565b61201c612d5e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190614d16565b60405180910390fd5b8060056000612097612d5e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612144612d5e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121899190614bb9565b60405180910390a35050565b6121a66121a0612d5e565b83612e8b565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90614eb6565b60405180910390fd5b6121f184848484613445565b50505050565b6121ff612d5e565b73ffffffffffffffffffffffffffffffffffffffff1661221d611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90614e16565b60405180910390fd5b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b6122a7612d5e565b73ffffffffffffffffffffffffffffffffffffffff166122c5611e16565b73ffffffffffffffffffffffffffffffffffffffff161461231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290614e16565b60405180910390fd5b81819050848490501461232d57600080fd5b60005b848490508110156123d25782828281811061234e5761234d6153ff565b5b90506020020135601d600087878581811061236c5761236b6153ff565b5b90506020020160208101906123819190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806123ca90615289565b915050612330565b5050505050565b601d6020528060005260406000206000915090505481565b600f80546123fe90615226565b80601f016020809104026020016040519081016040528092919081815260200182805461242a90615226565b80156124775780601f1061244c57610100808354040283529160200191612477565b820191906000526020600020905b81548152906001019060200180831161245a57829003601f168201915b505050505081565b606061248a82612d66565b6124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c090614e56565b60405180910390fd5b60006124d36134a1565b905060008151116124f35760405180602001604052806000815250612521565b806124fd84613533565b600f60405160200161251193929190614aff565b6040516020818303038152906040525b915050919050565b612531612d5e565b73ffffffffffffffffffffffffffffffffffffffff1661254f611e16565b73ffffffffffffffffffffffffffffffffffffffff16146125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259c90614e16565b60405180910390fd5b8181905084849050146125b757600080fd5b6000601e54905060008190505b81868690506125d39190615049565b811015612689578383828181106125ed576125ec6153ff565b5b90506020020135601b600088888581811061260b5761260a6153ff565b5b90506020020160208101906126209190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e600081548092919061267190615289565b9190505550808061268190615289565b9150506125c4565b505050505050565b601460009054906101000a900460ff166126e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d790614ef6565b60405180910390fd5b600081116126ed57600080fd5b6012548111156126fc57600080fd5b60115481612708611140565b6127129190615049565b111561271d57600080fd5b601a548160195461272e9190615049565b111561273957600080fd5b8060105461274791906150d0565b34101561275357600080fd5b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116127da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d190614c16565b60405180910390fd5b8082111561281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281490614c76565b60405180910390fd5b60005b828110156128685760006128326131c5565b905061284561283f612d5e565b82613353565b600183612852919061512a565b925050808061286090615289565b915050612820565b50816019546128779190615049565b60198190555080601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6128cd612d5e565b73ffffffffffffffffffffffffffffffffffffffff166128eb611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293890614e16565b60405180910390fd5b81819050848490501461295357600080fd5b60005b84849050811015612a1057828282818110612974576129736153ff565b5b90506020020135601c6000878785818110612992576129916153ff565b5b90506020020160208101906129a79190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601f60008154809291906129f890615289565b91905055508080612a0890615289565b915050612956565b5050505050565b6000600c54905090565b60115481565b6000612a31611eea565b612a39612a17565b612a43919061512a565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612ae4612d5e565b73ffffffffffffffffffffffffffffffffffffffff16612b02611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90614e16565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf90614c96565b60405180910390fd5b612bd181613371565b50565b612bdc612d5e565b73ffffffffffffffffffffffffffffffffffffffff16612bfa611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614e16565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d575750612d5682613694565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e45836118a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9682612d66565b612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90614d56565b60405180910390fd5b6000612ee0836118a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f4f57508373ffffffffffffffffffffffffffffffffffffffff16612f3784610f7f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f605750612f5f8185612a48565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f89826118a9565b73ffffffffffffffffffffffffffffffffffffffff1614612fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd690614e36565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561304f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304690614cf6565b60405180910390fd5b61305a8383836136fe565b613065600082612dd2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b5919061512a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461310c9190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806131d0612a27565b11613210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320790614d36565b60405180910390fd5b600061321a611eea565b613222612a17565b61322c919061512a565b9050600081334144454260405160200161324a959493929190614aa0565b6040516020818303038152906040528051906020012060001c61326d9190615312565b9050600080600d6000848152602001908152602001600020541415613294578190506132ab565b600d60008381526020019081526020016000205490505b6000600d60006001866132be919061512a565b81526020019081526020016000205414156132fc576001836132e0919061512a565b600d600084815260200190815260200160002081905550613334565b600d600060018561330d919061512a565b815260200190815260200160002054600d6000848152602001908152602001600020819055505b61333c613812565b50600e548161334b9190615049565b935050505090565b61336d82826040518060200160405280600081525061387c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b613450848484612f69565b61345c848484846138d7565b61349b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349290614c56565b60405180910390fd5b50505050565b6060602080546134b090615226565b80601f01602080910402602001604051908101604052809291908181526020018280546134dc90615226565b80156135295780601f106134fe57610100808354040283529160200191613529565b820191906000526020600020905b81548152906001019060200180831161350c57829003601f168201915b5050505050905090565b6060600082141561357b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061368f565b600082905060005b600082146135ad57808061359690615289565b915050600a826135a6919061509f565b9150613583565b60008167ffffffffffffffff8111156135c9576135c861542e565b5b6040519080825280601f01601f1916602001820160405280156135fb5781602001600182028036833780820191505090505b5090505b6000851461368857600182613614919061512a565b9150600a856136239190615312565b603061362f9190615049565b60f81b818381518110613645576136446153ff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613681919061509f565b94506135ff565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613709838383613a6e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561374c5761374781613a73565b61378b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461378a576137898382613abc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ce576137c981613c29565b61380d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461380c5761380b8282613cfa565b5b5b505050565b60008061381d612a27565b1161385d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385490614d36565b60405180910390fd5b6000613869600b613437565b9050613875600b613d79565b8091505090565b6138868383613d8f565b61389360008484846138d7565b6138d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c990614c56565b60405180910390fd5b505050565b60006138f88473ffffffffffffffffffffffffffffffffffffffff16613f5d565b15613a61578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613921612d5e565b8786866040518563ffffffff1660e01b81526004016139439493929190614b4b565b602060405180830381600087803b15801561395d57600080fd5b505af192505050801561398e57506040513d601f19601f8201168201806040525081019061398b9190614479565b60015b613a11573d80600081146139be576040519150601f19603f3d011682016040523d82523d6000602084013e6139c3565b606091505b50600081511415613a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0090614c56565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a66565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613ac9846119e9565b613ad3919061512a565b9050600060076000848152602001908152602001600020549050818114613bb8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c3d919061512a565b9050600060096000848152602001908152602001600020549050600060088381548110613c6d57613c6c6153ff565b5b906000526020600020015490508060088381548110613c8f57613c8e6153ff565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613cde57613cdd6153d0565b5b6001900381819060005260206000200160009055905550505050565b6000613d05836119e9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df690614dd6565b60405180910390fd5b613e0881612d66565b15613e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e3f90614cb6565b60405180910390fd5b613e54600083836136fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ea49190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613f7c90615226565b90600052602060002090601f016020900481019282613f9e5760008555613fe5565b82601f10613fb757805160ff1916838001178555613fe5565b82800160010185558215613fe5579182015b82811115613fe4578251825591602001919060010190613fc9565b5b509050613ff29190613ff6565b5090565b5b8082111561400f576000816000905550600101613ff7565b5090565b600061402661402184614f56565b614f31565b9050828152602081018484840111156140425761404161546c565b5b61404d8482856151e4565b509392505050565b600061406861406384614f87565b614f31565b9050828152602081018484840111156140845761408361546c565b5b61408f8482856151e4565b509392505050565b6000813590506140a681615aae565b92915050565b60008083601f8401126140c2576140c1615462565b5b8235905067ffffffffffffffff8111156140df576140de61545d565b5b6020830191508360208202830111156140fb576140fa615467565b5b9250929050565b60008083601f84011261411857614117615462565b5b8235905067ffffffffffffffff8111156141355761413461545d565b5b60208301915083602082028301111561415157614150615467565b5b9250929050565b60008135905061416781615ac5565b92915050565b60008135905061417c81615adc565b92915050565b60008151905061419181615adc565b92915050565b600082601f8301126141ac576141ab615462565b5b81356141bc848260208601614013565b91505092915050565b600082601f8301126141da576141d9615462565b5b81356141ea848260208601614055565b91505092915050565b60008135905061420281615af3565b92915050565b60006020828403121561421e5761421d615476565b5b600061422c84828501614097565b91505092915050565b6000806040838503121561424c5761424b615476565b5b600061425a85828601614097565b925050602061426b85828601614097565b9150509250929050565b60008060006060848603121561428e5761428d615476565b5b600061429c86828701614097565b93505060206142ad86828701614097565b92505060406142be868287016141f3565b9150509250925092565b600080600080608085870312156142e2576142e1615476565b5b60006142f087828801614097565b945050602061430187828801614097565b9350506040614312878288016141f3565b925050606085013567ffffffffffffffff81111561433357614332615471565b5b61433f87828801614197565b91505092959194509250565b6000806040838503121561436257614361615476565b5b600061437085828601614097565b925050602061438185828601614158565b9150509250929050565b600080604083850312156143a2576143a1615476565b5b60006143b085828601614097565b92505060206143c1858286016141f3565b9150509250929050565b600080600080604085870312156143e5576143e4615476565b5b600085013567ffffffffffffffff81111561440357614402615471565b5b61440f878288016140ac565b9450945050602085013567ffffffffffffffff81111561443257614431615471565b5b61443e87828801614102565b925092505092959194509250565b60006020828403121561446257614461615476565b5b60006144708482850161416d565b91505092915050565b60006020828403121561448f5761448e615476565b5b600061449d84828501614182565b91505092915050565b6000602082840312156144bc576144bb615476565b5b600082013567ffffffffffffffff8111156144da576144d9615471565b5b6144e6848285016141c5565b91505092915050565b60006020828403121561450557614504615476565b5b6000614513848285016141f3565b91505092915050565b60006145288383614a6b565b60208301905092915050565b61454561454082615170565b6152e4565b82525050565b6145548161515e565b82525050565b61456b6145668261515e565b6152d2565b82525050565b600061457c82614fdd565b614586818561500b565b935061459183614fb8565b8060005b838110156145c25781516145a9888261451c565b97506145b483614ffe565b925050600181019050614595565b5085935050505092915050565b6145d881615182565b82525050565b60006145e982614fe8565b6145f3818561501c565b93506146038185602086016151f3565b61460c8161547b565b840191505092915050565b600061462282614ff3565b61462c818561502d565b935061463c8185602086016151f3565b6146458161547b565b840191505092915050565b600061465b82614ff3565b614665818561503e565b93506146758185602086016151f3565b80840191505092915050565b6000815461468e81615226565b614698818661503e565b945060018216600081146146b357600181146146c4576146f7565b60ff198316865281860193506146f7565b6146cd85614fc8565b60005b838110156146ef578154818901526001820191506020810190506146d0565b838801955050505b50505092915050565b600061470d60168361502d565b915061471882615499565b602082019050919050565b600061473060178361502d565b915061473b826154c2565b602082019050919050565b6000614753602b8361502d565b915061475e826154eb565b604082019050919050565b600061477660328361502d565b91506147818261553a565b604082019050919050565b6000614799601f8361502d565b91506147a482615589565b602082019050919050565b60006147bc60268361502d565b91506147c7826155b2565b604082019050919050565b60006147df601c8361502d565b91506147ea82615601565b602082019050919050565b600061480260198361502d565b915061480d8261562a565b602082019050919050565b600061482560248361502d565b915061483082615653565b604082019050919050565b600061484860198361502d565b9150614853826156a2565b602082019050919050565b600061486b60188361502d565b9150614876826156cb565b602082019050919050565b600061488e602c8361502d565b9150614899826156f4565b604082019050919050565b60006148b160388361502d565b91506148bc82615743565b604082019050919050565b60006148d4602a8361502d565b91506148df82615792565b604082019050919050565b60006148f760298361502d565b9150614902826157e1565b604082019050919050565b600061491a60208361502d565b915061492582615830565b602082019050919050565b600061493d602c8361502d565b915061494882615859565b604082019050919050565b600061496060208361502d565b915061496b826158a8565b602082019050919050565b600061498360298361502d565b915061498e826158d1565b604082019050919050565b60006149a6602f8361502d565b91506149b182615920565b604082019050919050565b60006149c960218361502d565b91506149d48261596f565b604082019050919050565b60006149ec601e8361502d565b91506149f7826159be565b602082019050919050565b6000614a0f60318361502d565b9150614a1a826159e7565b604082019050919050565b6000614a32602c8361502d565b9150614a3d82615a36565b604082019050919050565b6000614a5560158361502d565b9150614a6082615a85565b602082019050919050565b614a74816151da565b82525050565b614a83816151da565b82525050565b614a9a614a95826151da565b615308565b82525050565b6000614aac828861455a565b601482019150614abc8287614534565b601482019150614acc8286614a89565b602082019150614adc8285614a89565b602082019150614aec8284614a89565b6020820191508190509695505050505050565b6000614b0b8286614650565b9150614b178285614650565b9150614b238284614681565b9150819050949350505050565b6000602082019050614b45600083018461454b565b92915050565b6000608082019050614b60600083018761454b565b614b6d602083018661454b565b614b7a6040830185614a7a565b8181036060830152614b8c81846145de565b905095945050505050565b60006020820190508181036000830152614bb18184614571565b905092915050565b6000602082019050614bce60008301846145cf565b92915050565b60006020820190508181036000830152614bee8184614617565b905092915050565b60006020820190508181036000830152614c0f81614700565b9050919050565b60006020820190508181036000830152614c2f81614723565b9050919050565b60006020820190508181036000830152614c4f81614746565b9050919050565b60006020820190508181036000830152614c6f81614769565b9050919050565b60006020820190508181036000830152614c8f8161478c565b9050919050565b60006020820190508181036000830152614caf816147af565b9050919050565b60006020820190508181036000830152614ccf816147d2565b9050919050565b60006020820190508181036000830152614cef816147f5565b9050919050565b60006020820190508181036000830152614d0f81614818565b9050919050565b60006020820190508181036000830152614d2f8161483b565b9050919050565b60006020820190508181036000830152614d4f8161485e565b9050919050565b60006020820190508181036000830152614d6f81614881565b9050919050565b60006020820190508181036000830152614d8f816148a4565b9050919050565b60006020820190508181036000830152614daf816148c7565b9050919050565b60006020820190508181036000830152614dcf816148ea565b9050919050565b60006020820190508181036000830152614def8161490d565b9050919050565b60006020820190508181036000830152614e0f81614930565b9050919050565b60006020820190508181036000830152614e2f81614953565b9050919050565b60006020820190508181036000830152614e4f81614976565b9050919050565b60006020820190508181036000830152614e6f81614999565b9050919050565b60006020820190508181036000830152614e8f816149bc565b9050919050565b60006020820190508181036000830152614eaf816149df565b9050919050565b60006020820190508181036000830152614ecf81614a02565b9050919050565b60006020820190508181036000830152614eef81614a25565b9050919050565b60006020820190508181036000830152614f0f81614a48565b9050919050565b6000602082019050614f2b6000830184614a7a565b92915050565b6000614f3b614f4c565b9050614f478282615258565b919050565b6000604051905090565b600067ffffffffffffffff821115614f7157614f7061542e565b5b614f7a8261547b565b9050602081019050919050565b600067ffffffffffffffff821115614fa257614fa161542e565b5b614fab8261547b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615054826151da565b915061505f836151da565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561509457615093615343565b5b828201905092915050565b60006150aa826151da565b91506150b5836151da565b9250826150c5576150c4615372565b5b828204905092915050565b60006150db826151da565b91506150e6836151da565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561511f5761511e615343565b5b828202905092915050565b6000615135826151da565b9150615140836151da565b92508282101561515357615152615343565b5b828203905092915050565b6000615169826151ba565b9050919050565b600061517b826151ba565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152115780820151818401526020810190506151f6565b83811115615220576000848401525b50505050565b6000600282049050600182168061523e57607f821691505b60208210811415615252576152516153a1565b5b50919050565b6152618261547b565b810181811067ffffffffffffffff821117156152805761527f61542e565b5b80604052505050565b6000615294826151da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152c7576152c6615343565b5b600182019050919050565b60006152dd826152f6565b9050919050565b60006152ef826152f6565b9050919050565b60006153018261548c565b9050919050565b6000819050919050565b600061531d826151da565b9150615328836151da565b92508261533857615337615372565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f467265656d696e74206973206e6f742061637469766500000000000000000000600082015250565b7f596f752068617665206e6f20746f6b656e73206c656674000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7572206d617820746f6b656e20686f6c64696e6720657863656564656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f47656e6573697320467265656d696e74206973206e6f74206163746976650000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b615ab78161515e565b8114615ac257600080fd5b50565b615ace81615182565b8114615ad957600080fd5b50565b615ae58161518e565b8114615af057600080fd5b50565b615afc816151da565b8114615b0757600080fd5b5056fea2646970667358221220828fa77ad0ac77f2754d1219667ff83ac1a442be633f27ef206cc8f0c736872564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103765760003560e01c8063715018a6116101d1578063b88d4fde11610102578063c9b298f1116100a0578063e14ca3531161006f578063e14ca35314610c79578063e985e9c514610ca4578063f2fde38b14610ce1578063ff12ec7414610d0a57610376565b8063c9b298f114610bde578063cbd53d8d14610bfa578063d5abeb0114610c23578063dccfbe4d14610c4e57610376565b8063c4da788e116100dc578063c4da788e14610b10578063c668286214610b4d578063c87b56dd14610b78578063c94f387014610bb557610376565b8063b88d4fde14610aa7578063b9ad9fde14610ad0578063bc1ebce114610ae757610376565b806388f627f71161016f5780639b19251a116101495780639b19251a146109fa5780639f181b5e14610a37578063a0712d6814610a62578063a22cb46514610a7e57610376565b806388f627f7146109795780638da5cb5b146109a457806395d89b41146109cf57610376565b80637ac3ad7d116101ab5780637ac3ad7d146108f05780637bffb4ce1461091b5780637c928fe914610932578063854807561461094e57610376565b8063715018a61461088357806378cbcf231461089a5780637a5b85c1146108c557610376565b80633ccfd60b116102ab578063540e40a21161024957806360d938dc1161022357806360d938dc146107b35780636352211e146107de5780636c0360eb1461081b57806370a082311461084657610376565b8063540e40a21461073457806355f804b31461075f5780635fa965531461078857610376565b8063438b630011610285578063438b63001461067357806347b8827f146106b05780634f6ccce7146106db5780635200cafb1461071857610376565b80633ccfd60b1461061557806342842e0e1461061f578063431005271461064857610376565b806313faede611610318578063221a7588116102f2578063221a75881461055b578063239c70ae1461058457806323b872dd146105af5780632f745c59146105d857610376565b806313faede6146104da57806318160ddd146105055780631e84c4131461053057610376565b8063081812fc11610354578063081812fc1461040c57806308e7e9b514610449578063092ca2d014610474578063095ea7b3146104b157610376565b806301ffc9a71461037b578063050414bb146103b857806306fdde03146103e1575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d919061444c565b610d21565b6040516103af9190614bb9565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da91906143cb565b610d9b565b005b3480156103ed57600080fd5b506103f6610eed565b6040516104039190614bd4565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e91906144ef565b610f7f565b6040516104409190614b30565b60405180910390f35b34801561045557600080fd5b5061045e611004565b60405161046b9190614f16565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190614208565b61100a565b6040516104a89190614f16565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d3919061438b565b611022565b005b3480156104e657600080fd5b506104ef61113a565b6040516104fc9190614f16565b60405180910390f35b34801561051157600080fd5b5061051a611140565b6040516105279190614f16565b60405180910390f35b34801561053c57600080fd5b5061054561114d565b6040516105529190614bb9565b60405180910390f35b34801561056757600080fd5b50610582600480360381019061057d91906143cb565b611160565b005b34801561059057600080fd5b506105996112c8565b6040516105a69190614f16565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d19190614275565b6112ce565b005b3480156105e457600080fd5b506105ff60048036038101906105fa919061438b565b61132e565b60405161060c9190614f16565b60405180910390f35b61061d6113d3565b005b34801561062b57600080fd5b5061064660048036038101906106419190614275565b61148f565b005b34801561065457600080fd5b5061065d6114af565b60405161066a9190614f16565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190614208565b6114b5565b6040516106a79190614b97565b60405180910390f35b3480156106bc57600080fd5b506106c5611563565b6040516106d29190614f16565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd91906144ef565b611569565b60405161070f9190614f16565b60405180910390f35b610732600480360381019061072d91906144ef565b6115da565b005b34801561074057600080fd5b506107496117f4565b6040516107569190614f16565b60405180910390f35b34801561076b57600080fd5b50610786600480360381019061078191906144a6565b6117fa565b005b34801561079457600080fd5b5061079d611890565b6040516107aa9190614f16565b60405180910390f35b3480156107bf57600080fd5b506107c8611896565b6040516107d59190614bb9565b60405180910390f35b3480156107ea57600080fd5b50610805600480360381019061080091906144ef565b6118a9565b6040516108129190614b30565b60405180910390f35b34801561082757600080fd5b5061083061195b565b60405161083d9190614bd4565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190614208565b6119e9565b60405161087a9190614f16565b60405180910390f35b34801561088f57600080fd5b50610898611aa1565b005b3480156108a657600080fd5b506108af611b29565b6040516108bc9190614f16565b60405180910390f35b3480156108d157600080fd5b506108da611b2f565b6040516108e79190614bb9565b60405180910390f35b3480156108fc57600080fd5b50610905611b42565b6040516109129190614f16565b60405180910390f35b34801561092757600080fd5b50610930611b48565b005b61094c600480360381019061094791906144ef565b611bf0565b005b34801561095a57600080fd5b50610963611e0a565b6040516109709190614f16565b60405180910390f35b34801561098557600080fd5b5061098e611e10565b60405161099b9190614f16565b60405180910390f35b3480156109b057600080fd5b506109b9611e16565b6040516109c69190614b30565b60405180910390f35b3480156109db57600080fd5b506109e4611e40565b6040516109f19190614bd4565b60405180910390f35b348015610a0657600080fd5b50610a216004803603810190610a1c9190614208565b611ed2565b604051610a2e9190614f16565b60405180910390f35b348015610a4357600080fd5b50610a4c611eea565b604051610a599190614f16565b60405180910390f35b610a7c6004803603810190610a7791906144ef565b611efb565b005b348015610a8a57600080fd5b50610aa56004803603810190610aa0919061434b565b612014565b005b348015610ab357600080fd5b50610ace6004803603810190610ac991906142c8565b612195565b005b348015610adc57600080fd5b50610ae56121f7565b005b348015610af357600080fd5b50610b0e6004803603810190610b0991906143cb565b61229f565b005b348015610b1c57600080fd5b50610b376004803603810190610b329190614208565b6123d9565b604051610b449190614f16565b60405180910390f35b348015610b5957600080fd5b50610b626123f1565b604051610b6f9190614bd4565b60405180910390f35b348015610b8457600080fd5b50610b9f6004803603810190610b9a91906144ef565b61247f565b604051610bac9190614bd4565b60405180910390f35b348015610bc157600080fd5b50610bdc6004803603810190610bd791906143cb565b612529565b005b610bf86004803603810190610bf391906144ef565b612691565b005b348015610c0657600080fd5b50610c216004803603810190610c1c91906143cb565b6128c5565b005b348015610c2f57600080fd5b50610c38612a17565b604051610c459190614f16565b60405180910390f35b348015610c5a57600080fd5b50610c63612a21565b604051610c709190614f16565b60405180910390f35b348015610c8557600080fd5b50610c8e612a27565b604051610c9b9190614f16565b60405180910390f35b348015610cb057600080fd5b50610ccb6004803603810190610cc69190614235565b612a48565b604051610cd89190614bb9565b60405180910390f35b348015610ced57600080fd5b50610d086004803603810190610d039190614208565b612adc565b005b348015610d1657600080fd5b50610d1f612bd4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d945750610d9382612c7c565b5b9050919050565b610da3612d5e565b73ffffffffffffffffffffffffffffffffffffffff16610dc1611e16565b73ffffffffffffffffffffffffffffffffffffffff1614610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90614e16565b60405180910390fd5b818190508484905014610e2957600080fd5b60005b84849050811015610ee657828282818110610e4a57610e496153ff565b5b90506020020135601b6000878785818110610e6857610e676153ff565b5b9050602002016020810190610e7d9190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e6000815480929190610ece90615289565b91905055508080610ede90615289565b915050610e2c565b5050505050565b606060008054610efc90615226565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2890615226565b8015610f755780601f10610f4a57610100808354040283529160200191610f75565b820191906000526020600020905b815481529060010190602001808311610f5857829003601f168201915b5050505050905090565b6000610f8a82612d66565b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614df6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b601e5481565b601c6020528060005260406000206000915090505481565b600061102d826118a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590614e76565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110bd612d5e565b73ffffffffffffffffffffffffffffffffffffffff1614806110ec57506110eb816110e6612d5e565b612a48565b5b61112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290614d76565b60405180910390fd5b6111358383612dd2565b505050565b60105481565b6000600880549050905090565b601460029054906101000a900460ff1681565b611168612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611186611e16565b73ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390614e16565b60405180910390fd5b8181905084849050146111ee57600080fd5b6000601f54905060008190505b818686905061120a9190615049565b8110156112c057838382818110611224576112236153ff565b5b90506020020135601c6000888885818110611242576112416153ff565b5b90506020020160208101906112579190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601f60008154809291906112a890615289565b919050555080806112b890615289565b9150506111fb565b505050505050565b60135481565b6112df6112d9612d5e565b82612e8b565b61131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590614eb6565b60405180910390fd5b611329838383612f69565b505050565b6000611339836119e9565b821061137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190614c36565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6113db612d5e565b73ffffffffffffffffffffffffffffffffffffffff166113f9611e16565b73ffffffffffffffffffffffffffffffffffffffff161461144f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144690614e16565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061148d57600080fd5b565b6114aa83838360405180602001604052806000815250612195565b505050565b60155481565b606060006114c2836119e9565b905060008167ffffffffffffffff8111156114e0576114df61542e565b5b60405190808252806020026020018201604052801561150e5781602001602082028036833780820191505090505b50905060005b8281101561155857611526858261132e565b828281518110611539576115386153ff565b5b602002602001018181525050808061155090615289565b915050611514565b508092505050919050565b60175481565b6000611573611140565b82106115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614ed6565b60405180910390fd5b600882815481106115c8576115c76153ff565b5b90600052602060002001549050919050565b601460009054906101000a900460ff16611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162090614e96565b60405180910390fd5b6000811161163657600080fd5b60135481111561164557600080fd5b60115481611651611140565b61165b9190615049565b111561166657600080fd5b601854816017546116779190615049565b111561168257600080fd5b6000601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090614c16565b60405180910390fd5b8082111561174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390614c76565b60405180910390fd5b60005b828110156117975760006117616131c5565b905061177461176e612d5e565b82613353565b600183611781919061512a565b925050808061178f90615289565b91505061174f565b50816017546117a69190615049565b60178190555080601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60185481565b611802612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611820611e16565b73ffffffffffffffffffffffffffffffffffffffff1614611876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186d90614e16565b60405180910390fd5b806020908051906020019061188c929190613f70565b5050565b601f5481565b601460009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990614db6565b60405180910390fd5b80915050919050565b6020805461196890615226565b80601f016020809104026020016040519081016040528092919081815260200182805461199490615226565b80156119e15780601f106119b6576101008083540402835291602001916119e1565b820191906000526020600020905b8154815290600101906020018083116119c457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5190614d96565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611aa9612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611ac7611e16565b73ffffffffffffffffffffffffffffffffffffffff1614611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490614e16565b60405180910390fd5b611b276000613371565b565b601a5481565b601460019054906101000a900460ff1681565b60165481565b611b50612d5e565b73ffffffffffffffffffffffffffffffffffffffff16611b6e611e16565b73ffffffffffffffffffffffffffffffffffffffff1614611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb90614e16565b60405180910390fd5b601460009054906101000a900460ff1615601460006101000a81548160ff021916908315150217905550565b601460019054906101000a900460ff16611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3690614bf6565b60405180910390fd5b60008111611c4c57600080fd5b601354811115611c5b57600080fd5b60115481611c67611140565b611c719190615049565b1115611c7c57600080fd5b60165481601554611c8d9190615049565b1115611c9857600080fd5b6000601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690614c16565b60405180910390fd5b80821115611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5990614c76565b60405180910390fd5b60005b82811015611dad576000611d776131c5565b9050611d8a611d84612d5e565b82613353565b600183611d97919061512a565b9250508080611da590615289565b915050611d65565b5081601554611dbc9190615049565b60158190555080601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60125481565b60195481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e4f90615226565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7b90615226565b8015611ec85780601f10611e9d57610100808354040283529160200191611ec8565b820191906000526020600020905b815481529060010190602001808311611eab57829003601f168201915b5050505050905090565b601b6020528060005260406000206000915090505481565b6000611ef6600b613437565b905090565b601460029054906101000a900460ff16611f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4190614cd6565b60405180910390fd5b60008111611f5757600080fd5b601354811115611f6657600080fd5b60115481611f72611140565b611f7c9190615049565b1115611f8757600080fd5b601a5481601954611f989190615049565b1115611fa357600080fd5b80601054611fb191906150d0565b341015611fbd57600080fd5b6000600190505b818111611ffc576000611fd56131c5565b9050611fe8611fe2612d5e565b82613353565b508080611ff490615289565b915050611fc4565b508060195461200b9190615049565b60198190555050565b61201c612d5e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561208a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208190614d16565b60405180910390fd5b8060056000612097612d5e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612144612d5e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121899190614bb9565b60405180910390a35050565b6121a66121a0612d5e565b83612e8b565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc90614eb6565b60405180910390fd5b6121f184848484613445565b50505050565b6121ff612d5e565b73ffffffffffffffffffffffffffffffffffffffff1661221d611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90614e16565b60405180910390fd5b601460029054906101000a900460ff1615601460026101000a81548160ff021916908315150217905550565b6122a7612d5e565b73ffffffffffffffffffffffffffffffffffffffff166122c5611e16565b73ffffffffffffffffffffffffffffffffffffffff161461231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290614e16565b60405180910390fd5b81819050848490501461232d57600080fd5b60005b848490508110156123d25782828281811061234e5761234d6153ff565b5b90506020020135601d600087878581811061236c5761236b6153ff565b5b90506020020160208101906123819190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806123ca90615289565b915050612330565b5050505050565b601d6020528060005260406000206000915090505481565b600f80546123fe90615226565b80601f016020809104026020016040519081016040528092919081815260200182805461242a90615226565b80156124775780601f1061244c57610100808354040283529160200191612477565b820191906000526020600020905b81548152906001019060200180831161245a57829003601f168201915b505050505081565b606061248a82612d66565b6124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c090614e56565b60405180910390fd5b60006124d36134a1565b905060008151116124f35760405180602001604052806000815250612521565b806124fd84613533565b600f60405160200161251193929190614aff565b6040516020818303038152906040525b915050919050565b612531612d5e565b73ffffffffffffffffffffffffffffffffffffffff1661254f611e16565b73ffffffffffffffffffffffffffffffffffffffff16146125a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259c90614e16565b60405180910390fd5b8181905084849050146125b757600080fd5b6000601e54905060008190505b81868690506125d39190615049565b811015612689578383828181106125ed576125ec6153ff565b5b90506020020135601b600088888581811061260b5761260a6153ff565b5b90506020020160208101906126209190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601e600081548092919061267190615289565b9190505550808061268190615289565b9150506125c4565b505050505050565b601460009054906101000a900460ff166126e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d790614ef6565b60405180910390fd5b600081116126ed57600080fd5b6012548111156126fc57600080fd5b60115481612708611140565b6127129190615049565b111561271d57600080fd5b601a548160195461272e9190615049565b111561273957600080fd5b8060105461274791906150d0565b34101561275357600080fd5b6000601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116127da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d190614c16565b60405180910390fd5b8082111561281d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281490614c76565b60405180910390fd5b60005b828110156128685760006128326131c5565b905061284561283f612d5e565b82613353565b600183612852919061512a565b925050808061286090615289565b915050612820565b50816019546128779190615049565b60198190555080601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6128cd612d5e565b73ffffffffffffffffffffffffffffffffffffffff166128eb611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293890614e16565b60405180910390fd5b81819050848490501461295357600080fd5b60005b84849050811015612a1057828282818110612974576129736153ff565b5b90506020020135601c6000878785818110612992576129916153ff565b5b90506020020160208101906129a79190614208565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601f60008154809291906129f890615289565b91905055508080612a0890615289565b915050612956565b5050505050565b6000600c54905090565b60115481565b6000612a31611eea565b612a39612a17565b612a43919061512a565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612ae4612d5e565b73ffffffffffffffffffffffffffffffffffffffff16612b02611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90614e16565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf90614c96565b60405180910390fd5b612bd181613371565b50565b612bdc612d5e565b73ffffffffffffffffffffffffffffffffffffffff16612bfa611e16565b73ffffffffffffffffffffffffffffffffffffffff1614612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614e16565b60405180910390fd5b601460019054906101000a900460ff1615601460016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d575750612d5682613694565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e45836118a9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612e9682612d66565b612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90614d56565b60405180910390fd5b6000612ee0836118a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f4f57508373ffffffffffffffffffffffffffffffffffffffff16612f3784610f7f565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f605750612f5f8185612a48565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612f89826118a9565b73ffffffffffffffffffffffffffffffffffffffff1614612fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd690614e36565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561304f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304690614cf6565b60405180910390fd5b61305a8383836136fe565b613065600082612dd2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b5919061512a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461310c9190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806131d0612a27565b11613210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320790614d36565b60405180910390fd5b600061321a611eea565b613222612a17565b61322c919061512a565b9050600081334144454260405160200161324a959493929190614aa0565b6040516020818303038152906040528051906020012060001c61326d9190615312565b9050600080600d6000848152602001908152602001600020541415613294578190506132ab565b600d60008381526020019081526020016000205490505b6000600d60006001866132be919061512a565b81526020019081526020016000205414156132fc576001836132e0919061512a565b600d600084815260200190815260200160002081905550613334565b600d600060018561330d919061512a565b815260200190815260200160002054600d6000848152602001908152602001600020819055505b61333c613812565b50600e548161334b9190615049565b935050505090565b61336d82826040518060200160405280600081525061387c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b613450848484612f69565b61345c848484846138d7565b61349b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349290614c56565b60405180910390fd5b50505050565b6060602080546134b090615226565b80601f01602080910402602001604051908101604052809291908181526020018280546134dc90615226565b80156135295780601f106134fe57610100808354040283529160200191613529565b820191906000526020600020905b81548152906001019060200180831161350c57829003601f168201915b5050505050905090565b6060600082141561357b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061368f565b600082905060005b600082146135ad57808061359690615289565b915050600a826135a6919061509f565b9150613583565b60008167ffffffffffffffff8111156135c9576135c861542e565b5b6040519080825280601f01601f1916602001820160405280156135fb5781602001600182028036833780820191505090505b5090505b6000851461368857600182613614919061512a565b9150600a856136239190615312565b603061362f9190615049565b60f81b818381518110613645576136446153ff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613681919061509f565b94506135ff565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613709838383613a6e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561374c5761374781613a73565b61378b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461378a576137898382613abc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137ce576137c981613c29565b61380d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461380c5761380b8282613cfa565b5b5b505050565b60008061381d612a27565b1161385d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385490614d36565b60405180910390fd5b6000613869600b613437565b9050613875600b613d79565b8091505090565b6138868383613d8f565b61389360008484846138d7565b6138d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c990614c56565b60405180910390fd5b505050565b60006138f88473ffffffffffffffffffffffffffffffffffffffff16613f5d565b15613a61578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613921612d5e565b8786866040518563ffffffff1660e01b81526004016139439493929190614b4b565b602060405180830381600087803b15801561395d57600080fd5b505af192505050801561398e57506040513d601f19601f8201168201806040525081019061398b9190614479565b60015b613a11573d80600081146139be576040519150601f19603f3d011682016040523d82523d6000602084013e6139c3565b606091505b50600081511415613a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0090614c56565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a66565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613ac9846119e9565b613ad3919061512a565b9050600060076000848152602001908152602001600020549050818114613bb8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c3d919061512a565b9050600060096000848152602001908152602001600020549050600060088381548110613c6d57613c6c6153ff565b5b906000526020600020015490508060088381548110613c8f57613c8e6153ff565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613cde57613cdd6153d0565b5b6001900381819060005260206000200160009055905550505050565b6000613d05836119e9565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df690614dd6565b60405180910390fd5b613e0881612d66565b15613e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e3f90614cb6565b60405180910390fd5b613e54600083836136fe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ea49190615049565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613f7c90615226565b90600052602060002090601f016020900481019282613f9e5760008555613fe5565b82601f10613fb757805160ff1916838001178555613fe5565b82800160010185558215613fe5579182015b82811115613fe4578251825591602001919060010190613fc9565b5b509050613ff29190613ff6565b5090565b5b8082111561400f576000816000905550600101613ff7565b5090565b600061402661402184614f56565b614f31565b9050828152602081018484840111156140425761404161546c565b5b61404d8482856151e4565b509392505050565b600061406861406384614f87565b614f31565b9050828152602081018484840111156140845761408361546c565b5b61408f8482856151e4565b509392505050565b6000813590506140a681615aae565b92915050565b60008083601f8401126140c2576140c1615462565b5b8235905067ffffffffffffffff8111156140df576140de61545d565b5b6020830191508360208202830111156140fb576140fa615467565b5b9250929050565b60008083601f84011261411857614117615462565b5b8235905067ffffffffffffffff8111156141355761413461545d565b5b60208301915083602082028301111561415157614150615467565b5b9250929050565b60008135905061416781615ac5565b92915050565b60008135905061417c81615adc565b92915050565b60008151905061419181615adc565b92915050565b600082601f8301126141ac576141ab615462565b5b81356141bc848260208601614013565b91505092915050565b600082601f8301126141da576141d9615462565b5b81356141ea848260208601614055565b91505092915050565b60008135905061420281615af3565b92915050565b60006020828403121561421e5761421d615476565b5b600061422c84828501614097565b91505092915050565b6000806040838503121561424c5761424b615476565b5b600061425a85828601614097565b925050602061426b85828601614097565b9150509250929050565b60008060006060848603121561428e5761428d615476565b5b600061429c86828701614097565b93505060206142ad86828701614097565b92505060406142be868287016141f3565b9150509250925092565b600080600080608085870312156142e2576142e1615476565b5b60006142f087828801614097565b945050602061430187828801614097565b9350506040614312878288016141f3565b925050606085013567ffffffffffffffff81111561433357614332615471565b5b61433f87828801614197565b91505092959194509250565b6000806040838503121561436257614361615476565b5b600061437085828601614097565b925050602061438185828601614158565b9150509250929050565b600080604083850312156143a2576143a1615476565b5b60006143b085828601614097565b92505060206143c1858286016141f3565b9150509250929050565b600080600080604085870312156143e5576143e4615476565b5b600085013567ffffffffffffffff81111561440357614402615471565b5b61440f878288016140ac565b9450945050602085013567ffffffffffffffff81111561443257614431615471565b5b61443e87828801614102565b925092505092959194509250565b60006020828403121561446257614461615476565b5b60006144708482850161416d565b91505092915050565b60006020828403121561448f5761448e615476565b5b600061449d84828501614182565b91505092915050565b6000602082840312156144bc576144bb615476565b5b600082013567ffffffffffffffff8111156144da576144d9615471565b5b6144e6848285016141c5565b91505092915050565b60006020828403121561450557614504615476565b5b6000614513848285016141f3565b91505092915050565b60006145288383614a6b565b60208301905092915050565b61454561454082615170565b6152e4565b82525050565b6145548161515e565b82525050565b61456b6145668261515e565b6152d2565b82525050565b600061457c82614fdd565b614586818561500b565b935061459183614fb8565b8060005b838110156145c25781516145a9888261451c565b97506145b483614ffe565b925050600181019050614595565b5085935050505092915050565b6145d881615182565b82525050565b60006145e982614fe8565b6145f3818561501c565b93506146038185602086016151f3565b61460c8161547b565b840191505092915050565b600061462282614ff3565b61462c818561502d565b935061463c8185602086016151f3565b6146458161547b565b840191505092915050565b600061465b82614ff3565b614665818561503e565b93506146758185602086016151f3565b80840191505092915050565b6000815461468e81615226565b614698818661503e565b945060018216600081146146b357600181146146c4576146f7565b60ff198316865281860193506146f7565b6146cd85614fc8565b60005b838110156146ef578154818901526001820191506020810190506146d0565b838801955050505b50505092915050565b600061470d60168361502d565b915061471882615499565b602082019050919050565b600061473060178361502d565b915061473b826154c2565b602082019050919050565b6000614753602b8361502d565b915061475e826154eb565b604082019050919050565b600061477660328361502d565b91506147818261553a565b604082019050919050565b6000614799601f8361502d565b91506147a482615589565b602082019050919050565b60006147bc60268361502d565b91506147c7826155b2565b604082019050919050565b60006147df601c8361502d565b91506147ea82615601565b602082019050919050565b600061480260198361502d565b915061480d8261562a565b602082019050919050565b600061482560248361502d565b915061483082615653565b604082019050919050565b600061484860198361502d565b9150614853826156a2565b602082019050919050565b600061486b60188361502d565b9150614876826156cb565b602082019050919050565b600061488e602c8361502d565b9150614899826156f4565b604082019050919050565b60006148b160388361502d565b91506148bc82615743565b604082019050919050565b60006148d4602a8361502d565b91506148df82615792565b604082019050919050565b60006148f760298361502d565b9150614902826157e1565b604082019050919050565b600061491a60208361502d565b915061492582615830565b602082019050919050565b600061493d602c8361502d565b915061494882615859565b604082019050919050565b600061496060208361502d565b915061496b826158a8565b602082019050919050565b600061498360298361502d565b915061498e826158d1565b604082019050919050565b60006149a6602f8361502d565b91506149b182615920565b604082019050919050565b60006149c960218361502d565b91506149d48261596f565b604082019050919050565b60006149ec601e8361502d565b91506149f7826159be565b602082019050919050565b6000614a0f60318361502d565b9150614a1a826159e7565b604082019050919050565b6000614a32602c8361502d565b9150614a3d82615a36565b604082019050919050565b6000614a5560158361502d565b9150614a6082615a85565b602082019050919050565b614a74816151da565b82525050565b614a83816151da565b82525050565b614a9a614a95826151da565b615308565b82525050565b6000614aac828861455a565b601482019150614abc8287614534565b601482019150614acc8286614a89565b602082019150614adc8285614a89565b602082019150614aec8284614a89565b6020820191508190509695505050505050565b6000614b0b8286614650565b9150614b178285614650565b9150614b238284614681565b9150819050949350505050565b6000602082019050614b45600083018461454b565b92915050565b6000608082019050614b60600083018761454b565b614b6d602083018661454b565b614b7a6040830185614a7a565b8181036060830152614b8c81846145de565b905095945050505050565b60006020820190508181036000830152614bb18184614571565b905092915050565b6000602082019050614bce60008301846145cf565b92915050565b60006020820190508181036000830152614bee8184614617565b905092915050565b60006020820190508181036000830152614c0f81614700565b9050919050565b60006020820190508181036000830152614c2f81614723565b9050919050565b60006020820190508181036000830152614c4f81614746565b9050919050565b60006020820190508181036000830152614c6f81614769565b9050919050565b60006020820190508181036000830152614c8f8161478c565b9050919050565b60006020820190508181036000830152614caf816147af565b9050919050565b60006020820190508181036000830152614ccf816147d2565b9050919050565b60006020820190508181036000830152614cef816147f5565b9050919050565b60006020820190508181036000830152614d0f81614818565b9050919050565b60006020820190508181036000830152614d2f8161483b565b9050919050565b60006020820190508181036000830152614d4f8161485e565b9050919050565b60006020820190508181036000830152614d6f81614881565b9050919050565b60006020820190508181036000830152614d8f816148a4565b9050919050565b60006020820190508181036000830152614daf816148c7565b9050919050565b60006020820190508181036000830152614dcf816148ea565b9050919050565b60006020820190508181036000830152614def8161490d565b9050919050565b60006020820190508181036000830152614e0f81614930565b9050919050565b60006020820190508181036000830152614e2f81614953565b9050919050565b60006020820190508181036000830152614e4f81614976565b9050919050565b60006020820190508181036000830152614e6f81614999565b9050919050565b60006020820190508181036000830152614e8f816149bc565b9050919050565b60006020820190508181036000830152614eaf816149df565b9050919050565b60006020820190508181036000830152614ecf81614a02565b9050919050565b60006020820190508181036000830152614eef81614a25565b9050919050565b60006020820190508181036000830152614f0f81614a48565b9050919050565b6000602082019050614f2b6000830184614a7a565b92915050565b6000614f3b614f4c565b9050614f478282615258565b919050565b6000604051905090565b600067ffffffffffffffff821115614f7157614f7061542e565b5b614f7a8261547b565b9050602081019050919050565b600067ffffffffffffffff821115614fa257614fa161542e565b5b614fab8261547b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615054826151da565b915061505f836151da565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561509457615093615343565b5b828201905092915050565b60006150aa826151da565b91506150b5836151da565b9250826150c5576150c4615372565b5b828204905092915050565b60006150db826151da565b91506150e6836151da565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561511f5761511e615343565b5b828202905092915050565b6000615135826151da565b9150615140836151da565b92508282101561515357615152615343565b5b828203905092915050565b6000615169826151ba565b9050919050565b600061517b826151ba565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156152115780820151818401526020810190506151f6565b83811115615220576000848401525b50505050565b6000600282049050600182168061523e57607f821691505b60208210811415615252576152516153a1565b5b50919050565b6152618261547b565b810181811067ffffffffffffffff821117156152805761527f61542e565b5b80604052505050565b6000615294826151da565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152c7576152c6615343565b5b600182019050919050565b60006152dd826152f6565b9050919050565b60006152ef826152f6565b9050919050565b60006153018261548c565b9050919050565b6000819050919050565b600061531d826151da565b9150615328836151da565b92508261533857615337615372565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f467265656d696e74206973206e6f742061637469766500000000000000000000600082015250565b7f596f752068617665206e6f20746f6b656e73206c656674000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7572206d617820746f6b656e20686f6c64696e6720657863656564656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f47656e6573697320467265656d696e74206973206e6f74206163746976650000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b615ab78161515e565b8114615ac257600080fd5b50565b615ace81615182565b8114615ad957600080fd5b50565b615ae58161518e565b8114615af057600080fd5b50565b615afc816151da565b8114615b0757600080fd5b5056fea2646970667358221220828fa77ad0ac77f2754d1219667ff83ac1a442be633f27ef206cc8f0c736872564736f6c63430008070033

Deployed Bytecode Sourcemap

48817:7792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42551:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53547:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30443:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32002:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49960:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49845:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31525:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48971:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43191:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49220:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54592:447;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49099:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32892:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42859:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56490:114;;;:::i;:::-;;33302:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49336:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55344:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49489:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43381:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52692:847;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49529:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50281:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49997:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49139:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30137:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50044:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29867:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8080:94;;;;;;;;;;;;;:::i;:::-;;49714:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49179:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49377;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56147:103;;;;;;;;;;;;;:::i;:::-;;51847:839;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49053:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49637:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7429:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30612:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49796:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2337:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50385:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32295:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33558:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56372:112;;;;;;;;;;;;;:::i;:::-;;55045:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49902:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48929:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55698:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54195:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50967:872;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53859:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2159:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49009:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2542:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32661:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8329:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56258:106;;;;;;;;;;;;;:::i;:::-;;42551:224;42653:4;42692:35;42677:50;;;:11;:50;;;;:90;;;;42731:36;42755:11;42731:23;:36::i;:::-;42677:90;42670:97;;42551:224;;;:::o;53547:306::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53695:6:::1;;:13;;53678:6;;:13;;:30;53670:39;;;::::0;::::1;;53723:9;53718:130;53742:6;;:13;;53738:1;:17;53718:130;;;53798:6;;53805:1;53798:9;;;;;;;:::i;:::-;;;;;;;;53775;:20;53785:6;;53792:1;53785:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53775:20;;;;;;;;;;;;;;;:32;;;;53820:16;;:18;;;;;;;;;:::i;:::-;;;;;;53757:3;;;;;:::i;:::-;;;;53718:130;;;;53547:306:::0;;;;:::o;30443:100::-;30497:13;30530:5;30523:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30443:100;:::o;32002:221::-;32078:7;32106:16;32114:7;32106;:16::i;:::-;32098:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32191:15;:24;32207:7;32191:24;;;;;;;;;;;;;;;;;;;;;32184:31;;32002:221;;;:::o;49960:32::-;;;;:::o;49845:52::-;;;;;;;;;;;;;;;;;:::o;31525:411::-;31606:13;31622:23;31637:7;31622:14;:23::i;:::-;31606:39;;31670:5;31664:11;;:2;:11;;;;31656:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31764:5;31748:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31773:37;31790:5;31797:12;:10;:12::i;:::-;31773:16;:37::i;:::-;31748:62;31726:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31907:21;31916:2;31920:7;31907:8;:21::i;:::-;31595:341;31525:411;;:::o;48971:33::-;;;;:::o;43191:113::-;43252:7;43279:10;:17;;;;43272:24;;43191:113;:::o;49220:38::-;;;;;;;;;;;;;:::o;54592:447::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54751:6:::1;;:13;;54734:6;;:13;;:30;54726:39;;;::::0;::::1;;54775:31;54809:24;;54775:58;;54847:9;54859:23;54847:35;;54842:192;54902:23;54888:6;;:13;;:37;;;;:::i;:::-;54884:1;:41;54842:192;;;54976:6;;54983:1;54976:9;;;;;;;:::i;:::-;;;;;;;;54945:17;:28;54963:6;;54970:1;54963:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54945:28;;;;;;;;;;;;;;;:40;;;;54998:24;;:26;;;;;;;;;:::i;:::-;;;;;;54927:3;;;;;:::i;:::-;;;;54842:192;;;;54717:322;54592:447:::0;;;;:::o;49099:33::-;;;;:::o;32892:339::-;33087:41;33106:12;:10;:12::i;:::-;33120:7;33087:18;:41::i;:::-;33079:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33195:28;33205:4;33211:2;33215:7;33195:9;:28::i;:::-;32892:339;;;:::o;42859:256::-;42956:7;42992:23;43009:5;42992:16;:23::i;:::-;42984:5;:31;42976:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43081:12;:19;43094:5;43081:19;;;;;;;;;;;;;;;:26;43101:5;43081:26;;;;;;;;;;;;43074:33;;42859:256;;;;:::o;56490:114::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56558:10:::1;56550:24;;:47;56575:21;56550:47;;;;;;;;;;;;;;;;;;;;;;;56542:56;;;::::0;::::1;;56490:114::o:0;33302:185::-;33440:39;33457:4;33463:2;33467:7;33440:39;;;;;;;;;;;;:16;:39::i;:::-;33302:185;;;:::o;49336:36::-;;;;:::o;55344:348::-;55419:16;55447:23;55473:17;55483:6;55473:9;:17::i;:::-;55447:43;;55497:25;55539:15;55525:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55497:58;;55567:9;55562:103;55582:15;55578:1;:19;55562:103;;;55627:30;55647:6;55655:1;55627:19;:30::i;:::-;55613:8;55622:1;55613:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;55599:3;;;;;:::i;:::-;;;;55562:103;;;;55678:8;55671:15;;;;55344:348;;;:::o;49489:35::-;;;;:::o;43381:233::-;43456:7;43492:30;:28;:30::i;:::-;43484:5;:38;43476:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43589:10;43600:5;43589:17;;;;;;;;:::i;:::-;;;;;;;;;;43582:24;;43381:233;;;:::o;52692:847::-;52772:15;;;;;;;;;;;52764:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52853:1;52839:11;:15;52831:24;;;;;;52887:13;;52872:11;:28;;52864:37;;;;;;52949:15;;52934:11;52918:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;52910:55;;;;;;53019:16;;53004:11;52982:19;;:33;;;;:::i;:::-;:53;;52974:62;;;;;;53047:19;53069:16;:28;53086:10;53069:28;;;;;;;;;;;;;;;;53047:50;;53130:1;53116:11;:15;53108:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;53191:11;53176;:26;;53168:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53256:9;53251:166;53275:11;53271:1;:15;53251:166;;;53304:17;53324:11;:9;:11::i;:::-;53304:31;;53346:34;53356:12;:10;:12::i;:::-;53370:9;53346;:34::i;:::-;53406:1;53391:16;;;;;:::i;:::-;;;53293:124;53288:3;;;;;:::i;:::-;;;;53251:166;;;;53471:11;53449:19;;:33;;;;:::i;:::-;53427:19;:55;;;;53522:11;53491:16;:28;53508:10;53491:28;;;;;;;;;;;;;;;:42;;;;52755:784;52692:847;:::o;49529:34::-;;;;:::o;50281:98::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50362:11:::1;50352:7;:21;;;;;;;;;;;;:::i;:::-;;50281:98:::0;:::o;49997:40::-;;;;:::o;49139:35::-;;;;;;;;;;;;;:::o;30137:239::-;30209:7;30229:13;30245:7;:16;30253:7;30245:16;;;;;;;;;;;;;;;;;;;;;30229:32;;30297:1;30280:19;;:5;:19;;;;30272:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30363:5;30356:12;;;30137:239;;;:::o;50044:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29867:208::-;29939:7;29984:1;29967:19;;:5;:19;;;;29959:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30051:9;:16;30061:5;30051:16;;;;;;;;;;;;;;;;30044:23;;29867:208;;;:::o;8080:94::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8145:21:::1;8163:1;8145:9;:21::i;:::-;8080:94::o:0;49714:34::-;;;;:::o;49179:36::-;;;;;;;;;;;;;:::o;49377:::-;;;;:::o;56147:103::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56227:15:::1;;;;;;;;;;;56226:16;56208:15;;:34;;;;;;;;;;;;;;;;;;56147:103::o:0;51847:839::-;51920:16;;;;;;;;;;;51912:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51994:1;51980:11;:15;51972:24;;;;;;52028:13;;52013:11;:28;;52005:37;;;;;;52090:15;;52075:11;52059:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;52051:55;;;;;;52161:17;;52146:11;52123:20;;:34;;;;:::i;:::-;:55;;52115:64;;;;;;52190:19;52212:17;:29;52230:10;52212:29;;;;;;;;;;;;;;;;52190:51;;52274:1;52260:11;:15;52252:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;52335:11;52320;:26;;52312:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52400:9;52395:166;52419:11;52415:1;:15;52395:166;;;52448:17;52468:11;:9;:11::i;:::-;52448:31;;52490:34;52500:12;:10;:12::i;:::-;52514:9;52490;:34::i;:::-;52550:1;52535:16;;;;;:::i;:::-;;;52437:124;52432:3;;;;;:::i;:::-;;;;52395:166;;;;52617:11;52594:20;;:34;;;;:::i;:::-;52571:20;:57;;;;52669:11;52637:17;:29;52655:10;52637:29;;;;;;;;;;;;;;;:43;;;;51903:783;51847:839;:::o;49053:39::-;;;;:::o;49637:34::-;;;;:::o;7429:87::-;7475:7;7502:6;;;;;;;;;;;7495:13;;7429:87;:::o;30612:104::-;30668:13;30701:7;30694:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30612:104;:::o;49796:44::-;;;;;;;;;;;;;;;;;:::o;2337:99::-;2380:7;2407:21;:11;:19;:21::i;:::-;2400:28;;2337:99;:::o;50385:576::-;50450:18;;;;;;;;;;;50442:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50527:1;50513:11;:15;50505:24;;;;;;50559:13;;50544:11;:28;;50536:37;;;;;;50619:15;;50604:11;50588:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;50580:55;;;;;;50686:15;;50671:11;50650:18;;:32;;;;:::i;:::-;:51;;50642:60;;;;;;50737:11;50730:4;;:18;;;;:::i;:::-;50717:9;:31;;50709:40;;;;;;50763:9;50775:1;50763:13;;50758:136;50783:11;50778:1;:16;50758:136;;50810:17;50830:11;:9;:11::i;:::-;50810:31;;50852:34;50862:12;:10;:12::i;:::-;50876:9;50852;:34::i;:::-;50801:93;50796:3;;;;;:::i;:::-;;;;50758:136;;;;50944:11;50923:18;;:32;;;;:::i;:::-;50902:18;:53;;;;50385:576;:::o;32295:295::-;32410:12;:10;:12::i;:::-;32398:24;;:8;:24;;;;32390:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32510:8;32465:18;:32;32484:12;:10;:12::i;:::-;32465:32;;;;;;;;;;;;;;;:42;32498:8;32465:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32563:8;32534:48;;32549:12;:10;:12::i;:::-;32534:48;;;32573:8;32534:48;;;;;;:::i;:::-;;;;;;;;32295:295;;:::o;33558:328::-;33733:41;33752:12;:10;:12::i;:::-;33766:7;33733:18;:41::i;:::-;33725:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33839:39;33853:4;33859:2;33863:7;33872:5;33839:13;:39::i;:::-;33558:328;;;;:::o;56372:112::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56458:18:::1;;;;;;;;;;;56457:19;56436:18;;:40;;;;;;;;;;;;;;;;;;56372:112::o:0;55045:293::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55204:6:::1;;:13;;55187:6;;:13;;:30;55179:39;;;::::0;::::1;;55232:9;55227:106;55251:6;;:13;;55247:1;:17;55227:106;;;55314:6;;55321:1;55314:9;;;;;;;:::i;:::-;;;;;;;;55284:16;:27;55301:6;;55308:1;55301:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55284:27;;;;;;;;;;;;;;;:39;;;;55266:3;;;;;:::i;:::-;;;;55227:106;;;;55045:293:::0;;;;:::o;49902:51::-;;;;;;;;;;;;;;;;;:::o;48929:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55698:423::-;55796:13;55837:16;55845:7;55837;:16::i;:::-;55821:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;55927:28;55958:10;:8;:10::i;:::-;55927:41;;56013:1;55988:14;55982:28;:32;:133;;;;;;;;;;;;;;;;;56050:14;56066:18;:7;:16;:18::i;:::-;56086:13;56033:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55982:133;55975:140;;;55698:423;;;:::o;54195:391::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54346:6:::1;;:13;;54329:6;;:13;;:30;54321:39;;;::::0;::::1;;54370:23;54396:16;;54370:42;;54426:9;54438:15;54426:27;;54421:160;54473:15;54459:6;;:13;;:29;;;;:::i;:::-;54455:1;:33;54421:160;;;54531:6;;54538:1;54531:9;;;;;;;:::i;:::-;;;;;;;;54508;:20;54518:6;;54525:1;54518:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54508:20;;;;;;;;;;;;;;;:32;;;;54553:16;;:18;;;;;;;;;:::i;:::-;;;;;;54490:3;;;;;:::i;:::-;;;;54421:160;;;;54312:274;54195:391:::0;;;;:::o;50967:872::-;51043:15;;;;;;;;;;;51035:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51115:1;51101:11;:15;51093:24;;;;;;51149:20;;51134:11;:35;;51126:44;;;;;;51218:15;;51203:11;51187:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;51179:55;;;;;;51287:15;;51272:11;51251:18;;:32;;;;:::i;:::-;:51;;51243:60;;;;;;51340:11;51333:4;;:18;;;;:::i;:::-;51320:9;:31;;51312:40;;;;;;51363:19;51385:9;:21;51395:10;51385:21;;;;;;;;;;;;;;;;51363:43;;51439:1;51425:11;:15;51417:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51500:11;51485;:26;;51477:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51565:9;51560:166;51584:11;51580:1;:15;51560:166;;;51613:17;51633:11;:9;:11::i;:::-;51613:31;;51655:34;51665:12;:10;:12::i;:::-;51679:9;51655;:34::i;:::-;51715:1;51700:16;;;;;:::i;:::-;;;51602:124;51597:3;;;;;:::i;:::-;;;;51560:166;;;;51778:11;51757:18;;:32;;;;:::i;:::-;51736:18;:53;;;;51822:11;51798:9;:21;51808:10;51798:21;;;;;;;;;;;;;;;:35;;;;51026:813;50967:872;:::o;53859:330::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54015:6:::1;;:13;;53998:6;;:13;;:30;53990:39;;;::::0;::::1;;54043:9;54038:146;54062:6;;:13;;54058:1;:17;54038:146;;;54126:6;;54133:1;54126:9;;;;;;;:::i;:::-;;;;;;;;54095:17;:28;54113:6;;54120:1;54113:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54095:28;;;;;;;;;;;;;;;:40;;;;54148:24;;:26;;;;;;;;;:::i;:::-;;;;;;54077:3;;;;;:::i;:::-;;;;54038:146;;;;53859:330:::0;;;;:::o;2159:87::-;2201:7;2228:10;;2221:17;;2159:87;:::o;49009:37::-;;;;:::o;2542:113::-;2594:7;2635:12;:10;:12::i;:::-;2621:11;:9;:11::i;:::-;:26;;;;:::i;:::-;2614:33;;2542:113;:::o;32661:164::-;32758:4;32782:18;:25;32801:5;32782:25;;;;;;;;;;;;;;;:35;32808:8;32782:35;;;;;;;;;;;;;;;;;;;;;;;;;32775:42;;32661:164;;;;:::o;8329:192::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8438:1:::1;8418:22;;:8;:22;;;;8410:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8494:19;8504:8;8494:9;:19::i;:::-;8329:192:::0;:::o;56258:106::-;7660:12;:10;:12::i;:::-;7649:23;;:7;:5;:7::i;:::-;:23;;;7641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56340:16:::1;;;;;;;;;;;56339:17;56320:16;;:36;;;;;;;;;;;;;;;;;;56258:106::o:0;29498:305::-;29600:4;29652:25;29637:40;;;:11;:40;;;;:105;;;;29709:33;29694:48;;;:11;:48;;;;29637:105;:158;;;;29759:36;29783:11;29759:23;:36::i;:::-;29637:158;29617:178;;29498:305;;;:::o;6217:98::-;6270:7;6297:10;6290:17;;6217:98;:::o;35396:127::-;35461:4;35513:1;35485:30;;:7;:16;35493:7;35485:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35478:37;;35396:127;;;:::o;39378:174::-;39480:2;39453:15;:24;39469:7;39453:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39536:7;39532:2;39498:46;;39507:23;39522:7;39507:14;:23::i;:::-;39498:46;;;;;;;;;;;;39378:174;;:::o;35690:348::-;35783:4;35808:16;35816:7;35808;:16::i;:::-;35800:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35884:13;35900:23;35915:7;35900:14;:23::i;:::-;35884:39;;35953:5;35942:16;;:7;:16;;;:51;;;;35986:7;35962:31;;:20;35974:7;35962:11;:20::i;:::-;:31;;;35942:51;:87;;;;35997:32;36014:5;36021:7;35997:16;:32::i;:::-;35942:87;35934:96;;;35690:348;;;;:::o;38682:578::-;38841:4;38814:31;;:23;38829:7;38814:14;:23::i;:::-;:31;;;38806:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38924:1;38910:16;;:2;:16;;;;38902:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38980:39;39001:4;39007:2;39011:7;38980:20;:39::i;:::-;39084:29;39101:1;39105:7;39084:8;:29::i;:::-;39145:1;39126:9;:15;39136:4;39126:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39174:1;39157:9;:13;39167:2;39157:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39205:2;39186:7;:16;39194:7;39186:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39244:7;39240:2;39225:27;;39234:4;39225:27;;;;;;;;;;;;38682:578;;;:::o;4323:1262::-;4390:7;3099:1;3075:21;:19;:21::i;:::-;:25;3067:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4410:16:::1;4443:12;:10;:12::i;:::-;4429:11;:9;:11::i;:::-;:26;;;;:::i;:::-;4410:45;;4466:14;4725:8;4550:10;4579:14;4612:16;4647:14;4680:15;4515:195;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4491:230;;;;;;4483:239;;:250;;;;:::i;:::-;4466:267;;4746:13;4801:1:::0;4778:11:::1;:19;4790:6;4778:19;;;;;;;;;;;;:24;4774:304;;;4923:6;4915:14;;4774:304;;;5047:11;:19;5059:6;5047:19;;;;;;;;;;;;5039:27;;4774:304;5184:1;5155:11;:25;5178:1;5167:8;:12;;;;:::i;:::-;5155:25;;;;;;;;;;;;:30;5151:331;;;5300:1;5289:8;:12;;;;:::i;:::-;5267:11;:19;5279:6;5267:19;;;;;;;;;;;:34;;;;5151:331;;;5445:11;:25;5468:1;5457:8;:12;;;;:::i;:::-;5445:25;;;;;;;;;;;;5423:11;:19;5435:6;5423:19;;;;;;;;;;;:47;;;;5151:331;5523:17;:15;:17::i;:::-;;5568:9;;5560:5;:17;;;;:::i;:::-;5553:24;;;;;4323:1262:::0;:::o;36380:110::-;36456:26;36466:2;36470:7;36456:26;;;;;;;;;;;;:9;:26::i;:::-;36380:110;;:::o;8529:173::-;8585:16;8604:6;;;;;;;;;;;8585:25;;8630:8;8621:6;;:17;;;;;;;;;;;;;;;;;;8685:8;8654:40;;8675:8;8654:40;;;;;;;;;;;;8574:128;8529:173;:::o;811:114::-;876:7;903;:14;;;896:21;;811:114;;;:::o;34768:315::-;34925:28;34935:4;34941:2;34945:7;34925:9;:28::i;:::-;34972:48;34995:4;35001:2;35005:7;35014:5;34972:22;:48::i;:::-;34964:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34768:315;;;;:::o;50173:102::-;50233:13;50262:7;50255:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50173:102;:::o;16625:723::-;16681:13;16911:1;16902:5;:10;16898:53;;;16929:10;;;;;;;;;;;;;;;;;;;;;16898:53;16961:12;16976:5;16961:20;;16992:14;17017:78;17032:1;17024:4;:9;17017:78;;17050:8;;;;;:::i;:::-;;;;17081:2;17073:10;;;;;:::i;:::-;;;17017:78;;;17105:19;17137:6;17127:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17105:39;;17155:154;17171:1;17162:5;:10;17155:154;;17199:1;17189:11;;;;;:::i;:::-;;;17266:2;17258:5;:10;;;;:::i;:::-;17245:2;:24;;;;:::i;:::-;17232:39;;17215:6;17222;17215:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17295:2;17286:11;;;;;:::i;:::-;;;17155:154;;;17333:6;17319:21;;;;;16625:723;;;;:::o;16150:157::-;16235:4;16274:25;16259:40;;;:11;:40;;;;16252:47;;16150:157;;;:::o;44227:589::-;44371:45;44398:4;44404:2;44408:7;44371:26;:45::i;:::-;44449:1;44433:18;;:4;:18;;;44429:187;;;44468:40;44500:7;44468:31;:40::i;:::-;44429:187;;;44538:2;44530:10;;:4;:10;;;44526:90;;44557:47;44590:4;44596:7;44557:32;:47::i;:::-;44526:90;44429:187;44644:1;44630:16;;:2;:16;;;44626:183;;;44663:45;44700:7;44663:36;:45::i;:::-;44626:183;;;44736:4;44730:10;;:2;:10;;;44726:83;;44757:40;44785:2;44789:7;44757:27;:40::i;:::-;44726:83;44626:183;44227:589;;;:::o;2765:192::-;2831:7;3099:1;3075:21;:19;:21::i;:::-;:25;3067:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2851:13:::1;2867:21;:11;:19;:21::i;:::-;2851:37;;2901:23;:11;:21;:23::i;:::-;2944:5;2937:12;;;2765:192:::0;:::o;36717:321::-;36847:18;36853:2;36857:7;36847:5;:18::i;:::-;36898:54;36929:1;36933:2;36937:7;36946:5;36898:22;:54::i;:::-;36876:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36717:321;;;:::o;40117:799::-;40272:4;40293:15;:2;:13;;;:15::i;:::-;40289:620;;;40345:2;40329:36;;;40366:12;:10;:12::i;:::-;40380:4;40386:7;40395:5;40329:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40325:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40588:1;40571:6;:13;:18;40567:272;;;40614:60;;;;;;;;;;:::i;:::-;;;;;;;;40567:272;40789:6;40783:13;40774:6;40770:2;40766:15;40759:38;40325:529;40462:41;;;40452:51;;;:6;:51;;;;40445:58;;;;;40289:620;40893:4;40886:11;;40117:799;;;;;;;:::o;41488:126::-;;;;:::o;45539:164::-;45643:10;:17;;;;45616:15;:24;45632:7;45616:24;;;;;;;;;;;:44;;;;45671:10;45687:7;45671:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45539:164;:::o;46330:988::-;46596:22;46646:1;46621:22;46638:4;46621:16;:22::i;:::-;:26;;;;:::i;:::-;46596:51;;46658:18;46679:17;:26;46697:7;46679:26;;;;;;;;;;;;46658:47;;46826:14;46812:10;:28;46808:328;;46857:19;46879:12;:18;46892:4;46879:18;;;;;;;;;;;;;;;:34;46898:14;46879:34;;;;;;;;;;;;46857:56;;46963:11;46930:12;:18;46943:4;46930:18;;;;;;;;;;;;;;;:30;46949:10;46930:30;;;;;;;;;;;:44;;;;47080:10;47047:17;:30;47065:11;47047:30;;;;;;;;;;;:43;;;;46842:294;46808:328;47232:17;:26;47250:7;47232:26;;;;;;;;;;;47225:33;;;47276:12;:18;47289:4;47276:18;;;;;;;;;;;;;;;:34;47295:14;47276:34;;;;;;;;;;;47269:41;;;46411:907;;46330:988;;:::o;47613:1079::-;47866:22;47911:1;47891:10;:17;;;;:21;;;;:::i;:::-;47866:46;;47923:18;47944:15;:24;47960:7;47944:24;;;;;;;;;;;;47923:45;;48295:19;48317:10;48328:14;48317:26;;;;;;;;:::i;:::-;;;;;;;;;;48295:48;;48381:11;48356:10;48367;48356:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48492:10;48461:15;:28;48477:11;48461:28;;;;;;;;;;;:41;;;;48633:15;:24;48649:7;48633:24;;;;;;;;;;;48626:31;;;48668:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47684:1008;;;47613:1079;:::o;45117:221::-;45202:14;45219:20;45236:2;45219:16;:20::i;:::-;45202:37;;45277:7;45250:12;:16;45263:2;45250:16;;;;;;;;;;;;;;;:24;45267:6;45250:24;;;;;;;;;;;:34;;;;45324:6;45295:17;:26;45313:7;45295:26;;;;;;;;;;;:35;;;;45191:147;45117:221;;:::o;933:127::-;1040:1;1022:7;:14;;;:19;;;;;;;;;;;933:127;:::o;37374:382::-;37468:1;37454:16;;:2;:16;;;;37446:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37527:16;37535:7;37527;:16::i;:::-;37526:17;37518:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37589:45;37618:1;37622:2;37626:7;37589:20;:45::i;:::-;37664:1;37647:9;:13;37657:2;37647:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37695:2;37676:7;:16;37684:7;37676:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37740:7;37736:2;37715:33;;37732:1;37715:33;;;;;;;;;;;;37374:382;;:::o;19150:387::-;19210:4;19418:12;19485:7;19473:20;19465:28;;19528:1;19521:4;:8;19514:15;;;19150:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:934::-;6924:6;6932;6940;6948;6997:2;6985:9;6976:7;6972:23;6968:32;6965:119;;;7003:79;;:::i;:::-;6965:119;7151:1;7140:9;7136:17;7123:31;7181:18;7173:6;7170:30;7167:117;;;7203:79;;:::i;:::-;7167:117;7316:80;7388:7;7379:6;7368:9;7364:22;7316:80;:::i;:::-;7298:98;;;;7094:312;7473:2;7462:9;7458:18;7445:32;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:80;7711:7;7702:6;7691:9;7687:22;7639:80;:::i;:::-;7621:98;;;;7416:313;6802:934;;;;;;;:::o;7742:327::-;7800:6;7849:2;7837:9;7828:7;7824:23;7820:32;7817:119;;;7855:79;;:::i;:::-;7817:119;7975:1;8000:52;8044:7;8035:6;8024:9;8020:22;8000:52;:::i;:::-;7990:62;;7946:116;7742:327;;;;:::o;8075:349::-;8144:6;8193:2;8181:9;8172:7;8168:23;8164:32;8161:119;;;8199:79;;:::i;:::-;8161:119;8319:1;8344:63;8399:7;8390:6;8379:9;8375:22;8344:63;:::i;:::-;8334:73;;8290:127;8075:349;;;;:::o;8430:509::-;8499:6;8548:2;8536:9;8527:7;8523:23;8519:32;8516:119;;;8554:79;;:::i;:::-;8516:119;8702:1;8691:9;8687:17;8674:31;8732:18;8724:6;8721:30;8718:117;;;8754:79;;:::i;:::-;8718:117;8859:63;8914:7;8905:6;8894:9;8890:22;8859:63;:::i;:::-;8849:73;;8645:287;8430:509;;;;:::o;8945:329::-;9004:6;9053:2;9041:9;9032:7;9028:23;9024:32;9021:119;;;9059:79;;:::i;:::-;9021:119;9179:1;9204:53;9249:7;9240:6;9229:9;9225:22;9204:53;:::i;:::-;9194:63;;9150:117;8945:329;;;;:::o;9280:179::-;9349:10;9370:46;9412:3;9404:6;9370:46;:::i;:::-;9448:4;9443:3;9439:14;9425:28;;9280:179;;;;:::o;9465:189::-;9586:61;9614:32;9640:5;9614:32;:::i;:::-;9586:61;:::i;:::-;9581:3;9574:74;9465:189;;:::o;9660:118::-;9747:24;9765:5;9747:24;:::i;:::-;9742:3;9735:37;9660:118;;:::o;9784:157::-;9889:45;9909:24;9927:5;9909:24;:::i;:::-;9889:45;:::i;:::-;9884:3;9877:58;9784:157;;:::o;9977:732::-;10096:3;10125:54;10173:5;10125:54;:::i;:::-;10195:86;10274:6;10269:3;10195:86;:::i;:::-;10188:93;;10305:56;10355:5;10305:56;:::i;:::-;10384:7;10415:1;10400:284;10425:6;10422:1;10419:13;10400:284;;;10501:6;10495:13;10528:63;10587:3;10572:13;10528:63;:::i;:::-;10521:70;;10614:60;10667:6;10614:60;:::i;:::-;10604:70;;10460:224;10447:1;10444;10440:9;10435:14;;10400:284;;;10404:14;10700:3;10693:10;;10101:608;;;9977:732;;;;:::o;10715:109::-;10796:21;10811:5;10796:21;:::i;:::-;10791:3;10784:34;10715:109;;:::o;10830:360::-;10916:3;10944:38;10976:5;10944:38;:::i;:::-;10998:70;11061:6;11056:3;10998:70;:::i;:::-;10991:77;;11077:52;11122:6;11117:3;11110:4;11103:5;11099:16;11077:52;:::i;:::-;11154:29;11176:6;11154:29;:::i;:::-;11149:3;11145:39;11138:46;;10920:270;10830:360;;;;:::o;11196:364::-;11284:3;11312:39;11345:5;11312:39;:::i;:::-;11367:71;11431:6;11426:3;11367:71;:::i;:::-;11360:78;;11447:52;11492:6;11487:3;11480:4;11473:5;11469:16;11447:52;:::i;:::-;11524:29;11546:6;11524:29;:::i;:::-;11519:3;11515:39;11508:46;;11288:272;11196:364;;;;:::o;11566:377::-;11672:3;11700:39;11733:5;11700:39;:::i;:::-;11755:89;11837:6;11832:3;11755:89;:::i;:::-;11748:96;;11853:52;11898:6;11893:3;11886:4;11879:5;11875:16;11853:52;:::i;:::-;11930:6;11925:3;11921:16;11914:23;;11676:267;11566:377;;;;:::o;11973:845::-;12076:3;12113:5;12107:12;12142:36;12168:9;12142:36;:::i;:::-;12194:89;12276:6;12271:3;12194:89;:::i;:::-;12187:96;;12314:1;12303:9;12299:17;12330:1;12325:137;;;;12476:1;12471:341;;;;12292:520;;12325:137;12409:4;12405:9;12394;12390:25;12385:3;12378:38;12445:6;12440:3;12436:16;12429:23;;12325:137;;12471:341;12538:38;12570:5;12538:38;:::i;:::-;12598:1;12612:154;12626:6;12623:1;12620:13;12612:154;;;12700:7;12694:14;12690:1;12685:3;12681:11;12674:35;12750:1;12741:7;12737:15;12726:26;;12648:4;12645:1;12641:12;12636:17;;12612:154;;;12795:6;12790:3;12786:16;12779:23;;12478:334;;12292:520;;12080:738;;11973:845;;;;:::o;12824:366::-;12966:3;12987:67;13051:2;13046:3;12987:67;:::i;:::-;12980:74;;13063:93;13152:3;13063:93;:::i;:::-;13181:2;13176:3;13172:12;13165:19;;12824:366;;;:::o;13196:::-;13338:3;13359:67;13423:2;13418:3;13359:67;:::i;:::-;13352:74;;13435:93;13524:3;13435:93;:::i;:::-;13553:2;13548:3;13544:12;13537:19;;13196:366;;;:::o;13568:::-;13710:3;13731:67;13795:2;13790:3;13731:67;:::i;:::-;13724:74;;13807:93;13896:3;13807:93;:::i;:::-;13925:2;13920:3;13916:12;13909:19;;13568:366;;;:::o;13940:::-;14082:3;14103:67;14167:2;14162:3;14103:67;:::i;:::-;14096:74;;14179:93;14268:3;14179:93;:::i;:::-;14297:2;14292:3;14288:12;14281:19;;13940:366;;;:::o;14312:::-;14454:3;14475:67;14539:2;14534:3;14475:67;:::i;:::-;14468:74;;14551:93;14640:3;14551:93;:::i;:::-;14669:2;14664:3;14660:12;14653:19;;14312:366;;;:::o;14684:::-;14826:3;14847:67;14911:2;14906:3;14847:67;:::i;:::-;14840:74;;14923:93;15012:3;14923:93;:::i;:::-;15041:2;15036:3;15032:12;15025:19;;14684:366;;;:::o;15056:::-;15198:3;15219:67;15283:2;15278:3;15219:67;:::i;:::-;15212:74;;15295:93;15384:3;15295:93;:::i;:::-;15413:2;15408:3;15404:12;15397:19;;15056:366;;;:::o;15428:::-;15570:3;15591:67;15655:2;15650:3;15591:67;:::i;:::-;15584:74;;15667:93;15756:3;15667:93;:::i;:::-;15785:2;15780:3;15776:12;15769:19;;15428:366;;;:::o;15800:::-;15942:3;15963:67;16027:2;16022:3;15963:67;:::i;:::-;15956:74;;16039:93;16128:3;16039:93;:::i;:::-;16157:2;16152:3;16148:12;16141:19;;15800:366;;;:::o;16172:::-;16314:3;16335:67;16399:2;16394:3;16335:67;:::i;:::-;16328:74;;16411:93;16500:3;16411:93;:::i;:::-;16529:2;16524:3;16520:12;16513:19;;16172:366;;;:::o;16544:::-;16686:3;16707:67;16771:2;16766:3;16707:67;:::i;:::-;16700:74;;16783:93;16872:3;16783:93;:::i;:::-;16901:2;16896:3;16892:12;16885:19;;16544:366;;;:::o;16916:::-;17058:3;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17155:93;17244:3;17155:93;:::i;:::-;17273:2;17268:3;17264:12;17257:19;;16916:366;;;:::o;17288:::-;17430:3;17451:67;17515:2;17510:3;17451:67;:::i;:::-;17444:74;;17527:93;17616:3;17527:93;:::i;:::-;17645:2;17640:3;17636:12;17629:19;;17288:366;;;:::o;17660:::-;17802:3;17823:67;17887:2;17882:3;17823:67;:::i;:::-;17816:74;;17899:93;17988:3;17899:93;:::i;:::-;18017:2;18012:3;18008:12;18001:19;;17660:366;;;:::o;18032:::-;18174:3;18195:67;18259:2;18254:3;18195:67;:::i;:::-;18188:74;;18271:93;18360:3;18271:93;:::i;:::-;18389:2;18384:3;18380:12;18373:19;;18032:366;;;:::o;18404:::-;18546:3;18567:67;18631:2;18626:3;18567:67;:::i;:::-;18560:74;;18643:93;18732:3;18643:93;:::i;:::-;18761:2;18756:3;18752:12;18745:19;;18404:366;;;:::o;18776:::-;18918:3;18939:67;19003:2;18998:3;18939:67;:::i;:::-;18932:74;;19015:93;19104:3;19015:93;:::i;:::-;19133:2;19128:3;19124:12;19117:19;;18776:366;;;:::o;19148:::-;19290:3;19311:67;19375:2;19370:3;19311:67;:::i;:::-;19304:74;;19387:93;19476:3;19387:93;:::i;:::-;19505:2;19500:3;19496:12;19489:19;;19148:366;;;:::o;19520:::-;19662:3;19683:67;19747:2;19742:3;19683:67;:::i;:::-;19676:74;;19759:93;19848:3;19759:93;:::i;:::-;19877:2;19872:3;19868:12;19861:19;;19520:366;;;:::o;19892:::-;20034:3;20055:67;20119:2;20114:3;20055:67;:::i;:::-;20048:74;;20131:93;20220:3;20131:93;:::i;:::-;20249:2;20244:3;20240:12;20233:19;;19892:366;;;:::o;20264:::-;20406:3;20427:67;20491:2;20486:3;20427:67;:::i;:::-;20420:74;;20503:93;20592:3;20503:93;:::i;:::-;20621:2;20616:3;20612:12;20605:19;;20264:366;;;:::o;20636:::-;20778:3;20799:67;20863:2;20858:3;20799:67;:::i;:::-;20792:74;;20875:93;20964:3;20875:93;:::i;:::-;20993:2;20988:3;20984:12;20977:19;;20636:366;;;:::o;21008:::-;21150:3;21171:67;21235:2;21230:3;21171:67;:::i;:::-;21164:74;;21247:93;21336:3;21247:93;:::i;:::-;21365:2;21360:3;21356:12;21349:19;;21008:366;;;:::o;21380:::-;21522:3;21543:67;21607:2;21602:3;21543:67;:::i;:::-;21536:74;;21619:93;21708:3;21619:93;:::i;:::-;21737:2;21732:3;21728:12;21721:19;;21380:366;;;:::o;21752:::-;21894:3;21915:67;21979:2;21974:3;21915:67;:::i;:::-;21908:74;;21991:93;22080:3;21991:93;:::i;:::-;22109:2;22104:3;22100:12;22093:19;;21752:366;;;:::o;22124:108::-;22201:24;22219:5;22201:24;:::i;:::-;22196:3;22189:37;22124:108;;:::o;22238:118::-;22325:24;22343:5;22325:24;:::i;:::-;22320:3;22313:37;22238:118;;:::o;22362:157::-;22467:45;22487:24;22505:5;22487:24;:::i;:::-;22467:45;:::i;:::-;22462:3;22455:58;22362:157;;:::o;22525:852::-;22765:3;22780:75;22851:3;22842:6;22780:75;:::i;:::-;22880:2;22875:3;22871:12;22864:19;;22893:91;22980:3;22971:6;22893:91;:::i;:::-;23009:2;23004:3;23000:12;22993:19;;23022:75;23093:3;23084:6;23022:75;:::i;:::-;23122:2;23117:3;23113:12;23106:19;;23135:75;23206:3;23197:6;23135:75;:::i;:::-;23235:2;23230:3;23226:12;23219:19;;23248:75;23319:3;23310:6;23248:75;:::i;:::-;23348:2;23343:3;23339:12;23332:19;;23368:3;23361:10;;22525:852;;;;;;;;:::o;23383:589::-;23608:3;23630:95;23721:3;23712:6;23630:95;:::i;:::-;23623:102;;23742:95;23833:3;23824:6;23742:95;:::i;:::-;23735:102;;23854:92;23942:3;23933:6;23854:92;:::i;:::-;23847:99;;23963:3;23956:10;;23383:589;;;;;;:::o;23978:222::-;24071:4;24109:2;24098:9;24094:18;24086:26;;24122:71;24190:1;24179:9;24175:17;24166:6;24122:71;:::i;:::-;23978:222;;;;:::o;24206:640::-;24401:4;24439:3;24428:9;24424:19;24416:27;;24453:71;24521:1;24510:9;24506:17;24497:6;24453:71;:::i;:::-;24534:72;24602:2;24591:9;24587:18;24578:6;24534:72;:::i;:::-;24616;24684:2;24673:9;24669:18;24660:6;24616:72;:::i;:::-;24735:9;24729:4;24725:20;24720:2;24709:9;24705:18;24698:48;24763:76;24834:4;24825:6;24763:76;:::i;:::-;24755:84;;24206:640;;;;;;;:::o;24852:373::-;24995:4;25033:2;25022:9;25018:18;25010:26;;25082:9;25076:4;25072:20;25068:1;25057:9;25053:17;25046:47;25110:108;25213:4;25204:6;25110:108;:::i;:::-;25102:116;;24852:373;;;;:::o;25231:210::-;25318:4;25356:2;25345:9;25341:18;25333:26;;25369:65;25431:1;25420:9;25416:17;25407:6;25369:65;:::i;:::-;25231:210;;;;:::o;25447:313::-;25560:4;25598:2;25587:9;25583:18;25575:26;;25647:9;25641:4;25637:20;25633:1;25622:9;25618:17;25611:47;25675:78;25748:4;25739:6;25675:78;:::i;:::-;25667:86;;25447:313;;;;:::o;25766:419::-;25932:4;25970:2;25959:9;25955:18;25947:26;;26019:9;26013:4;26009:20;26005:1;25994:9;25990:17;25983:47;26047:131;26173:4;26047:131;:::i;:::-;26039:139;;25766:419;;;:::o;26191:::-;26357:4;26395:2;26384:9;26380:18;26372:26;;26444:9;26438:4;26434:20;26430:1;26419:9;26415:17;26408:47;26472:131;26598:4;26472:131;:::i;:::-;26464:139;;26191:419;;;:::o;26616:::-;26782:4;26820:2;26809:9;26805:18;26797:26;;26869:9;26863:4;26859:20;26855:1;26844:9;26840:17;26833:47;26897:131;27023:4;26897:131;:::i;:::-;26889:139;;26616:419;;;:::o;27041:::-;27207:4;27245:2;27234:9;27230:18;27222:26;;27294:9;27288:4;27284:20;27280:1;27269:9;27265:17;27258:47;27322:131;27448:4;27322:131;:::i;:::-;27314:139;;27041:419;;;:::o;27466:::-;27632:4;27670:2;27659:9;27655:18;27647:26;;27719:9;27713:4;27709:20;27705:1;27694:9;27690:17;27683:47;27747:131;27873:4;27747:131;:::i;:::-;27739:139;;27466:419;;;:::o;27891:::-;28057:4;28095:2;28084:9;28080:18;28072:26;;28144:9;28138:4;28134:20;28130:1;28119:9;28115:17;28108:47;28172:131;28298:4;28172:131;:::i;:::-;28164:139;;27891:419;;;:::o;28316:::-;28482:4;28520:2;28509:9;28505:18;28497:26;;28569:9;28563:4;28559:20;28555:1;28544:9;28540:17;28533:47;28597:131;28723:4;28597:131;:::i;:::-;28589:139;;28316:419;;;:::o;28741:::-;28907:4;28945:2;28934:9;28930:18;28922:26;;28994:9;28988:4;28984:20;28980:1;28969:9;28965:17;28958:47;29022:131;29148:4;29022:131;:::i;:::-;29014:139;;28741:419;;;:::o;29166:::-;29332:4;29370:2;29359:9;29355:18;29347:26;;29419:9;29413:4;29409:20;29405:1;29394:9;29390:17;29383:47;29447:131;29573:4;29447:131;:::i;:::-;29439:139;;29166:419;;;:::o;29591:::-;29757:4;29795:2;29784:9;29780:18;29772:26;;29844:9;29838:4;29834:20;29830:1;29819:9;29815:17;29808:47;29872:131;29998:4;29872:131;:::i;:::-;29864:139;;29591:419;;;:::o;30016:::-;30182:4;30220:2;30209:9;30205:18;30197:26;;30269:9;30263:4;30259:20;30255:1;30244:9;30240:17;30233:47;30297:131;30423:4;30297:131;:::i;:::-;30289:139;;30016:419;;;:::o;30441:::-;30607:4;30645:2;30634:9;30630:18;30622:26;;30694:9;30688:4;30684:20;30680:1;30669:9;30665:17;30658:47;30722:131;30848:4;30722:131;:::i;:::-;30714:139;;30441:419;;;:::o;30866:::-;31032:4;31070:2;31059:9;31055:18;31047:26;;31119:9;31113:4;31109:20;31105:1;31094:9;31090:17;31083:47;31147:131;31273:4;31147:131;:::i;:::-;31139:139;;30866:419;;;:::o;31291:::-;31457:4;31495:2;31484:9;31480:18;31472:26;;31544:9;31538:4;31534:20;31530:1;31519:9;31515:17;31508:47;31572:131;31698:4;31572:131;:::i;:::-;31564:139;;31291:419;;;:::o;31716:::-;31882:4;31920:2;31909:9;31905:18;31897:26;;31969:9;31963:4;31959:20;31955:1;31944:9;31940:17;31933:47;31997:131;32123:4;31997:131;:::i;:::-;31989:139;;31716:419;;;:::o;32141:::-;32307:4;32345:2;32334:9;32330:18;32322:26;;32394:9;32388:4;32384:20;32380:1;32369:9;32365:17;32358:47;32422:131;32548:4;32422:131;:::i;:::-;32414:139;;32141:419;;;:::o;32566:::-;32732:4;32770:2;32759:9;32755:18;32747:26;;32819:9;32813:4;32809:20;32805:1;32794:9;32790:17;32783:47;32847:131;32973:4;32847:131;:::i;:::-;32839:139;;32566:419;;;:::o;32991:::-;33157:4;33195:2;33184:9;33180:18;33172:26;;33244:9;33238:4;33234:20;33230:1;33219:9;33215:17;33208:47;33272:131;33398:4;33272:131;:::i;:::-;33264:139;;32991:419;;;:::o;33416:::-;33582:4;33620:2;33609:9;33605:18;33597:26;;33669:9;33663:4;33659:20;33655:1;33644:9;33640:17;33633:47;33697:131;33823:4;33697:131;:::i;:::-;33689:139;;33416:419;;;:::o;33841:::-;34007:4;34045:2;34034:9;34030:18;34022:26;;34094:9;34088:4;34084:20;34080:1;34069:9;34065:17;34058:47;34122:131;34248:4;34122:131;:::i;:::-;34114:139;;33841:419;;;:::o;34266:::-;34432:4;34470:2;34459:9;34455:18;34447:26;;34519:9;34513:4;34509:20;34505:1;34494:9;34490:17;34483:47;34547:131;34673:4;34547:131;:::i;:::-;34539:139;;34266:419;;;:::o;34691:::-;34857:4;34895:2;34884:9;34880:18;34872:26;;34944:9;34938:4;34934:20;34930:1;34919:9;34915:17;34908:47;34972:131;35098:4;34972:131;:::i;:::-;34964:139;;34691:419;;;:::o;35116:::-;35282:4;35320:2;35309:9;35305:18;35297:26;;35369:9;35363:4;35359:20;35355:1;35344:9;35340:17;35333:47;35397:131;35523:4;35397:131;:::i;:::-;35389:139;;35116:419;;;:::o;35541:::-;35707:4;35745:2;35734:9;35730:18;35722:26;;35794:9;35788:4;35784:20;35780:1;35769:9;35765:17;35758:47;35822:131;35948:4;35822:131;:::i;:::-;35814:139;;35541:419;;;:::o;35966:::-;36132:4;36170:2;36159:9;36155:18;36147:26;;36219:9;36213:4;36209:20;36205:1;36194:9;36190:17;36183:47;36247:131;36373:4;36247:131;:::i;:::-;36239:139;;35966:419;;;:::o;36391:222::-;36484:4;36522:2;36511:9;36507:18;36499:26;;36535:71;36603:1;36592:9;36588:17;36579:6;36535:71;:::i;:::-;36391:222;;;;:::o;36619:129::-;36653:6;36680:20;;:::i;:::-;36670:30;;36709:33;36737:4;36729:6;36709:33;:::i;:::-;36619:129;;;:::o;36754:75::-;36787:6;36820:2;36814:9;36804:19;;36754:75;:::o;36835:307::-;36896:4;36986:18;36978:6;36975:30;36972:56;;;37008:18;;:::i;:::-;36972:56;37046:29;37068:6;37046:29;:::i;:::-;37038:37;;37130:4;37124;37120:15;37112:23;;36835:307;;;:::o;37148:308::-;37210:4;37300:18;37292:6;37289:30;37286:56;;;37322:18;;:::i;:::-;37286:56;37360:29;37382:6;37360:29;:::i;:::-;37352:37;;37444:4;37438;37434:15;37426:23;;37148:308;;;:::o;37462:132::-;37529:4;37552:3;37544:11;;37582:4;37577:3;37573:14;37565:22;;37462:132;;;:::o;37600:141::-;37649:4;37672:3;37664:11;;37695:3;37692:1;37685:14;37729:4;37726:1;37716:18;37708:26;;37600:141;;;:::o;37747:114::-;37814:6;37848:5;37842:12;37832:22;;37747:114;;;:::o;37867:98::-;37918:6;37952:5;37946:12;37936:22;;37867:98;;;:::o;37971:99::-;38023:6;38057:5;38051:12;38041:22;;37971:99;;;:::o;38076:113::-;38146:4;38178;38173:3;38169:14;38161:22;;38076:113;;;:::o;38195:184::-;38294:11;38328:6;38323:3;38316:19;38368:4;38363:3;38359:14;38344:29;;38195:184;;;;:::o;38385:168::-;38468:11;38502:6;38497:3;38490:19;38542:4;38537:3;38533:14;38518:29;;38385:168;;;;:::o;38559:169::-;38643:11;38677:6;38672:3;38665:19;38717:4;38712:3;38708:14;38693:29;;38559:169;;;;:::o;38734:148::-;38836:11;38873:3;38858:18;;38734:148;;;;:::o;38888:305::-;38928:3;38947:20;38965:1;38947:20;:::i;:::-;38942:25;;38981:20;38999:1;38981:20;:::i;:::-;38976:25;;39135:1;39067:66;39063:74;39060:1;39057:81;39054:107;;;39141:18;;:::i;:::-;39054:107;39185:1;39182;39178:9;39171:16;;38888:305;;;;:::o;39199:185::-;39239:1;39256:20;39274:1;39256:20;:::i;:::-;39251:25;;39290:20;39308:1;39290:20;:::i;:::-;39285:25;;39329:1;39319:35;;39334:18;;:::i;:::-;39319:35;39376:1;39373;39369:9;39364:14;;39199:185;;;;:::o;39390:348::-;39430:7;39453:20;39471:1;39453:20;:::i;:::-;39448:25;;39487:20;39505:1;39487:20;:::i;:::-;39482:25;;39675:1;39607:66;39603:74;39600:1;39597:81;39592:1;39585:9;39578:17;39574:105;39571:131;;;39682:18;;:::i;:::-;39571:131;39730:1;39727;39723:9;39712:20;;39390:348;;;;:::o;39744:191::-;39784:4;39804:20;39822:1;39804:20;:::i;:::-;39799:25;;39838:20;39856:1;39838:20;:::i;:::-;39833:25;;39877:1;39874;39871:8;39868:34;;;39882:18;;:::i;:::-;39868:34;39927:1;39924;39920:9;39912:17;;39744:191;;;;:::o;39941:96::-;39978:7;40007:24;40025:5;40007:24;:::i;:::-;39996:35;;39941:96;;;:::o;40043:104::-;40088:7;40117:24;40135:5;40117:24;:::i;:::-;40106:35;;40043:104;;;:::o;40153:90::-;40187:7;40230:5;40223:13;40216:21;40205:32;;40153:90;;;:::o;40249:149::-;40285:7;40325:66;40318:5;40314:78;40303:89;;40249:149;;;:::o;40404:126::-;40441:7;40481:42;40474:5;40470:54;40459:65;;40404:126;;;:::o;40536:77::-;40573:7;40602:5;40591:16;;40536:77;;;:::o;40619:154::-;40703:6;40698:3;40693;40680:30;40765:1;40756:6;40751:3;40747:16;40740:27;40619:154;;;:::o;40779:307::-;40847:1;40857:113;40871:6;40868:1;40865:13;40857:113;;;40956:1;40951:3;40947:11;40941:18;40937:1;40932:3;40928:11;40921:39;40893:2;40890:1;40886:10;40881:15;;40857:113;;;40988:6;40985:1;40982:13;40979:101;;;41068:1;41059:6;41054:3;41050:16;41043:27;40979:101;40828:258;40779:307;;;:::o;41092:320::-;41136:6;41173:1;41167:4;41163:12;41153:22;;41220:1;41214:4;41210:12;41241:18;41231:81;;41297:4;41289:6;41285:17;41275:27;;41231:81;41359:2;41351:6;41348:14;41328:18;41325:38;41322:84;;;41378:18;;:::i;:::-;41322:84;41143:269;41092:320;;;:::o;41418:281::-;41501:27;41523:4;41501:27;:::i;:::-;41493:6;41489:40;41631:6;41619:10;41616:22;41595:18;41583:10;41580:34;41577:62;41574:88;;;41642:18;;:::i;:::-;41574:88;41682:10;41678:2;41671:22;41461:238;41418:281;;:::o;41705:233::-;41744:3;41767:24;41785:5;41767:24;:::i;:::-;41758:33;;41813:66;41806:5;41803:77;41800:103;;;41883:18;;:::i;:::-;41800:103;41930:1;41923:5;41919:13;41912:20;;41705:233;;;:::o;41944:100::-;41983:7;42012:26;42032:5;42012:26;:::i;:::-;42001:37;;41944:100;;;:::o;42050:108::-;42097:7;42126:26;42146:5;42126:26;:::i;:::-;42115:37;;42050:108;;;:::o;42164:94::-;42203:7;42232:20;42246:5;42232:20;:::i;:::-;42221:31;;42164:94;;;:::o;42264:79::-;42303:7;42332:5;42321:16;;42264:79;;;:::o;42349:176::-;42381:1;42398:20;42416:1;42398:20;:::i;:::-;42393:25;;42432:20;42450:1;42432:20;:::i;:::-;42427:25;;42471:1;42461:35;;42476:18;;:::i;:::-;42461:35;42517:1;42514;42510:9;42505:14;;42349:176;;;;:::o;42531:180::-;42579:77;42576:1;42569:88;42676:4;42673:1;42666:15;42700:4;42697:1;42690:15;42717:180;42765:77;42762:1;42755:88;42862:4;42859:1;42852:15;42886:4;42883:1;42876:15;42903:180;42951:77;42948:1;42941:88;43048:4;43045:1;43038:15;43072:4;43069:1;43062:15;43089:180;43137:77;43134:1;43127:88;43234:4;43231:1;43224:15;43258:4;43255:1;43248:15;43275:180;43323:77;43320:1;43313:88;43420:4;43417:1;43410:15;43444:4;43441:1;43434:15;43461:180;43509:77;43506:1;43499:88;43606:4;43603:1;43596:15;43630:4;43627:1;43620:15;43647:117;43756:1;43753;43746:12;43770:117;43879:1;43876;43869:12;43893:117;44002:1;43999;43992:12;44016:117;44125:1;44122;44115:12;44139:117;44248:1;44245;44238:12;44262:117;44371:1;44368;44361:12;44385:102;44426:6;44477:2;44473:7;44468:2;44461:5;44457:14;44453:28;44443:38;;44385:102;;;:::o;44493:94::-;44526:8;44574:5;44570:2;44566:14;44545:35;;44493:94;;;:::o;44593:172::-;44733:24;44729:1;44721:6;44717:14;44710:48;44593:172;:::o;44771:173::-;44911:25;44907:1;44899:6;44895:14;44888:49;44771:173;:::o;44950:230::-;45090:34;45086:1;45078:6;45074:14;45067:58;45159:13;45154:2;45146:6;45142:15;45135:38;44950:230;:::o;45186:237::-;45326:34;45322:1;45314:6;45310:14;45303:58;45395:20;45390:2;45382:6;45378:15;45371:45;45186:237;:::o;45429:181::-;45569:33;45565:1;45557:6;45553:14;45546:57;45429:181;:::o;45616:225::-;45756:34;45752:1;45744:6;45740:14;45733:58;45825:8;45820:2;45812:6;45808:15;45801:33;45616:225;:::o;45847:178::-;45987:30;45983:1;45975:6;45971:14;45964:54;45847:178;:::o;46031:175::-;46171:27;46167:1;46159:6;46155:14;46148:51;46031:175;:::o;46212:223::-;46352:34;46348:1;46340:6;46336:14;46329:58;46421:6;46416:2;46408:6;46404:15;46397:31;46212:223;:::o;46441:175::-;46581:27;46577:1;46569:6;46565:14;46558:51;46441:175;:::o;46622:174::-;46762:26;46758:1;46750:6;46746:14;46739:50;46622:174;:::o;46802:231::-;46942:34;46938:1;46930:6;46926:14;46919:58;47011:14;47006:2;46998:6;46994:15;46987:39;46802:231;:::o;47039:243::-;47179:34;47175:1;47167:6;47163:14;47156:58;47248:26;47243:2;47235:6;47231:15;47224:51;47039:243;:::o;47288:229::-;47428:34;47424:1;47416:6;47412:14;47405:58;47497:12;47492:2;47484:6;47480:15;47473:37;47288:229;:::o;47523:228::-;47663:34;47659:1;47651:6;47647:14;47640:58;47732:11;47727:2;47719:6;47715:15;47708:36;47523:228;:::o;47757:182::-;47897:34;47893:1;47885:6;47881:14;47874:58;47757:182;:::o;47945:231::-;48085:34;48081:1;48073:6;48069:14;48062:58;48154:14;48149:2;48141:6;48137:15;48130:39;47945:231;:::o;48182:182::-;48322:34;48318:1;48310:6;48306:14;48299:58;48182:182;:::o;48370:228::-;48510:34;48506:1;48498:6;48494:14;48487:58;48579:11;48574:2;48566:6;48562:15;48555:36;48370:228;:::o;48604:234::-;48744:34;48740:1;48732:6;48728:14;48721:58;48813:17;48808:2;48800:6;48796:15;48789:42;48604:234;:::o;48844:220::-;48984:34;48980:1;48972:6;48968:14;48961:58;49053:3;49048:2;49040:6;49036:15;49029:28;48844:220;:::o;49070:180::-;49210:32;49206:1;49198:6;49194:14;49187:56;49070:180;:::o;49256:236::-;49396:34;49392:1;49384:6;49380:14;49373:58;49465:19;49460:2;49452:6;49448:15;49441:44;49256:236;:::o;49498:231::-;49638:34;49634:1;49626:6;49622:14;49615:58;49707:14;49702:2;49694:6;49690:15;49683:39;49498:231;:::o;49735:171::-;49875:23;49871:1;49863:6;49859:14;49852:47;49735:171;:::o;49912:122::-;49985:24;50003:5;49985:24;:::i;:::-;49978:5;49975:35;49965:63;;50024:1;50021;50014:12;49965:63;49912:122;:::o;50040:116::-;50110:21;50125:5;50110:21;:::i;:::-;50103:5;50100:32;50090:60;;50146:1;50143;50136:12;50090:60;50040:116;:::o;50162:120::-;50234:23;50251:5;50234:23;:::i;:::-;50227:5;50224:34;50214:62;;50272:1;50269;50262:12;50214:62;50162:120;:::o;50288:122::-;50361:24;50379:5;50361:24;:::i;:::-;50354:5;50351:35;50341:63;;50400:1;50397;50390:12;50341:63;50288:122;:::o

Swarm Source

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