ETH Price: $3,470.14 (+1.82%)
Gas: 8 Gwei

Token

Warrior Apes (WAPE)
 

Overview

Max Total Supply

168 WAPE

Holders

79

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hopester.eth
Balance
1 WAPE
0x0db33b8940769cf6bf38f5a81ad80c61dc9adfa5
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:
Apes

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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;
    
    // Base URI
    string private _baseURI;

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

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    /**
     * @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(bytes(baseURI()).length != 0, "BaseURI has not been set yet");
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

        return string(abi.encodePacked(baseURI(), _tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

    bool private _paused;

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

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

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

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

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

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

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

contract ApesPresale is Ownable {
    // Default presale is true
    bool private _isPresale = true;

    /*

    */
    function _flipPresale() internal {
        _isPresale = !_isPresale;
    }

    function isPresale() public view returns (bool) {
        return _isPresale;
    }

    modifier onlyPresale() {
        require(isPresale(), "Presale not active");
        _;
    }
    modifier onlyPublicSale() {
        require(!isPresale(), "Public sale not active");
        _;
    }
}

contract Apes is ERC721, Ownable, Pausable, ApesPresale, EIP712 {
    uint256 public MAX_COUNT = 10000;
    uint256 public totalSupply = 0;
    uint256 private OWNER_MAX_TOKEN_COUNT = 100;
    uint256 public PRESALE_PRICE = 50000000000000000;
    uint256 public PUBLIC_PRICE = 55000000000000000;
    bool private _isPresale = true;
    string private constant SIGNING_DOMAIN = "WarriorApesNFT";
    string private constant SIGNATURE_VERSION = "1";
    address private signer = 0x0dd874F41cE844FcdaeBA33714B6197136D89B7F;
    uint256 public reserveTokensRemaining = 150;
    string public PROVENANCE_HASH = "";
    uint256 public startingIndexBlock;
    uint256 public startingIndex;
    bool public mintingStoppedForever = false;

    constructor() ERC721("Warrior Apes", "WAPE") EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION) {}

    struct NFTVoucher {
        /// @notice The minimum price (in wei) that the NFT creator is willing to accept for the initial sale of this NFT.
        address reciever;
        /// @notice The metadata URI to associate with this token.
        uint16 maxcount;
        /// @notice the EIP-712 signature of all other fields in the NFTVoucher struct. For a voucher to be valid, it must be signed by an account with the MINTER_ROLE.
        bytes signature;
    }

    function publicMint(uint256 tokenCount)
        public
        payable
        whenNotPaused
        onlyPublicSale
    {
        require(msg.sender != address(0), "Cannot mint to null address");
        require(
            totalSupply + tokenCount <= MAX_COUNT - reserveTokensRemaining,
            "Minting would exceed max total supply"
        );
        require(
            balanceOf(msg.sender) + tokenCount <= OWNER_MAX_TOKEN_COUNT,
            "Minting would exceed max count for owner"
        );
        require(msg.value >= PUBLIC_PRICE * tokenCount, "Insufficient funds sent");

        for (uint256 i = 0; i < tokenCount; i++) {
            mintNext(msg.sender);
        }

        // If we haven't set the starting index and this is either 1) the last saleable token or 2) the first token to be sold after
        // the end of pre-sale, set the starting index block
        if (startingIndexBlock == 0 && totalSupply == MAX_COUNT) {
            startingIndexBlock = block.number;
        } 

        if (totalSupply == MAX_COUNT) {
            mintingStoppedForever = true;
        }
    }


    function presaleMint(NFTVoucher calldata voucher, uint tokenCount) public payable onlyPresale whenNotPaused {
        require(
            totalSupply + tokenCount <= MAX_COUNT - reserveTokensRemaining,
            "Minting would exceed max total supply"
        );
        require(signer == _verify(voucher), "Wrong signature");
        require(msg.sender == voucher.reciever, "Voucher reciever and msg.sender are not the same");
        require(
            balanceOf(msg.sender) + tokenCount <= voucher.maxcount,
            "Minting would exceed max presale count for owner"
        );
        require(
            balanceOf(msg.sender) + tokenCount <= OWNER_MAX_TOKEN_COUNT,
            "Minting would exceed max count for owner"
        );
        require(msg.value >= PRESALE_PRICE * tokenCount, "Insufficient funds sent");

        for (uint256 i = 0; i < tokenCount; i++) {
            mintNext(msg.sender);
        }
    }

    function mintNext(address toAddress) private {
        _safeMint(toAddress, totalSupply);
        totalSupply++;
    }

    function getChainID() external view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    function _verify(NFTVoucher calldata voucher)
        internal
        view
        returns (address)
    {
        bytes32 digest = _hash(voucher);
        return ECDSA.recover(digest, voucher.signature);
    }

    function _hash(NFTVoucher calldata voucher)
        internal
        view
        returns (bytes32)
    {
        return
            _hashTypedDataV4(
                keccak256(
                    abi.encode(
                        keccak256(
                            "NFTVoucher(address reciever,uint16 maxcount)"
                        ),
                        voucher.reciever,
                        voucher.maxcount
                    )
                )
            );
    }

    /**
     * Set the starting index for the collection
     */
    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");
        
        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_COUNT;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if (block.number - (startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_COUNT;
        }
        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex++;
        }
    }

    // onlyOwner functions

    /*
        Toggles contract paused state
    */
    function flipPaused() public onlyOwner {
        require(mintingStoppedForever != true, "minting has already been stopped!");
        if (paused()) {
            _unpause();
        } else {
            _pause();
        }
    }

    function flipPresale() public onlyOwner {
        _flipPresale();
    }
    
    // stops minting forever
    function stopMintingForever() public onlyOwner {
        require(mintingStoppedForever != true, "minting has already been stopped!");
        _pause();
        mintingStoppedForever = true;
        if (startingIndexBlock == 0) {
            startingIndexBlock = block.number;
        }
    }

    /*     
    * Set provenance once it's calculated
    */
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        PROVENANCE_HASH = provenanceHash;
    }

    function withdrawAll() external onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0, "not enough balance");
        uint256 communityShare = balance*5/100;
        uint256 communityManagerShare = communityShare/5;
        uint256 artistAndPmShare = balance*12/100;
        uint256 advisor1Share = communityManagerShare*3;
        uint256 advisor2Share = communityManagerShare*8;
        uint256 owner1Share = balance*29/100;
        payable(0x862f66d3621e28183DE315e6556E72723A6f0648).transfer(communityShare); // Community Wallet to pay flat rates
        payable(0xc72E14dcC80eaa9Ff9873B26E1737eACacB97B01).transfer(communityManagerShare); // Community Manager
        payable(0x4b5b8C41940Ab49b8211Af3C55cB70C546cc8439).transfer(artistAndPmShare); // Project Manager
        payable(0x9Fc1Bd284c8DFB757Df0fC63Da33b35B5A711a11).transfer(artistAndPmShare); // Artist
        payable(0x9c63a62849e68B5f059edb3a20A3c5a7e2C53783).transfer(advisor1Share); // Advisor 1
        payable(0xEbCEe6204eeEEf21e406C0A75734E70f342914e0).transfer(advisor2Share); // Advisor 2
        payable(0x6F32aBB1191e75a873D73B2AE70A60Cb61FEeA88).transfer(owner1Share); // Owner 1
        payable(0x862f66d3621e28183DE315e6556E72723A6f0648).transfer(address(this).balance); // Owner 2
    }

    function giftReserve(address to, uint256 amount) public onlyOwner {
        require(reserveTokensRemaining > 0, "already claimed all the reserve tokens!");
        require(reserveTokensRemaining - amount >= 0, "amount would exceed the supply of reserve tokens!");
        for (uint256 i = 0; i < amount; i++) {
            mintNext(to);
            reserveTokensRemaining--;
        }
    }

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

    /**
     * Set the starting index block for the collection, essentially unblocking
     * setting starting index
     */
    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        
        startingIndexBlock = block.number;
    }
}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"giftReserve","outputs":[],"stateMutability":"nonpayable","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":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingStoppedForever","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"reciever","type":"address"},{"internalType":"uint16","name":"maxcount","type":"uint16"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct Apes.NFTVoucher","name":"voucher","type":"tuple"},{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokensRemaining","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":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopMintingForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040526001600860156101000a81548160ff0219169083151502179055506127106009556000600a556064600b5566b1a2bc2ec50000600c5566c3663566a58000600d556001600e60006101000a81548160ff021916908315150217905550730dd874f41ce844fcdaeba33714b6197136d89b7f600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506096600f556040518060200160405280600081525060109080519060200190620000e2929190620003e0565b506000601360006101000a81548160ff0219169083151502179055503480156200010b57600080fd5b506040518060400160405280600e81526020017f57617272696f72417065734e46540000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600c81526020017f57617272696f72204170657300000000000000000000000000000000000000008152506040518060400160405280600481526020017f57415045000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001fc929190620003e0565b50806001908051906020019062000215929190620003e0565b505050620002386200022c620002d660201b60201c565b620002de60201b60201c565b6000600860146101000a81548160ff02191690831515021790555060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260c081815250508160e081815250504660a08181525050620002bb818484620003a460201b60201c565b608081815250508061010081815250505050505050620005cd565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008383834630604051602001620003c1959493929190620004c3565b6040516020818303038152906040528051906020012090509392505050565b828054620003ee9062000568565b90600052602060002090601f0160209004810192826200041257600085556200045e565b82601f106200042d57805160ff19168380011785556200045e565b828001600101855582156200045e579182015b828111156200045d57825182559160200191906001019062000440565b5b5090506200046d919062000471565b5090565b5b808211156200048c57600081600090555060010162000472565b5090565b6200049b8162000520565b82525050565b620004ac8162000534565b82525050565b620004bd816200055e565b82525050565b600060a082019050620004da6000830188620004a1565b620004e96020830187620004a1565b620004f86040830186620004a1565b620005076060830185620004b2565b62000516608083018462000490565b9695505050505050565b60006200052d826200053e565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200058157607f821691505b602082108114156200059857620005976200059e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160e05161010051615a60620006126000396000613489015260006134cb015260006134aa015260006134360152600061345e0152615a606000f3fe60806040526004361061023a5760003560e01c80636c0360eb1161012e578063a22cb465116100ab578063e36d64981161006f578063e36d6498146107d4578063e985e9c5146107ff578063e98665501461083c578063f2fde38b14610853578063ff1b65561461087c5761023a565b8063a22cb465146106ef578063b88d4fde14610718578063c8510b9714610741578063c87b56dd1461076c578063cb774d47146107a95761023a565b806383396ab8116100f257806383396ab81461062c578063853828b6146106575780638da5cb5b1461066e57806395364a841461069957806395d89b41146106c45761023a565b80636c0360eb1461056b57806370a0823114610596578063715018a6146105d357806377163c1d146105ea5780637d17fcbe146106155761023a565b8063333171bb116101bc5780635c975abb116101805780635c975abb14610484578063611f3f10146104af57806362dc6e21146104da5780636352211e1461050557806364e4223f146105425761023a565b8063333171bb146103d957806342842e0e146103f057806355a409141461041957806355f804b314610430578063564b81ef146104595761023a565b80631096952311610203578063109695231461032457806315fbee961461034d57806318160ddd1461036957806323b872dd146103945780632db11544146103bd5761023a565b8062acf3481461023f57806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb575b600080fd5b34801561024b57600080fd5b506102546108a7565b005b34801561026257600080fd5b5061027d60048036038101906102789190613c6e565b61092d565b60405161028a91906144f2565b60405180910390f35b34801561029f57600080fd5b506102a8610a0f565b6040516102b591906145dc565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613d9a565b610aa1565b6040516102f2919061448b565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613c2e565b610b26565b005b34801561033057600080fd5b5061034b60048036038101906103469190613cc8565b610c3e565b005b61036760048036038101906103629190613d11565b610cd4565b005b34801561037557600080fd5b5061037e61101a565b60405161038b9190614abe565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613b18565b611020565b005b6103d760048036038101906103d29190613d9a565b611080565b005b3480156103e557600080fd5b506103ee6112fc565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613b18565b6113f4565b005b34801561042557600080fd5b5061042e611414565b005b34801561043c57600080fd5b5061045760048036038101906104529190613cc8565b61151f565b005b34801561046557600080fd5b5061046e6115a7565b60405161047b9190614abe565b60405180910390f35b34801561049057600080fd5b506104996115b4565b6040516104a691906144f2565b60405180910390f35b3480156104bb57600080fd5b506104c46115cb565b6040516104d19190614abe565b60405180910390f35b3480156104e657600080fd5b506104ef6115d1565b6040516104fc9190614abe565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613d9a565b6115d7565b604051610539919061448b565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613c2e565b611689565b005b34801561057757600080fd5b506105806117df565b60405161058d91906145dc565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190613aab565b611871565b6040516105ca9190614abe565b60405180910390f35b3480156105df57600080fd5b506105e8611929565b005b3480156105f657600080fd5b506105ff6119b1565b60405161060c9190614abe565b60405180910390f35b34801561062157600080fd5b5061062a6119b7565b005b34801561063857600080fd5b50610641611a81565b60405161064e9190614abe565b60405180910390f35b34801561066357600080fd5b5061066c611a87565b005b34801561067a57600080fd5b50610683611eb6565b604051610690919061448b565b60405180910390f35b3480156106a557600080fd5b506106ae611ee0565b6040516106bb91906144f2565b60405180910390f35b3480156106d057600080fd5b506106d9611ef7565b6040516106e691906145dc565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190613bee565b611f89565b005b34801561072457600080fd5b5061073f600480360381019061073a9190613b6b565b61210a565b005b34801561074d57600080fd5b5061075661216c565b60405161076391906144f2565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613d9a565b61217f565b6040516107a091906145dc565b60405180910390f35b3480156107b557600080fd5b506107be61224d565b6040516107cb9190614abe565b60405180910390f35b3480156107e057600080fd5b506107e9612253565b6040516107f69190614abe565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613ad8565b612259565b60405161083391906144f2565b60405180910390f35b34801561084857600080fd5b506108516122ed565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613aab565b6123f3565b005b34801561088857600080fd5b506108916124eb565b60405161089e91906145dc565b60405180910390f35b6108af612579565b73ffffffffffffffffffffffffffffffffffffffff166108cd611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a9061491e565b60405180910390fd5b61092b612581565b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a085750610a07826125ad565b5b9050919050565b606060008054610a1e90614e20565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a90614e20565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b5050505050905090565b6000610aac82612617565b610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae2906148de565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b31826115d7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b999061499e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc1612579565b73ffffffffffffffffffffffffffffffffffffffff161480610bf05750610bef81610bea612579565b612259565b5b610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c269061481e565b60405180910390fd5b610c398383612683565b505050565b610c46612579565b73ffffffffffffffffffffffffffffffffffffffff16610c64611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb19061491e565b60405180910390fd5b8060109080519060200190610cd092919061388b565b5050565b610cdc611ee0565b610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d129061475e565b60405180910390fd5b610d236115b4565b15610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a906147fe565b60405180910390fd5b600f54600954610d739190614ce7565b81600a54610d819190614c06565b1115610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db99061497e565b60405180910390fd5b610dcb8261273c565b73ffffffffffffffffffffffffffffffffffffffff16600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e519061467e565b60405180910390fd5b816000016020810190610e6d9190613aab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190614a3e565b60405180910390fd5b816020016020810190610eed9190613d6d565b61ffff1681610efb33611871565b610f059190614c06565b1115610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90614a9e565b60405180910390fd5b600b5481610f5333611871565b610f5d9190614c06565b1115610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061487e565b60405180910390fd5b80600c54610fac9190614c8d565b341015610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590614a5e565b60405180910390fd5b60005b8181101561101557611002336127ae565b808061100d90614e83565b915050610ff1565b505050565b600a5481565b61103161102b612579565b826127d5565b611070576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611067906149fe565b60405180910390fd5b61107b8383836128b3565b505050565b6110886115b4565b156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906147fe565b60405180910390fd5b6110d0611ee0565b15611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611107906148fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614a1e565b60405180910390fd5b600f546009546111909190614ce7565b81600a5461119e9190614c06565b11156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d69061497e565b60405180910390fd5b600b54816111ec33611871565b6111f69190614c06565b1115611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e9061487e565b60405180910390fd5b80600d546112459190614c8d565b341015611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90614a5e565b60405180910390fd5b60005b818110156112ae5761129b336127ae565b80806112a690614e83565b91505061128a565b5060006011541480156112c45750600954600a54145b156112d157436011819055505b600954600a5414156112f9576001601360006101000a81548160ff0219169083151502179055505b50565b611304612579565b73ffffffffffffffffffffffffffffffffffffffff16611322611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f9061491e565b60405180910390fd5b60011515601360009054906101000a900460ff16151514156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c690614a7e565b60405180910390fd5b6113d76115b4565b156113e9576113e4612b0f565b6113f2565b6113f1612bb1565b5b565b61140f8383836040518060200160405280600081525061210a565b505050565b61141c612579565b73ffffffffffffffffffffffffffffffffffffffff1661143a611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114879061491e565b60405180910390fd5b60011515601360009054906101000a900460ff16151514156114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90614a7e565b60405180910390fd5b6114ef612bb1565b6001601360006101000a81548160ff0219169083151502179055506000601154141561151d57436011819055505b565b611527612579565b73ffffffffffffffffffffffffffffffffffffffff16611545611eb6565b73ffffffffffffffffffffffffffffffffffffffff161461159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061491e565b60405180910390fd5b6115a481612c54565b50565b6000804690508091505090565b6000600860149054906101000a900460ff16905090565b600d5481565b600c5481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116779061485e565b60405180910390fd5b80915050919050565b611691612579565b73ffffffffffffffffffffffffffffffffffffffff166116af611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fc9061491e565b60405180910390fd5b6000600f541161174a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611741906149be565b60405180910390fd5b600081600f5461175a9190614ce7565b101561179b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117929061461e565b60405180910390fd5b60005b818110156117da576117af836127ae565b600f60008154809291906117c290614df6565b919050555080806117d290614e83565b91505061179e565b505050565b6060600280546117ee90614e20565b80601f016020809104026020016040519081016040528092919081815260200182805461181a90614e20565b80156118675780601f1061183c57610100808354040283529160200191611867565b820191906000526020600020905b81548152906001019060200180831161184a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d99061483e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611931612579565b73ffffffffffffffffffffffffffffffffffffffff1661194f611eb6565b73ffffffffffffffffffffffffffffffffffffffff16146119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c9061491e565b60405180910390fd5b6119af6000612c6e565b565b60095481565b6119bf612579565b73ffffffffffffffffffffffffffffffffffffffff166119dd611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9061491e565b60405180910390fd5b600060125414611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f906147de565b60405180910390fd5b43601181905550565b600f5481565b611a8f612579565b73ffffffffffffffffffffffffffffffffffffffff16611aad611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa9061491e565b60405180910390fd5b600047905060008111611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906147be565b60405180910390fd5b60006064600583611b5c9190614c8d565b611b669190614c5c565b90506000600582611b779190614c5c565b905060006064600c85611b8a9190614c8d565b611b949190614c5c565b90506000600383611ba59190614c8d565b90506000600884611bb69190614c8d565b905060006064601d88611bc99190614c8d565b611bd39190614c5c565b905073862f66d3621e28183de315e6556e72723a6f064873ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f19350505050158015611c2f573d6000803e3d6000fd5b5073c72e14dcc80eaa9ff9873b26e1737eacacb97b0173ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050158015611c8a573d6000803e3d6000fd5b50734b5b8c41940ab49b8211af3c55cb70c546cc843973ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611ce5573d6000803e3d6000fd5b50739fc1bd284c8dfb757df0fc63da33b35b5a711a1173ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611d40573d6000803e3d6000fd5b50739c63a62849e68b5f059edb3a20a3c5a7e2c5378373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611d9b573d6000803e3d6000fd5b5073ebcee6204eeeef21e406c0a75734e70f342914e073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611df6573d6000803e3d6000fd5b50736f32abb1191e75a873d73b2ae70a60cb61feea8873ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e51573d6000803e3d6000fd5b5073862f66d3621e28183de315e6556e72723a6f064873ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611eac573d6000803e3d6000fd5b5050505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600860159054906101000a900460ff16905090565b606060018054611f0690614e20565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3290614e20565b8015611f7f5780601f10611f5457610100808354040283529160200191611f7f565b820191906000526020600020905b815481529060010190602001808311611f6257829003601f168201915b5050505050905090565b611f91612579565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff69061473e565b60405180910390fd5b806006600061200c612579565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120b9612579565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120fe91906144f2565b60405180910390a35050565b61211b612115612579565b836127d5565b61215a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612151906149fe565b60405180910390fd5b61216684848484612d34565b50505050565b601360009054906101000a900460ff1681565b6060600061218b6117df565b5114156121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c4906146fe565b60405180910390fd5b6121d682612617565b612215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220c9061495e565b60405180910390fd5b61221d6117df565b61222683612d90565b604051602001612237929190614430565b6040516020818303038152906040529050919050565b60125481565b60115481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060125414612332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612329906147de565b60405180910390fd5b60006011541415612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f906149de565b60405180910390fd5b6009546011544060001c61238c9190614ed6565b60128190555060ff601154436123a29190614ce7565b11156123cd576009546001436123b89190614ce7565b4060001c6123c69190614ed6565b6012819055505b600060125414156123f157601260008154809291906123eb90614e83565b91905055505b565b6123fb612579565b73ffffffffffffffffffffffffffffffffffffffff16612419611eb6565b73ffffffffffffffffffffffffffffffffffffffff161461246f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124669061491e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d6906146be565b60405180910390fd5b6124e881612c6e565b50565b601080546124f890614e20565b80601f016020809104026020016040519081016040528092919081815260200182805461252490614e20565b80156125715780601f1061254657610100808354040283529160200191612571565b820191906000526020600020905b81548152906001019060200180831161255457829003601f168201915b505050505081565b600033905090565b600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126f6836115d7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061274883612ef1565b90506127a68184806040019061275e9190614ad9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612f71565b915050919050565b6127ba81600a54612f98565b600a60008154809291906127cd90614e83565b919050555050565b60006127e082612617565b61281f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128169061479e565b60405180910390fd5b600061282a836115d7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061289957508373ffffffffffffffffffffffffffffffffffffffff1661288184610aa1565b73ffffffffffffffffffffffffffffffffffffffff16145b806128aa57506128a98185612259565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128d3826115d7565b73ffffffffffffffffffffffffffffffffffffffff1614612929576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129209061493e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612999576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129909061471e565b60405180910390fd5b6129a4838383612fb6565b6129af600082612683565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ff9190614ce7565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a569190614c06565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612b176115b4565b612b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4d9061463e565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b9a612579565b604051612ba7919061448b565b60405180910390a1565b612bb96115b4565b15612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf0906147fe565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612c3d612579565b604051612c4a919061448b565b60405180910390a1565b8060029080519060200190612c6a92919061388b565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d3f8484846128b3565b612d4b84848484612fbb565b612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d819061469e565b60405180910390fd5b50505050565b60606000821415612dd8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eec565b600082905060005b60008214612e0a578080612df390614e83565b915050600a82612e039190614c5c565b9150612de0565b60008167ffffffffffffffff811115612e2657612e25614ff2565b5b6040519080825280601f01601f191660200182016040528015612e585781602001600182028036833780820191505090505b5090505b60008514612ee557600182612e719190614ce7565b9150600a85612e809190614ed6565b6030612e8c9190614c06565b60f81b818381518110612ea257612ea1614fc3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ede9190614c5c565b9450612e5c565b8093505050505b919050565b6000612f6a7f9611493255b815b777536772d2108838eb77c2771aa3ce571a4d00adef2a7a08836000016020810190612f2a9190613aab565b846020016020810190612f3d9190613d6d565b604051602001612f4f9392919061450d565b60405160208183030381529060405280519060200120613152565b9050919050565b6000806000612f80858561316c565b91509150612f8d816131ef565b819250505092915050565b612fb28282604051806020016040528060008152506133c4565b5050565b505050565b6000612fdc8473ffffffffffffffffffffffffffffffffffffffff1661341f565b15613145578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613005612579565b8786866040518563ffffffff1660e01b815260040161302794939291906144a6565b602060405180830381600087803b15801561304157600080fd5b505af192505050801561307257506040513d601f19601f8201168201806040525081019061306f9190613c9b565b60015b6130f5573d80600081146130a2576040519150601f19603f3d011682016040523d82523d6000602084013e6130a7565b606091505b506000815114156130ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e49061469e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061314a565b600190505b949350505050565b600061316561315f613432565b836134f5565b9050919050565b6000806041835114156131ae5760008060006020860151925060408601519150606086015160001a90506131a287828585613528565b945094505050506131e8565b6040835114156131df5760008060208501519150604085015190506131d4868383613635565b9350935050506131e8565b60006002915091505b9250929050565b6000600481111561320357613202614f65565b5b81600481111561321657613215614f65565b5b1415613221576133c1565b6001600481111561323557613234614f65565b5b81600481111561324857613247614f65565b5b1415613289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613280906145fe565b60405180910390fd5b6002600481111561329d5761329c614f65565b5b8160048111156132b0576132af614f65565b5b14156132f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e89061465e565b60405180910390fd5b6003600481111561330557613304614f65565b5b81600481111561331857613317614f65565b5b1415613359576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133509061477e565b60405180910390fd5b60048081111561336c5761336b614f65565b5b81600481111561337f5761337e614f65565b5b14156133c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b79061489e565b60405180910390fd5b5b50565b6133ce8383613683565b6133db6000848484612fbb565b61341a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134119061469e565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415613484577f000000000000000000000000000000000000000000000000000000000000000090506134f2565b6134ef7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613851565b90505b90565b6000828260405160200161350a929190614454565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561356357600060039150915061362c565b601b8560ff161415801561357b5750601c8560ff1614155b1561358d57600060049150915061362c565b6000600187878787604051600081526020016040526040516135b29493929190614597565b6020604051602081039080840390855afa1580156135d4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156136235760006001925092505061362c565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061367587828885613528565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ea906148be565b60405180910390fd5b6136fc81612617565b1561373c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613733906146de565b60405180910390fd5b61374860008383612fb6565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137989190614c06565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000838383463060405160200161386c959493929190614544565b6040516020818303038152906040528051906020012090509392505050565b82805461389790614e20565b90600052602060002090601f0160209004810192826138b95760008555613900565b82601f106138d257805160ff1916838001178555613900565b82800160010185558215613900579182015b828111156138ff5782518255916020019190600101906138e4565b5b50905061390d9190613911565b5090565b5b8082111561392a576000816000905550600101613912565b5090565b600061394161393c84614b61565b614b3c565b90508281526020810184848401111561395d5761395c61503a565b5b613968848285614db4565b509392505050565b600061398361397e84614b92565b614b3c565b90508281526020810184848401111561399f5761399e61503a565b5b6139aa848285614db4565b509392505050565b6000813590506139c1816159b7565b92915050565b6000813590506139d6816159ce565b92915050565b6000813590506139eb816159e5565b92915050565b600081519050613a00816159e5565b92915050565b600082601f830112613a1b57613a1a615021565b5b8135613a2b84826020860161392e565b91505092915050565b600082601f830112613a4957613a48615021565b5b8135613a59848260208601613970565b91505092915050565b600060608284031215613a7857613a7761502b565b5b81905092915050565b600081359050613a90816159fc565b92915050565b600081359050613aa581615a13565b92915050565b600060208284031215613ac157613ac0615044565b5b6000613acf848285016139b2565b91505092915050565b60008060408385031215613aef57613aee615044565b5b6000613afd858286016139b2565b9250506020613b0e858286016139b2565b9150509250929050565b600080600060608486031215613b3157613b30615044565b5b6000613b3f868287016139b2565b9350506020613b50868287016139b2565b9250506040613b6186828701613a96565b9150509250925092565b60008060008060808587031215613b8557613b84615044565b5b6000613b93878288016139b2565b9450506020613ba4878288016139b2565b9350506040613bb587828801613a96565b925050606085013567ffffffffffffffff811115613bd657613bd561503f565b5b613be287828801613a06565b91505092959194509250565b60008060408385031215613c0557613c04615044565b5b6000613c13858286016139b2565b9250506020613c24858286016139c7565b9150509250929050565b60008060408385031215613c4557613c44615044565b5b6000613c53858286016139b2565b9250506020613c6485828601613a96565b9150509250929050565b600060208284031215613c8457613c83615044565b5b6000613c92848285016139dc565b91505092915050565b600060208284031215613cb157613cb0615044565b5b6000613cbf848285016139f1565b91505092915050565b600060208284031215613cde57613cdd615044565b5b600082013567ffffffffffffffff811115613cfc57613cfb61503f565b5b613d0884828501613a34565b91505092915050565b60008060408385031215613d2857613d27615044565b5b600083013567ffffffffffffffff811115613d4657613d4561503f565b5b613d5285828601613a62565b9250506020613d6385828601613a96565b9150509250929050565b600060208284031215613d8357613d82615044565b5b6000613d9184828501613a81565b91505092915050565b600060208284031215613db057613daf615044565b5b6000613dbe84828501613a96565b91505092915050565b613dd081614d1b565b82525050565b613ddf81614d2d565b82525050565b613dee81614d39565b82525050565b613e05613e0082614d39565b614ecc565b82525050565b6000613e1682614bc3565b613e208185614bd9565b9350613e30818560208601614dc3565b613e3981615049565b840191505092915050565b6000613e4f82614bce565b613e598185614bea565b9350613e69818560208601614dc3565b613e7281615049565b840191505092915050565b6000613e8882614bce565b613e928185614bfb565b9350613ea2818560208601614dc3565b80840191505092915050565b6000613ebb601883614bea565b9150613ec68261505a565b602082019050919050565b6000613ede603183614bea565b9150613ee982615083565b604082019050919050565b6000613f01601483614bea565b9150613f0c826150d2565b602082019050919050565b6000613f24601f83614bea565b9150613f2f826150fb565b602082019050919050565b6000613f47600f83614bea565b9150613f5282615124565b602082019050919050565b6000613f6a603283614bea565b9150613f758261514d565b604082019050919050565b6000613f8d602683614bea565b9150613f988261519c565b604082019050919050565b6000613fb0601c83614bea565b9150613fbb826151eb565b602082019050919050565b6000613fd3600283614bfb565b9150613fde82615214565b600282019050919050565b6000613ff6601c83614bea565b91506140018261523d565b602082019050919050565b6000614019602483614bea565b915061402482615266565b604082019050919050565b600061403c601983614bea565b9150614047826152b5565b602082019050919050565b600061405f601283614bea565b915061406a826152de565b602082019050919050565b6000614082602283614bea565b915061408d82615307565b604082019050919050565b60006140a5602c83614bea565b91506140b082615356565b604082019050919050565b60006140c8601283614bea565b91506140d3826153a5565b602082019050919050565b60006140eb601d83614bea565b91506140f6826153ce565b602082019050919050565b600061410e601083614bea565b9150614119826153f7565b602082019050919050565b6000614131603883614bea565b915061413c82615420565b604082019050919050565b6000614154602a83614bea565b915061415f8261546f565b604082019050919050565b6000614177602983614bea565b9150614182826154be565b604082019050919050565b600061419a602883614bea565b91506141a58261550d565b604082019050919050565b60006141bd602283614bea565b91506141c88261555c565b604082019050919050565b60006141e0602083614bea565b91506141eb826155ab565b602082019050919050565b6000614203602c83614bea565b915061420e826155d4565b604082019050919050565b6000614226601683614bea565b915061423182615623565b602082019050919050565b6000614249602083614bea565b91506142548261564c565b602082019050919050565b600061426c602983614bea565b915061427782615675565b604082019050919050565b600061428f602f83614bea565b915061429a826156c4565b604082019050919050565b60006142b2602583614bea565b91506142bd82615713565b604082019050919050565b60006142d5602183614bea565b91506142e082615762565b604082019050919050565b60006142f8602783614bea565b9150614303826157b1565b604082019050919050565b600061431b602083614bea565b915061432682615800565b602082019050919050565b600061433e603183614bea565b915061434982615829565b604082019050919050565b6000614361601b83614bea565b915061436c82615878565b602082019050919050565b6000614384603083614bea565b915061438f826158a1565b604082019050919050565b60006143a7601783614bea565b91506143b2826158f0565b602082019050919050565b60006143ca602183614bea565b91506143d582615919565b604082019050919050565b60006143ed603083614bea565b91506143f882615968565b604082019050919050565b61440c81614d6f565b82525050565b61441b81614d9d565b82525050565b61442a81614da7565b82525050565b600061443c8285613e7d565b91506144488284613e7d565b91508190509392505050565b600061445f82613fc6565b915061446b8285613df4565b60208201915061447b8284613df4565b6020820191508190509392505050565b60006020820190506144a06000830184613dc7565b92915050565b60006080820190506144bb6000830187613dc7565b6144c86020830186613dc7565b6144d56040830185614412565b81810360608301526144e78184613e0b565b905095945050505050565b60006020820190506145076000830184613dd6565b92915050565b60006060820190506145226000830186613de5565b61452f6020830185613dc7565b61453c6040830184614403565b949350505050565b600060a0820190506145596000830188613de5565b6145666020830187613de5565b6145736040830186613de5565b6145806060830185614412565b61458d6080830184613dc7565b9695505050505050565b60006080820190506145ac6000830187613de5565b6145b96020830186614421565b6145c66040830185613de5565b6145d36060830184613de5565b95945050505050565b600060208201905081810360008301526145f68184613e44565b905092915050565b6000602082019050818103600083015261461781613eae565b9050919050565b6000602082019050818103600083015261463781613ed1565b9050919050565b6000602082019050818103600083015261465781613ef4565b9050919050565b6000602082019050818103600083015261467781613f17565b9050919050565b6000602082019050818103600083015261469781613f3a565b9050919050565b600060208201905081810360008301526146b781613f5d565b9050919050565b600060208201905081810360008301526146d781613f80565b9050919050565b600060208201905081810360008301526146f781613fa3565b9050919050565b6000602082019050818103600083015261471781613fe9565b9050919050565b600060208201905081810360008301526147378161400c565b9050919050565b600060208201905081810360008301526147578161402f565b9050919050565b6000602082019050818103600083015261477781614052565b9050919050565b6000602082019050818103600083015261479781614075565b9050919050565b600060208201905081810360008301526147b781614098565b9050919050565b600060208201905081810360008301526147d7816140bb565b9050919050565b600060208201905081810360008301526147f7816140de565b9050919050565b6000602082019050818103600083015261481781614101565b9050919050565b6000602082019050818103600083015261483781614124565b9050919050565b6000602082019050818103600083015261485781614147565b9050919050565b600060208201905081810360008301526148778161416a565b9050919050565b600060208201905081810360008301526148978161418d565b9050919050565b600060208201905081810360008301526148b7816141b0565b9050919050565b600060208201905081810360008301526148d7816141d3565b9050919050565b600060208201905081810360008301526148f7816141f6565b9050919050565b6000602082019050818103600083015261491781614219565b9050919050565b600060208201905081810360008301526149378161423c565b9050919050565b600060208201905081810360008301526149578161425f565b9050919050565b6000602082019050818103600083015261497781614282565b9050919050565b60006020820190508181036000830152614997816142a5565b9050919050565b600060208201905081810360008301526149b7816142c8565b9050919050565b600060208201905081810360008301526149d7816142eb565b9050919050565b600060208201905081810360008301526149f78161430e565b9050919050565b60006020820190508181036000830152614a1781614331565b9050919050565b60006020820190508181036000830152614a3781614354565b9050919050565b60006020820190508181036000830152614a5781614377565b9050919050565b60006020820190508181036000830152614a778161439a565b9050919050565b60006020820190508181036000830152614a97816143bd565b9050919050565b60006020820190508181036000830152614ab7816143e0565b9050919050565b6000602082019050614ad36000830184614412565b92915050565b60008083356001602003843603038112614af657614af5615030565b5b80840192508235915067ffffffffffffffff821115614b1857614b17615026565b5b602083019250600182023603831315614b3457614b33615035565b5b509250929050565b6000614b46614b57565b9050614b528282614e52565b919050565b6000604051905090565b600067ffffffffffffffff821115614b7c57614b7b614ff2565b5b614b8582615049565b9050602081019050919050565b600067ffffffffffffffff821115614bad57614bac614ff2565b5b614bb682615049565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1182614d9d565b9150614c1c83614d9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5157614c50614f07565b5b828201905092915050565b6000614c6782614d9d565b9150614c7283614d9d565b925082614c8257614c81614f36565b5b828204905092915050565b6000614c9882614d9d565b9150614ca383614d9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cdc57614cdb614f07565b5b828202905092915050565b6000614cf282614d9d565b9150614cfd83614d9d565b925082821015614d1057614d0f614f07565b5b828203905092915050565b6000614d2682614d7d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614de1578082015181840152602081019050614dc6565b83811115614df0576000848401525b50505050565b6000614e0182614d9d565b91506000821415614e1557614e14614f07565b5b600182039050919050565b60006002820490506001821680614e3857607f821691505b60208210811415614e4c57614e4b614f94565b5b50919050565b614e5b82615049565b810181811067ffffffffffffffff82111715614e7a57614e79614ff2565b5b80604052505050565b6000614e8e82614d9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ec157614ec0614f07565b5b600182019050919050565b6000819050919050565b6000614ee182614d9d565b9150614eec83614d9d565b925082614efc57614efb614f36565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f616d6f756e7420776f756c64206578636565642074686520737570706c79206f60008201527f66207265736572766520746f6b656e7321000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f57726f6e67207369676e61747572650000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4261736555524920686173206e6f74206265656e207365742079657400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820636f756e74206660008201527f6f72206f776e6572000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820746f74616c207360008201527f7570706c79000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f616c726561647920636c61696d656420616c6c2074686520726573657276652060008201527f746f6b656e732100000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e7420746f206e756c6c20616464726573730000000000600082015250565b7f566f756368657220726563696576657220616e64206d73672e73656e6465722060008201527f617265206e6f74207468652073616d6500000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732073656e74000000000000000000600082015250565b7f6d696e74696e672068617320616c7265616479206265656e2073746f7070656460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d61782070726573616c6560008201527f20636f756e7420666f72206f776e657200000000000000000000000000000000602082015250565b6159c081614d1b565b81146159cb57600080fd5b50565b6159d781614d2d565b81146159e257600080fd5b50565b6159ee81614d43565b81146159f957600080fd5b50565b615a0581614d6f565b8114615a1057600080fd5b50565b615a1c81614d9d565b8114615a2757600080fd5b5056fea2646970667358221220d2bd9c0d6cb15fa1f06929ea2b4f3b5f3fccf1590e4b597d1757d3c72630c52d64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061023a5760003560e01c80636c0360eb1161012e578063a22cb465116100ab578063e36d64981161006f578063e36d6498146107d4578063e985e9c5146107ff578063e98665501461083c578063f2fde38b14610853578063ff1b65561461087c5761023a565b8063a22cb465146106ef578063b88d4fde14610718578063c8510b9714610741578063c87b56dd1461076c578063cb774d47146107a95761023a565b806383396ab8116100f257806383396ab81461062c578063853828b6146106575780638da5cb5b1461066e57806395364a841461069957806395d89b41146106c45761023a565b80636c0360eb1461056b57806370a0823114610596578063715018a6146105d357806377163c1d146105ea5780637d17fcbe146106155761023a565b8063333171bb116101bc5780635c975abb116101805780635c975abb14610484578063611f3f10146104af57806362dc6e21146104da5780636352211e1461050557806364e4223f146105425761023a565b8063333171bb146103d957806342842e0e146103f057806355a409141461041957806355f804b314610430578063564b81ef146104595761023a565b80631096952311610203578063109695231461032457806315fbee961461034d57806318160ddd1461036957806323b872dd146103945780632db11544146103bd5761023a565b8062acf3481461023f57806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb575b600080fd5b34801561024b57600080fd5b506102546108a7565b005b34801561026257600080fd5b5061027d60048036038101906102789190613c6e565b61092d565b60405161028a91906144f2565b60405180910390f35b34801561029f57600080fd5b506102a8610a0f565b6040516102b591906145dc565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613d9a565b610aa1565b6040516102f2919061448b565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190613c2e565b610b26565b005b34801561033057600080fd5b5061034b60048036038101906103469190613cc8565b610c3e565b005b61036760048036038101906103629190613d11565b610cd4565b005b34801561037557600080fd5b5061037e61101a565b60405161038b9190614abe565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613b18565b611020565b005b6103d760048036038101906103d29190613d9a565b611080565b005b3480156103e557600080fd5b506103ee6112fc565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613b18565b6113f4565b005b34801561042557600080fd5b5061042e611414565b005b34801561043c57600080fd5b5061045760048036038101906104529190613cc8565b61151f565b005b34801561046557600080fd5b5061046e6115a7565b60405161047b9190614abe565b60405180910390f35b34801561049057600080fd5b506104996115b4565b6040516104a691906144f2565b60405180910390f35b3480156104bb57600080fd5b506104c46115cb565b6040516104d19190614abe565b60405180910390f35b3480156104e657600080fd5b506104ef6115d1565b6040516104fc9190614abe565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613d9a565b6115d7565b604051610539919061448b565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613c2e565b611689565b005b34801561057757600080fd5b506105806117df565b60405161058d91906145dc565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190613aab565b611871565b6040516105ca9190614abe565b60405180910390f35b3480156105df57600080fd5b506105e8611929565b005b3480156105f657600080fd5b506105ff6119b1565b60405161060c9190614abe565b60405180910390f35b34801561062157600080fd5b5061062a6119b7565b005b34801561063857600080fd5b50610641611a81565b60405161064e9190614abe565b60405180910390f35b34801561066357600080fd5b5061066c611a87565b005b34801561067a57600080fd5b50610683611eb6565b604051610690919061448b565b60405180910390f35b3480156106a557600080fd5b506106ae611ee0565b6040516106bb91906144f2565b60405180910390f35b3480156106d057600080fd5b506106d9611ef7565b6040516106e691906145dc565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190613bee565b611f89565b005b34801561072457600080fd5b5061073f600480360381019061073a9190613b6b565b61210a565b005b34801561074d57600080fd5b5061075661216c565b60405161076391906144f2565b60405180910390f35b34801561077857600080fd5b50610793600480360381019061078e9190613d9a565b61217f565b6040516107a091906145dc565b60405180910390f35b3480156107b557600080fd5b506107be61224d565b6040516107cb9190614abe565b60405180910390f35b3480156107e057600080fd5b506107e9612253565b6040516107f69190614abe565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613ad8565b612259565b60405161083391906144f2565b60405180910390f35b34801561084857600080fd5b506108516122ed565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613aab565b6123f3565b005b34801561088857600080fd5b506108916124eb565b60405161089e91906145dc565b60405180910390f35b6108af612579565b73ffffffffffffffffffffffffffffffffffffffff166108cd611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614610923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091a9061491e565b60405180910390fd5b61092b612581565b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a085750610a07826125ad565b5b9050919050565b606060008054610a1e90614e20565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4a90614e20565b8015610a975780601f10610a6c57610100808354040283529160200191610a97565b820191906000526020600020905b815481529060010190602001808311610a7a57829003601f168201915b5050505050905090565b6000610aac82612617565b610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae2906148de565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b31826115d7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b999061499e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc1612579565b73ffffffffffffffffffffffffffffffffffffffff161480610bf05750610bef81610bea612579565b612259565b5b610c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c269061481e565b60405180910390fd5b610c398383612683565b505050565b610c46612579565b73ffffffffffffffffffffffffffffffffffffffff16610c64611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb19061491e565b60405180910390fd5b8060109080519060200190610cd092919061388b565b5050565b610cdc611ee0565b610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d129061475e565b60405180910390fd5b610d236115b4565b15610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a906147fe565b60405180910390fd5b600f54600954610d739190614ce7565b81600a54610d819190614c06565b1115610dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db99061497e565b60405180910390fd5b610dcb8261273c565b73ffffffffffffffffffffffffffffffffffffffff16600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e519061467e565b60405180910390fd5b816000016020810190610e6d9190613aab565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190614a3e565b60405180910390fd5b816020016020810190610eed9190613d6d565b61ffff1681610efb33611871565b610f059190614c06565b1115610f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3d90614a9e565b60405180910390fd5b600b5481610f5333611871565b610f5d9190614c06565b1115610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061487e565b60405180910390fd5b80600c54610fac9190614c8d565b341015610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590614a5e565b60405180910390fd5b60005b8181101561101557611002336127ae565b808061100d90614e83565b915050610ff1565b505050565b600a5481565b61103161102b612579565b826127d5565b611070576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611067906149fe565b60405180910390fd5b61107b8383836128b3565b505050565b6110886115b4565b156110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bf906147fe565b60405180910390fd5b6110d0611ee0565b15611110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611107906148fe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790614a1e565b60405180910390fd5b600f546009546111909190614ce7565b81600a5461119e9190614c06565b11156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d69061497e565b60405180910390fd5b600b54816111ec33611871565b6111f69190614c06565b1115611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e9061487e565b60405180910390fd5b80600d546112459190614c8d565b341015611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90614a5e565b60405180910390fd5b60005b818110156112ae5761129b336127ae565b80806112a690614e83565b91505061128a565b5060006011541480156112c45750600954600a54145b156112d157436011819055505b600954600a5414156112f9576001601360006101000a81548160ff0219169083151502179055505b50565b611304612579565b73ffffffffffffffffffffffffffffffffffffffff16611322611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f9061491e565b60405180910390fd5b60011515601360009054906101000a900460ff16151514156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c690614a7e565b60405180910390fd5b6113d76115b4565b156113e9576113e4612b0f565b6113f2565b6113f1612bb1565b5b565b61140f8383836040518060200160405280600081525061210a565b505050565b61141c612579565b73ffffffffffffffffffffffffffffffffffffffff1661143a611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114879061491e565b60405180910390fd5b60011515601360009054906101000a900460ff16151514156114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90614a7e565b60405180910390fd5b6114ef612bb1565b6001601360006101000a81548160ff0219169083151502179055506000601154141561151d57436011819055505b565b611527612579565b73ffffffffffffffffffffffffffffffffffffffff16611545611eb6565b73ffffffffffffffffffffffffffffffffffffffff161461159b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115929061491e565b60405180910390fd5b6115a481612c54565b50565b6000804690508091505090565b6000600860149054906101000a900460ff16905090565b600d5481565b600c5481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611680576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116779061485e565b60405180910390fd5b80915050919050565b611691612579565b73ffffffffffffffffffffffffffffffffffffffff166116af611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fc9061491e565b60405180910390fd5b6000600f541161174a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611741906149be565b60405180910390fd5b600081600f5461175a9190614ce7565b101561179b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117929061461e565b60405180910390fd5b60005b818110156117da576117af836127ae565b600f60008154809291906117c290614df6565b919050555080806117d290614e83565b91505061179e565b505050565b6060600280546117ee90614e20565b80601f016020809104026020016040519081016040528092919081815260200182805461181a90614e20565b80156118675780601f1061183c57610100808354040283529160200191611867565b820191906000526020600020905b81548152906001019060200180831161184a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d99061483e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611931612579565b73ffffffffffffffffffffffffffffffffffffffff1661194f611eb6565b73ffffffffffffffffffffffffffffffffffffffff16146119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c9061491e565b60405180910390fd5b6119af6000612c6e565b565b60095481565b6119bf612579565b73ffffffffffffffffffffffffffffffffffffffff166119dd611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9061491e565b60405180910390fd5b600060125414611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f906147de565b60405180910390fd5b43601181905550565b600f5481565b611a8f612579565b73ffffffffffffffffffffffffffffffffffffffff16611aad611eb6565b73ffffffffffffffffffffffffffffffffffffffff1614611b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afa9061491e565b60405180910390fd5b600047905060008111611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906147be565b60405180910390fd5b60006064600583611b5c9190614c8d565b611b669190614c5c565b90506000600582611b779190614c5c565b905060006064600c85611b8a9190614c8d565b611b949190614c5c565b90506000600383611ba59190614c8d565b90506000600884611bb69190614c8d565b905060006064601d88611bc99190614c8d565b611bd39190614c5c565b905073862f66d3621e28183de315e6556e72723a6f064873ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f19350505050158015611c2f573d6000803e3d6000fd5b5073c72e14dcc80eaa9ff9873b26e1737eacacb97b0173ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050158015611c8a573d6000803e3d6000fd5b50734b5b8c41940ab49b8211af3c55cb70c546cc843973ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611ce5573d6000803e3d6000fd5b50739fc1bd284c8dfb757df0fc63da33b35b5a711a1173ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015611d40573d6000803e3d6000fd5b50739c63a62849e68b5f059edb3a20a3c5a7e2c5378373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611d9b573d6000803e3d6000fd5b5073ebcee6204eeeef21e406c0a75734e70f342914e073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611df6573d6000803e3d6000fd5b50736f32abb1191e75a873d73b2ae70a60cb61feea8873ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e51573d6000803e3d6000fd5b5073862f66d3621e28183de315e6556e72723a6f064873ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611eac573d6000803e3d6000fd5b5050505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600860159054906101000a900460ff16905090565b606060018054611f0690614e20565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3290614e20565b8015611f7f5780601f10611f5457610100808354040283529160200191611f7f565b820191906000526020600020905b815481529060010190602001808311611f6257829003601f168201915b5050505050905090565b611f91612579565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff69061473e565b60405180910390fd5b806006600061200c612579565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120b9612579565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120fe91906144f2565b60405180910390a35050565b61211b612115612579565b836127d5565b61215a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612151906149fe565b60405180910390fd5b61216684848484612d34565b50505050565b601360009054906101000a900460ff1681565b6060600061218b6117df565b5114156121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c4906146fe565b60405180910390fd5b6121d682612617565b612215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220c9061495e565b60405180910390fd5b61221d6117df565b61222683612d90565b604051602001612237929190614430565b6040516020818303038152906040529050919050565b60125481565b60115481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060125414612332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612329906147de565b60405180910390fd5b60006011541415612378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236f906149de565b60405180910390fd5b6009546011544060001c61238c9190614ed6565b60128190555060ff601154436123a29190614ce7565b11156123cd576009546001436123b89190614ce7565b4060001c6123c69190614ed6565b6012819055505b600060125414156123f157601260008154809291906123eb90614e83565b91905055505b565b6123fb612579565b73ffffffffffffffffffffffffffffffffffffffff16612419611eb6565b73ffffffffffffffffffffffffffffffffffffffff161461246f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124669061491e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d6906146be565b60405180910390fd5b6124e881612c6e565b50565b601080546124f890614e20565b80601f016020809104026020016040519081016040528092919081815260200182805461252490614e20565b80156125715780601f1061254657610100808354040283529160200191612571565b820191906000526020600020905b81548152906001019060200180831161255457829003601f168201915b505050505081565b600033905090565b600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126f6836115d7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061274883612ef1565b90506127a68184806040019061275e9190614ad9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612f71565b915050919050565b6127ba81600a54612f98565b600a60008154809291906127cd90614e83565b919050555050565b60006127e082612617565b61281f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128169061479e565b60405180910390fd5b600061282a836115d7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061289957508373ffffffffffffffffffffffffffffffffffffffff1661288184610aa1565b73ffffffffffffffffffffffffffffffffffffffff16145b806128aa57506128a98185612259565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128d3826115d7565b73ffffffffffffffffffffffffffffffffffffffff1614612929576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129209061493e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612999576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129909061471e565b60405180910390fd5b6129a4838383612fb6565b6129af600082612683565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129ff9190614ce7565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a569190614c06565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612b176115b4565b612b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4d9061463e565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612b9a612579565b604051612ba7919061448b565b60405180910390a1565b612bb96115b4565b15612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf0906147fe565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612c3d612579565b604051612c4a919061448b565b60405180910390a1565b8060029080519060200190612c6a92919061388b565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d3f8484846128b3565b612d4b84848484612fbb565b612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d819061469e565b60405180910390fd5b50505050565b60606000821415612dd8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eec565b600082905060005b60008214612e0a578080612df390614e83565b915050600a82612e039190614c5c565b9150612de0565b60008167ffffffffffffffff811115612e2657612e25614ff2565b5b6040519080825280601f01601f191660200182016040528015612e585781602001600182028036833780820191505090505b5090505b60008514612ee557600182612e719190614ce7565b9150600a85612e809190614ed6565b6030612e8c9190614c06565b60f81b818381518110612ea257612ea1614fc3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ede9190614c5c565b9450612e5c565b8093505050505b919050565b6000612f6a7f9611493255b815b777536772d2108838eb77c2771aa3ce571a4d00adef2a7a08836000016020810190612f2a9190613aab565b846020016020810190612f3d9190613d6d565b604051602001612f4f9392919061450d565b60405160208183030381529060405280519060200120613152565b9050919050565b6000806000612f80858561316c565b91509150612f8d816131ef565b819250505092915050565b612fb28282604051806020016040528060008152506133c4565b5050565b505050565b6000612fdc8473ffffffffffffffffffffffffffffffffffffffff1661341f565b15613145578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613005612579565b8786866040518563ffffffff1660e01b815260040161302794939291906144a6565b602060405180830381600087803b15801561304157600080fd5b505af192505050801561307257506040513d601f19601f8201168201806040525081019061306f9190613c9b565b60015b6130f5573d80600081146130a2576040519150601f19603f3d011682016040523d82523d6000602084013e6130a7565b606091505b506000815114156130ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e49061469e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061314a565b600190505b949350505050565b600061316561315f613432565b836134f5565b9050919050565b6000806041835114156131ae5760008060006020860151925060408601519150606086015160001a90506131a287828585613528565b945094505050506131e8565b6040835114156131df5760008060208501519150604085015190506131d4868383613635565b9350935050506131e8565b60006002915091505b9250929050565b6000600481111561320357613202614f65565b5b81600481111561321657613215614f65565b5b1415613221576133c1565b6001600481111561323557613234614f65565b5b81600481111561324857613247614f65565b5b1415613289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613280906145fe565b60405180910390fd5b6002600481111561329d5761329c614f65565b5b8160048111156132b0576132af614f65565b5b14156132f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e89061465e565b60405180910390fd5b6003600481111561330557613304614f65565b5b81600481111561331857613317614f65565b5b1415613359576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133509061477e565b60405180910390fd5b60048081111561336c5761336b614f65565b5b81600481111561337f5761337e614f65565b5b14156133c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b79061489e565b60405180910390fd5b5b50565b6133ce8383613683565b6133db6000848484612fbb565b61341a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134119061469e565b60405180910390fd5b505050565b600080823b905060008111915050919050565b60007f0000000000000000000000000000000000000000000000000000000000000001461415613484577fc9dde547d33b26e9e7398fa55398fa2e07b471a7ac6cc062531cb671307fdc7790506134f2565b6134ef7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fb43420f3e6872eb7587426bc54b6c75700f52f940b28235dc14136de5dda33c67fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613851565b90505b90565b6000828260405160200161350a929190614454565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561356357600060039150915061362c565b601b8560ff161415801561357b5750601c8560ff1614155b1561358d57600060049150915061362c565b6000600187878787604051600081526020016040526040516135b29493929190614597565b6020604051602081039080840390855afa1580156135d4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156136235760006001925092505061362c565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061367587828885613528565b935093505050935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ea906148be565b60405180910390fd5b6136fc81612617565b1561373c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613733906146de565b60405180910390fd5b61374860008383612fb6565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137989190614c06565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000838383463060405160200161386c959493929190614544565b6040516020818303038152906040528051906020012090509392505050565b82805461389790614e20565b90600052602060002090601f0160209004810192826138b95760008555613900565b82601f106138d257805160ff1916838001178555613900565b82800160010185558215613900579182015b828111156138ff5782518255916020019190600101906138e4565b5b50905061390d9190613911565b5090565b5b8082111561392a576000816000905550600101613912565b5090565b600061394161393c84614b61565b614b3c565b90508281526020810184848401111561395d5761395c61503a565b5b613968848285614db4565b509392505050565b600061398361397e84614b92565b614b3c565b90508281526020810184848401111561399f5761399e61503a565b5b6139aa848285614db4565b509392505050565b6000813590506139c1816159b7565b92915050565b6000813590506139d6816159ce565b92915050565b6000813590506139eb816159e5565b92915050565b600081519050613a00816159e5565b92915050565b600082601f830112613a1b57613a1a615021565b5b8135613a2b84826020860161392e565b91505092915050565b600082601f830112613a4957613a48615021565b5b8135613a59848260208601613970565b91505092915050565b600060608284031215613a7857613a7761502b565b5b81905092915050565b600081359050613a90816159fc565b92915050565b600081359050613aa581615a13565b92915050565b600060208284031215613ac157613ac0615044565b5b6000613acf848285016139b2565b91505092915050565b60008060408385031215613aef57613aee615044565b5b6000613afd858286016139b2565b9250506020613b0e858286016139b2565b9150509250929050565b600080600060608486031215613b3157613b30615044565b5b6000613b3f868287016139b2565b9350506020613b50868287016139b2565b9250506040613b6186828701613a96565b9150509250925092565b60008060008060808587031215613b8557613b84615044565b5b6000613b93878288016139b2565b9450506020613ba4878288016139b2565b9350506040613bb587828801613a96565b925050606085013567ffffffffffffffff811115613bd657613bd561503f565b5b613be287828801613a06565b91505092959194509250565b60008060408385031215613c0557613c04615044565b5b6000613c13858286016139b2565b9250506020613c24858286016139c7565b9150509250929050565b60008060408385031215613c4557613c44615044565b5b6000613c53858286016139b2565b9250506020613c6485828601613a96565b9150509250929050565b600060208284031215613c8457613c83615044565b5b6000613c92848285016139dc565b91505092915050565b600060208284031215613cb157613cb0615044565b5b6000613cbf848285016139f1565b91505092915050565b600060208284031215613cde57613cdd615044565b5b600082013567ffffffffffffffff811115613cfc57613cfb61503f565b5b613d0884828501613a34565b91505092915050565b60008060408385031215613d2857613d27615044565b5b600083013567ffffffffffffffff811115613d4657613d4561503f565b5b613d5285828601613a62565b9250506020613d6385828601613a96565b9150509250929050565b600060208284031215613d8357613d82615044565b5b6000613d9184828501613a81565b91505092915050565b600060208284031215613db057613daf615044565b5b6000613dbe84828501613a96565b91505092915050565b613dd081614d1b565b82525050565b613ddf81614d2d565b82525050565b613dee81614d39565b82525050565b613e05613e0082614d39565b614ecc565b82525050565b6000613e1682614bc3565b613e208185614bd9565b9350613e30818560208601614dc3565b613e3981615049565b840191505092915050565b6000613e4f82614bce565b613e598185614bea565b9350613e69818560208601614dc3565b613e7281615049565b840191505092915050565b6000613e8882614bce565b613e928185614bfb565b9350613ea2818560208601614dc3565b80840191505092915050565b6000613ebb601883614bea565b9150613ec68261505a565b602082019050919050565b6000613ede603183614bea565b9150613ee982615083565b604082019050919050565b6000613f01601483614bea565b9150613f0c826150d2565b602082019050919050565b6000613f24601f83614bea565b9150613f2f826150fb565b602082019050919050565b6000613f47600f83614bea565b9150613f5282615124565b602082019050919050565b6000613f6a603283614bea565b9150613f758261514d565b604082019050919050565b6000613f8d602683614bea565b9150613f988261519c565b604082019050919050565b6000613fb0601c83614bea565b9150613fbb826151eb565b602082019050919050565b6000613fd3600283614bfb565b9150613fde82615214565b600282019050919050565b6000613ff6601c83614bea565b91506140018261523d565b602082019050919050565b6000614019602483614bea565b915061402482615266565b604082019050919050565b600061403c601983614bea565b9150614047826152b5565b602082019050919050565b600061405f601283614bea565b915061406a826152de565b602082019050919050565b6000614082602283614bea565b915061408d82615307565b604082019050919050565b60006140a5602c83614bea565b91506140b082615356565b604082019050919050565b60006140c8601283614bea565b91506140d3826153a5565b602082019050919050565b60006140eb601d83614bea565b91506140f6826153ce565b602082019050919050565b600061410e601083614bea565b9150614119826153f7565b602082019050919050565b6000614131603883614bea565b915061413c82615420565b604082019050919050565b6000614154602a83614bea565b915061415f8261546f565b604082019050919050565b6000614177602983614bea565b9150614182826154be565b604082019050919050565b600061419a602883614bea565b91506141a58261550d565b604082019050919050565b60006141bd602283614bea565b91506141c88261555c565b604082019050919050565b60006141e0602083614bea565b91506141eb826155ab565b602082019050919050565b6000614203602c83614bea565b915061420e826155d4565b604082019050919050565b6000614226601683614bea565b915061423182615623565b602082019050919050565b6000614249602083614bea565b91506142548261564c565b602082019050919050565b600061426c602983614bea565b915061427782615675565b604082019050919050565b600061428f602f83614bea565b915061429a826156c4565b604082019050919050565b60006142b2602583614bea565b91506142bd82615713565b604082019050919050565b60006142d5602183614bea565b91506142e082615762565b604082019050919050565b60006142f8602783614bea565b9150614303826157b1565b604082019050919050565b600061431b602083614bea565b915061432682615800565b602082019050919050565b600061433e603183614bea565b915061434982615829565b604082019050919050565b6000614361601b83614bea565b915061436c82615878565b602082019050919050565b6000614384603083614bea565b915061438f826158a1565b604082019050919050565b60006143a7601783614bea565b91506143b2826158f0565b602082019050919050565b60006143ca602183614bea565b91506143d582615919565b604082019050919050565b60006143ed603083614bea565b91506143f882615968565b604082019050919050565b61440c81614d6f565b82525050565b61441b81614d9d565b82525050565b61442a81614da7565b82525050565b600061443c8285613e7d565b91506144488284613e7d565b91508190509392505050565b600061445f82613fc6565b915061446b8285613df4565b60208201915061447b8284613df4565b6020820191508190509392505050565b60006020820190506144a06000830184613dc7565b92915050565b60006080820190506144bb6000830187613dc7565b6144c86020830186613dc7565b6144d56040830185614412565b81810360608301526144e78184613e0b565b905095945050505050565b60006020820190506145076000830184613dd6565b92915050565b60006060820190506145226000830186613de5565b61452f6020830185613dc7565b61453c6040830184614403565b949350505050565b600060a0820190506145596000830188613de5565b6145666020830187613de5565b6145736040830186613de5565b6145806060830185614412565b61458d6080830184613dc7565b9695505050505050565b60006080820190506145ac6000830187613de5565b6145b96020830186614421565b6145c66040830185613de5565b6145d36060830184613de5565b95945050505050565b600060208201905081810360008301526145f68184613e44565b905092915050565b6000602082019050818103600083015261461781613eae565b9050919050565b6000602082019050818103600083015261463781613ed1565b9050919050565b6000602082019050818103600083015261465781613ef4565b9050919050565b6000602082019050818103600083015261467781613f17565b9050919050565b6000602082019050818103600083015261469781613f3a565b9050919050565b600060208201905081810360008301526146b781613f5d565b9050919050565b600060208201905081810360008301526146d781613f80565b9050919050565b600060208201905081810360008301526146f781613fa3565b9050919050565b6000602082019050818103600083015261471781613fe9565b9050919050565b600060208201905081810360008301526147378161400c565b9050919050565b600060208201905081810360008301526147578161402f565b9050919050565b6000602082019050818103600083015261477781614052565b9050919050565b6000602082019050818103600083015261479781614075565b9050919050565b600060208201905081810360008301526147b781614098565b9050919050565b600060208201905081810360008301526147d7816140bb565b9050919050565b600060208201905081810360008301526147f7816140de565b9050919050565b6000602082019050818103600083015261481781614101565b9050919050565b6000602082019050818103600083015261483781614124565b9050919050565b6000602082019050818103600083015261485781614147565b9050919050565b600060208201905081810360008301526148778161416a565b9050919050565b600060208201905081810360008301526148978161418d565b9050919050565b600060208201905081810360008301526148b7816141b0565b9050919050565b600060208201905081810360008301526148d7816141d3565b9050919050565b600060208201905081810360008301526148f7816141f6565b9050919050565b6000602082019050818103600083015261491781614219565b9050919050565b600060208201905081810360008301526149378161423c565b9050919050565b600060208201905081810360008301526149578161425f565b9050919050565b6000602082019050818103600083015261497781614282565b9050919050565b60006020820190508181036000830152614997816142a5565b9050919050565b600060208201905081810360008301526149b7816142c8565b9050919050565b600060208201905081810360008301526149d7816142eb565b9050919050565b600060208201905081810360008301526149f78161430e565b9050919050565b60006020820190508181036000830152614a1781614331565b9050919050565b60006020820190508181036000830152614a3781614354565b9050919050565b60006020820190508181036000830152614a5781614377565b9050919050565b60006020820190508181036000830152614a778161439a565b9050919050565b60006020820190508181036000830152614a97816143bd565b9050919050565b60006020820190508181036000830152614ab7816143e0565b9050919050565b6000602082019050614ad36000830184614412565b92915050565b60008083356001602003843603038112614af657614af5615030565b5b80840192508235915067ffffffffffffffff821115614b1857614b17615026565b5b602083019250600182023603831315614b3457614b33615035565b5b509250929050565b6000614b46614b57565b9050614b528282614e52565b919050565b6000604051905090565b600067ffffffffffffffff821115614b7c57614b7b614ff2565b5b614b8582615049565b9050602081019050919050565b600067ffffffffffffffff821115614bad57614bac614ff2565b5b614bb682615049565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c1182614d9d565b9150614c1c83614d9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c5157614c50614f07565b5b828201905092915050565b6000614c6782614d9d565b9150614c7283614d9d565b925082614c8257614c81614f36565b5b828204905092915050565b6000614c9882614d9d565b9150614ca383614d9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cdc57614cdb614f07565b5b828202905092915050565b6000614cf282614d9d565b9150614cfd83614d9d565b925082821015614d1057614d0f614f07565b5b828203905092915050565b6000614d2682614d7d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614de1578082015181840152602081019050614dc6565b83811115614df0576000848401525b50505050565b6000614e0182614d9d565b91506000821415614e1557614e14614f07565b5b600182039050919050565b60006002820490506001821680614e3857607f821691505b60208210811415614e4c57614e4b614f94565b5b50919050565b614e5b82615049565b810181811067ffffffffffffffff82111715614e7a57614e79614ff2565b5b80604052505050565b6000614e8e82614d9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ec157614ec0614f07565b5b600182019050919050565b6000819050919050565b6000614ee182614d9d565b9150614eec83614d9d565b925082614efc57614efb614f36565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f616d6f756e7420776f756c64206578636565642074686520737570706c79206f60008201527f66207265736572766520746f6b656e7321000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f57726f6e67207369676e61747572650000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4261736555524920686173206e6f74206265656e207365742079657400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820636f756e74206660008201527f6f72206f776e6572000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742061637469766500000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d617820746f74616c207360008201527f7570706c79000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f616c726561647920636c61696d656420616c6c2074686520726573657276652060008201527f746f6b656e732100000000000000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820626c6f636b206d75737420626520736574600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f43616e6e6f74206d696e7420746f206e756c6c20616464726573730000000000600082015250565b7f566f756368657220726563696576657220616e64206d73672e73656e6465722060008201527f617265206e6f74207468652073616d6500000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732073656e74000000000000000000600082015250565b7f6d696e74696e672068617320616c7265616479206265656e2073746f7070656460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720776f756c6420657863656564206d61782070726573616c6560008201527f20636f756e7420666f72206f776e657200000000000000000000000000000000602082015250565b6159c081614d1b565b81146159cb57600080fd5b50565b6159d781614d2d565b81146159e257600080fd5b50565b6159ee81614d43565b81146159f957600080fd5b50565b615a0581614d6f565b8114615a1057600080fd5b50565b615a1c81614d9d565b8114615a2757600080fd5b5056fea2646970667358221220d2bd9c0d6cb15fa1f06929ea2b4f3b5f3fccf1590e4b597d1757d3c72630c52d64736f6c63430008070033

Deployed Bytecode Sourcemap

50352:8313:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55882:73;;;;;;;;;;;;;:::i;:::-;;19771:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20716:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22606:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22129:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56367:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52821:952;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50462:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23496:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51675:1136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55639:235;;;;;;;;;;;;;:::i;:::-;;23906:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55997:298;;;;;;;;;;;;;:::i;:::-;;58234:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53910:163;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35402:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50604:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50549:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20410:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57829:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21640:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20140:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33790:94;;;;;;;;;;;;;:::i;:::-;;50423:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58470:192;;;;;;;;;;;;;:::i;:::-;;50887:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56500:1321;;;;;;;;;;;;;:::i;:::-;;33139:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50047:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20885:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22899:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24162:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51053:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21060:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51018:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50978:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23265:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54890:656;;;;;;;;;;;;;:::i;:::-;;34039:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50937:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55882:73;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55933:14:::1;:12;:14::i;:::-;55882:73::o:0;19771:305::-;19873:4;19925:25;19910:40;;;:11;:40;;;;:105;;;;19982:33;19967:48;;;:11;:48;;;;19910:105;:158;;;;20032:36;20056:11;20032:23;:36::i;:::-;19910:158;19890:178;;19771:305;;;:::o;20716:100::-;20770:13;20803:5;20796:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20716:100;:::o;22606:221::-;22682:7;22710:16;22718:7;22710;:16::i;:::-;22702:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22795:15;:24;22811:7;22795:24;;;;;;;;;;;;;;;;;;;;;22788:31;;22606:221;;;:::o;22129:411::-;22210:13;22226:23;22241:7;22226:14;:23::i;:::-;22210:39;;22274:5;22268:11;;:2;:11;;;;22260:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22368:5;22352:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22377:37;22394:5;22401:12;:10;:12::i;:::-;22377:16;:37::i;:::-;22352:62;22330:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22511:21;22520:2;22524:7;22511:8;:21::i;:::-;22199:341;22129:411;;:::o;56367:125::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56470:14:::1;56452:15;:32;;;;;;;;;;;;:::i;:::-;;56367:125:::0;:::o;52821:952::-;50181:11;:9;:11::i;:::-;50173:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;35728:8:::1;:6;:8::i;:::-;35727:9;35719:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;53002:22:::2;;52990:9;;:34;;;;:::i;:::-;52976:10;52962:11;;:24;;;;:::i;:::-;:62;;52940:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;53118:16;53126:7;53118;:16::i;:::-;53108:26;;:6;;;;;;;;;;;:26;;;53100:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53187:7;:16;;;;;;;;;;:::i;:::-;53173:30;;:10;:30;;;53165:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;53327:7;:16;;;;;;;;;;:::i;:::-;53289:54;;53313:10;53289:21;53299:10;53289:9;:21::i;:::-;:34;;;;:::i;:::-;:54;;53267:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;53490:21;;53476:10;53452:21;53462:10;53452:9;:21::i;:::-;:34;;;;:::i;:::-;:59;;53430:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;53627:10;53611:13;;:26;;;;:::i;:::-;53598:9;:39;;53590:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;53683:9;53678:88;53702:10;53698:1;:14;53678:88;;;53734:20;53743:10;53734:8;:20::i;:::-;53714:3;;;;;:::i;:::-;;;;53678:88;;;;52821:952:::0;;:::o;50462:30::-;;;;:::o;23496:339::-;23691:41;23710:12;:10;:12::i;:::-;23724:7;23691:18;:41::i;:::-;23683:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23799:28;23809:4;23815:2;23819:7;23799:9;:28::i;:::-;23496:339;;;:::o;51675:1136::-;35728:8;:6;:8::i;:::-;35727:9;35719:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50287:11:::1;:9;:11::i;:::-;50286:12;50278:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;51841:1:::2;51819:24;;:10;:24;;;;51811:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51948:22;;51936:9;;:34;;;;:::i;:::-;51922:10;51908:11;;:24;;;;:::i;:::-;:62;;51886:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;52106:21;;52092:10;52068:21;52078:10;52068:9;:21::i;:::-;:34;;;;:::i;:::-;:59;;52046:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;52242:10;52227:12;;:25;;;;:::i;:::-;52214:9;:38;;52206:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;52298:9;52293:88;52317:10;52313:1;:14;52293:88;;;52349:20;52358:10;52349:8;:20::i;:::-;52329:3;;;;;:::i;:::-;;;;52293:88;;;;52615:1;52593:18;;:23;:51;;;;;52635:9;;52620:11;;:24;52593:51;52589:117;;;52682:12;52661:18;:33;;;;52589:117;52738:9;;52723:11;;:24;52719:85;;;52788:4;52764:21;;:28;;;;;;;;;;;;;;;;;;52719:85;51675:1136:::0;:::o;55639:235::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55722:4:::1;55697:29;;:21;;;;;;;;;;;:29;;;;55689:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55779:8;:6;:8::i;:::-;55775:92;;;55804:10;:8;:10::i;:::-;55775:92;;;55847:8;:6;:8::i;:::-;55775:92;55639:235::o:0;23906:185::-;24044:39;24061:4;24067:2;24071:7;24044:39;;;;;;;;;;;;:16;:39::i;:::-;23906:185;;;:::o;55997:298::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56088:4:::1;56063:29;;:21;;;;;;;;;;;:29;;;;56055:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56141:8;:6;:8::i;:::-;56184:4;56160:21;;:28;;;;;;;;;;;;;;;;;;56225:1;56203:18;;:23;56199:89;;;56264:12;56243:18;:33;;;;56199:89;55997:298::o:0;58234:99::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58305:20:::1;58317:7;58305:11;:20::i;:::-;58234:99:::0;:::o;53910:163::-;53955:7;53975:10;54026:9;54020:15;;54063:2;54056:9;;;53910:163;:::o;35402:86::-;35449:4;35473:7;;;;;;;;;;;35466:14;;35402:86;:::o;50604:47::-;;;;:::o;50549:48::-;;;;:::o;20410:239::-;20482:7;20502:13;20518:7;:16;20526:7;20518:16;;;;;;;;;;;;;;;;;;;;;20502:32;;20570:1;20553:19;;:5;:19;;;;20545:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20636:5;20629:12;;;20410:239;;;:::o;57829:397::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57939:1:::1;57914:22;;:26;57906:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58038:1;58028:6;58003:22;;:31;;;;:::i;:::-;:36;;57995:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;58109:9;58104:115;58128:6;58124:1;:10;58104:115;;;58156:12;58165:2;58156:8;:12::i;:::-;58183:22;;:24;;;;;;;;;:::i;:::-;;;;;;58136:3;;;;;:::i;:::-;;;;58104:115;;;;57829:397:::0;;:::o;21640:97::-;21688:13;21721:8;21714:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21640:97;:::o;20140:208::-;20212:7;20257:1;20240:19;;:5;:19;;;;20232:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20324:9;:16;20334:5;20324:16;;;;;;;;;;;;;;;;20317:23;;20140:208;;;:::o;33790:94::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33855:21:::1;33873:1;33855:9;:21::i;:::-;33790:94::o:0;50423:32::-;;;;:::o;58470:192::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58565:1:::1;58548:13;;:18;58540:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58642:12;58621:18;:33;;;;58470:192::o:0;50887:43::-;;;;:::o;56500:1321::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56553:15:::1;56571:21;56553:39;;56621:1;56611:7;:11;56603:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;56656:22;56691:3;56689:1;56681:7;:9;;;;:::i;:::-;:13;;;;:::i;:::-;56656:38;;56705:29;56752:1;56737:14;:16;;;;:::i;:::-;56705:48;;56764:24;56802:3;56799:2;56791:7;:10;;;;:::i;:::-;:14;;;;:::i;:::-;56764:41;;56816:21;56862:1;56840:21;:23;;;;:::i;:::-;56816:47;;56874:21;56920:1;56898:21;:23;;;;:::i;:::-;56874:47;;56932:19;56965:3;56962:2;56954:7;:10;;;;:::i;:::-;:14;;;;:::i;:::-;56932:36;;56987:42;56979:60;;:76;57040:14;56979:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57112:42;57104:60;;:83;57165:21;57104:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57227:42;57219:60;;:78;57280:16;57219:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57335:42;57327:60;;:78;57388:16;57327:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57434:42;57426:60;;:75;57487:13;57426:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57533:42;57525:60;;:75;57586:13;57525:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57632:42;57624:60;;:73;57685:11;57624:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57727:42;57719:60;;:83;57780:21;57719:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56542:1279;;;;;;;56500:1321::o:0;33139:87::-;33185:7;33212:6;;;;;;;;;;;33205:13;;33139:87;:::o;50047:84::-;50089:4;50113:10;;;;;;;;;;;50106:17;;50047:84;:::o;20885:104::-;20941:13;20974:7;20967:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20885:104;:::o;22899:295::-;23014:12;:10;:12::i;:::-;23002:24;;:8;:24;;;;22994:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23114:8;23069:18;:32;23088:12;:10;:12::i;:::-;23069:32;;;;;;;;;;;;;;;:42;23102:8;23069:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23167:8;23138:48;;23153:12;:10;:12::i;:::-;23138:48;;;23177:8;23138:48;;;;;;:::i;:::-;;;;;;;;22899:295;;:::o;24162:328::-;24337:41;24356:12;:10;:12::i;:::-;24370:7;24337:18;:41::i;:::-;24329:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24443:39;24457:4;24463:2;24467:7;24476:5;24443:13;:39::i;:::-;24162:328;;;;:::o;51053:41::-;;;;;;;;;;;;;:::o;21060:341::-;21134:13;21195:1;21174:9;:7;:9::i;:::-;21168:23;:28;;21160:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;21248:17;21256:8;21248:7;:17::i;:::-;21240:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;21361:9;:7;:9::i;:::-;21372:19;:8;:17;:19::i;:::-;21344:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21330:63;;21060:341;;;:::o;51018:28::-;;;;:::o;50978:33::-;;;;:::o;23265:164::-;23362:4;23386:18;:25;23405:5;23386:25;;;;;;;;;;;;;;;:35;23412:8;23386:35;;;;;;;;;;;;;;;;;;;;;;;;;23379:42;;23265:164;;;;:::o;54890:656::-;54961:1;54944:13;;:18;54936:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;55037:1;55015:18;;:23;;55007:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55150:9;;55127:18;;55117:29;55112:35;;:47;;;;:::i;:::-;55096:13;:63;;;;55333:3;55311:18;;55295:12;:35;;;;:::i;:::-;:41;55291:135;;;55405:9;;55399:1;55384:12;:16;;;;:::i;:::-;55374:27;55369:33;;:45;;;;:::i;:::-;55353:13;:61;;;;55291:135;55494:1;55477:13;;:18;55473:66;;;55512:13;;:15;;;;;;;;;:::i;:::-;;;;;;55473:66;54890:656::o;34039:192::-;33370:12;:10;:12::i;:::-;33359:23;;:7;:5;:7::i;:::-;:23;;;33351:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34148:1:::1;34128:22;;:8;:22;;;;34120:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34204:19;34214:8;34204:9;:19::i;:::-;34039:192:::0;:::o;50937:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15335:98::-;15388:7;15415:10;15408:17;;15335:98;:::o;49963:76::-;50021:10;;;;;;;;;;;50020:11;50007:10;;:24;;;;;;;;;;;;;;;;;;49963:76::o;18232:157::-;18317:4;18356:25;18341:40;;;:11;:40;;;;18334:47;;18232:157;;;:::o;26000:127::-;26065:4;26117:1;26089:30;;:7;:16;26097:7;26089:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26082:37;;26000:127;;;:::o;29982:174::-;30084:2;30057:15;:24;30073:7;30057:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30140:7;30136:2;30102:46;;30111:23;30126:7;30111:14;:23::i;:::-;30102:46;;;;;;;;;;;;29982:174;;:::o;54081:218::-;54177:7;54202:14;54219;54225:7;54219:5;:14::i;:::-;54202:31;;54251:40;54265:6;54273:7;:17;;;;;;;;:::i;:::-;54251:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:40::i;:::-;54244:47;;;54081:218;;;:::o;53781:121::-;53837:33;53847:9;53858:11;;53837:9;:33::i;:::-;53881:11;;:13;;;;;;;;;:::i;:::-;;;;;;53781:121;:::o;26294:348::-;26387:4;26412:16;26420:7;26412;:16::i;:::-;26404:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26488:13;26504:23;26519:7;26504:14;:23::i;:::-;26488:39;;26557:5;26546:16;;:7;:16;;;:51;;;;26590:7;26566:31;;:20;26578:7;26566:11;:20::i;:::-;:31;;;26546:51;:87;;;;26601:32;26618:5;26625:7;26601:16;:32::i;:::-;26546:87;26538:96;;;26294:348;;;;:::o;29286:578::-;29445:4;29418:31;;:23;29433:7;29418:14;:23::i;:::-;:31;;;29410:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29528:1;29514:16;;:2;:16;;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29584:39;29605:4;29611:2;29615:7;29584:20;:39::i;:::-;29688:29;29705:1;29709:7;29688:8;:29::i;:::-;29749:1;29730:9;:15;29740:4;29730:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29778:1;29761:9;:13;29771:2;29761:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29809:2;29790:7;:16;29798:7;29790:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29848:7;29844:2;29829:27;;29838:4;29829:27;;;;;;;;;;;;29286:578;;;:::o;36461:120::-;36005:8;:6;:8::i;:::-;35997:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;36530:5:::1;36520:7;;:15;;;;;;;;;;;;;;;;;;36551:22;36560:12;:10;:12::i;:::-;36551:22;;;;;;:::i;:::-;;;;;;;;36461:120::o:0;36202:118::-;35728:8;:6;:8::i;:::-;35727:9;35719:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36272:4:::1;36262:7;;:14;;;;;;;;;;;;;;;;;;36292:20;36299:12;:10;:12::i;:::-;36292:20;;;;;;:::i;:::-;;;;;;;;36202:118::o:0;21967:100::-;22051:8;22040;:19;;;;;;;;;;;;:::i;:::-;;21967:100;:::o;34239:173::-;34295:16;34314:6;;;;;;;;;;;34295:25;;34340:8;34331:6;;:17;;;;;;;;;;;;;;;;;;34395:8;34364:40;;34385:8;34364:40;;;;;;;;;;;;34284:128;34239:173;:::o;25372:315::-;25529:28;25539:4;25545:2;25549:7;25529:9;:28::i;:::-;25576:48;25599:4;25605:2;25609:7;25618:5;25576:22;:48::i;:::-;25568:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25372:315;;;;:::o;15775:723::-;15831:13;16061:1;16052:5;:10;16048:53;;;16079:10;;;;;;;;;;;;;;;;;;;;;16048:53;16111:12;16126:5;16111:20;;16142:14;16167:78;16182:1;16174:4;:9;16167:78;;16200:8;;;;;:::i;:::-;;;;16231:2;16223:10;;;;;:::i;:::-;;;16167:78;;;16255:19;16287:6;16277:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16255:39;;16305:154;16321:1;16312:5;:10;16305:154;;16349:1;16339:11;;;;;:::i;:::-;;;16416:2;16408:5;:10;;;;:::i;:::-;16395:2;:24;;;;:::i;:::-;16382:39;;16365:6;16372;16365:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16445:2;16436:11;;;;;:::i;:::-;;;16305:154;;;16483:6;16469:21;;;;;15775:723;;;;:::o;54307:507::-;54401:7;54446:360;54550:113;54690:7;:16;;;;;;;;;;:::i;:::-;54733:7;:16;;;;;;;;;;:::i;:::-;54513:259;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54481:310;;;;;;54446:16;:360::i;:::-;54426:380;;54307:507;;;:::o;40827:231::-;40905:7;40926:17;40945:18;40967:27;40978:4;40984:9;40967:10;:27::i;:::-;40925:69;;;;41005:18;41017:5;41005:11;:18::i;:::-;41041:9;41034:16;;;;40827:231;;;;:::o;26984:110::-;27060:26;27070:2;27074:7;27060:26;;;;;;;;;;;;:9;:26::i;:::-;26984:110;;:::o;32096:126::-;;;;:::o;30721:803::-;30876:4;30897:15;:2;:13;;;:15::i;:::-;30893:624;;;30949:2;30933:36;;;30970:12;:10;:12::i;:::-;30984:4;30990:7;30999:5;30933:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30929:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31196:1;31179:6;:13;:18;31175:272;;;31222:60;;;;;;;;;;:::i;:::-;;;;;;;;31175:272;31397:6;31391:13;31382:6;31378:2;31374:15;31367:38;30929:533;31066:45;;;31056:55;;;:6;:55;;;;31049:62;;;;;30893:624;31501:4;31494:11;;30721:803;;;;;;;:::o;49661:167::-;49738:7;49765:55;49787:20;:18;:20::i;:::-;49809:10;49765:21;:55::i;:::-;49758:62;;49661:167;;;:::o;38717:1308::-;38798:7;38807:12;39052:2;39032:9;:16;:22;39028:990;;;39071:9;39095;39119:7;39328:4;39317:9;39313:20;39307:27;39302:32;;39378:4;39367:9;39363:20;39357:27;39352:32;;39436:4;39425:9;39421:20;39415:27;39412:1;39407:36;39402:41;;39479:25;39490:4;39496:1;39499;39502;39479:10;:25::i;:::-;39472:32;;;;;;;;;39028:990;39546:2;39526:9;:16;:22;39522:496;;;39565:9;39589:10;39801:4;39790:9;39786:20;39780:27;39775:32;;39852:4;39841:9;39837:20;39831:27;39825:33;;39894:23;39905:4;39911:1;39914:2;39894:10;:23::i;:::-;39887:30;;;;;;;;39522:496;39966:1;39970:35;39950:56;;;;38717:1308;;;;;;:::o;36988:643::-;37066:20;37057:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;37053:571;;;37103:7;;37053:571;37164:29;37155:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;37151:473;;;37210:34;;;;;;;;;;:::i;:::-;;;;;;;;37151:473;37275:35;37266:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;37262:362;;;37327:41;;;;;;;;;;:::i;:::-;;;;;;;;37262:362;37399:30;37390:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;37386:238;;;37446:44;;;;;;;;;;:::i;:::-;;;;;;;;37386:238;37521:30;37512:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;37508:116;;;37568:44;;;;;;;;;;:::i;:::-;;;;;;;;37508:116;36988:643;;:::o;27321:321::-;27451:18;27457:2;27461:7;27451:5;:18::i;:::-;27502:54;27533:1;27537:2;27541:7;27550:5;27502:22;:54::i;:::-;27480:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27321:321;;;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;48467:281::-;48520:7;48561:16;48544:13;:33;48540:201;;;48601:24;48594:31;;;;48540:201;48665:64;48687:10;48699:12;48713:15;48665:21;:64::i;:::-;48658:71;;48467:281;;:::o;45295:196::-;45388:7;45454:15;45471:10;45425:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45415:68;;;;;;45408:75;;45295:196;;;;:::o;42326:1632::-;42457:7;42466:12;43391:66;43386:1;43378:10;;:79;43374:163;;;43490:1;43494:30;43474:51;;;;;;43374:163;43556:2;43551:1;:7;;;;:18;;;;;43567:2;43562:1;:7;;;;43551:18;43547:102;;;43602:1;43606:30;43586:51;;;;;;43547:102;43746:14;43763:24;43773:4;43779:1;43782;43785;43763:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43746:41;;43820:1;43802:20;;:6;:20;;;43798:103;;;43855:1;43859:29;43839:50;;;;;;;43798:103;43921:6;43929:20;43913:37;;;;;42326:1632;;;;;;;;:::o;41321:391::-;41435:7;41444:12;41469:9;41489:7;41544:66;41540:2;41536:75;41531:80;;41648:2;41643;41638:3;41634:12;41630:21;41625:26;;41679:25;41690:4;41696:1;41699;41702;41679:10;:25::i;:::-;41672:32;;;;;;41321:391;;;;;;:::o;27978:382::-;28072:1;28058:16;;:2;:16;;;;28050:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28131:16;28139:7;28131;:16::i;:::-;28130:17;28122:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28193:45;28222:1;28226:2;28230:7;28193:20;:45::i;:::-;28268:1;28251:9;:13;28261:2;28251:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28299:2;28280:7;:16;28288:7;28280:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28344:7;28340:2;28319:33;;28336:1;28319:33;;;;;;;;;;;;27978:382;;:::o;48756:263::-;48900:7;48948:8;48958;48968:11;48981:13;49004:4;48937:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48927:84;;;;;;48920:91;;48756:263;;;;;:::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;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2162:234::-;2238:5;2279:2;2270:6;2265:3;2261:16;2257:25;2254:112;;;2285:79;;:::i;:::-;2254:112;2384:6;2375:15;;2162:234;;;;:::o;2402:137::-;2447:5;2485:6;2472:20;2463:29;;2501:32;2527:5;2501:32;:::i;:::-;2402:137;;;;:::o;2545:139::-;2591:5;2629:6;2616:20;2607:29;;2645:33;2672:5;2645:33;:::i;:::-;2545:139;;;;:::o;2690:329::-;2749:6;2798:2;2786:9;2777:7;2773:23;2769:32;2766:119;;;2804:79;;:::i;:::-;2766:119;2924:1;2949:53;2994:7;2985:6;2974:9;2970:22;2949:53;:::i;:::-;2939:63;;2895:117;2690:329;;;;:::o;3025:474::-;3093:6;3101;3150:2;3138:9;3129:7;3125:23;3121:32;3118:119;;;3156:79;;:::i;:::-;3118:119;3276:1;3301:53;3346:7;3337:6;3326:9;3322:22;3301:53;:::i;:::-;3291:63;;3247:117;3403:2;3429:53;3474:7;3465:6;3454:9;3450:22;3429:53;:::i;:::-;3419:63;;3374:118;3025:474;;;;;:::o;3505:619::-;3582:6;3590;3598;3647:2;3635:9;3626:7;3622:23;3618:32;3615:119;;;3653:79;;:::i;:::-;3615:119;3773:1;3798:53;3843:7;3834:6;3823:9;3819:22;3798:53;:::i;:::-;3788:63;;3744:117;3900:2;3926:53;3971:7;3962:6;3951:9;3947:22;3926:53;:::i;:::-;3916:63;;3871:118;4028:2;4054:53;4099:7;4090:6;4079:9;4075:22;4054:53;:::i;:::-;4044:63;;3999:118;3505:619;;;;;:::o;4130:943::-;4225:6;4233;4241;4249;4298:3;4286:9;4277:7;4273:23;4269:33;4266:120;;;4305:79;;:::i;:::-;4266:120;4425:1;4450:53;4495:7;4486:6;4475:9;4471:22;4450:53;:::i;:::-;4440:63;;4396:117;4552:2;4578:53;4623:7;4614:6;4603:9;4599:22;4578:53;:::i;:::-;4568:63;;4523:118;4680:2;4706:53;4751:7;4742:6;4731:9;4727:22;4706:53;:::i;:::-;4696:63;;4651:118;4836:2;4825:9;4821:18;4808:32;4867:18;4859:6;4856:30;4853:117;;;4889:79;;:::i;:::-;4853:117;4994:62;5048:7;5039:6;5028:9;5024:22;4994:62;:::i;:::-;4984:72;;4779:287;4130:943;;;;;;;:::o;5079:468::-;5144:6;5152;5201:2;5189:9;5180:7;5176:23;5172:32;5169:119;;;5207:79;;:::i;:::-;5169:119;5327:1;5352:53;5397:7;5388:6;5377:9;5373:22;5352:53;:::i;:::-;5342:63;;5298:117;5454:2;5480:50;5522:7;5513:6;5502:9;5498:22;5480:50;:::i;:::-;5470:60;;5425:115;5079:468;;;;;:::o;5553:474::-;5621:6;5629;5678:2;5666:9;5657:7;5653:23;5649:32;5646:119;;;5684:79;;:::i;:::-;5646:119;5804:1;5829:53;5874:7;5865:6;5854:9;5850:22;5829:53;:::i;:::-;5819:63;;5775:117;5931:2;5957:53;6002:7;5993:6;5982:9;5978:22;5957:53;:::i;:::-;5947:63;;5902:118;5553:474;;;;;:::o;6033:327::-;6091:6;6140:2;6128:9;6119:7;6115:23;6111:32;6108:119;;;6146:79;;:::i;:::-;6108:119;6266:1;6291:52;6335:7;6326:6;6315:9;6311:22;6291:52;:::i;:::-;6281:62;;6237:116;6033:327;;;;:::o;6366:349::-;6435:6;6484:2;6472:9;6463:7;6459:23;6455:32;6452:119;;;6490:79;;:::i;:::-;6452:119;6610:1;6635:63;6690:7;6681:6;6670:9;6666:22;6635:63;:::i;:::-;6625:73;;6581:127;6366:349;;;;:::o;6721:509::-;6790:6;6839:2;6827:9;6818:7;6814:23;6810:32;6807:119;;;6845:79;;:::i;:::-;6807:119;6993:1;6982:9;6978:17;6965:31;7023:18;7015:6;7012:30;7009:117;;;7045:79;;:::i;:::-;7009:117;7150:63;7205:7;7196:6;7185:9;7181:22;7150:63;:::i;:::-;7140:73;;6936:287;6721:509;;;;:::o;7236:694::-;7334:6;7342;7391:2;7379:9;7370:7;7366:23;7362:32;7359:119;;;7397:79;;:::i;:::-;7359:119;7545:1;7534:9;7530:17;7517:31;7575:18;7567:6;7564:30;7561:117;;;7597:79;;:::i;:::-;7561:117;7702:83;7777:7;7768:6;7757:9;7753:22;7702:83;:::i;:::-;7692:93;;7488:307;7834:2;7860:53;7905:7;7896:6;7885:9;7881:22;7860:53;:::i;:::-;7850:63;;7805:118;7236:694;;;;;:::o;7936:327::-;7994:6;8043:2;8031:9;8022:7;8018:23;8014:32;8011:119;;;8049:79;;:::i;:::-;8011:119;8169:1;8194:52;8238:7;8229:6;8218:9;8214:22;8194:52;:::i;:::-;8184:62;;8140:116;7936:327;;;;:::o;8269:329::-;8328:6;8377:2;8365:9;8356:7;8352:23;8348:32;8345:119;;;8383:79;;:::i;:::-;8345:119;8503:1;8528:53;8573:7;8564:6;8553:9;8549:22;8528:53;:::i;:::-;8518:63;;8474:117;8269:329;;;;:::o;8604:118::-;8691:24;8709:5;8691:24;:::i;:::-;8686:3;8679:37;8604:118;;:::o;8728:109::-;8809:21;8824:5;8809:21;:::i;:::-;8804:3;8797:34;8728:109;;:::o;8843:118::-;8930:24;8948:5;8930:24;:::i;:::-;8925:3;8918:37;8843:118;;:::o;8967:157::-;9072:45;9092:24;9110:5;9092:24;:::i;:::-;9072:45;:::i;:::-;9067:3;9060:58;8967:157;;:::o;9130:360::-;9216:3;9244:38;9276:5;9244:38;:::i;:::-;9298:70;9361:6;9356:3;9298:70;:::i;:::-;9291:77;;9377:52;9422:6;9417:3;9410:4;9403:5;9399:16;9377:52;:::i;:::-;9454:29;9476:6;9454:29;:::i;:::-;9449:3;9445:39;9438:46;;9220:270;9130:360;;;;:::o;9496:364::-;9584:3;9612:39;9645:5;9612:39;:::i;:::-;9667:71;9731:6;9726:3;9667:71;:::i;:::-;9660:78;;9747:52;9792:6;9787:3;9780:4;9773:5;9769:16;9747:52;:::i;:::-;9824:29;9846:6;9824:29;:::i;:::-;9819:3;9815:39;9808:46;;9588:272;9496:364;;;;:::o;9866:377::-;9972:3;10000:39;10033:5;10000:39;:::i;:::-;10055:89;10137:6;10132:3;10055:89;:::i;:::-;10048:96;;10153:52;10198:6;10193:3;10186:4;10179:5;10175:16;10153:52;:::i;:::-;10230:6;10225:3;10221:16;10214:23;;9976:267;9866:377;;;;:::o;10249:366::-;10391:3;10412:67;10476:2;10471:3;10412:67;:::i;:::-;10405:74;;10488:93;10577:3;10488:93;:::i;:::-;10606:2;10601:3;10597:12;10590:19;;10249:366;;;:::o;10621:::-;10763:3;10784:67;10848:2;10843:3;10784:67;:::i;:::-;10777:74;;10860:93;10949:3;10860:93;:::i;:::-;10978:2;10973:3;10969:12;10962:19;;10621:366;;;:::o;10993:::-;11135:3;11156:67;11220:2;11215:3;11156:67;:::i;:::-;11149:74;;11232:93;11321:3;11232:93;:::i;:::-;11350:2;11345:3;11341:12;11334:19;;10993:366;;;:::o;11365:::-;11507:3;11528:67;11592:2;11587:3;11528:67;:::i;:::-;11521:74;;11604:93;11693:3;11604:93;:::i;:::-;11722:2;11717:3;11713:12;11706:19;;11365:366;;;:::o;11737:::-;11879:3;11900:67;11964:2;11959:3;11900:67;:::i;:::-;11893:74;;11976:93;12065:3;11976:93;:::i;:::-;12094:2;12089:3;12085:12;12078:19;;11737:366;;;:::o;12109:::-;12251:3;12272:67;12336:2;12331:3;12272:67;:::i;:::-;12265:74;;12348:93;12437:3;12348:93;:::i;:::-;12466:2;12461:3;12457:12;12450:19;;12109:366;;;:::o;12481:::-;12623:3;12644:67;12708:2;12703:3;12644:67;:::i;:::-;12637:74;;12720:93;12809:3;12720:93;:::i;:::-;12838:2;12833:3;12829:12;12822:19;;12481:366;;;:::o;12853:::-;12995:3;13016:67;13080:2;13075:3;13016:67;:::i;:::-;13009:74;;13092:93;13181:3;13092:93;:::i;:::-;13210:2;13205:3;13201:12;13194:19;;12853:366;;;:::o;13225:400::-;13385:3;13406:84;13488:1;13483:3;13406:84;:::i;:::-;13399:91;;13499:93;13588:3;13499:93;:::i;:::-;13617:1;13612:3;13608:11;13601:18;;13225:400;;;:::o;13631:366::-;13773:3;13794:67;13858:2;13853:3;13794:67;:::i;:::-;13787:74;;13870:93;13959:3;13870:93;:::i;:::-;13988:2;13983:3;13979:12;13972:19;;13631:366;;;:::o;14003:::-;14145:3;14166:67;14230:2;14225:3;14166:67;:::i;:::-;14159:74;;14242:93;14331:3;14242:93;:::i;:::-;14360:2;14355:3;14351:12;14344:19;;14003:366;;;:::o;14375:::-;14517:3;14538:67;14602:2;14597:3;14538:67;:::i;:::-;14531:74;;14614:93;14703:3;14614:93;:::i;:::-;14732:2;14727:3;14723:12;14716:19;;14375:366;;;:::o;14747:::-;14889:3;14910:67;14974:2;14969:3;14910:67;:::i;:::-;14903:74;;14986:93;15075:3;14986:93;:::i;:::-;15104:2;15099:3;15095:12;15088:19;;14747:366;;;:::o;15119:::-;15261:3;15282:67;15346:2;15341:3;15282:67;:::i;:::-;15275:74;;15358:93;15447:3;15358:93;:::i;:::-;15476:2;15471:3;15467:12;15460:19;;15119:366;;;:::o;15491:::-;15633:3;15654:67;15718:2;15713:3;15654:67;:::i;:::-;15647:74;;15730:93;15819:3;15730:93;:::i;:::-;15848:2;15843:3;15839:12;15832:19;;15491:366;;;:::o;15863:::-;16005:3;16026:67;16090:2;16085:3;16026:67;:::i;:::-;16019:74;;16102:93;16191:3;16102:93;:::i;:::-;16220:2;16215:3;16211:12;16204:19;;15863:366;;;:::o;16235:::-;16377:3;16398:67;16462:2;16457:3;16398:67;:::i;:::-;16391:74;;16474:93;16563:3;16474:93;:::i;:::-;16592:2;16587:3;16583:12;16576:19;;16235:366;;;:::o;16607:::-;16749:3;16770:67;16834:2;16829:3;16770:67;:::i;:::-;16763:74;;16846:93;16935:3;16846:93;:::i;:::-;16964:2;16959:3;16955:12;16948:19;;16607:366;;;:::o;16979:::-;17121:3;17142:67;17206:2;17201:3;17142:67;:::i;:::-;17135:74;;17218:93;17307:3;17218:93;:::i;:::-;17336:2;17331:3;17327:12;17320:19;;16979:366;;;:::o;17351:::-;17493:3;17514:67;17578:2;17573:3;17514:67;:::i;:::-;17507:74;;17590:93;17679:3;17590:93;:::i;:::-;17708:2;17703:3;17699:12;17692:19;;17351:366;;;:::o;17723:::-;17865:3;17886:67;17950:2;17945:3;17886:67;:::i;:::-;17879:74;;17962:93;18051:3;17962:93;:::i;:::-;18080:2;18075:3;18071:12;18064:19;;17723:366;;;:::o;18095:::-;18237:3;18258:67;18322:2;18317:3;18258:67;:::i;:::-;18251:74;;18334:93;18423:3;18334:93;:::i;:::-;18452:2;18447:3;18443:12;18436:19;;18095:366;;;:::o;18467:::-;18609:3;18630:67;18694:2;18689:3;18630:67;:::i;:::-;18623:74;;18706:93;18795:3;18706:93;:::i;:::-;18824:2;18819:3;18815:12;18808:19;;18467:366;;;:::o;18839:::-;18981:3;19002:67;19066:2;19061:3;19002:67;:::i;:::-;18995:74;;19078:93;19167:3;19078:93;:::i;:::-;19196:2;19191:3;19187:12;19180:19;;18839:366;;;:::o;19211:::-;19353:3;19374:67;19438:2;19433:3;19374:67;:::i;:::-;19367:74;;19450:93;19539:3;19450:93;:::i;:::-;19568:2;19563:3;19559:12;19552:19;;19211:366;;;:::o;19583:::-;19725:3;19746:67;19810:2;19805:3;19746:67;:::i;:::-;19739:74;;19822:93;19911:3;19822:93;:::i;:::-;19940:2;19935:3;19931:12;19924:19;;19583:366;;;:::o;19955:::-;20097:3;20118:67;20182:2;20177:3;20118:67;:::i;:::-;20111:74;;20194:93;20283:3;20194:93;:::i;:::-;20312:2;20307:3;20303:12;20296:19;;19955:366;;;:::o;20327:::-;20469:3;20490:67;20554:2;20549:3;20490:67;:::i;:::-;20483:74;;20566:93;20655:3;20566:93;:::i;:::-;20684:2;20679:3;20675:12;20668:19;;20327:366;;;:::o;20699:::-;20841:3;20862:67;20926:2;20921:3;20862:67;:::i;:::-;20855:74;;20938:93;21027:3;20938:93;:::i;:::-;21056:2;21051:3;21047:12;21040:19;;20699:366;;;:::o;21071:::-;21213:3;21234:67;21298:2;21293:3;21234:67;:::i;:::-;21227:74;;21310:93;21399:3;21310:93;:::i;:::-;21428:2;21423:3;21419:12;21412:19;;21071:366;;;:::o;21443:::-;21585:3;21606:67;21670:2;21665:3;21606:67;:::i;:::-;21599:74;;21682:93;21771:3;21682:93;:::i;:::-;21800:2;21795:3;21791:12;21784:19;;21443:366;;;:::o;21815:::-;21957:3;21978:67;22042:2;22037:3;21978:67;:::i;:::-;21971:74;;22054:93;22143:3;22054:93;:::i;:::-;22172:2;22167:3;22163:12;22156:19;;21815:366;;;:::o;22187:::-;22329:3;22350:67;22414:2;22409:3;22350:67;:::i;:::-;22343:74;;22426:93;22515:3;22426:93;:::i;:::-;22544:2;22539:3;22535:12;22528:19;;22187:366;;;:::o;22559:::-;22701:3;22722:67;22786:2;22781:3;22722:67;:::i;:::-;22715:74;;22798:93;22887:3;22798:93;:::i;:::-;22916:2;22911:3;22907:12;22900:19;;22559:366;;;:::o;22931:::-;23073:3;23094:67;23158:2;23153:3;23094:67;:::i;:::-;23087:74;;23170:93;23259:3;23170:93;:::i;:::-;23288:2;23283:3;23279:12;23272:19;;22931:366;;;:::o;23303:::-;23445:3;23466:67;23530:2;23525:3;23466:67;:::i;:::-;23459:74;;23542:93;23631:3;23542:93;:::i;:::-;23660:2;23655:3;23651:12;23644:19;;23303:366;;;:::o;23675:::-;23817:3;23838:67;23902:2;23897:3;23838:67;:::i;:::-;23831:74;;23914:93;24003:3;23914:93;:::i;:::-;24032:2;24027:3;24023:12;24016:19;;23675:366;;;:::o;24047:::-;24189:3;24210:67;24274:2;24269:3;24210:67;:::i;:::-;24203:74;;24286:93;24375:3;24286:93;:::i;:::-;24404:2;24399:3;24395:12;24388:19;;24047:366;;;:::o;24419:::-;24561:3;24582:67;24646:2;24641:3;24582:67;:::i;:::-;24575:74;;24658:93;24747:3;24658:93;:::i;:::-;24776:2;24771:3;24767:12;24760:19;;24419:366;;;:::o;24791:115::-;24876:23;24893:5;24876:23;:::i;:::-;24871:3;24864:36;24791:115;;:::o;24912:118::-;24999:24;25017:5;24999:24;:::i;:::-;24994:3;24987:37;24912:118;;:::o;25036:112::-;25119:22;25135:5;25119:22;:::i;:::-;25114:3;25107:35;25036:112;;:::o;25154:435::-;25334:3;25356:95;25447:3;25438:6;25356:95;:::i;:::-;25349:102;;25468:95;25559:3;25550:6;25468:95;:::i;:::-;25461:102;;25580:3;25573:10;;25154:435;;;;;:::o;25595:663::-;25836:3;25858:148;26002:3;25858:148;:::i;:::-;25851:155;;26016:75;26087:3;26078:6;26016:75;:::i;:::-;26116:2;26111:3;26107:12;26100:19;;26129:75;26200:3;26191:6;26129:75;:::i;:::-;26229:2;26224:3;26220:12;26213:19;;26249:3;26242:10;;25595:663;;;;;:::o;26264:222::-;26357:4;26395:2;26384:9;26380:18;26372:26;;26408:71;26476:1;26465:9;26461:17;26452:6;26408:71;:::i;:::-;26264:222;;;;:::o;26492:640::-;26687:4;26725:3;26714:9;26710:19;26702:27;;26739:71;26807:1;26796:9;26792:17;26783:6;26739:71;:::i;:::-;26820:72;26888:2;26877:9;26873:18;26864:6;26820:72;:::i;:::-;26902;26970:2;26959:9;26955:18;26946:6;26902:72;:::i;:::-;27021:9;27015:4;27011:20;27006:2;26995:9;26991:18;26984:48;27049:76;27120:4;27111:6;27049:76;:::i;:::-;27041:84;;26492:640;;;;;;;:::o;27138:210::-;27225:4;27263:2;27252:9;27248:18;27240:26;;27276:65;27338:1;27327:9;27323:17;27314:6;27276:65;:::i;:::-;27138:210;;;;:::o;27354:438::-;27501:4;27539:2;27528:9;27524:18;27516:26;;27552:71;27620:1;27609:9;27605:17;27596:6;27552:71;:::i;:::-;27633:72;27701:2;27690:9;27686:18;27677:6;27633:72;:::i;:::-;27715:70;27781:2;27770:9;27766:18;27757:6;27715:70;:::i;:::-;27354:438;;;;;;:::o;27798:664::-;28003:4;28041:3;28030:9;28026:19;28018:27;;28055:71;28123:1;28112:9;28108:17;28099:6;28055:71;:::i;:::-;28136:72;28204:2;28193:9;28189:18;28180:6;28136:72;:::i;:::-;28218;28286:2;28275:9;28271:18;28262:6;28218:72;:::i;:::-;28300;28368:2;28357:9;28353:18;28344:6;28300:72;:::i;:::-;28382:73;28450:3;28439:9;28435:19;28426:6;28382:73;:::i;:::-;27798:664;;;;;;;;:::o;28468:545::-;28641:4;28679:3;28668:9;28664:19;28656:27;;28693:71;28761:1;28750:9;28746:17;28737:6;28693:71;:::i;:::-;28774:68;28838:2;28827:9;28823:18;28814:6;28774:68;:::i;:::-;28852:72;28920:2;28909:9;28905:18;28896:6;28852:72;:::i;:::-;28934;29002:2;28991:9;28987:18;28978:6;28934:72;:::i;:::-;28468:545;;;;;;;:::o;29019:313::-;29132:4;29170:2;29159:9;29155:18;29147:26;;29219:9;29213:4;29209:20;29205:1;29194:9;29190:17;29183:47;29247:78;29320:4;29311:6;29247:78;:::i;:::-;29239:86;;29019:313;;;;:::o;29338:419::-;29504:4;29542:2;29531:9;29527:18;29519:26;;29591:9;29585:4;29581:20;29577:1;29566:9;29562:17;29555:47;29619:131;29745:4;29619:131;:::i;:::-;29611:139;;29338:419;;;:::o;29763:::-;29929:4;29967:2;29956:9;29952:18;29944:26;;30016:9;30010:4;30006:20;30002:1;29991:9;29987:17;29980:47;30044:131;30170:4;30044:131;:::i;:::-;30036:139;;29763:419;;;:::o;30188:::-;30354:4;30392:2;30381:9;30377:18;30369:26;;30441:9;30435:4;30431:20;30427:1;30416:9;30412:17;30405:47;30469:131;30595:4;30469:131;:::i;:::-;30461:139;;30188:419;;;:::o;30613:::-;30779:4;30817:2;30806:9;30802:18;30794:26;;30866:9;30860:4;30856:20;30852:1;30841:9;30837:17;30830:47;30894:131;31020:4;30894:131;:::i;:::-;30886:139;;30613:419;;;:::o;31038:::-;31204:4;31242:2;31231:9;31227:18;31219:26;;31291:9;31285:4;31281:20;31277:1;31266:9;31262:17;31255:47;31319:131;31445:4;31319:131;:::i;:::-;31311:139;;31038:419;;;:::o;31463:::-;31629:4;31667:2;31656:9;31652:18;31644:26;;31716:9;31710:4;31706:20;31702:1;31691:9;31687:17;31680:47;31744:131;31870:4;31744:131;:::i;:::-;31736:139;;31463:419;;;:::o;31888:::-;32054:4;32092:2;32081:9;32077:18;32069:26;;32141:9;32135:4;32131:20;32127:1;32116:9;32112:17;32105:47;32169:131;32295:4;32169:131;:::i;:::-;32161:139;;31888:419;;;:::o;32313:::-;32479:4;32517:2;32506:9;32502:18;32494:26;;32566:9;32560:4;32556:20;32552:1;32541:9;32537:17;32530:47;32594:131;32720:4;32594:131;:::i;:::-;32586:139;;32313:419;;;:::o;32738:::-;32904:4;32942:2;32931:9;32927:18;32919:26;;32991:9;32985:4;32981:20;32977:1;32966:9;32962:17;32955:47;33019:131;33145:4;33019:131;:::i;:::-;33011:139;;32738:419;;;:::o;33163:::-;33329:4;33367:2;33356:9;33352:18;33344:26;;33416:9;33410:4;33406:20;33402:1;33391:9;33387:17;33380:47;33444:131;33570:4;33444:131;:::i;:::-;33436:139;;33163:419;;;:::o;33588:::-;33754:4;33792:2;33781:9;33777:18;33769:26;;33841:9;33835:4;33831:20;33827:1;33816:9;33812:17;33805:47;33869:131;33995:4;33869:131;:::i;:::-;33861:139;;33588:419;;;:::o;34013:::-;34179:4;34217:2;34206:9;34202:18;34194:26;;34266:9;34260:4;34256:20;34252:1;34241:9;34237:17;34230:47;34294:131;34420:4;34294:131;:::i;:::-;34286:139;;34013:419;;;:::o;34438:::-;34604:4;34642:2;34631:9;34627:18;34619:26;;34691:9;34685:4;34681:20;34677:1;34666:9;34662:17;34655:47;34719:131;34845:4;34719:131;:::i;:::-;34711:139;;34438:419;;;:::o;34863:::-;35029:4;35067:2;35056:9;35052:18;35044:26;;35116:9;35110:4;35106:20;35102:1;35091:9;35087:17;35080:47;35144:131;35270:4;35144:131;:::i;:::-;35136:139;;34863:419;;;:::o;35288:::-;35454:4;35492:2;35481:9;35477:18;35469:26;;35541:9;35535:4;35531:20;35527:1;35516:9;35512:17;35505:47;35569:131;35695:4;35569:131;:::i;:::-;35561:139;;35288:419;;;:::o;35713:::-;35879:4;35917:2;35906:9;35902:18;35894:26;;35966:9;35960:4;35956:20;35952:1;35941:9;35937:17;35930:47;35994:131;36120:4;35994:131;:::i;:::-;35986:139;;35713:419;;;:::o;36138:::-;36304:4;36342:2;36331:9;36327:18;36319:26;;36391:9;36385:4;36381:20;36377:1;36366:9;36362:17;36355:47;36419:131;36545:4;36419:131;:::i;:::-;36411:139;;36138:419;;;:::o;36563:::-;36729:4;36767:2;36756:9;36752:18;36744:26;;36816:9;36810:4;36806:20;36802:1;36791:9;36787:17;36780:47;36844:131;36970:4;36844:131;:::i;:::-;36836:139;;36563:419;;;:::o;36988:::-;37154:4;37192:2;37181:9;37177:18;37169:26;;37241:9;37235:4;37231:20;37227:1;37216:9;37212:17;37205:47;37269:131;37395:4;37269:131;:::i;:::-;37261:139;;36988:419;;;:::o;37413:::-;37579:4;37617:2;37606:9;37602:18;37594:26;;37666:9;37660:4;37656:20;37652:1;37641:9;37637:17;37630:47;37694:131;37820:4;37694:131;:::i;:::-;37686:139;;37413:419;;;:::o;37838:::-;38004:4;38042:2;38031:9;38027:18;38019:26;;38091:9;38085:4;38081:20;38077:1;38066:9;38062:17;38055:47;38119:131;38245:4;38119:131;:::i;:::-;38111:139;;37838:419;;;:::o;38263:::-;38429:4;38467:2;38456:9;38452:18;38444:26;;38516:9;38510:4;38506:20;38502:1;38491:9;38487:17;38480:47;38544:131;38670:4;38544:131;:::i;:::-;38536:139;;38263:419;;;:::o;38688:::-;38854:4;38892:2;38881:9;38877:18;38869:26;;38941:9;38935:4;38931:20;38927:1;38916:9;38912:17;38905:47;38969:131;39095:4;38969:131;:::i;:::-;38961:139;;38688:419;;;:::o;39113:::-;39279:4;39317:2;39306:9;39302:18;39294:26;;39366:9;39360:4;39356:20;39352:1;39341:9;39337:17;39330:47;39394:131;39520:4;39394:131;:::i;:::-;39386:139;;39113:419;;;:::o;39538:::-;39704:4;39742:2;39731:9;39727:18;39719:26;;39791:9;39785:4;39781:20;39777:1;39766:9;39762:17;39755:47;39819:131;39945:4;39819:131;:::i;:::-;39811:139;;39538:419;;;:::o;39963:::-;40129:4;40167:2;40156:9;40152:18;40144:26;;40216:9;40210:4;40206:20;40202:1;40191:9;40187:17;40180:47;40244:131;40370:4;40244:131;:::i;:::-;40236:139;;39963:419;;;:::o;40388:::-;40554:4;40592:2;40581:9;40577:18;40569:26;;40641:9;40635:4;40631:20;40627:1;40616:9;40612:17;40605:47;40669:131;40795:4;40669:131;:::i;:::-;40661:139;;40388:419;;;:::o;40813:::-;40979:4;41017:2;41006:9;41002:18;40994:26;;41066:9;41060:4;41056:20;41052:1;41041:9;41037:17;41030:47;41094:131;41220:4;41094:131;:::i;:::-;41086:139;;40813:419;;;:::o;41238:::-;41404:4;41442:2;41431:9;41427:18;41419:26;;41491:9;41485:4;41481:20;41477:1;41466:9;41462:17;41455:47;41519:131;41645:4;41519:131;:::i;:::-;41511:139;;41238:419;;;:::o;41663:::-;41829:4;41867:2;41856:9;41852:18;41844:26;;41916:9;41910:4;41906:20;41902:1;41891:9;41887:17;41880:47;41944:131;42070:4;41944:131;:::i;:::-;41936:139;;41663:419;;;:::o;42088:::-;42254:4;42292:2;42281:9;42277:18;42269:26;;42341:9;42335:4;42331:20;42327:1;42316:9;42312:17;42305:47;42369:131;42495:4;42369:131;:::i;:::-;42361:139;;42088:419;;;:::o;42513:::-;42679:4;42717:2;42706:9;42702:18;42694:26;;42766:9;42760:4;42756:20;42752:1;42741:9;42737:17;42730:47;42794:131;42920:4;42794:131;:::i;:::-;42786:139;;42513:419;;;:::o;42938:::-;43104:4;43142:2;43131:9;43127:18;43119:26;;43191:9;43185:4;43181:20;43177:1;43166:9;43162:17;43155:47;43219:131;43345:4;43219:131;:::i;:::-;43211:139;;42938:419;;;:::o;43363:::-;43529:4;43567:2;43556:9;43552:18;43544:26;;43616:9;43610:4;43606:20;43602:1;43591:9;43587:17;43580:47;43644:131;43770:4;43644:131;:::i;:::-;43636:139;;43363:419;;;:::o;43788:::-;43954:4;43992:2;43981:9;43977:18;43969:26;;44041:9;44035:4;44031:20;44027:1;44016:9;44012:17;44005:47;44069:131;44195:4;44069:131;:::i;:::-;44061:139;;43788:419;;;:::o;44213:::-;44379:4;44417:2;44406:9;44402:18;44394:26;;44466:9;44460:4;44456:20;44452:1;44441:9;44437:17;44430:47;44494:131;44620:4;44494:131;:::i;:::-;44486:139;;44213:419;;;:::o;44638:::-;44804:4;44842:2;44831:9;44827:18;44819:26;;44891:9;44885:4;44881:20;44877:1;44866:9;44862:17;44855:47;44919:131;45045:4;44919:131;:::i;:::-;44911:139;;44638:419;;;:::o;45063:::-;45229:4;45267:2;45256:9;45252:18;45244:26;;45316:9;45310:4;45306:20;45302:1;45291:9;45287:17;45280:47;45344:131;45470:4;45344:131;:::i;:::-;45336:139;;45063:419;;;:::o;45488:222::-;45581:4;45619:2;45608:9;45604:18;45596:26;;45632:71;45700:1;45689:9;45685:17;45676:6;45632:71;:::i;:::-;45488:222;;;;:::o;45716:724::-;45793:4;45799:6;45855:11;45842:25;45955:1;45949:4;45945:12;45934:8;45918:14;45914:29;45910:48;45890:18;45886:73;45876:168;;45963:79;;:::i;:::-;45876:168;46075:18;46065:8;46061:33;46053:41;;46127:4;46114:18;46104:28;;46155:18;46147:6;46144:30;46141:117;;;46177:79;;:::i;:::-;46141:117;46285:2;46279:4;46275:13;46267:21;;46342:4;46334:6;46330:17;46314:14;46310:38;46304:4;46300:49;46297:136;;;46352:79;;:::i;:::-;46297:136;45806:634;45716:724;;;;;:::o;46446:129::-;46480:6;46507:20;;:::i;:::-;46497:30;;46536:33;46564:4;46556:6;46536:33;:::i;:::-;46446:129;;;:::o;46581:75::-;46614:6;46647:2;46641:9;46631:19;;46581:75;:::o;46662:307::-;46723:4;46813:18;46805:6;46802:30;46799:56;;;46835:18;;:::i;:::-;46799:56;46873:29;46895:6;46873:29;:::i;:::-;46865:37;;46957:4;46951;46947:15;46939:23;;46662:307;;;:::o;46975:308::-;47037:4;47127:18;47119:6;47116:30;47113:56;;;47149:18;;:::i;:::-;47113:56;47187:29;47209:6;47187:29;:::i;:::-;47179:37;;47271:4;47265;47261:15;47253:23;;46975:308;;;:::o;47289:98::-;47340:6;47374:5;47368:12;47358:22;;47289:98;;;:::o;47393:99::-;47445:6;47479:5;47473:12;47463:22;;47393:99;;;:::o;47498:168::-;47581:11;47615:6;47610:3;47603:19;47655:4;47650:3;47646:14;47631:29;;47498:168;;;;:::o;47672:169::-;47756:11;47790:6;47785:3;47778:19;47830:4;47825:3;47821:14;47806:29;;47672:169;;;;:::o;47847:148::-;47949:11;47986:3;47971:18;;47847:148;;;;:::o;48001:305::-;48041:3;48060:20;48078:1;48060:20;:::i;:::-;48055:25;;48094:20;48112:1;48094:20;:::i;:::-;48089:25;;48248:1;48180:66;48176:74;48173:1;48170:81;48167:107;;;48254:18;;:::i;:::-;48167:107;48298:1;48295;48291:9;48284:16;;48001:305;;;;:::o;48312:185::-;48352:1;48369:20;48387:1;48369:20;:::i;:::-;48364:25;;48403:20;48421:1;48403:20;:::i;:::-;48398:25;;48442:1;48432:35;;48447:18;;:::i;:::-;48432:35;48489:1;48486;48482:9;48477:14;;48312:185;;;;:::o;48503:348::-;48543:7;48566:20;48584:1;48566:20;:::i;:::-;48561:25;;48600:20;48618:1;48600:20;:::i;:::-;48595:25;;48788:1;48720:66;48716:74;48713:1;48710:81;48705:1;48698:9;48691:17;48687:105;48684:131;;;48795:18;;:::i;:::-;48684:131;48843:1;48840;48836:9;48825:20;;48503:348;;;;:::o;48857:191::-;48897:4;48917:20;48935:1;48917:20;:::i;:::-;48912:25;;48951:20;48969:1;48951:20;:::i;:::-;48946:25;;48990:1;48987;48984:8;48981:34;;;48995:18;;:::i;:::-;48981:34;49040:1;49037;49033:9;49025:17;;48857:191;;;;:::o;49054:96::-;49091:7;49120:24;49138:5;49120:24;:::i;:::-;49109:35;;49054:96;;;:::o;49156:90::-;49190:7;49233:5;49226:13;49219:21;49208:32;;49156:90;;;:::o;49252:77::-;49289:7;49318:5;49307:16;;49252:77;;;:::o;49335:149::-;49371:7;49411:66;49404:5;49400:78;49389:89;;49335:149;;;:::o;49490:89::-;49526:7;49566:6;49559:5;49555:18;49544:29;;49490:89;;;:::o;49585:126::-;49622:7;49662:42;49655:5;49651:54;49640:65;;49585:126;;;:::o;49717:77::-;49754:7;49783:5;49772:16;;49717:77;;;:::o;49800:86::-;49835:7;49875:4;49868:5;49864:16;49853:27;;49800:86;;;:::o;49892:154::-;49976:6;49971:3;49966;49953:30;50038:1;50029:6;50024:3;50020:16;50013:27;49892:154;;;:::o;50052:307::-;50120:1;50130:113;50144:6;50141:1;50138:13;50130:113;;;50229:1;50224:3;50220:11;50214:18;50210:1;50205:3;50201:11;50194:39;50166:2;50163:1;50159:10;50154:15;;50130:113;;;50261:6;50258:1;50255:13;50252:101;;;50341:1;50332:6;50327:3;50323:16;50316:27;50252:101;50101:258;50052:307;;;:::o;50365:171::-;50404:3;50427:24;50445:5;50427:24;:::i;:::-;50418:33;;50473:4;50466:5;50463:15;50460:41;;;50481:18;;:::i;:::-;50460:41;50528:1;50521:5;50517:13;50510:20;;50365:171;;;:::o;50542:320::-;50586:6;50623:1;50617:4;50613:12;50603:22;;50670:1;50664:4;50660:12;50691:18;50681:81;;50747:4;50739:6;50735:17;50725:27;;50681:81;50809:2;50801:6;50798:14;50778:18;50775:38;50772:84;;;50828:18;;:::i;:::-;50772:84;50593:269;50542:320;;;:::o;50868:281::-;50951:27;50973:4;50951:27;:::i;:::-;50943:6;50939:40;51081:6;51069:10;51066:22;51045:18;51033:10;51030:34;51027:62;51024:88;;;51092:18;;:::i;:::-;51024:88;51132:10;51128:2;51121:22;50911:238;50868:281;;:::o;51155:233::-;51194:3;51217:24;51235:5;51217:24;:::i;:::-;51208:33;;51263:66;51256:5;51253:77;51250:103;;;51333:18;;:::i;:::-;51250:103;51380:1;51373:5;51369:13;51362:20;;51155:233;;;:::o;51394:79::-;51433:7;51462:5;51451:16;;51394:79;;;:::o;51479:176::-;51511:1;51528:20;51546:1;51528:20;:::i;:::-;51523:25;;51562:20;51580:1;51562:20;:::i;:::-;51557:25;;51601:1;51591:35;;51606:18;;:::i;:::-;51591:35;51647:1;51644;51640:9;51635:14;;51479:176;;;;:::o;51661:180::-;51709:77;51706:1;51699:88;51806:4;51803:1;51796:15;51830:4;51827:1;51820:15;51847:180;51895:77;51892:1;51885:88;51992:4;51989:1;51982:15;52016:4;52013:1;52006:15;52033:180;52081:77;52078:1;52071:88;52178:4;52175:1;52168:15;52202:4;52199:1;52192:15;52219:180;52267:77;52264:1;52257:88;52364:4;52361:1;52354:15;52388:4;52385:1;52378:15;52405:180;52453:77;52450:1;52443:88;52550:4;52547:1;52540:15;52574:4;52571:1;52564:15;52591:180;52639:77;52636:1;52629:88;52736:4;52733:1;52726:15;52760:4;52757:1;52750:15;52777:117;52886:1;52883;52876:12;52900:117;53009:1;53006;52999:12;53023:117;53132:1;53129;53122:12;53146:117;53255:1;53252;53245:12;53269:117;53378:1;53375;53368:12;53392:117;53501:1;53498;53491:12;53515:117;53624:1;53621;53614:12;53638:117;53747:1;53744;53737:12;53761:102;53802:6;53853:2;53849:7;53844:2;53837:5;53833:14;53829:28;53819:38;;53761:102;;;:::o;53869:174::-;54009:26;54005:1;53997:6;53993:14;53986:50;53869:174;:::o;54049:236::-;54189:34;54185:1;54177:6;54173:14;54166:58;54258:19;54253:2;54245:6;54241:15;54234:44;54049:236;:::o;54291:170::-;54431:22;54427:1;54419:6;54415:14;54408:46;54291:170;:::o;54467:181::-;54607:33;54603:1;54595:6;54591:14;54584:57;54467:181;:::o;54654:165::-;54794:17;54790:1;54782:6;54778:14;54771:41;54654:165;:::o;54825:237::-;54965:34;54961:1;54953:6;54949:14;54942:58;55034:20;55029:2;55021:6;55017:15;55010:45;54825:237;:::o;55068:225::-;55208:34;55204:1;55196:6;55192:14;55185:58;55277:8;55272:2;55264:6;55260:15;55253:33;55068:225;:::o;55299:178::-;55439:30;55435:1;55427:6;55423:14;55416:54;55299:178;:::o;55483:214::-;55623:66;55619:1;55611:6;55607:14;55600:90;55483:214;:::o;55703:178::-;55843:30;55839:1;55831:6;55827:14;55820:54;55703:178;:::o;55887:223::-;56027:34;56023:1;56015:6;56011:14;56004:58;56096:6;56091:2;56083:6;56079:15;56072:31;55887:223;:::o;56116:175::-;56256:27;56252:1;56244:6;56240:14;56233:51;56116:175;:::o;56297:168::-;56437:20;56433:1;56425:6;56421:14;56414:44;56297:168;:::o;56471:221::-;56611:34;56607:1;56599:6;56595:14;56588:58;56680:4;56675:2;56667:6;56663:15;56656:29;56471:221;:::o;56698:231::-;56838:34;56834:1;56826:6;56822:14;56815:58;56907:14;56902:2;56894:6;56890:15;56883:39;56698:231;:::o;56935:168::-;57075:20;57071:1;57063:6;57059:14;57052:44;56935:168;:::o;57109:179::-;57249:31;57245:1;57237:6;57233:14;57226:55;57109:179;:::o;57294:166::-;57434:18;57430:1;57422:6;57418:14;57411:42;57294:166;:::o;57466:243::-;57606:34;57602:1;57594:6;57590:14;57583:58;57675:26;57670:2;57662:6;57658:15;57651:51;57466:243;:::o;57715:229::-;57855:34;57851:1;57843:6;57839:14;57832:58;57924:12;57919:2;57911:6;57907:15;57900:37;57715:229;:::o;57950:228::-;58090:34;58086:1;58078:6;58074:14;58067:58;58159:11;58154:2;58146:6;58142:15;58135:36;57950:228;:::o;58184:227::-;58324:34;58320:1;58312:6;58308:14;58301:58;58393:10;58388:2;58380:6;58376:15;58369:35;58184:227;:::o;58417:221::-;58557:34;58553:1;58545:6;58541:14;58534:58;58626:4;58621:2;58613:6;58609:15;58602:29;58417:221;:::o;58644:182::-;58784:34;58780:1;58772:6;58768:14;58761:58;58644:182;:::o;58832:231::-;58972:34;58968:1;58960:6;58956:14;58949:58;59041:14;59036:2;59028:6;59024:15;59017:39;58832:231;:::o;59069:172::-;59209:24;59205:1;59197:6;59193:14;59186:48;59069:172;:::o;59247:182::-;59387:34;59383:1;59375:6;59371:14;59364:58;59247:182;:::o;59435:228::-;59575:34;59571:1;59563:6;59559:14;59552:58;59644:11;59639:2;59631:6;59627:15;59620:36;59435:228;:::o;59669:234::-;59809:34;59805:1;59797:6;59793:14;59786:58;59878:17;59873:2;59865:6;59861:15;59854:42;59669:234;:::o;59909:224::-;60049:34;60045:1;60037:6;60033:14;60026:58;60118:7;60113:2;60105:6;60101:15;60094:32;59909:224;:::o;60139:220::-;60279:34;60275:1;60267:6;60263:14;60256:58;60348:3;60343:2;60335:6;60331:15;60324:28;60139:220;:::o;60365:226::-;60505:34;60501:1;60493:6;60489:14;60482:58;60574:9;60569:2;60561:6;60557:15;60550:34;60365:226;:::o;60597:182::-;60737:34;60733:1;60725:6;60721:14;60714:58;60597:182;:::o;60785:236::-;60925:34;60921:1;60913:6;60909:14;60902:58;60994:19;60989:2;60981:6;60977:15;60970:44;60785:236;:::o;61027:177::-;61167:29;61163:1;61155:6;61151:14;61144:53;61027:177;:::o;61210:235::-;61350:34;61346:1;61338:6;61334:14;61327:58;61419:18;61414:2;61406:6;61402:15;61395:43;61210:235;:::o;61451:173::-;61591:25;61587:1;61579:6;61575:14;61568:49;61451:173;:::o;61630:220::-;61770:34;61766:1;61758:6;61754:14;61747:58;61839:3;61834:2;61826:6;61822:15;61815:28;61630:220;:::o;61856:235::-;61996:34;61992:1;61984:6;61980:14;61973:58;62065:18;62060:2;62052:6;62048:15;62041:43;61856:235;:::o;62097:122::-;62170:24;62188:5;62170:24;:::i;:::-;62163:5;62160:35;62150:63;;62209:1;62206;62199:12;62150:63;62097:122;:::o;62225:116::-;62295:21;62310:5;62295:21;:::i;:::-;62288:5;62285:32;62275:60;;62331:1;62328;62321:12;62275:60;62225:116;:::o;62347:120::-;62419:23;62436:5;62419:23;:::i;:::-;62412:5;62409:34;62399:62;;62457:1;62454;62447:12;62399:62;62347:120;:::o;62473:::-;62545:23;62562:5;62545:23;:::i;:::-;62538:5;62535:34;62525:62;;62583:1;62580;62573:12;62525:62;62473:120;:::o;62599:122::-;62672:24;62690:5;62672:24;:::i;:::-;62665:5;62662:35;62652:63;;62711:1;62708;62701:12;62652:63;62599:122;:::o

Swarm Source

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