ETH Price: $3,319.77 (-3.47%)
Gas: 9.21 Gwei

Token

Shovel (SHOVEL)
 

Overview

Max Total Supply

5,000 SHOVEL

Holders

1,009

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SHOVEL
0x2be68e381eaad342b9892961beb822270ef1fbd4
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:
Shovels

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/Shovels.sol


pragma solidity ^0.8.0;




contract Shovels is ERC721Enumerable, Ownable {
    uint256 public constant MAX_NFT_SUPPLY = 5000;
    uint public constant MAX_PURCHASABLE = 30;
    uint256 public SHOVEL_PRICE = 30000000000000000; // 0.03 ETH
    string public PROVENANCE_HASH = "";

    bool public saleStarted = false;

    constructor() ERC721("Shovel", "SHOVEL") {
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return "https://api.shovelnfts.com/";
    }

    function getTokenURI(uint256 tokenId) public view returns (string memory) {
        return tokenURI(tokenId);
    }

   function mint(uint256 amountToMint) public payable {
        require(saleStarted == true, "This sale has not started.");
        require(totalSupply() < MAX_NFT_SUPPLY, "All NFTs have been minted.");
        require(amountToMint > 0, "You must mint at least one Shovel.");
        require(amountToMint <= MAX_PURCHASABLE, "You cannot mint more than 30 Shovels.");
        require(totalSupply() + amountToMint <= MAX_NFT_SUPPLY, "The amount of Shovels you are trying to mint exceeds the MAX_NFT_SUPPLY.");
        
        require(SHOVEL_PRICE * amountToMint == msg.value, "Incorrect Ether value.");

        for (uint256 i = 0; i < amountToMint; i++) {
            uint256 mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
        }
   }

    function startSale() public onlyOwner {
        saleStarted = true;
    }

    function pauseSale() public onlyOwner {
        saleStarted = false;
    }

    function setProvenanceHash(string memory _hash) public onlyOwner {
        PROVENANCE_HASH = _hash;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASABLE","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":"SHOVEL_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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052666a94d74f430000600b5560405180602001604052806000815250600c908051906020019062000036929190620001bf565b506000600d60006101000a81548160ff0219169083151502179055503480156200005f57600080fd5b506040518060400160405280600681526020017f53686f76656c00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f53484f56454c00000000000000000000000000000000000000000000000000008152508160009080519060200190620000e4929190620001bf565b508060019080519060200190620000fd929190620001bf565b505050600062000112620001b760201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002d4565b600033905090565b828054620001cd906200026f565b90600052602060002090601f016020900481019282620001f157600085556200023d565b82601f106200020c57805160ff19168380011785556200023d565b828001600101855582156200023d579182015b828111156200023c5782518255916020019190600101906200021f565b5b5090506200024c919062000250565b5090565b5b808211156200026b57600081600090555060010162000251565b5090565b600060028204905060018216806200028857607f821691505b602082108114156200029f576200029e620002a5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613fb580620002e46000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610636578063e985e9c514610673578063f2fde38b146106b0578063ff1b6556146106d9576101cd565b8063a22cb465146105a2578063b5077f44146105cb578063b66a0e5d146105f6578063b88d4fde1461060d576101cd565b806383e816b5116100d157806383e816b5146105055780638da5cb5b1461053057806395d89b411461055b578063a0712d6814610586576101cd565b80636352211e1461047457806370a08231146104b1578063715018a6146104ee576101cd565b806323b872dd1161016f57806342842e0e1161013e57806342842e0e146103cc5780634f6ccce7146103f557806355367ba9146104325780635c474f9e14610449576101cd565b806323b872dd1461031f5780632f745c59146103485780633bb3a24d146103855780633ccfd60b146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806310969523146102a0578063119e4398146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612cf0565b610704565b60405161020691906137b3565b60405180910390f35b34801561021b57600080fd5b5061022461077e565b60405161023191906137ce565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d83565b610810565b60405161026e919061374c565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cb4565b610895565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612d42565b6109ad565b005b3480156102d557600080fd5b506102de610a43565b6040516102eb9190613af0565b60405180910390f35b34801561030057600080fd5b50610309610a48565b6040516103169190613af0565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612bae565b610a55565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612cb4565b610ab5565b60405161037c9190613af0565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190612d83565b610b5a565b6040516103b991906137ce565b60405180910390f35b6103ca610b6c565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612bae565b610c28565b005b34801561040157600080fd5b5061041c60048036038101906104179190612d83565b610c48565b6040516104299190613af0565b60405180910390f35b34801561043e57600080fd5b50610447610cdf565b005b34801561045557600080fd5b5061045e610d78565b60405161046b91906137b3565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612d83565b610d8b565b6040516104a8919061374c565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612b49565b610e3d565b6040516104e59190613af0565b60405180910390f35b3480156104fa57600080fd5b50610503610ef5565b005b34801561051157600080fd5b5061051a611032565b6040516105279190613af0565b60405180910390f35b34801561053c57600080fd5b50610545611038565b604051610552919061374c565b60405180910390f35b34801561056757600080fd5b50610570611062565b60405161057d91906137ce565b60405180910390f35b6105a0600480360381019061059b9190612d83565b6110f4565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190612c78565b6112fb565b005b3480156105d757600080fd5b506105e061147c565b6040516105ed9190613af0565b60405180910390f35b34801561060257600080fd5b5061060b611482565b005b34801561061957600080fd5b50610634600480360381019061062f9190612bfd565b61151b565b005b34801561064257600080fd5b5061065d60048036038101906106589190612d83565b61157d565b60405161066a91906137ce565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612b72565b611624565b6040516106a791906137b3565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612b49565b6116b8565b005b3480156106e557600080fd5b506106ee611864565b6040516106fb91906137ce565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107775750610776826118f2565b5b9050919050565b60606000805461078d90613daa565b80601f01602080910402602001604051908101604052809291908181526020018280546107b990613daa565b80156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b5050505050905090565b600061081b826119d4565b61085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906139d0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a082610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613a70565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610930611a40565b73ffffffffffffffffffffffffffffffffffffffff16148061095f575061095e81610959611a40565b611624565b5b61099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590613910565b60405180910390fd5b6109a88383611a48565b505050565b6109b5611a40565b73ffffffffffffffffffffffffffffffffffffffff166109d3611038565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906139f0565b60405180910390fd5b80600c9080519060200190610a3f92919061296d565b5050565b601e81565b6000600880549050905090565b610a66610a60611a40565b82611b01565b610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613a90565b60405180910390fd5b610ab0838383611bdf565b505050565b6000610ac083610e3d565b8210610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890613810565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610b658261157d565b9050919050565b610b74611a40565b73ffffffffffffffffffffffffffffffffffffffff16610b92611038565b73ffffffffffffffffffffffffffffffffffffffff1614610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf906139f0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c2657600080fd5b565b610c438383836040518060200160405280600081525061151b565b505050565b6000610c52610a48565b8210610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90613ab0565b60405180910390fd5b60088281548110610ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ce7611a40565b73ffffffffffffffffffffffffffffffffffffffff16610d05611038565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906139f0565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613950565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea590613930565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610efd611a40565b73ffffffffffffffffffffffffffffffffffffffff16610f1b611038565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f68906139f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461107190613daa565b80601f016020809104026020016040519081016040528092919081815260200182805461109d90613daa565b80156110ea5780601f106110bf576101008083540402835291602001916110ea565b820191906000526020600020905b8154815290600101906020018083116110cd57829003601f168201915b5050505050905090565b60011515600d60009054906101000a900460ff1615151461114a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611141906137f0565b60405180910390fd5b611388611155610a48565b10611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118c906138d0565b60405180910390fd5b600081116111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613990565b60405180910390fd5b601e81111561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390613a50565b60405180910390fd5b61138881611228610a48565b6112329190613bdf565b1115611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613ad0565b60405180910390fd5b3481600b546112829190613c66565b146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990613970565b60405180910390fd5b60005b818110156112f75760006112d7610a48565b90506112e33382611e3b565b5080806112ef90613ddc565b9150506112c5565b5050565b611303611a40565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906138b0565b60405180910390fd5b806005600061137e611a40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661142b611a40565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161147091906137b3565b60405180910390a35050565b61138881565b61148a611a40565b73ffffffffffffffffffffffffffffffffffffffff166114a8611038565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906139f0565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b61152c611526611a40565b83611b01565b61156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156290613a90565b60405180910390fd5b61157784848484611e59565b50505050565b6060611588826119d4565b6115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90613a30565b60405180910390fd5b60006115d1611eb5565b905060008151116115f1576040518060200160405280600081525061161c565b806115fb84611ef2565b60405160200161160c929190613728565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116c0611a40565b73ffffffffffffffffffffffffffffffffffffffff166116de611038565b73ffffffffffffffffffffffffffffffffffffffff1614611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b906139f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613850565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c805461187190613daa565b80601f016020809104026020016040519081016040528092919081815260200182805461189d90613daa565b80156118ea5780601f106118bf576101008083540402835291602001916118ea565b820191906000526020600020905b8154815290600101906020018083116118cd57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119cd57506119cc8261209f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611abb83610d8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b0c826119d4565b611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906138f0565b60405180910390fd5b6000611b5683610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bc557508373ffffffffffffffffffffffffffffffffffffffff16611bad84610810565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bd65750611bd58185611624565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611bff82610d8b565b73ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90613a10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613890565b60405180910390fd5b611cd0838383612109565b611cdb600082611a48565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2b9190613cc0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d829190613bdf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e5582826040518060200160405280600081525061221d565b5050565b611e64848484611bdf565b611e7084848484612278565b611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690613830565b60405180910390fd5b50505050565b60606040518060400160405280601b81526020017f68747470733a2f2f6170692e73686f76656c6e6674732e636f6d2f0000000000815250905090565b60606000821415611f3a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061209a565b600082905060005b60008214611f6c578080611f5590613ddc565b915050600a82611f659190613c35565b9150611f42565b60008167ffffffffffffffff811115611fae577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fe05781602001600182028036833780820191505090505b5090505b6000851461209357600182611ff99190613cc0565b9150600a856120089190613e25565b60306120149190613bdf565b60f81b818381518110612050577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561208c9190613c35565b9450611fe4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211483838361240f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121575761215281612414565b612196565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219557612194838261245d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d9576121d4816125ca565b612218565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221757612216828261270d565b5b5b505050565b612227838361278c565b6122346000848484612278565b612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90613830565b60405180910390fd5b505050565b60006122998473ffffffffffffffffffffffffffffffffffffffff1661295a565b15612402578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c2611a40565b8786866040518563ffffffff1660e01b81526004016122e49493929190613767565b602060405180830381600087803b1580156122fe57600080fd5b505af192505050801561232f57506040513d601f19601f8201168201806040525081019061232c9190612d19565b60015b6123b2573d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b506000815114156123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190613830565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612407565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246a84610e3d565b6124749190613cc0565b9050600060076000848152602001908152602001600020549050818114612559576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125de9190613cc0565b9050600060096000848152602001908152602001600020549050600060088381548110612634577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061267c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061271883610e3d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f3906139b0565b60405180910390fd5b612805816119d4565b15612845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283c90613870565b60405180910390fd5b61285160008383612109565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a19190613bdf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461297990613daa565b90600052602060002090601f01602090048101928261299b57600085556129e2565b82601f106129b457805160ff19168380011785556129e2565b828001600101855582156129e2579182015b828111156129e15782518255916020019190600101906129c6565b5b5090506129ef91906129f3565b5090565b5b80821115612a0c5760008160009055506001016129f4565b5090565b6000612a23612a1e84613b3c565b613b0b565b905082815260208101848484011115612a3b57600080fd5b612a46848285613d68565b509392505050565b6000612a61612a5c84613b6c565b613b0b565b905082815260208101848484011115612a7957600080fd5b612a84848285613d68565b509392505050565b600081359050612a9b81613f23565b92915050565b600081359050612ab081613f3a565b92915050565b600081359050612ac581613f51565b92915050565b600081519050612ada81613f51565b92915050565b600082601f830112612af157600080fd5b8135612b01848260208601612a10565b91505092915050565b600082601f830112612b1b57600080fd5b8135612b2b848260208601612a4e565b91505092915050565b600081359050612b4381613f68565b92915050565b600060208284031215612b5b57600080fd5b6000612b6984828501612a8c565b91505092915050565b60008060408385031215612b8557600080fd5b6000612b9385828601612a8c565b9250506020612ba485828601612a8c565b9150509250929050565b600080600060608486031215612bc357600080fd5b6000612bd186828701612a8c565b9350506020612be286828701612a8c565b9250506040612bf386828701612b34565b9150509250925092565b60008060008060808587031215612c1357600080fd5b6000612c2187828801612a8c565b9450506020612c3287828801612a8c565b9350506040612c4387828801612b34565b925050606085013567ffffffffffffffff811115612c6057600080fd5b612c6c87828801612ae0565b91505092959194509250565b60008060408385031215612c8b57600080fd5b6000612c9985828601612a8c565b9250506020612caa85828601612aa1565b9150509250929050565b60008060408385031215612cc757600080fd5b6000612cd585828601612a8c565b9250506020612ce685828601612b34565b9150509250929050565b600060208284031215612d0257600080fd5b6000612d1084828501612ab6565b91505092915050565b600060208284031215612d2b57600080fd5b6000612d3984828501612acb565b91505092915050565b600060208284031215612d5457600080fd5b600082013567ffffffffffffffff811115612d6e57600080fd5b612d7a84828501612b0a565b91505092915050565b600060208284031215612d9557600080fd5b6000612da384828501612b34565b91505092915050565b612db581613cf4565b82525050565b612dc481613d06565b82525050565b6000612dd582613b9c565b612ddf8185613bb2565b9350612def818560208601613d77565b612df881613f12565b840191505092915050565b6000612e0e82613ba7565b612e188185613bc3565b9350612e28818560208601613d77565b612e3181613f12565b840191505092915050565b6000612e4782613ba7565b612e518185613bd4565b9350612e61818560208601613d77565b80840191505092915050565b6000612e7a601a83613bc3565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612eba602b83613bc3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f20603283613bc3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f86602683613bc3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fec601c83613bc3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061302c602483613bc3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613092601983613bc3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130d2601a83613bc3565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000613112602c83613bc3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613178603883613bc3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131de602a83613bc3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613244602983613bc3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132aa601683613bc3565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b60006132ea602283613bc3565b91507f596f75206d757374206d696e74206174206c65617374206f6e652053686f766560008301527f6c2e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613350602083613bc3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613390602c83613bc3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133f6602083613bc3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613436602983613bc3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061349c602f83613bc3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613502602583613bc3565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2033302053686f60008301527f76656c732e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613568602183613bc3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ce603183613bc3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613634602c83613bc3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061369a604883613bc3565b91507f54686520616d6f756e74206f662053686f76656c7320796f752061726520747260008301527f79696e6720746f206d696e74206578636565647320746865204d41585f4e465460208301527f5f535550504c592e0000000000000000000000000000000000000000000000006040830152606082019050919050565b61372281613d5e565b82525050565b60006137348285612e3c565b91506137408284612e3c565b91508190509392505050565b60006020820190506137616000830184612dac565b92915050565b600060808201905061377c6000830187612dac565b6137896020830186612dac565b6137966040830185613719565b81810360608301526137a88184612dca565b905095945050505050565b60006020820190506137c86000830184612dbb565b92915050565b600060208201905081810360008301526137e88184612e03565b905092915050565b6000602082019050818103600083015261380981612e6d565b9050919050565b6000602082019050818103600083015261382981612ead565b9050919050565b6000602082019050818103600083015261384981612f13565b9050919050565b6000602082019050818103600083015261386981612f79565b9050919050565b6000602082019050818103600083015261388981612fdf565b9050919050565b600060208201905081810360008301526138a98161301f565b9050919050565b600060208201905081810360008301526138c981613085565b9050919050565b600060208201905081810360008301526138e9816130c5565b9050919050565b6000602082019050818103600083015261390981613105565b9050919050565b600060208201905081810360008301526139298161316b565b9050919050565b60006020820190508181036000830152613949816131d1565b9050919050565b6000602082019050818103600083015261396981613237565b9050919050565b600060208201905081810360008301526139898161329d565b9050919050565b600060208201905081810360008301526139a9816132dd565b9050919050565b600060208201905081810360008301526139c981613343565b9050919050565b600060208201905081810360008301526139e981613383565b9050919050565b60006020820190508181036000830152613a09816133e9565b9050919050565b60006020820190508181036000830152613a2981613429565b9050919050565b60006020820190508181036000830152613a498161348f565b9050919050565b60006020820190508181036000830152613a69816134f5565b9050919050565b60006020820190508181036000830152613a898161355b565b9050919050565b60006020820190508181036000830152613aa9816135c1565b9050919050565b60006020820190508181036000830152613ac981613627565b9050919050565b60006020820190508181036000830152613ae98161368d565b9050919050565b6000602082019050613b056000830184613719565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b3257613b31613ee3565b5b8060405250919050565b600067ffffffffffffffff821115613b5757613b56613ee3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b8757613b86613ee3565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bea82613d5e565b9150613bf583613d5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c2a57613c29613e56565b5b828201905092915050565b6000613c4082613d5e565b9150613c4b83613d5e565b925082613c5b57613c5a613e85565b5b828204905092915050565b6000613c7182613d5e565b9150613c7c83613d5e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cb557613cb4613e56565b5b828202905092915050565b6000613ccb82613d5e565b9150613cd683613d5e565b925082821015613ce957613ce8613e56565b5b828203905092915050565b6000613cff82613d3e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d95578082015181840152602081019050613d7a565b83811115613da4576000848401525b50505050565b60006002820490506001821680613dc257607f821691505b60208210811415613dd657613dd5613eb4565b5b50919050565b6000613de782613d5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e1a57613e19613e56565b5b600182019050919050565b6000613e3082613d5e565b9150613e3b83613d5e565b925082613e4b57613e4a613e85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f2c81613cf4565b8114613f3757600080fd5b50565b613f4381613d06565b8114613f4e57600080fd5b50565b613f5a81613d12565b8114613f6557600080fd5b50565b613f7181613d5e565b8114613f7c57600080fd5b5056fea26469706673582212203acd8825196bf4ee16fc524e1816c175d3f2bd54d437ea19ea1447af2958dde864736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80636352211e116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd14610636578063e985e9c514610673578063f2fde38b146106b0578063ff1b6556146106d9576101cd565b8063a22cb465146105a2578063b5077f44146105cb578063b66a0e5d146105f6578063b88d4fde1461060d576101cd565b806383e816b5116100d157806383e816b5146105055780638da5cb5b1461053057806395d89b411461055b578063a0712d6814610586576101cd565b80636352211e1461047457806370a08231146104b1578063715018a6146104ee576101cd565b806323b872dd1161016f57806342842e0e1161013e57806342842e0e146103cc5780634f6ccce7146103f557806355367ba9146104325780635c474f9e14610449576101cd565b806323b872dd1461031f5780632f745c59146103485780633bb3a24d146103855780633ccfd60b146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806310969523146102a0578063119e4398146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612cf0565b610704565b60405161020691906137b3565b60405180910390f35b34801561021b57600080fd5b5061022461077e565b60405161023191906137ce565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d83565b610810565b60405161026e919061374c565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612cb4565b610895565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190612d42565b6109ad565b005b3480156102d557600080fd5b506102de610a43565b6040516102eb9190613af0565b60405180910390f35b34801561030057600080fd5b50610309610a48565b6040516103169190613af0565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612bae565b610a55565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612cb4565b610ab5565b60405161037c9190613af0565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190612d83565b610b5a565b6040516103b991906137ce565b60405180910390f35b6103ca610b6c565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612bae565b610c28565b005b34801561040157600080fd5b5061041c60048036038101906104179190612d83565b610c48565b6040516104299190613af0565b60405180910390f35b34801561043e57600080fd5b50610447610cdf565b005b34801561045557600080fd5b5061045e610d78565b60405161046b91906137b3565b60405180910390f35b34801561048057600080fd5b5061049b60048036038101906104969190612d83565b610d8b565b6040516104a8919061374c565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190612b49565b610e3d565b6040516104e59190613af0565b60405180910390f35b3480156104fa57600080fd5b50610503610ef5565b005b34801561051157600080fd5b5061051a611032565b6040516105279190613af0565b60405180910390f35b34801561053c57600080fd5b50610545611038565b604051610552919061374c565b60405180910390f35b34801561056757600080fd5b50610570611062565b60405161057d91906137ce565b60405180910390f35b6105a0600480360381019061059b9190612d83565b6110f4565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190612c78565b6112fb565b005b3480156105d757600080fd5b506105e061147c565b6040516105ed9190613af0565b60405180910390f35b34801561060257600080fd5b5061060b611482565b005b34801561061957600080fd5b50610634600480360381019061062f9190612bfd565b61151b565b005b34801561064257600080fd5b5061065d60048036038101906106589190612d83565b61157d565b60405161066a91906137ce565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612b72565b611624565b6040516106a791906137b3565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190612b49565b6116b8565b005b3480156106e557600080fd5b506106ee611864565b6040516106fb91906137ce565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107775750610776826118f2565b5b9050919050565b60606000805461078d90613daa565b80601f01602080910402602001604051908101604052809291908181526020018280546107b990613daa565b80156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b5050505050905090565b600061081b826119d4565b61085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906139d0565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a082610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090890613a70565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610930611a40565b73ffffffffffffffffffffffffffffffffffffffff16148061095f575061095e81610959611a40565b611624565b5b61099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590613910565b60405180910390fd5b6109a88383611a48565b505050565b6109b5611a40565b73ffffffffffffffffffffffffffffffffffffffff166109d3611038565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906139f0565b60405180910390fd5b80600c9080519060200190610a3f92919061296d565b5050565b601e81565b6000600880549050905090565b610a66610a60611a40565b82611b01565b610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c90613a90565b60405180910390fd5b610ab0838383611bdf565b505050565b6000610ac083610e3d565b8210610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890613810565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610b658261157d565b9050919050565b610b74611a40565b73ffffffffffffffffffffffffffffffffffffffff16610b92611038565b73ffffffffffffffffffffffffffffffffffffffff1614610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf906139f0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c2657600080fd5b565b610c438383836040518060200160405280600081525061151b565b505050565b6000610c52610a48565b8210610c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8a90613ab0565b60405180910390fd5b60088281548110610ccd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610ce7611a40565b73ffffffffffffffffffffffffffffffffffffffff16610d05611038565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d52906139f0565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b600d60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90613950565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea590613930565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610efd611a40565b73ffffffffffffffffffffffffffffffffffffffff16610f1b611038565b73ffffffffffffffffffffffffffffffffffffffff1614610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f68906139f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461107190613daa565b80601f016020809104026020016040519081016040528092919081815260200182805461109d90613daa565b80156110ea5780601f106110bf576101008083540402835291602001916110ea565b820191906000526020600020905b8154815290600101906020018083116110cd57829003601f168201915b5050505050905090565b60011515600d60009054906101000a900460ff1615151461114a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611141906137f0565b60405180910390fd5b611388611155610a48565b10611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118c906138d0565b60405180910390fd5b600081116111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90613990565b60405180910390fd5b601e81111561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390613a50565b60405180910390fd5b61138881611228610a48565b6112329190613bdf565b1115611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613ad0565b60405180910390fd5b3481600b546112829190613c66565b146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990613970565b60405180910390fd5b60005b818110156112f75760006112d7610a48565b90506112e33382611e3b565b5080806112ef90613ddc565b9150506112c5565b5050565b611303611a40565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611368906138b0565b60405180910390fd5b806005600061137e611a40565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661142b611a40565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161147091906137b3565b60405180910390a35050565b61138881565b61148a611a40565b73ffffffffffffffffffffffffffffffffffffffff166114a8611038565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906139f0565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b61152c611526611a40565b83611b01565b61156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156290613a90565b60405180910390fd5b61157784848484611e59565b50505050565b6060611588826119d4565b6115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90613a30565b60405180910390fd5b60006115d1611eb5565b905060008151116115f1576040518060200160405280600081525061161c565b806115fb84611ef2565b60405160200161160c929190613728565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116c0611a40565b73ffffffffffffffffffffffffffffffffffffffff166116de611038565b73ffffffffffffffffffffffffffffffffffffffff1614611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b906139f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90613850565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c805461187190613daa565b80601f016020809104026020016040519081016040528092919081815260200182805461189d90613daa565b80156118ea5780601f106118bf576101008083540402835291602001916118ea565b820191906000526020600020905b8154815290600101906020018083116118cd57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119bd57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119cd57506119cc8261209f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611abb83610d8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b0c826119d4565b611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906138f0565b60405180910390fd5b6000611b5683610d8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bc557508373ffffffffffffffffffffffffffffffffffffffff16611bad84610810565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bd65750611bd58185611624565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611bff82610d8b565b73ffffffffffffffffffffffffffffffffffffffff1614611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90613a10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc90613890565b60405180910390fd5b611cd0838383612109565b611cdb600082611a48565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2b9190613cc0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d829190613bdf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e5582826040518060200160405280600081525061221d565b5050565b611e64848484611bdf565b611e7084848484612278565b611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690613830565b60405180910390fd5b50505050565b60606040518060400160405280601b81526020017f68747470733a2f2f6170692e73686f76656c6e6674732e636f6d2f0000000000815250905090565b60606000821415611f3a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061209a565b600082905060005b60008214611f6c578080611f5590613ddc565b915050600a82611f659190613c35565b9150611f42565b60008167ffffffffffffffff811115611fae577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611fe05781602001600182028036833780820191505090505b5090505b6000851461209357600182611ff99190613cc0565b9150600a856120089190613e25565b60306120149190613bdf565b60f81b818381518110612050577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561208c9190613c35565b9450611fe4565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211483838361240f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121575761215281612414565b612196565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219557612194838261245d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d9576121d4816125ca565b612218565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221757612216828261270d565b5b5b505050565b612227838361278c565b6122346000848484612278565b612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90613830565b60405180910390fd5b505050565b60006122998473ffffffffffffffffffffffffffffffffffffffff1661295a565b15612402578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c2611a40565b8786866040518563ffffffff1660e01b81526004016122e49493929190613767565b602060405180830381600087803b1580156122fe57600080fd5b505af192505050801561232f57506040513d601f19601f8201168201806040525081019061232c9190612d19565b60015b6123b2573d806000811461235f576040519150601f19603f3d011682016040523d82523d6000602084013e612364565b606091505b506000815114156123aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a190613830565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612407565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246a84610e3d565b6124749190613cc0565b9050600060076000848152602001908152602001600020549050818114612559576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125de9190613cc0565b9050600060096000848152602001908152602001600020549050600060088381548110612634577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061267c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806126f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061271883610e3d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f3906139b0565b60405180910390fd5b612805816119d4565b15612845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283c90613870565b60405180910390fd5b61285160008383612109565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a19190613bdf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461297990613daa565b90600052602060002090601f01602090048101928261299b57600085556129e2565b82601f106129b457805160ff19168380011785556129e2565b828001600101855582156129e2579182015b828111156129e15782518255916020019190600101906129c6565b5b5090506129ef91906129f3565b5090565b5b80821115612a0c5760008160009055506001016129f4565b5090565b6000612a23612a1e84613b3c565b613b0b565b905082815260208101848484011115612a3b57600080fd5b612a46848285613d68565b509392505050565b6000612a61612a5c84613b6c565b613b0b565b905082815260208101848484011115612a7957600080fd5b612a84848285613d68565b509392505050565b600081359050612a9b81613f23565b92915050565b600081359050612ab081613f3a565b92915050565b600081359050612ac581613f51565b92915050565b600081519050612ada81613f51565b92915050565b600082601f830112612af157600080fd5b8135612b01848260208601612a10565b91505092915050565b600082601f830112612b1b57600080fd5b8135612b2b848260208601612a4e565b91505092915050565b600081359050612b4381613f68565b92915050565b600060208284031215612b5b57600080fd5b6000612b6984828501612a8c565b91505092915050565b60008060408385031215612b8557600080fd5b6000612b9385828601612a8c565b9250506020612ba485828601612a8c565b9150509250929050565b600080600060608486031215612bc357600080fd5b6000612bd186828701612a8c565b9350506020612be286828701612a8c565b9250506040612bf386828701612b34565b9150509250925092565b60008060008060808587031215612c1357600080fd5b6000612c2187828801612a8c565b9450506020612c3287828801612a8c565b9350506040612c4387828801612b34565b925050606085013567ffffffffffffffff811115612c6057600080fd5b612c6c87828801612ae0565b91505092959194509250565b60008060408385031215612c8b57600080fd5b6000612c9985828601612a8c565b9250506020612caa85828601612aa1565b9150509250929050565b60008060408385031215612cc757600080fd5b6000612cd585828601612a8c565b9250506020612ce685828601612b34565b9150509250929050565b600060208284031215612d0257600080fd5b6000612d1084828501612ab6565b91505092915050565b600060208284031215612d2b57600080fd5b6000612d3984828501612acb565b91505092915050565b600060208284031215612d5457600080fd5b600082013567ffffffffffffffff811115612d6e57600080fd5b612d7a84828501612b0a565b91505092915050565b600060208284031215612d9557600080fd5b6000612da384828501612b34565b91505092915050565b612db581613cf4565b82525050565b612dc481613d06565b82525050565b6000612dd582613b9c565b612ddf8185613bb2565b9350612def818560208601613d77565b612df881613f12565b840191505092915050565b6000612e0e82613ba7565b612e188185613bc3565b9350612e28818560208601613d77565b612e3181613f12565b840191505092915050565b6000612e4782613ba7565b612e518185613bd4565b9350612e61818560208601613d77565b80840191505092915050565b6000612e7a601a83613bc3565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612eba602b83613bc3565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612f20603283613bc3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612f86602683613bc3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fec601c83613bc3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061302c602483613bc3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613092601983613bc3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006130d2601a83613bc3565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000613112602c83613bc3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613178603883613bc3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006131de602a83613bc3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613244602983613bc3565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132aa601683613bc3565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b60006132ea602283613bc3565b91507f596f75206d757374206d696e74206174206c65617374206f6e652053686f766560008301527f6c2e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613350602083613bc3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613390602c83613bc3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006133f6602083613bc3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613436602983613bc3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061349c602f83613bc3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613502602583613bc3565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2033302053686f60008301527f76656c732e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613568602183613bc3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006135ce603183613bc3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613634602c83613bc3565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061369a604883613bc3565b91507f54686520616d6f756e74206f662053686f76656c7320796f752061726520747260008301527f79696e6720746f206d696e74206578636565647320746865204d41585f4e465460208301527f5f535550504c592e0000000000000000000000000000000000000000000000006040830152606082019050919050565b61372281613d5e565b82525050565b60006137348285612e3c565b91506137408284612e3c565b91508190509392505050565b60006020820190506137616000830184612dac565b92915050565b600060808201905061377c6000830187612dac565b6137896020830186612dac565b6137966040830185613719565b81810360608301526137a88184612dca565b905095945050505050565b60006020820190506137c86000830184612dbb565b92915050565b600060208201905081810360008301526137e88184612e03565b905092915050565b6000602082019050818103600083015261380981612e6d565b9050919050565b6000602082019050818103600083015261382981612ead565b9050919050565b6000602082019050818103600083015261384981612f13565b9050919050565b6000602082019050818103600083015261386981612f79565b9050919050565b6000602082019050818103600083015261388981612fdf565b9050919050565b600060208201905081810360008301526138a98161301f565b9050919050565b600060208201905081810360008301526138c981613085565b9050919050565b600060208201905081810360008301526138e9816130c5565b9050919050565b6000602082019050818103600083015261390981613105565b9050919050565b600060208201905081810360008301526139298161316b565b9050919050565b60006020820190508181036000830152613949816131d1565b9050919050565b6000602082019050818103600083015261396981613237565b9050919050565b600060208201905081810360008301526139898161329d565b9050919050565b600060208201905081810360008301526139a9816132dd565b9050919050565b600060208201905081810360008301526139c981613343565b9050919050565b600060208201905081810360008301526139e981613383565b9050919050565b60006020820190508181036000830152613a09816133e9565b9050919050565b60006020820190508181036000830152613a2981613429565b9050919050565b60006020820190508181036000830152613a498161348f565b9050919050565b60006020820190508181036000830152613a69816134f5565b9050919050565b60006020820190508181036000830152613a898161355b565b9050919050565b60006020820190508181036000830152613aa9816135c1565b9050919050565b60006020820190508181036000830152613ac981613627565b9050919050565b60006020820190508181036000830152613ae98161368d565b9050919050565b6000602082019050613b056000830184613719565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613b3257613b31613ee3565b5b8060405250919050565b600067ffffffffffffffff821115613b5757613b56613ee3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b8757613b86613ee3565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bea82613d5e565b9150613bf583613d5e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c2a57613c29613e56565b5b828201905092915050565b6000613c4082613d5e565b9150613c4b83613d5e565b925082613c5b57613c5a613e85565b5b828204905092915050565b6000613c7182613d5e565b9150613c7c83613d5e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cb557613cb4613e56565b5b828202905092915050565b6000613ccb82613d5e565b9150613cd683613d5e565b925082821015613ce957613ce8613e56565b5b828203905092915050565b6000613cff82613d3e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d95578082015181840152602081019050613d7a565b83811115613da4576000848401525b50505050565b60006002820490506001821680613dc257607f821691505b60208210811415613dd657613dd5613eb4565b5b50919050565b6000613de782613d5e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e1a57613e19613e56565b5b600182019050919050565b6000613e3082613d5e565b9150613e3b83613d5e565b925082613e4b57613e4a613e85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f2c81613cf4565b8114613f3757600080fd5b50565b613f4381613d06565b8114613f4e57600080fd5b50565b613f5a81613d12565b8114613f6557600080fd5b50565b613f7181613d5e565b8114613f7c57600080fd5b5056fea26469706673582212203acd8825196bf4ee16fc524e1816c175d3f2bd54d437ea19ea1447af2958dde864736f6c63430008000033

Deployed Bytecode Sourcemap

42819:1807:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34324:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22989:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22526:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44388:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42924:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34977:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23879:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34645:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43316:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44503:120;;;:::i;:::-;;24255:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35167:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44304:76;;;;;;;;;;;;;:::i;:::-;;43081:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21223:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42196:148;;;;;;;;;;;;;:::i;:::-;;42972:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41545:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21698:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43440:773;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23282:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42872:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44221:75;;;;;;;;;;;;;:::i;:::-;;24477:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21873:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23648:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42499:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43038:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34324:237;34426:4;34465:35;34450:50;;;:11;:50;;;;:103;;;;34517:36;34541:11;34517:23;:36::i;:::-;34450:103;34443:110;;34324:237;;;:::o;21529:100::-;21583:13;21616:5;21609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21529:100;:::o;22989:221::-;23065:7;23093:16;23101:7;23093;:16::i;:::-;23085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23178:15;:24;23194:7;23178:24;;;;;;;;;;;;;;;;;;;;;23171:31;;22989:221;;;:::o;22526:397::-;22607:13;22623:23;22638:7;22623:14;:23::i;:::-;22607:39;;22671:5;22665:11;;:2;:11;;;;22657:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22751:5;22735:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22760:37;22777:5;22784:12;:10;:12::i;:::-;22760:16;:37::i;:::-;22735:62;22727:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22894:21;22903:2;22907:7;22894:8;:21::i;:::-;22526:397;;;:::o;44388:107::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44482:5:::1;44464:15;:23;;;;;;;;;;;;:::i;:::-;;44388:107:::0;:::o;42924:41::-;42963:2;42924:41;:::o;34977:113::-;35038:7;35065:10;:17;;;;35058:24;;34977:113;:::o;23879:305::-;24040:41;24059:12;:10;:12::i;:::-;24073:7;24040:18;:41::i;:::-;24032:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24148:28;24158:4;24164:2;24168:7;24148:9;:28::i;:::-;23879:305;;;:::o;34645:256::-;34742:7;34778:23;34795:5;34778:16;:23::i;:::-;34770:5;:31;34762:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34867:12;:19;34880:5;34867:19;;;;;;;;;;;;;;;:26;34887:5;34867:26;;;;;;;;;;;;34860:33;;34645:256;;;;:::o;43316:117::-;43375:13;43408:17;43417:7;43408:8;:17::i;:::-;43401:24;;43316:117;;;:::o;44503:120::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44575:10:::1;44567:24;;:47;44592:21;44567:47;;;;;;;;;;;;;;;;;;;;;;;44559:56;;;::::0;::::1;;44503:120::o:0;24255:151::-;24359:39;24376:4;24382:2;24386:7;24359:39;;;;;;;;;;;;:16;:39::i;:::-;24255:151;;;:::o;35167:233::-;35242:7;35278:30;:28;:30::i;:::-;35270:5;:38;35262:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35375:10;35386:5;35375:17;;;;;;;;;;;;;;;;;;;;;;;;35368:24;;35167:233;;;:::o;44304:76::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44367:5:::1;44353:11;;:19;;;;;;;;;;;;;;;;;;44304:76::o:0;43081:31::-;;;;;;;;;;;;;:::o;21223:239::-;21295:7;21315:13;21331:7;:16;21339:7;21331:16;;;;;;;;;;;;;;;;;;;;;21315:32;;21383:1;21366:19;;:5;:19;;;;21358:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21449:5;21442:12;;;21223:239;;;:::o;20953:208::-;21025:7;21070:1;21053:19;;:5;:19;;;;21045:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21137:9;:16;21147:5;21137:16;;;;;;;;;;;;;;;;21130:23;;20953:208;;;:::o;42196:148::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42303:1:::1;42266:40;;42287:6;;;;;;;;;;;42266:40;;;;;;;;;;;;42334:1;42317:6;;:19;;;;;;;;;;;;;;;;;;42196:148::o:0;42972:47::-;;;;:::o;41545:87::-;41591:7;41618:6;;;;;;;;;;;41611:13;;41545:87;:::o;21698:104::-;21754:13;21787:7;21780:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21698:104;:::o;43440:773::-;43525:4;43510:19;;:11;;;;;;;;;;;:19;;;43502:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42913:4;43579:13;:11;:13::i;:::-;:30;43571:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43674:1;43659:12;:16;43651:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42963:2;43733:12;:31;;43725:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42913:4;43841:12;43825:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;43817:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;44008:9;43992:12;43977;;:27;;;;:::i;:::-;:40;43969:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;44062:9;44057:150;44081:12;44077:1;:16;44057:150;;;44115:17;44135:13;:11;:13::i;:::-;44115:33;;44163:32;44173:10;44185:9;44163;:32::i;:::-;44057:150;44095:3;;;;;:::i;:::-;;;;44057:150;;;;43440:773;:::o;23282:295::-;23397:12;:10;:12::i;:::-;23385:24;;:8;:24;;;;23377:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23497:8;23452:18;:32;23471:12;:10;:12::i;:::-;23452:32;;;;;;;;;;;;;;;:42;23485:8;23452:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23550:8;23521:48;;23536:12;:10;:12::i;:::-;23521:48;;;23560:8;23521:48;;;;;;:::i;:::-;;;;;;;;23282:295;;:::o;42872:45::-;42913:4;42872:45;:::o;44221:75::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44284:4:::1;44270:11;;:18;;;;;;;;;;;;;;;;;;44221:75::o:0;24477:285::-;24609:41;24628:12;:10;:12::i;:::-;24642:7;24609:18;:41::i;:::-;24601:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24715:39;24729:4;24735:2;24739:7;24748:5;24715:13;:39::i;:::-;24477:285;;;;:::o;21873:360::-;21946:13;21980:16;21988:7;21980;:16::i;:::-;21972:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22061:21;22085:10;:8;:10::i;:::-;22061:34;;22137:1;22119:7;22113:21;:25;:112;;;;;;;;;;;;;;;;;22178:7;22187:18;:7;:16;:18::i;:::-;22161:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22113:112;22106:119;;;21873:360;;;:::o;23648:164::-;23745:4;23769:18;:25;23788:5;23769:25;;;;;;;;;;;;;;;:35;23795:8;23769:35;;;;;;;;;;;;;;;;;;;;;;;;;23762:42;;23648:164;;;;:::o;42499:244::-;41776:12;:10;:12::i;:::-;41765:23;;:7;:5;:7::i;:::-;:23;;;41757:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42608:1:::1;42588:22;;:8;:22;;;;42580:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42698:8;42669:38;;42690:6;;;;;;;;;;;42669:38;;;;;;;;;;;;42727:8;42718:6;;:17;;;;;;;;;;;;;;;;;;42499:244:::0;:::o;43038:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20597:292::-;20699:4;20738:25;20723:40;;;:11;:40;;;;:105;;;;20795:33;20780:48;;;:11;:48;;;;20723:105;:158;;;;20845:36;20869:11;20845:23;:36::i;:::-;20723:158;20716:165;;20597:292;;;:::o;26229:127::-;26294:4;26346:1;26318:30;;:7;:16;26326:7;26318:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26311:37;;26229:127;;;:::o;15885:98::-;15938:7;15965:10;15958:17;;15885:98;:::o;30106:174::-;30208:2;30181:15;:24;30197:7;30181:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30264:7;30260:2;30226:46;;30235:23;30250:7;30235:14;:23::i;:::-;30226:46;;;;;;;;;;;;30106:174;;:::o;26523:348::-;26616:4;26641:16;26649:7;26641;:16::i;:::-;26633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26717:13;26733:23;26748:7;26733:14;:23::i;:::-;26717:39;;26786:5;26775:16;;:7;:16;;;:51;;;;26819:7;26795:31;;:20;26807:7;26795:11;:20::i;:::-;:31;;;26775:51;:87;;;;26830:32;26847:5;26854:7;26830:16;:32::i;:::-;26775:87;26767:96;;;26523:348;;;;:::o;29444:544::-;29569:4;29542:31;;:23;29557:7;29542:14;:23::i;:::-;:31;;;29534:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29652:1;29638:16;;:2;:16;;;;29630:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29708:39;29729:4;29735:2;29739:7;29708:20;:39::i;:::-;29812:29;29829:1;29833:7;29812:8;:29::i;:::-;29873:1;29854:9;:15;29864:4;29854:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29902:1;29885:9;:13;29895:2;29885:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29933:2;29914:7;:16;29922:7;29914:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29972:7;29968:2;29953:27;;29962:4;29953:27;;;;;;;;;;;;29444:544;;;:::o;27213:110::-;27289:26;27299:2;27303:7;27289:26;;;;;;;;;;;;:9;:26::i;:::-;27213:110;;:::o;25644:272::-;25758:28;25768:4;25774:2;25778:7;25758:9;:28::i;:::-;25805:48;25828:4;25834:2;25838:7;25847:5;25805:22;:48::i;:::-;25797:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25644:272;;;;:::o;43178:130::-;43238:13;43264:36;;;;;;;;;;;;;;;;;;;43178:130;:::o;16540:723::-;16596:13;16826:1;16817:5;:10;16813:53;;;16844:10;;;;;;;;;;;;;;;;;;;;;16813:53;16876:12;16891:5;16876:20;;16907:14;16932:78;16947:1;16939:4;:9;16932:78;;16965:8;;;;;:::i;:::-;;;;16996:2;16988:10;;;;;:::i;:::-;;;16932:78;;;17020:19;17052:6;17042:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17020:39;;17070:154;17086:1;17077:5;:10;17070:154;;17114:1;17104:11;;;;;:::i;:::-;;;17181:2;17173:5;:10;;;;:::i;:::-;17160:2;:24;;;;:::i;:::-;17147:39;;17130:6;17137;17130:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17210:2;17201:11;;;;;:::i;:::-;;;17070:154;;;17248:6;17234:21;;;;;16540:723;;;;:::o;19095:157::-;19180:4;19219:25;19204:40;;;:11;:40;;;;19197:47;;19095:157;;;:::o;36013:555::-;36123:45;36150:4;36156:2;36160:7;36123:26;:45::i;:::-;36201:1;36185:18;;:4;:18;;;36181:187;;;36220:40;36252:7;36220:31;:40::i;:::-;36181:187;;;36290:2;36282:10;;:4;:10;;;36278:90;;36309:47;36342:4;36348:7;36309:32;:47::i;:::-;36278:90;36181:187;36396:1;36382:16;;:2;:16;;;36378:183;;;36415:45;36452:7;36415:36;:45::i;:::-;36378:183;;;36488:4;36482:10;;:2;:10;;;36478:83;;36509:40;36537:2;36541:7;36509:27;:40::i;:::-;36478:83;36378:183;36013:555;;;:::o;27550:250::-;27646:18;27652:2;27656:7;27646:5;:18::i;:::-;27683:54;27714:1;27718:2;27722:7;27731:5;27683:22;:54::i;:::-;27675:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27550:250;;;:::o;30845:843::-;30966:4;30992:15;:2;:13;;;:15::i;:::-;30988:693;;;31044:2;31028:36;;;31065:12;:10;:12::i;:::-;31079:4;31085:7;31094:5;31028:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31024:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31291:1;31274:6;:13;:18;31270:341;;;31317:60;;;;;;;;;;:::i;:::-;;;;;;;;31270:341;31561:6;31555:13;31546:6;31542:2;31538:15;31531:38;31024:602;31161:45;;;31151:55;;;:6;:55;;;;31144:62;;;;;30988:693;31665:4;31658:11;;30845:843;;;;;;;:::o;32301:93::-;;;;:::o;37291:164::-;37395:10;:17;;;;37368:15;:24;37384:7;37368:24;;;;;;;;;;;:44;;;;37423:10;37439:7;37423:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37291:164;:::o;38082:988::-;38348:22;38398:1;38373:22;38390:4;38373:16;:22::i;:::-;:26;;;;:::i;:::-;38348:51;;38410:18;38431:17;:26;38449:7;38431:26;;;;;;;;;;;;38410:47;;38578:14;38564:10;:28;38560:328;;38609:19;38631:12;:18;38644:4;38631:18;;;;;;;;;;;;;;;:34;38650:14;38631:34;;;;;;;;;;;;38609:56;;38715:11;38682:12;:18;38695:4;38682:18;;;;;;;;;;;;;;;:30;38701:10;38682:30;;;;;;;;;;;:44;;;;38832:10;38799:17;:30;38817:11;38799:30;;;;;;;;;;;:43;;;;38560:328;;38984:17;:26;39002:7;38984:26;;;;;;;;;;;38977:33;;;39028:12;:18;39041:4;39028:18;;;;;;;;;;;;;;;:34;39047:14;39028:34;;;;;;;;;;;39021:41;;;38082:988;;;;:::o;39365:1079::-;39618:22;39663:1;39643:10;:17;;;;:21;;;;:::i;:::-;39618:46;;39675:18;39696:15;:24;39712:7;39696:24;;;;;;;;;;;;39675:45;;40047:19;40069:10;40080:14;40069:26;;;;;;;;;;;;;;;;;;;;;;;;40047:48;;40133:11;40108:10;40119;40108:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40244:10;40213:15;:28;40229:11;40213:28;;;;;;;;;;;:41;;;;40385:15;:24;40401:7;40385:24;;;;;;;;;;;40378:31;;;40420:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39365:1079;;;;:::o;36869:221::-;36954:14;36971:20;36988:2;36971:16;:20::i;:::-;36954:37;;37029:7;37002:12;:16;37015:2;37002:16;;;;;;;;;;;;;;;:24;37019:6;37002:24;;;;;;;;;;;:34;;;;37076:6;37047:17;:26;37065:7;37047:26;;;;;;;;;;;:35;;;;36869:221;;;:::o;28136:382::-;28230:1;28216:16;;:2;:16;;;;28208:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28289:16;28297:7;28289;:16::i;:::-;28288:17;28280:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28351:45;28380:1;28384:2;28388:7;28351:20;:45::i;:::-;28426:1;28409:9;:13;28419:2;28409:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28457:2;28438:7;:16;28446:7;28438:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28502:7;28498:2;28477:33;;28494:1;28477:33;;;;;;;;;;;;28136:382;;:::o;8002:422::-;8062:4;8270:12;8381:7;8369:20;8361:28;;8415:1;8408:4;:8;8401:15;;;8002:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:324::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:28;7698:1;7693:3;7689:11;7682:49;7757:2;7752:3;7748:12;7741:19;;7588:178;;;:::o;7772:375::-;;7935:67;7999:2;7994:3;7935:67;:::i;:::-;7928:74;;8032:34;8028:1;8023:3;8019:11;8012:55;8098:13;8093:2;8088:3;8084:12;8077:35;8138:2;8133:3;8129:12;8122:19;;7918:229;;;:::o;8153:382::-;;8316:67;8380:2;8375:3;8316:67;:::i;:::-;8309:74;;8413:34;8409:1;8404:3;8400:11;8393:55;8479:20;8474:2;8469:3;8465:12;8458:42;8526:2;8521:3;8517:12;8510:19;;8299:236;;;:::o;8541:370::-;;8704:67;8768:2;8763:3;8704:67;:::i;:::-;8697:74;;8801:34;8797:1;8792:3;8788:11;8781:55;8867:8;8862:2;8857:3;8853:12;8846:30;8902:2;8897:3;8893:12;8886:19;;8687:224;;;:::o;8917:326::-;;9080:67;9144:2;9139:3;9080:67;:::i;:::-;9073:74;;9177:30;9173:1;9168:3;9164:11;9157:51;9234:2;9229:3;9225:12;9218:19;;9063:180;;;:::o;9249:368::-;;9412:67;9476:2;9471:3;9412:67;:::i;:::-;9405:74;;9509:34;9505:1;9500:3;9496:11;9489:55;9575:6;9570:2;9565:3;9561:12;9554:28;9608:2;9603:3;9599:12;9592:19;;9395:222;;;:::o;9623:323::-;;9786:67;9850:2;9845:3;9786:67;:::i;:::-;9779:74;;9883:27;9879:1;9874:3;9870:11;9863:48;9937:2;9932:3;9928:12;9921:19;;9769:177;;;:::o;9952:324::-;;10115:67;10179:2;10174:3;10115:67;:::i;:::-;10108:74;;10212:28;10208:1;10203:3;10199:11;10192:49;10267:2;10262:3;10258:12;10251:19;;10098:178;;;:::o;10282:376::-;;10445:67;10509:2;10504:3;10445:67;:::i;:::-;10438:74;;10542:34;10538:1;10533:3;10529:11;10522:55;10608:14;10603:2;10598:3;10594:12;10587:36;10649:2;10644:3;10640:12;10633:19;;10428:230;;;:::o;10664:388::-;;10827:67;10891:2;10886:3;10827:67;:::i;:::-;10820:74;;10924:34;10920:1;10915:3;10911:11;10904:55;10990:26;10985:2;10980:3;10976:12;10969:48;11043:2;11038:3;11034:12;11027:19;;10810:242;;;:::o;11058:374::-;;11221:67;11285:2;11280:3;11221:67;:::i;:::-;11214:74;;11318:34;11314:1;11309:3;11305:11;11298:55;11384:12;11379:2;11374:3;11370:12;11363:34;11423:2;11418:3;11414:12;11407:19;;11204:228;;;:::o;11438:373::-;;11601:67;11665:2;11660:3;11601:67;:::i;:::-;11594:74;;11698:34;11694:1;11689:3;11685:11;11678:55;11764:11;11759:2;11754:3;11750:12;11743:33;11802:2;11797:3;11793:12;11786:19;;11584:227;;;:::o;11817:320::-;;11980:67;12044:2;12039:3;11980:67;:::i;:::-;11973:74;;12077:24;12073:1;12068:3;12064:11;12057:45;12128:2;12123:3;12119:12;12112:19;;11963:174;;;:::o;12143:366::-;;12306:67;12370:2;12365:3;12306:67;:::i;:::-;12299:74;;12403:34;12399:1;12394:3;12390:11;12383:55;12469:4;12464:2;12459:3;12455:12;12448:26;12500:2;12495:3;12491:12;12484:19;;12289:220;;;:::o;12515:330::-;;12678:67;12742:2;12737:3;12678:67;:::i;:::-;12671:74;;12775:34;12771:1;12766:3;12762:11;12755:55;12836:2;12831:3;12827:12;12820:19;;12661:184;;;:::o;12851:376::-;;13014:67;13078:2;13073:3;13014:67;:::i;:::-;13007:74;;13111:34;13107:1;13102:3;13098:11;13091:55;13177:14;13172:2;13167:3;13163:12;13156:36;13218:2;13213:3;13209:12;13202:19;;12997:230;;;:::o;13233:330::-;;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13493:34;13489:1;13484:3;13480:11;13473:55;13554:2;13549:3;13545:12;13538:19;;13379:184;;;:::o;13569:373::-;;13732:67;13796:2;13791:3;13732:67;:::i;:::-;13725:74;;13829:34;13825:1;13820:3;13816:11;13809:55;13895:11;13890:2;13885:3;13881:12;13874:33;13933:2;13928:3;13924:12;13917:19;;13715:227;;;:::o;13948:379::-;;14111:67;14175:2;14170:3;14111:67;:::i;:::-;14104:74;;14208:34;14204:1;14199:3;14195:11;14188:55;14274:17;14269:2;14264:3;14260:12;14253:39;14318:2;14313:3;14309:12;14302:19;;14094:233;;;:::o;14333:369::-;;14496:67;14560:2;14555:3;14496:67;:::i;:::-;14489:74;;14593:34;14589:1;14584:3;14580:11;14573:55;14659:7;14654:2;14649:3;14645:12;14638:29;14693:2;14688:3;14684:12;14677:19;;14479:223;;;:::o;14708:365::-;;14871:67;14935:2;14930:3;14871:67;:::i;:::-;14864:74;;14968:34;14964:1;14959:3;14955:11;14948:55;15034:3;15029:2;15024:3;15020:12;15013:25;15064:2;15059:3;15055:12;15048:19;;14854:219;;;:::o;15079:381::-;;15242:67;15306:2;15301:3;15242:67;:::i;:::-;15235:74;;15339:34;15335:1;15330:3;15326:11;15319:55;15405:19;15400:2;15395:3;15391:12;15384:41;15451:2;15446:3;15442:12;15435:19;;15225:235;;;:::o;15466:376::-;;15629:67;15693:2;15688:3;15629:67;:::i;:::-;15622:74;;15726:34;15722:1;15717:3;15713:11;15706:55;15792:14;15787:2;15782:3;15778:12;15771:36;15833:2;15828:3;15824:12;15817:19;;15612:230;;;:::o;15848:438::-;;16011:67;16075:2;16070:3;16011:67;:::i;:::-;16004:74;;16108:34;16104:1;16099:3;16095:11;16088:55;16174:34;16169:2;16164:3;16160:12;16153:56;16240:10;16235:2;16230:3;16226:12;16219:32;16277:2;16272:3;16268:12;16261:19;;15994:292;;;:::o;16292:118::-;16379:24;16397:5;16379:24;:::i;:::-;16374:3;16367:37;16357:53;;:::o;16416:435::-;;16618:95;16709:3;16700:6;16618:95;:::i;:::-;16611:102;;16730:95;16821:3;16812:6;16730:95;:::i;:::-;16723:102;;16842:3;16835:10;;16600:251;;;;;:::o;16857:222::-;;16988:2;16977:9;16973:18;16965:26;;17001:71;17069:1;17058:9;17054:17;17045:6;17001:71;:::i;:::-;16955:124;;;;:::o;17085:640::-;;17318:3;17307:9;17303:19;17295:27;;17332:71;17400:1;17389:9;17385:17;17376:6;17332:71;:::i;:::-;17413:72;17481:2;17470:9;17466:18;17457:6;17413:72;:::i;:::-;17495;17563:2;17552:9;17548:18;17539:6;17495:72;:::i;:::-;17614:9;17608:4;17604:20;17599:2;17588:9;17584:18;17577:48;17642:76;17713:4;17704:6;17642:76;:::i;:::-;17634:84;;17285:440;;;;;;;:::o;17731:210::-;;17856:2;17845:9;17841:18;17833:26;;17869:65;17931:1;17920:9;17916:17;17907:6;17869:65;:::i;:::-;17823:118;;;;:::o;17947:313::-;;18098:2;18087:9;18083:18;18075:26;;18147:9;18141:4;18137:20;18133:1;18122:9;18118:17;18111:47;18175:78;18248:4;18239:6;18175:78;:::i;:::-;18167:86;;18065:195;;;;:::o;18266:419::-;;18470:2;18459:9;18455:18;18447:26;;18519:9;18513:4;18509:20;18505:1;18494:9;18490:17;18483:47;18547:131;18673:4;18547:131;:::i;:::-;18539:139;;18437:248;;;:::o;18691:419::-;;18895:2;18884:9;18880:18;18872:26;;18944:9;18938:4;18934:20;18930:1;18919:9;18915:17;18908:47;18972:131;19098:4;18972:131;:::i;:::-;18964:139;;18862:248;;;:::o;19116:419::-;;19320:2;19309:9;19305:18;19297:26;;19369:9;19363:4;19359:20;19355:1;19344:9;19340:17;19333:47;19397:131;19523:4;19397:131;:::i;:::-;19389:139;;19287:248;;;:::o;19541:419::-;;19745:2;19734:9;19730:18;19722:26;;19794:9;19788:4;19784:20;19780:1;19769:9;19765:17;19758:47;19822:131;19948:4;19822:131;:::i;:::-;19814:139;;19712:248;;;:::o;19966:419::-;;20170:2;20159:9;20155:18;20147:26;;20219:9;20213:4;20209:20;20205:1;20194:9;20190:17;20183:47;20247:131;20373:4;20247:131;:::i;:::-;20239:139;;20137:248;;;:::o;20391:419::-;;20595:2;20584:9;20580:18;20572:26;;20644:9;20638:4;20634:20;20630:1;20619:9;20615:17;20608:47;20672:131;20798:4;20672:131;:::i;:::-;20664:139;;20562:248;;;:::o;20816:419::-;;21020:2;21009:9;21005:18;20997:26;;21069:9;21063:4;21059:20;21055:1;21044:9;21040:17;21033:47;21097:131;21223:4;21097:131;:::i;:::-;21089:139;;20987:248;;;:::o;21241:419::-;;21445:2;21434:9;21430:18;21422:26;;21494:9;21488:4;21484:20;21480:1;21469:9;21465:17;21458:47;21522:131;21648:4;21522:131;:::i;:::-;21514:139;;21412:248;;;:::o;21666:419::-;;21870:2;21859:9;21855:18;21847:26;;21919:9;21913:4;21909:20;21905:1;21894:9;21890:17;21883:47;21947:131;22073:4;21947:131;:::i;:::-;21939:139;;21837:248;;;:::o;22091:419::-;;22295:2;22284:9;22280:18;22272:26;;22344:9;22338:4;22334:20;22330:1;22319:9;22315:17;22308:47;22372:131;22498:4;22372:131;:::i;:::-;22364:139;;22262:248;;;:::o;22516:419::-;;22720:2;22709:9;22705:18;22697:26;;22769:9;22763:4;22759:20;22755:1;22744:9;22740:17;22733:47;22797:131;22923:4;22797:131;:::i;:::-;22789:139;;22687:248;;;:::o;22941:419::-;;23145:2;23134:9;23130:18;23122:26;;23194:9;23188:4;23184:20;23180:1;23169:9;23165:17;23158:47;23222:131;23348:4;23222:131;:::i;:::-;23214:139;;23112:248;;;:::o;23366:419::-;;23570:2;23559:9;23555:18;23547:26;;23619:9;23613:4;23609:20;23605:1;23594:9;23590:17;23583:47;23647:131;23773:4;23647:131;:::i;:::-;23639:139;;23537:248;;;:::o;23791:419::-;;23995:2;23984:9;23980:18;23972:26;;24044:9;24038:4;24034:20;24030:1;24019:9;24015:17;24008:47;24072:131;24198:4;24072:131;:::i;:::-;24064:139;;23962:248;;;:::o;24216:419::-;;24420:2;24409:9;24405:18;24397:26;;24469:9;24463:4;24459:20;24455:1;24444:9;24440:17;24433:47;24497:131;24623:4;24497:131;:::i;:::-;24489:139;;24387:248;;;:::o;24641:419::-;;24845:2;24834:9;24830:18;24822:26;;24894:9;24888:4;24884:20;24880:1;24869:9;24865:17;24858:47;24922:131;25048:4;24922:131;:::i;:::-;24914:139;;24812:248;;;:::o;25066:419::-;;25270:2;25259:9;25255:18;25247:26;;25319:9;25313:4;25309:20;25305:1;25294:9;25290:17;25283:47;25347:131;25473:4;25347:131;:::i;:::-;25339:139;;25237:248;;;:::o;25491:419::-;;25695:2;25684:9;25680:18;25672:26;;25744:9;25738:4;25734:20;25730:1;25719:9;25715:17;25708:47;25772:131;25898:4;25772:131;:::i;:::-;25764:139;;25662:248;;;:::o;25916:419::-;;26120:2;26109:9;26105:18;26097:26;;26169:9;26163:4;26159:20;26155:1;26144:9;26140:17;26133:47;26197:131;26323:4;26197:131;:::i;:::-;26189:139;;26087:248;;;:::o;26341:419::-;;26545:2;26534:9;26530:18;26522:26;;26594:9;26588:4;26584:20;26580:1;26569:9;26565:17;26558:47;26622:131;26748:4;26622:131;:::i;:::-;26614:139;;26512:248;;;:::o;26766:419::-;;26970:2;26959:9;26955:18;26947:26;;27019:9;27013:4;27009:20;27005:1;26994:9;26990:17;26983:47;27047:131;27173:4;27047:131;:::i;:::-;27039:139;;26937:248;;;:::o;27191:419::-;;27395:2;27384:9;27380:18;27372:26;;27444:9;27438:4;27434:20;27430:1;27419:9;27415:17;27408:47;27472:131;27598:4;27472:131;:::i;:::-;27464:139;;27362:248;;;:::o;27616:419::-;;27820:2;27809:9;27805:18;27797:26;;27869:9;27863:4;27859:20;27855:1;27844:9;27840:17;27833:47;27897:131;28023:4;27897:131;:::i;:::-;27889:139;;27787:248;;;:::o;28041:419::-;;28245:2;28234:9;28230:18;28222:26;;28294:9;28288:4;28284:20;28280:1;28269:9;28265:17;28258:47;28322:131;28448:4;28322:131;:::i;:::-;28314:139;;28212:248;;;:::o;28466:222::-;;28597:2;28586:9;28582:18;28574:26;;28610:71;28678:1;28667:9;28663:17;28654:6;28610:71;:::i;:::-;28564:124;;;;:::o;28694:283::-;;28760:2;28754:9;28744:19;;28802:4;28794:6;28790:17;28909:6;28897:10;28894:22;28873:18;28861:10;28858:34;28855:62;28852:2;;;28920:18;;:::i;:::-;28852:2;28960:10;28956:2;28949:22;28734:243;;;;:::o;28983:331::-;;29134:18;29126:6;29123:30;29120:2;;;29156:18;;:::i;:::-;29120:2;29241:4;29237:9;29230:4;29222:6;29218:17;29214:33;29206:41;;29302:4;29296;29292:15;29284:23;;29049:265;;;:::o;29320:332::-;;29472:18;29464:6;29461:30;29458:2;;;29494:18;;:::i;:::-;29458:2;29579:4;29575:9;29568:4;29560:6;29556:17;29552:33;29544:41;;29640:4;29634;29630:15;29622:23;;29387:265;;;:::o;29658:98::-;;29743:5;29737:12;29727:22;;29716:40;;;:::o;29762:99::-;;29848:5;29842:12;29832:22;;29821:40;;;:::o;29867:168::-;;29984:6;29979:3;29972:19;30024:4;30019:3;30015:14;30000:29;;29962:73;;;;:::o;30041:169::-;;30159:6;30154:3;30147:19;30199:4;30194:3;30190:14;30175:29;;30137:73;;;;:::o;30216:148::-;;30355:3;30340:18;;30330:34;;;;:::o;30370:305::-;;30429:20;30447:1;30429:20;:::i;:::-;30424:25;;30463:20;30481:1;30463:20;:::i;:::-;30458:25;;30617:1;30549:66;30545:74;30542:1;30539:81;30536:2;;;30623:18;;:::i;:::-;30536:2;30667:1;30664;30660:9;30653:16;;30414:261;;;;:::o;30681:185::-;;30738:20;30756:1;30738:20;:::i;:::-;30733:25;;30772:20;30790:1;30772:20;:::i;:::-;30767:25;;30811:1;30801:2;;30816:18;;:::i;:::-;30801:2;30858:1;30855;30851:9;30846:14;;30723:143;;;;:::o;30872:348::-;;30935:20;30953:1;30935:20;:::i;:::-;30930:25;;30969:20;30987:1;30969:20;:::i;:::-;30964:25;;31157:1;31089:66;31085:74;31082:1;31079:81;31074:1;31067:9;31060:17;31056:105;31053:2;;;31164:18;;:::i;:::-;31053:2;31212:1;31209;31205:9;31194:20;;30920:300;;;;:::o;31226:191::-;;31286:20;31304:1;31286:20;:::i;:::-;31281:25;;31320:20;31338:1;31320:20;:::i;:::-;31315:25;;31359:1;31356;31353:8;31350:2;;;31364:18;;:::i;:::-;31350:2;31409:1;31406;31402:9;31394:17;;31271:146;;;;:::o;31423:96::-;;31489:24;31507:5;31489:24;:::i;:::-;31478:35;;31468:51;;;:::o;31525:90::-;;31602:5;31595:13;31588:21;31577:32;;31567:48;;;:::o;31621:149::-;;31697:66;31690:5;31686:78;31675:89;;31665:105;;;:::o;31776:126::-;;31853:42;31846:5;31842:54;31831:65;;31821:81;;;:::o;31908:77::-;;31974:5;31963:16;;31953:32;;;:::o;31991:154::-;32075:6;32070:3;32065;32052:30;32137:1;32128:6;32123:3;32119:16;32112:27;32042:103;;;:::o;32151:307::-;32219:1;32229:113;32243:6;32240:1;32237:13;32229:113;;;32328:1;32323:3;32319:11;32313:18;32309:1;32304:3;32300:11;32293:39;32265:2;32262:1;32258:10;32253:15;;32229:113;;;32360:6;32357:1;32354:13;32351:2;;;32440:1;32431:6;32426:3;32422:16;32415:27;32351:2;32200:258;;;;:::o;32464:320::-;;32545:1;32539:4;32535:12;32525:22;;32592:1;32586:4;32582:12;32613:18;32603:2;;32669:4;32661:6;32657:17;32647:27;;32603:2;32731;32723:6;32720:14;32700:18;32697:38;32694:2;;;32750:18;;:::i;:::-;32694:2;32515:269;;;;:::o;32790:233::-;;32852:24;32870:5;32852:24;:::i;:::-;32843:33;;32898:66;32891:5;32888:77;32885:2;;;32968:18;;:::i;:::-;32885:2;33015:1;33008:5;33004:13;32997:20;;32833:190;;;:::o;33029:176::-;;33078:20;33096:1;33078:20;:::i;:::-;33073:25;;33112:20;33130:1;33112:20;:::i;:::-;33107:25;;33151:1;33141:2;;33156:18;;:::i;:::-;33141:2;33197:1;33194;33190:9;33185:14;;33063:142;;;;:::o;33211:180::-;33259:77;33256:1;33249:88;33356:4;33353:1;33346:15;33380:4;33377:1;33370:15;33397:180;33445:77;33442:1;33435:88;33542:4;33539:1;33532:15;33566:4;33563:1;33556:15;33583:180;33631:77;33628:1;33621:88;33728:4;33725:1;33718:15;33752:4;33749:1;33742:15;33769:180;33817:77;33814:1;33807:88;33914:4;33911:1;33904:15;33938:4;33935:1;33928:15;33955:102;;34047:2;34043:7;34038:2;34031:5;34027:14;34023:28;34013:38;;34003:54;;;:::o;34063:122::-;34136:24;34154:5;34136:24;:::i;:::-;34129:5;34126:35;34116:2;;34175:1;34172;34165:12;34116:2;34106:79;:::o;34191:116::-;34261:21;34276:5;34261:21;:::i;:::-;34254:5;34251:32;34241:2;;34297:1;34294;34287:12;34241:2;34231:76;:::o;34313:120::-;34385:23;34402:5;34385:23;:::i;:::-;34378:5;34375:34;34365:2;;34423:1;34420;34413:12;34365:2;34355:78;:::o;34439:122::-;34512:24;34530:5;34512:24;:::i;:::-;34505:5;34502:35;34492:2;;34551:1;34548;34541:12;34492:2;34482:79;:::o

Swarm Source

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