ETH Price: $3,370.88 (-3.31%)

Token

Saibushi (S)
 

Overview

Max Total Supply

4,444 S

Holders

3,246

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 S
0xe4f399c6cb7efb6d1ae7aaa9cea6054ae9ac3272
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:
Saibushi

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-27
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/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);
}



pragma solidity >=0.8.2;
// to enable certain compiler features

//import '@openzeppelin/contracts/token/ERC721/ERC721.sol';


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;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

contract Saibushi is ERC721, Ownable {
    using Strings for uint256;

    //amount of tokens that have been minted so far, in total and in presale
    uint256 private numberOfTotalTokens;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
    
    //the amount of reserved mints that have currently been executed by creator and giveaways
    uint private _reservedMints;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;
    
    //marks the timestamp of when the respective sales open
    uint256 internal presaleLaunchTime;
    uint256 internal publicSaleLaunchTime;
    uint256 internal revealTime;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddressPresale;
    mapping(address => uint256) public mintsPerAddressPublicSale;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;
    
    //declaring initial values for variables
    constructor() ERC721('Saibushi', 'S') {
        maxTotalTokens = 4444;

        unrevealedURI = "ipfs://QmXc1Q4QKw87qer4NpzCf5XjMYB8CcrWcq6WVi5PvuvwnT/";
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }

    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }
    
    //gets the tokenID of NFT to be minted
    function tokenId() internal view returns(uint256) {
        return numberOfTotalTokens + 1;
    }

    function switchToPresale() public onlyOwner {
        require(saleState() == State.NoSale, 'Sale is already Open!');
        presaleLaunchTime = block.timestamp;
    }

    function switchToPublic () public onlyOwner {
        require(saleState() == State.Presale, 'Cannot Open Public Sale!');
        publicSaleLaunchTime = block.timestamp;
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(numberOfTotalTokens < maxTotalTokens, "Not enough NFTs left to mint..");
        require(mintsPerAddressPresale[msg.sender] < 1, "Maximum 1 Mint per Address allowed!");

        uint256 tid = tokenId();
        _safeMint(msg.sender, tid);
        mintsPerAddressPresale[msg.sender] += 1;
        numberOfTotalTokens += 1;
        

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint() public {
        State saleState_ = saleState();
        require(saleState_ == State.PublicSale, "Public Sale in not open yet!");
        require(numberOfTotalTokens < maxTotalTokens, "Not enough NFTs left to mint..");
        require(mintsPerAddressPublicSale[msg.sender] < 1, "Maximum 1 Mint per Address allowed!");

        uint256 tid = tokenId();
        _safeMint(msg.sender, tid);
        mintsPerAddressPublicSale[msg.sender] += 1;
        numberOfTotalTokens += 1;
        
    }
    
    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (revealTime == 0) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //reserved NFTs for creator
    function reservedMint(uint number, address recipient) public onlyOwner {
        require(_reservedMints + number <= maxTotalTokens, "Not enough NFTs left to mint..");

        for (uint i = 0; i < number; i++) {
            _safeMint(recipient, _reservedMints + 1);
            numberOfTotalTokens += 1;
            _reservedMints += 1;
        }    
        
    }
    
    //burn the tokens that have not been sold yet
    function burnTokens() public onlyOwner {
        maxTotalTokens = numberOfTotalTokens;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //retrieve all funds recieved from minting
    function withdraw() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, 'No Funds to withdraw, Balance is 0');

        _withdraw(payable(owner()), (balance * 50) / 100); 
        _withdraw(payable(owner()), accountBalance()); //to avoid dust eth
    }
    
    //send the percentage of funds to a shareholder´s wallet
    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //see the total amount of tokens that have been minted
    function totalSupply() public view returns(uint) {
        return numberOfTotalTokens;
    }

    //see the current state of the sale
    function saleState() public view returns(State){
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (publicSaleLaunchTime == 0) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }

    //see when NFTs will be revealed
    function timeOfReveal() public view returns(uint256) {
        require(revealTime != 0, 'NFT Reveal Time has not been determined yet!');
        return revealTime;
    }

    //reveal the collection
    function reveal() public onlyOwner {
        require(revealTime == 0, "Has already been revealed!");
        revealTime = block.timestamp;
    }
    
   
}

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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddressPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddressPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicSaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","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":"saleState","outputs":[{"internalType":"enum Saibushi.State","name":"","type":"uint8"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfReveal","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":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040527380e4929c869102140e69550bbecc20bed61b080c600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600881526020017f53616962757368690000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f53000000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000eb92919062000236565b5080600190805190602001906200010492919062000236565b505050620001276200011b6200016860201b60201c565b6200017060201b60201c565b61115c60098190555060405180606001604052806036815260200162004ede60369139601290805190602001906200016192919062000236565b506200034b565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002449062000315565b90600052602060002090601f016020900481019282620002685760008555620002b4565b82601f106200028357805160ff1916838001178555620002b4565b82800160010185558215620002b4579182015b82811115620002b357825182559160200191906001019062000296565b5b509050620002c39190620002c7565b5090565b5b80821115620002e2576000816000905550600101620002c8565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200032e57607f821691505b60208210811415620003455762000344620002e6565b5b50919050565b614b83806200035b6000396000f3fe6080604052600436106102085760003560e01c806370a0823111610118578063a475b5dd116100a0578063c87b56dd1161006f578063c87b56dd14610724578063d2eb86ee14610761578063e985e9c514610778578063eab41782146107b5578063f2fde38b146107cc5761020f565b8063a475b5dd14610690578063b0a1c1c4146106a7578063b88d4fde146106d2578063c4d8b9df146106fb5761020f565b80638da5cb5b116100e75780638da5cb5b146105d15780638fd0aeb2146105fc57806395d89b4114610613578063a22cb4651461063e578063a23b69ad146106675761020f565b806370a0823114610515578063715018a6146105525780637c76f698146105695780637ee66f9d146105945761020f565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e1461041c5780635614e6dc14610445578063603f4d52146104825780636352211e146104ad5780637035bf18146104ea5761020f565b806323b872dd14610376578063326241141461039f57806339a0c6f9146103dc5780633ccfd60b146104055761020f565b8063081812fc116101d7578063081812fc146102bc578063095ea7b3146102f957806318160ddd1461032257806318df64031461034d5761020f565b80630191a6571461021457806301ffc9a71461023d57806306fdde031461027a57806308003f78146102a55761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612f20565b6107f5565b005b34801561024957600080fd5b50610264600480360381019061025f9190612fa5565b6108b5565b6040516102719190612fed565b60405180910390f35b34801561028657600080fd5b5061028f610997565b60405161029c91906130a1565b60405180910390f35b3480156102b157600080fd5b506102ba610a29565b005b3480156102c857600080fd5b506102e360048036038101906102de91906130f9565b610ab0565b6040516102f09190613135565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b9190613150565b610b35565b005b34801561032e57600080fd5b50610337610c4d565b604051610344919061319f565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f91906131ba565b610c57565b005b34801561038257600080fd5b5061039d600480360381019061039891906131fa565b610d94565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906132bc565b610df4565b6040516103d39190612fed565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613458565b610ef2565b005b34801561041157600080fd5b5061041a610f88565b005b34801561042857600080fd5b50610443600480360381019061043e91906131fa565b611097565b005b34801561045157600080fd5b5061046c60048036038101906104679190612f20565b6110b7565b604051610479919061319f565b60405180910390f35b34801561048e57600080fd5b506104976110cf565b6040516104a49190613518565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf91906130f9565b611100565b6040516104e19190613135565b60405180910390f35b3480156104f657600080fd5b506104ff6111b2565b60405161050c91906130a1565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190612f20565b611240565b604051610549919061319f565b60405180910390f35b34801561055e57600080fd5b506105676112f8565b005b34801561057557600080fd5b5061057e611380565b60405161058b919061319f565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190612f20565b6113cf565b6040516105c8919061319f565b60405180910390f35b3480156105dd57600080fd5b506105e66113e7565b6040516105f39190613135565b60405180910390f35b34801561060857600080fd5b50610611611411565b005b34801561061f57600080fd5b50610628611504565b60405161063591906130a1565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061355f565b611596565b005b34801561067357600080fd5b5061068e6004803603810190610689919061359f565b611717565b005b34801561069c57600080fd5b506106a5611999565b005b3480156106b357600080fd5b506106bc611a63565b6040516106c9919061319f565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190613693565b611ae7565b005b34801561070757600080fd5b50610722600480360381019061071d9190613458565b611b49565b005b34801561073057600080fd5b5061074b600480360381019061074691906130f9565b611bdf565b60405161075891906130a1565b60405180910390f35b34801561076d57600080fd5b50610776611d24565b005b34801561078457600080fd5b5061079f600480360381019061079a9190613716565b611ee9565b6040516107ac9190612fed565b60405180910390f35b3480156107c157600080fd5b506107ca611f7d565b005b3480156107d857600080fd5b506107f360048036038101906107ee9190612f20565b612070565b005b6107fd612168565b73ffffffffffffffffffffffffffffffffffffffff1661081b6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610868906137a2565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f82612170565b5b9050919050565b6060600080546109a6906137f1565b80601f01602080910402602001604051908101604052809291908181526020018280546109d2906137f1565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b610a31612168565b73ffffffffffffffffffffffffffffffffffffffff16610a4f6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c906137a2565b60405180910390fd5b600854600981905550565b6000610abb826121da565b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613895565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4082611100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613927565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd0612168565b73ffffffffffffffffffffffffffffffffffffffff161480610bff5750610bfe81610bf9612168565b611ee9565b5b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906139b9565b60405180910390fd5b610c488383612246565b505050565b6000600854905090565b610c5f612168565b73ffffffffffffffffffffffffffffffffffffffff16610c7d6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca906137a2565b60405180910390fd5b60095482600b54610ce49190613a08565b1115610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90613aaa565b60405180910390fd5b60005b82811015610d8f57610d48826001600b54610d439190613a08565b6122ff565b600160086000828254610d5b9190613a08565b925050819055506001600b6000828254610d759190613a08565b925050819055508080610d8790613aca565b915050610d28565b505050565b610da5610d9f612168565b8261231d565b610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90613b85565b60405180910390fd5b610def8383836123fb565b505050565b6000803086604051602001610e0a929190613bed565b604051602081830303815290604052805190602001209050600181604051602001610e359190613c91565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610e6b9493929190613cd5565b6020604051602081039080840390855afa158015610e8d573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610efa612168565b73ffffffffffffffffffffffffffffffffffffffff16610f186113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906137a2565b60405180910390fd5b80600a9080519060200190610f84929190612e0b565b5050565b610f90612168565b73ffffffffffffffffffffffffffffffffffffffff16610fae6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb906137a2565b60405180910390fd5b600061100e611a63565b905060008111611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90613d8c565b60405180910390fd5b61107c61105e6113e7565b606460328461106d9190613dac565b6110779190613e35565b612657565b6110946110876113e7565b61108f611a63565b612657565b50565b6110b283838360405180602001604052806000815250611ae7565b505050565b60116020528060005260406000206000915090505481565b600080600d5414156110e457600090506110fd565b6000600e5414156110f857600190506110fd565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090613ed8565b60405180910390fd5b80915050919050565b601280546111bf906137f1565b80601f01602080910402602001604051908101604052809291908181526020018280546111eb906137f1565b80156112385780601f1061120d57610100808354040283529160200191611238565b820191906000526020600020905b81548152906001019060200180831161121b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890613f6a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611300612168565b73ffffffffffffffffffffffffffffffffffffffff1661131e6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b906137a2565b60405180910390fd5b61137e6000612708565b565b600080600f5414156113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90613ffc565b60405180910390fd5b600f54905090565b60106020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611419612168565b73ffffffffffffffffffffffffffffffffffffffff166114376113e7565b73ffffffffffffffffffffffffffffffffffffffff161461148d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611484906137a2565b60405180910390fd5b600160028111156114a1576114a06134a1565b5b6114a96110cf565b60028111156114bb576114ba6134a1565b5b146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290614068565b60405180910390fd5b42600e81905550565b606060018054611513906137f1565b80601f016020809104026020016040519081016040528092919081815260200182805461153f906137f1565b801561158c5780601f106115615761010080835404028352916020019161158c565b820191906000526020600020905b81548152906001019060200180831161156f57829003601f168201915b5050505050905090565b61159e612168565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561160c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611603906140d4565b60405180910390fd5b8060056000611619612168565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c6612168565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161170b9190612fed565b60405180910390a35050565b82828261172633848484610df4565b611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c90614140565b60405180910390fd5b600061176f6110cf565b905060006002811115611785576117846134a1565b5b816002811115611798576117976134a1565b5b14156117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d0906141ac565b60405180910390fd5b6002808111156117ec576117eb6134a1565b5b8160028111156117ff576117fe6134a1565b5b1415611840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118379061423e565b60405180910390fd5b60095460085410611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613aaa565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff906142d0565b60405180910390fd5b60006119126127ce565b905061191e33826122ff565b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461196e9190613a08565b925050819055506001600860008282546119889190613a08565b925050819055505050505050505050565b6119a1612168565b73ffffffffffffffffffffffffffffffffffffffff166119bf6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906137a2565b60405180910390fd5b6000600f5414611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a519061433c565b60405180910390fd5b42600f81905550565b6000611a6d612168565b73ffffffffffffffffffffffffffffffffffffffff16611a8b6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad8906137a2565b60405180910390fd5b47905090565b611af8611af2612168565b8361231d565b611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90613b85565b60405180910390fd5b611b43848484846127e4565b50505050565b611b51612168565b73ffffffffffffffffffffffffffffffffffffffff16611b6f6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc906137a2565b60405180910390fd5b8060129080519060200190611bdb929190612e0b565b5050565b6060611bea826121da565b611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c20906143ce565b60405180910390fd5b6000600f541415611cc65760128054611c41906137f1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6d906137f1565b8015611cba5780601f10611c8f57610100808354040283529160200191611cba565b820191906000526020600020905b815481529060010190602001808311611c9d57829003601f168201915b50505050509050611d1f565b6000611cd0612840565b90506000815111611cf05760405180602001604052806000815250611d1b565b80611cfa846128d2565b604051602001611d0b92919061446b565b6040516020818303038152906040525b9150505b919050565b6000611d2e6110cf565b9050600280811115611d4357611d426134a1565b5b816002811115611d5657611d556134a1565b5b14611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d906144e6565b60405180910390fd5b60095460085410611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd390613aaa565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e55906142d0565b60405180910390fd5b6000611e686127ce565b9050611e7433826122ff565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec49190613a08565b92505081905550600160086000828254611ede9190613a08565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f85612168565b73ffffffffffffffffffffffffffffffffffffffff16611fa36113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff0906137a2565b60405180910390fd5b6000600281111561200d5761200c6134a1565b5b6120156110cf565b6002811115612027576120266134a1565b5b14612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205e90614552565b60405180910390fd5b42600d81905550565b612078612168565b73ffffffffffffffffffffffffffffffffffffffff166120966113e7565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e3906137a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561215c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612153906145e4565b60405180910390fd5b61216581612708565b50565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122b983611100565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612319828260405180602001604052806000815250612a33565b5050565b6000612328826121da565b612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e90614676565b60405180910390fd5b600061237283611100565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e157508373ffffffffffffffffffffffffffffffffffffffff166123c984610ab0565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f257506123f18185611ee9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241b82611100565b73ffffffffffffffffffffffffffffffffffffffff1614612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246890614708565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d89061479a565b60405180910390fd5b6124ec838383612a8e565b6124f7600082612246565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254791906147ba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259e9190613a08565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161267d9061481f565b60006040518083038185875af1925050503d80600081146126ba576040519150601f19603f3d011682016040523d82523d6000602084013e6126bf565b606091505b5050905080612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90614880565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060016008546127df9190613a08565b905090565b6127ef8484846123fb565b6127fb84848484612a93565b61283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283190614912565b60405180910390fd5b50505050565b6060600a805461284f906137f1565b80601f016020809104026020016040519081016040528092919081815260200182805461287b906137f1565b80156128c85780601f1061289d576101008083540402835291602001916128c8565b820191906000526020600020905b8154815290600101906020018083116128ab57829003601f168201915b5050505050905090565b6060600082141561291a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a2e565b600082905060005b6000821461294c57808061293590613aca565b915050600a826129459190613e35565b9150612922565b60008167ffffffffffffffff8111156129685761296761332d565b5b6040519080825280601f01601f19166020018201604052801561299a5781602001600182028036833780820191505090505b5090505b60008514612a27576001826129b391906147ba565b9150600a856129c29190614932565b60306129ce9190613a08565b60f81b8183815181106129e4576129e3614963565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a209190613e35565b945061299e565b8093505050505b919050565b612a3d8383612c2a565b612a4a6000848484612a93565b612a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8090614912565b60405180910390fd5b505050565b505050565b6000612ab48473ffffffffffffffffffffffffffffffffffffffff16612df8565b15612c1d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612add612168565b8786866040518563ffffffff1660e01b8152600401612aff94939291906149e7565b602060405180830381600087803b158015612b1957600080fd5b505af1925050508015612b4a57506040513d601f19601f82011682018060405250810190612b479190614a48565b60015b612bcd573d8060008114612b7a576040519150601f19603f3d011682016040523d82523d6000602084013e612b7f565b606091505b50600081511415612bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbc90614912565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c22565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190614ac1565b60405180910390fd5b612ca3816121da565b15612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cda90614b2d565b60405180910390fd5b612cef60008383612a8e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3f9190613a08565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612e17906137f1565b90600052602060002090601f016020900481019282612e395760008555612e80565b82601f10612e5257805160ff1916838001178555612e80565b82800160010185558215612e80579182015b82811115612e7f578251825591602001919060010190612e64565b5b509050612e8d9190612e91565b5090565b5b80821115612eaa576000816000905550600101612e92565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eed82612ec2565b9050919050565b612efd81612ee2565b8114612f0857600080fd5b50565b600081359050612f1a81612ef4565b92915050565b600060208284031215612f3657612f35612eb8565b5b6000612f4484828501612f0b565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f8281612f4d565b8114612f8d57600080fd5b50565b600081359050612f9f81612f79565b92915050565b600060208284031215612fbb57612fba612eb8565b5b6000612fc984828501612f90565b91505092915050565b60008115159050919050565b612fe781612fd2565b82525050565b60006020820190506130026000830184612fde565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613042578082015181840152602081019050613027565b83811115613051576000848401525b50505050565b6000601f19601f8301169050919050565b600061307382613008565b61307d8185613013565b935061308d818560208601613024565b61309681613057565b840191505092915050565b600060208201905081810360008301526130bb8184613068565b905092915050565b6000819050919050565b6130d6816130c3565b81146130e157600080fd5b50565b6000813590506130f3816130cd565b92915050565b60006020828403121561310f5761310e612eb8565b5b600061311d848285016130e4565b91505092915050565b61312f81612ee2565b82525050565b600060208201905061314a6000830184613126565b92915050565b6000806040838503121561316757613166612eb8565b5b600061317585828601612f0b565b9250506020613186858286016130e4565b9150509250929050565b613199816130c3565b82525050565b60006020820190506131b46000830184613190565b92915050565b600080604083850312156131d1576131d0612eb8565b5b60006131df858286016130e4565b92505060206131f085828601612f0b565b9150509250929050565b60008060006060848603121561321357613212612eb8565b5b600061322186828701612f0b565b935050602061323286828701612f0b565b9250506040613243868287016130e4565b9150509250925092565b600060ff82169050919050565b6132638161324d565b811461326e57600080fd5b50565b6000813590506132808161325a565b92915050565b6000819050919050565b61329981613286565b81146132a457600080fd5b50565b6000813590506132b681613290565b92915050565b600080600080608085870312156132d6576132d5612eb8565b5b60006132e487828801612f0b565b94505060206132f587828801613271565b9350506040613306878288016132a7565b9250506060613317878288016132a7565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61336582613057565b810181811067ffffffffffffffff821117156133845761338361332d565b5b80604052505050565b6000613397612eae565b90506133a3828261335c565b919050565b600067ffffffffffffffff8211156133c3576133c261332d565b5b6133cc82613057565b9050602081019050919050565b82818337600083830152505050565b60006133fb6133f6846133a8565b61338d565b90508281526020810184848401111561341757613416613328565b5b6134228482856133d9565b509392505050565b600082601f83011261343f5761343e613323565b5b813561344f8482602086016133e8565b91505092915050565b60006020828403121561346e5761346d612eb8565b5b600082013567ffffffffffffffff81111561348c5761348b612ebd565b5b6134988482850161342a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381106134e1576134e06134a1565b5b50565b60008190506134f2826134d0565b919050565b6000613502826134e4565b9050919050565b613512816134f7565b82525050565b600060208201905061352d6000830184613509565b92915050565b61353c81612fd2565b811461354757600080fd5b50565b60008135905061355981613533565b92915050565b6000806040838503121561357657613575612eb8565b5b600061358485828601612f0b565b92505060206135958582860161354a565b9150509250929050565b6000806000606084860312156135b8576135b7612eb8565b5b60006135c686828701613271565b93505060206135d7868287016132a7565b92505060406135e8868287016132a7565b9150509250925092565b600067ffffffffffffffff82111561360d5761360c61332d565b5b61361682613057565b9050602081019050919050565b6000613636613631846135f2565b61338d565b90508281526020810184848401111561365257613651613328565b5b61365d8482856133d9565b509392505050565b600082601f83011261367a57613679613323565b5b813561368a848260208601613623565b91505092915050565b600080600080608085870312156136ad576136ac612eb8565b5b60006136bb87828801612f0b565b94505060206136cc87828801612f0b565b93505060406136dd878288016130e4565b925050606085013567ffffffffffffffff8111156136fe576136fd612ebd565b5b61370a87828801613665565b91505092959194509250565b6000806040838503121561372d5761372c612eb8565b5b600061373b85828601612f0b565b925050602061374c85828601612f0b565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061378c602083613013565b915061379782613756565b602082019050919050565b600060208201905081810360008301526137bb8161377f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061380957607f821691505b6020821081141561381d5761381c6137c2565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061387f602c83613013565b915061388a82613823565b604082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613911602183613013565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006139a3603883613013565b91506139ae82613947565b604082019050919050565b600060208201905081810360008301526139d281613996565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a13826130c3565b9150613a1e836130c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5357613a526139d9565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000613a94601e83613013565b9150613a9f82613a5e565b602082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b6000613ad5826130c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0857613b076139d9565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b6f603183613013565b9150613b7a82613b13565b604082019050919050565b60006020820190508181036000830152613b9e81613b62565b9050919050565b60008160601b9050919050565b6000613bbd82613ba5565b9050919050565b6000613bcf82613bb2565b9050919050565b613be7613be282612ee2565b613bc4565b82525050565b6000613bf98285613bd6565b601482019150613c098284613bd6565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613c5a601c83613c19565b9150613c6582613c24565b601c82019050919050565b6000819050919050565b613c8b613c8682613286565b613c70565b82525050565b6000613c9c82613c4d565b9150613ca88284613c7a565b60208201915081905092915050565b613cc081613286565b82525050565b613ccf8161324d565b82525050565b6000608082019050613cea6000830187613cb7565b613cf76020830186613cc6565b613d046040830185613cb7565b613d116060830184613cb7565b95945050505050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d76602283613013565b9150613d8182613d1a565b604082019050919050565b60006020820190508181036000830152613da581613d69565b9050919050565b6000613db7826130c3565b9150613dc2836130c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dfb57613dfa6139d9565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e40826130c3565b9150613e4b836130c3565b925082613e5b57613e5a613e06565b5b828204905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613ec2602983613013565b9150613ecd82613e66565b604082019050919050565b60006020820190508181036000830152613ef181613eb5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f54602a83613013565b9150613f5f82613ef8565b604082019050919050565b60006020820190508181036000830152613f8381613f47565b9050919050565b7f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460008201527f65726d696e656420796574210000000000000000000000000000000000000000602082015250565b6000613fe6602c83613013565b9150613ff182613f8a565b604082019050919050565b6000602082019050818103600083015261401581613fd9565b9050919050565b7f43616e6e6f74204f70656e205075626c69632053616c65210000000000000000600082015250565b6000614052601883613013565b915061405d8261401c565b602082019050919050565b6000602082019050818103600083015261408181614045565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140be601983613013565b91506140c982614088565b602082019050919050565b600060208201905081810360008301526140ed816140b1565b9050919050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b600061412a601183613013565b9150614135826140f4565b602082019050919050565b600060208201905081810360008301526141598161411d565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000614196601583613013565b91506141a182614160565b602082019050919050565b600060208201905081810360008301526141c581614189565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000614228602a83613013565b9150614233826141cc565b604082019050919050565b600060208201905081810360008301526142578161421b565b9050919050565b7f4d6178696d756d2031204d696e7420706572204164647265737320616c6c6f7760008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b60006142ba602383613013565b91506142c58261425e565b604082019050919050565b600060208201905081810360008301526142e9816142ad565b9050919050565b7f48617320616c7265616479206265656e2072657665616c656421000000000000600082015250565b6000614326601a83613013565b9150614331826142f0565b602082019050919050565b6000602082019050818103600083015261435581614319565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143b8602f83613013565b91506143c38261435c565b604082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b60006143f982613008565b6144038185613c19565b9350614413818560208601613024565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614455600583613c19565b91506144608261441f565b600582019050919050565b600061447782856143ee565b915061448382846143ee565b915061448e82614448565b91508190509392505050565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b60006144d0601c83613013565b91506144db8261449a565b602082019050919050565b600060208201905081810360008301526144ff816144c3565b9050919050565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b600061453c601583613013565b915061454782614506565b602082019050919050565b6000602082019050818103600083015261456b8161452f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145ce602683613013565b91506145d982614572565b604082019050919050565b600060208201905081810360008301526145fd816145c1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614660602c83613013565b915061466b82614604565b604082019050919050565b6000602082019050818103600083015261468f81614653565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146f2602983613013565b91506146fd82614696565b604082019050919050565b60006020820190508181036000830152614721816146e5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614784602483613013565b915061478f82614728565b604082019050919050565b600060208201905081810360008301526147b381614777565b9050919050565b60006147c5826130c3565b91506147d0836130c3565b9250828210156147e3576147e26139d9565b5b828203905092915050565b600081905092915050565b50565b60006148096000836147ee565b9150614814826147f9565b600082019050919050565b600061482a826147fc565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061486a601483613013565b915061487582614834565b602082019050919050565b600060208201905081810360008301526148998161485d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148fc603283613013565b9150614907826148a0565b604082019050919050565b6000602082019050818103600083015261492b816148ef565b9050919050565b600061493d826130c3565b9150614948836130c3565b92508261495857614957613e06565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006149b982614992565b6149c3818561499d565b93506149d3818560208601613024565b6149dc81613057565b840191505092915050565b60006080820190506149fc6000830187613126565b614a096020830186613126565b614a166040830185613190565b8181036060830152614a2881846149ae565b905095945050505050565b600081519050614a4281612f79565b92915050565b600060208284031215614a5e57614a5d612eb8565b5b6000614a6c84828501614a33565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614aab602083613013565b9150614ab682614a75565b602082019050919050565b60006020820190508181036000830152614ada81614a9e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b17601c83613013565b9150614b2282614ae1565b602082019050919050565b60006020820190508181036000830152614b4681614b0a565b905091905056fea264697066735822122034b582fccad5b4f7de3e588f4b0f43b5eca290873aab31a43d29d3b5ffcaa7aa64736f6c63430008090033697066733a2f2f516d5863315134514b773837716572344e707a436635586a4d594238436372576371365756693550767576776e542f

Deployed Bytecode

0x6080604052600436106102085760003560e01c806370a0823111610118578063a475b5dd116100a0578063c87b56dd1161006f578063c87b56dd14610724578063d2eb86ee14610761578063e985e9c514610778578063eab41782146107b5578063f2fde38b146107cc5761020f565b8063a475b5dd14610690578063b0a1c1c4146106a7578063b88d4fde146106d2578063c4d8b9df146106fb5761020f565b80638da5cb5b116100e75780638da5cb5b146105d15780638fd0aeb2146105fc57806395d89b4114610613578063a22cb4651461063e578063a23b69ad146106675761020f565b806370a0823114610515578063715018a6146105525780637c76f698146105695780637ee66f9d146105945761020f565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e1461041c5780635614e6dc14610445578063603f4d52146104825780636352211e146104ad5780637035bf18146104ea5761020f565b806323b872dd14610376578063326241141461039f57806339a0c6f9146103dc5780633ccfd60b146104055761020f565b8063081812fc116101d7578063081812fc146102bc578063095ea7b3146102f957806318160ddd1461032257806318df64031461034d5761020f565b80630191a6571461021457806301ffc9a71461023d57806306fdde031461027a57806308003f78146102a55761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612f20565b6107f5565b005b34801561024957600080fd5b50610264600480360381019061025f9190612fa5565b6108b5565b6040516102719190612fed565b60405180910390f35b34801561028657600080fd5b5061028f610997565b60405161029c91906130a1565b60405180910390f35b3480156102b157600080fd5b506102ba610a29565b005b3480156102c857600080fd5b506102e360048036038101906102de91906130f9565b610ab0565b6040516102f09190613135565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b9190613150565b610b35565b005b34801561032e57600080fd5b50610337610c4d565b604051610344919061319f565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f91906131ba565b610c57565b005b34801561038257600080fd5b5061039d600480360381019061039891906131fa565b610d94565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906132bc565b610df4565b6040516103d39190612fed565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613458565b610ef2565b005b34801561041157600080fd5b5061041a610f88565b005b34801561042857600080fd5b50610443600480360381019061043e91906131fa565b611097565b005b34801561045157600080fd5b5061046c60048036038101906104679190612f20565b6110b7565b604051610479919061319f565b60405180910390f35b34801561048e57600080fd5b506104976110cf565b6040516104a49190613518565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf91906130f9565b611100565b6040516104e19190613135565b60405180910390f35b3480156104f657600080fd5b506104ff6111b2565b60405161050c91906130a1565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190612f20565b611240565b604051610549919061319f565b60405180910390f35b34801561055e57600080fd5b506105676112f8565b005b34801561057557600080fd5b5061057e611380565b60405161058b919061319f565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b69190612f20565b6113cf565b6040516105c8919061319f565b60405180910390f35b3480156105dd57600080fd5b506105e66113e7565b6040516105f39190613135565b60405180910390f35b34801561060857600080fd5b50610611611411565b005b34801561061f57600080fd5b50610628611504565b60405161063591906130a1565b60405180910390f35b34801561064a57600080fd5b506106656004803603810190610660919061355f565b611596565b005b34801561067357600080fd5b5061068e6004803603810190610689919061359f565b611717565b005b34801561069c57600080fd5b506106a5611999565b005b3480156106b357600080fd5b506106bc611a63565b6040516106c9919061319f565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f49190613693565b611ae7565b005b34801561070757600080fd5b50610722600480360381019061071d9190613458565b611b49565b005b34801561073057600080fd5b5061074b600480360381019061074691906130f9565b611bdf565b60405161075891906130a1565b60405180910390f35b34801561076d57600080fd5b50610776611d24565b005b34801561078457600080fd5b5061079f600480360381019061079a9190613716565b611ee9565b6040516107ac9190612fed565b60405180910390f35b3480156107c157600080fd5b506107ca611f7d565b005b3480156107d857600080fd5b506107f360048036038101906107ee9190612f20565b612070565b005b6107fd612168565b73ffffffffffffffffffffffffffffffffffffffff1661081b6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610868906137a2565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610990575061098f82612170565b5b9050919050565b6060600080546109a6906137f1565b80601f01602080910402602001604051908101604052809291908181526020018280546109d2906137f1565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b610a31612168565b73ffffffffffffffffffffffffffffffffffffffff16610a4f6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c906137a2565b60405180910390fd5b600854600981905550565b6000610abb826121da565b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190613895565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4082611100565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613927565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd0612168565b73ffffffffffffffffffffffffffffffffffffffff161480610bff5750610bfe81610bf9612168565b611ee9565b5b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906139b9565b60405180910390fd5b610c488383612246565b505050565b6000600854905090565b610c5f612168565b73ffffffffffffffffffffffffffffffffffffffff16610c7d6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca906137a2565b60405180910390fd5b60095482600b54610ce49190613a08565b1115610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90613aaa565b60405180910390fd5b60005b82811015610d8f57610d48826001600b54610d439190613a08565b6122ff565b600160086000828254610d5b9190613a08565b925050819055506001600b6000828254610d759190613a08565b925050819055508080610d8790613aca565b915050610d28565b505050565b610da5610d9f612168565b8261231d565b610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90613b85565b60405180910390fd5b610def8383836123fb565b505050565b6000803086604051602001610e0a929190613bed565b604051602081830303815290604052805190602001209050600181604051602001610e359190613c91565b6040516020818303038152906040528051906020012086868660405160008152602001604052604051610e6b9493929190613cd5565b6020604051602081039080840390855afa158015610e8d573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b610efa612168565b73ffffffffffffffffffffffffffffffffffffffff16610f186113e7565b73ffffffffffffffffffffffffffffffffffffffff1614610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906137a2565b60405180910390fd5b80600a9080519060200190610f84929190612e0b565b5050565b610f90612168565b73ffffffffffffffffffffffffffffffffffffffff16610fae6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb906137a2565b60405180910390fd5b600061100e611a63565b905060008111611053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104a90613d8c565b60405180910390fd5b61107c61105e6113e7565b606460328461106d9190613dac565b6110779190613e35565b612657565b6110946110876113e7565b61108f611a63565b612657565b50565b6110b283838360405180602001604052806000815250611ae7565b505050565b60116020528060005260406000206000915090505481565b600080600d5414156110e457600090506110fd565b6000600e5414156110f857600190506110fd565b600290505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a090613ed8565b60405180910390fd5b80915050919050565b601280546111bf906137f1565b80601f01602080910402602001604051908101604052809291908181526020018280546111eb906137f1565b80156112385780601f1061120d57610100808354040283529160200191611238565b820191906000526020600020905b81548152906001019060200180831161121b57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890613f6a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611300612168565b73ffffffffffffffffffffffffffffffffffffffff1661131e6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136b906137a2565b60405180910390fd5b61137e6000612708565b565b600080600f5414156113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be90613ffc565b60405180910390fd5b600f54905090565b60106020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611419612168565b73ffffffffffffffffffffffffffffffffffffffff166114376113e7565b73ffffffffffffffffffffffffffffffffffffffff161461148d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611484906137a2565b60405180910390fd5b600160028111156114a1576114a06134a1565b5b6114a96110cf565b60028111156114bb576114ba6134a1565b5b146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290614068565b60405180910390fd5b42600e81905550565b606060018054611513906137f1565b80601f016020809104026020016040519081016040528092919081815260200182805461153f906137f1565b801561158c5780601f106115615761010080835404028352916020019161158c565b820191906000526020600020905b81548152906001019060200180831161156f57829003601f168201915b5050505050905090565b61159e612168565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561160c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611603906140d4565b60405180910390fd5b8060056000611619612168565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116c6612168565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161170b9190612fed565b60405180910390a35050565b82828261172633848484610df4565b611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c90614140565b60405180910390fd5b600061176f6110cf565b905060006002811115611785576117846134a1565b5b816002811115611798576117976134a1565b5b14156117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d0906141ac565b60405180910390fd5b6002808111156117ec576117eb6134a1565b5b8160028111156117ff576117fe6134a1565b5b1415611840576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118379061423e565b60405180910390fd5b60095460085410611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90613aaa565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ff906142d0565b60405180910390fd5b60006119126127ce565b905061191e33826122ff565b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461196e9190613a08565b925050819055506001600860008282546119889190613a08565b925050819055505050505050505050565b6119a1612168565b73ffffffffffffffffffffffffffffffffffffffff166119bf6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c906137a2565b60405180910390fd5b6000600f5414611a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a519061433c565b60405180910390fd5b42600f81905550565b6000611a6d612168565b73ffffffffffffffffffffffffffffffffffffffff16611a8b6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad8906137a2565b60405180910390fd5b47905090565b611af8611af2612168565b8361231d565b611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90613b85565b60405180910390fd5b611b43848484846127e4565b50505050565b611b51612168565b73ffffffffffffffffffffffffffffffffffffffff16611b6f6113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc906137a2565b60405180910390fd5b8060129080519060200190611bdb929190612e0b565b5050565b6060611bea826121da565b611c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c20906143ce565b60405180910390fd5b6000600f541415611cc65760128054611c41906137f1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6d906137f1565b8015611cba5780601f10611c8f57610100808354040283529160200191611cba565b820191906000526020600020905b815481529060010190602001808311611c9d57829003601f168201915b50505050509050611d1f565b6000611cd0612840565b90506000815111611cf05760405180602001604052806000815250611d1b565b80611cfa846128d2565b604051602001611d0b92919061446b565b6040516020818303038152906040525b9150505b919050565b6000611d2e6110cf565b9050600280811115611d4357611d426134a1565b5b816002811115611d5657611d556134a1565b5b14611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d906144e6565b60405180910390fd5b60095460085410611ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd390613aaa565b60405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e55906142d0565b60405180910390fd5b6000611e686127ce565b9050611e7433826122ff565b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec49190613a08565b92505081905550600160086000828254611ede9190613a08565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f85612168565b73ffffffffffffffffffffffffffffffffffffffff16611fa36113e7565b73ffffffffffffffffffffffffffffffffffffffff1614611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff0906137a2565b60405180910390fd5b6000600281111561200d5761200c6134a1565b5b6120156110cf565b6002811115612027576120266134a1565b5b14612067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205e90614552565b60405180910390fd5b42600d81905550565b612078612168565b73ffffffffffffffffffffffffffffffffffffffff166120966113e7565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e3906137a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561215c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612153906145e4565b60405180910390fd5b61216581612708565b50565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122b983611100565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612319828260405180602001604052806000815250612a33565b5050565b6000612328826121da565b612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e90614676565b60405180910390fd5b600061237283611100565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e157508373ffffffffffffffffffffffffffffffffffffffff166123c984610ab0565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f257506123f18185611ee9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241b82611100565b73ffffffffffffffffffffffffffffffffffffffff1614612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246890614708565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d89061479a565b60405180910390fd5b6124ec838383612a8e565b6124f7600082612246565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254791906147ba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259e9190613a08565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161267d9061481f565b60006040518083038185875af1925050503d80600081146126ba576040519150601f19603f3d011682016040523d82523d6000602084013e6126bf565b606091505b5050905080612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa90614880565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600060016008546127df9190613a08565b905090565b6127ef8484846123fb565b6127fb84848484612a93565b61283a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283190614912565b60405180910390fd5b50505050565b6060600a805461284f906137f1565b80601f016020809104026020016040519081016040528092919081815260200182805461287b906137f1565b80156128c85780601f1061289d576101008083540402835291602001916128c8565b820191906000526020600020905b8154815290600101906020018083116128ab57829003601f168201915b5050505050905090565b6060600082141561291a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a2e565b600082905060005b6000821461294c57808061293590613aca565b915050600a826129459190613e35565b9150612922565b60008167ffffffffffffffff8111156129685761296761332d565b5b6040519080825280601f01601f19166020018201604052801561299a5781602001600182028036833780820191505090505b5090505b60008514612a27576001826129b391906147ba565b9150600a856129c29190614932565b60306129ce9190613a08565b60f81b8183815181106129e4576129e3614963565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a209190613e35565b945061299e565b8093505050505b919050565b612a3d8383612c2a565b612a4a6000848484612a93565b612a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8090614912565b60405180910390fd5b505050565b505050565b6000612ab48473ffffffffffffffffffffffffffffffffffffffff16612df8565b15612c1d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612add612168565b8786866040518563ffffffff1660e01b8152600401612aff94939291906149e7565b602060405180830381600087803b158015612b1957600080fd5b505af1925050508015612b4a57506040513d601f19601f82011682018060405250810190612b479190614a48565b60015b612bcd573d8060008114612b7a576040519150601f19603f3d011682016040523d82523d6000602084013e612b7f565b606091505b50600081511415612bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbc90614912565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c22565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9190614ac1565b60405180910390fd5b612ca3816121da565b15612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cda90614b2d565b60405180910390fd5b612cef60008383612a8e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d3f9190613a08565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612e17906137f1565b90600052602060002090601f016020900481019282612e395760008555612e80565b82601f10612e5257805160ff1916838001178555612e80565b82800160010185558215612e80579182015b82811115612e7f578251825591602001919060010190612e64565b5b509050612e8d9190612e91565b5090565b5b80821115612eaa576000816000905550600101612e92565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eed82612ec2565b9050919050565b612efd81612ee2565b8114612f0857600080fd5b50565b600081359050612f1a81612ef4565b92915050565b600060208284031215612f3657612f35612eb8565b5b6000612f4484828501612f0b565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f8281612f4d565b8114612f8d57600080fd5b50565b600081359050612f9f81612f79565b92915050565b600060208284031215612fbb57612fba612eb8565b5b6000612fc984828501612f90565b91505092915050565b60008115159050919050565b612fe781612fd2565b82525050565b60006020820190506130026000830184612fde565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613042578082015181840152602081019050613027565b83811115613051576000848401525b50505050565b6000601f19601f8301169050919050565b600061307382613008565b61307d8185613013565b935061308d818560208601613024565b61309681613057565b840191505092915050565b600060208201905081810360008301526130bb8184613068565b905092915050565b6000819050919050565b6130d6816130c3565b81146130e157600080fd5b50565b6000813590506130f3816130cd565b92915050565b60006020828403121561310f5761310e612eb8565b5b600061311d848285016130e4565b91505092915050565b61312f81612ee2565b82525050565b600060208201905061314a6000830184613126565b92915050565b6000806040838503121561316757613166612eb8565b5b600061317585828601612f0b565b9250506020613186858286016130e4565b9150509250929050565b613199816130c3565b82525050565b60006020820190506131b46000830184613190565b92915050565b600080604083850312156131d1576131d0612eb8565b5b60006131df858286016130e4565b92505060206131f085828601612f0b565b9150509250929050565b60008060006060848603121561321357613212612eb8565b5b600061322186828701612f0b565b935050602061323286828701612f0b565b9250506040613243868287016130e4565b9150509250925092565b600060ff82169050919050565b6132638161324d565b811461326e57600080fd5b50565b6000813590506132808161325a565b92915050565b6000819050919050565b61329981613286565b81146132a457600080fd5b50565b6000813590506132b681613290565b92915050565b600080600080608085870312156132d6576132d5612eb8565b5b60006132e487828801612f0b565b94505060206132f587828801613271565b9350506040613306878288016132a7565b9250506060613317878288016132a7565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61336582613057565b810181811067ffffffffffffffff821117156133845761338361332d565b5b80604052505050565b6000613397612eae565b90506133a3828261335c565b919050565b600067ffffffffffffffff8211156133c3576133c261332d565b5b6133cc82613057565b9050602081019050919050565b82818337600083830152505050565b60006133fb6133f6846133a8565b61338d565b90508281526020810184848401111561341757613416613328565b5b6134228482856133d9565b509392505050565b600082601f83011261343f5761343e613323565b5b813561344f8482602086016133e8565b91505092915050565b60006020828403121561346e5761346d612eb8565b5b600082013567ffffffffffffffff81111561348c5761348b612ebd565b5b6134988482850161342a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381106134e1576134e06134a1565b5b50565b60008190506134f2826134d0565b919050565b6000613502826134e4565b9050919050565b613512816134f7565b82525050565b600060208201905061352d6000830184613509565b92915050565b61353c81612fd2565b811461354757600080fd5b50565b60008135905061355981613533565b92915050565b6000806040838503121561357657613575612eb8565b5b600061358485828601612f0b565b92505060206135958582860161354a565b9150509250929050565b6000806000606084860312156135b8576135b7612eb8565b5b60006135c686828701613271565b93505060206135d7868287016132a7565b92505060406135e8868287016132a7565b9150509250925092565b600067ffffffffffffffff82111561360d5761360c61332d565b5b61361682613057565b9050602081019050919050565b6000613636613631846135f2565b61338d565b90508281526020810184848401111561365257613651613328565b5b61365d8482856133d9565b509392505050565b600082601f83011261367a57613679613323565b5b813561368a848260208601613623565b91505092915050565b600080600080608085870312156136ad576136ac612eb8565b5b60006136bb87828801612f0b565b94505060206136cc87828801612f0b565b93505060406136dd878288016130e4565b925050606085013567ffffffffffffffff8111156136fe576136fd612ebd565b5b61370a87828801613665565b91505092959194509250565b6000806040838503121561372d5761372c612eb8565b5b600061373b85828601612f0b565b925050602061374c85828601612f0b565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061378c602083613013565b915061379782613756565b602082019050919050565b600060208201905081810360008301526137bb8161377f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061380957607f821691505b6020821081141561381d5761381c6137c2565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061387f602c83613013565b915061388a82613823565b604082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613911602183613013565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006139a3603883613013565b91506139ae82613947565b604082019050919050565b600060208201905081810360008301526139d281613996565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a13826130c3565b9150613a1e836130c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a5357613a526139d9565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000613a94601e83613013565b9150613a9f82613a5e565b602082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b6000613ad5826130c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0857613b076139d9565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613b6f603183613013565b9150613b7a82613b13565b604082019050919050565b60006020820190508181036000830152613b9e81613b62565b9050919050565b60008160601b9050919050565b6000613bbd82613ba5565b9050919050565b6000613bcf82613bb2565b9050919050565b613be7613be282612ee2565b613bc4565b82525050565b6000613bf98285613bd6565b601482019150613c098284613bd6565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000613c5a601c83613c19565b9150613c6582613c24565b601c82019050919050565b6000819050919050565b613c8b613c8682613286565b613c70565b82525050565b6000613c9c82613c4d565b9150613ca88284613c7a565b60208201915081905092915050565b613cc081613286565b82525050565b613ccf8161324d565b82525050565b6000608082019050613cea6000830187613cb7565b613cf76020830186613cc6565b613d046040830185613cb7565b613d116060830184613cb7565b95945050505050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d76602283613013565b9150613d8182613d1a565b604082019050919050565b60006020820190508181036000830152613da581613d69565b9050919050565b6000613db7826130c3565b9150613dc2836130c3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dfb57613dfa6139d9565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e40826130c3565b9150613e4b836130c3565b925082613e5b57613e5a613e06565b5b828204905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613ec2602983613013565b9150613ecd82613e66565b604082019050919050565b60006020820190508181036000830152613ef181613eb5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613f54602a83613013565b9150613f5f82613ef8565b604082019050919050565b60006020820190508181036000830152613f8381613f47565b9050919050565b7f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460008201527f65726d696e656420796574210000000000000000000000000000000000000000602082015250565b6000613fe6602c83613013565b9150613ff182613f8a565b604082019050919050565b6000602082019050818103600083015261401581613fd9565b9050919050565b7f43616e6e6f74204f70656e205075626c69632053616c65210000000000000000600082015250565b6000614052601883613013565b915061405d8261401c565b602082019050919050565b6000602082019050818103600083015261408181614045565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006140be601983613013565b91506140c982614088565b602082019050919050565b600060208201905081810360008301526140ed816140b1565b9050919050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b600061412a601183613013565b9150614135826140f4565b602082019050919050565b600060208201905081810360008301526141598161411d565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000614196601583613013565b91506141a182614160565b602082019050919050565b600060208201905081810360008301526141c581614189565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000614228602a83613013565b9150614233826141cc565b604082019050919050565b600060208201905081810360008301526142578161421b565b9050919050565b7f4d6178696d756d2031204d696e7420706572204164647265737320616c6c6f7760008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b60006142ba602383613013565b91506142c58261425e565b604082019050919050565b600060208201905081810360008301526142e9816142ad565b9050919050565b7f48617320616c7265616479206265656e2072657665616c656421000000000000600082015250565b6000614326601a83613013565b9150614331826142f0565b602082019050919050565b6000602082019050818103600083015261435581614319565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006143b8602f83613013565b91506143c38261435c565b604082019050919050565b600060208201905081810360008301526143e7816143ab565b9050919050565b60006143f982613008565b6144038185613c19565b9350614413818560208601613024565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614455600583613c19565b91506144608261441f565b600582019050919050565b600061447782856143ee565b915061448382846143ee565b915061448e82614448565b91508190509392505050565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b60006144d0601c83613013565b91506144db8261449a565b602082019050919050565b600060208201905081810360008301526144ff816144c3565b9050919050565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b600061453c601583613013565b915061454782614506565b602082019050919050565b6000602082019050818103600083015261456b8161452f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145ce602683613013565b91506145d982614572565b604082019050919050565b600060208201905081810360008301526145fd816145c1565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614660602c83613013565b915061466b82614604565b604082019050919050565b6000602082019050818103600083015261468f81614653565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006146f2602983613013565b91506146fd82614696565b604082019050919050565b60006020820190508181036000830152614721816146e5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614784602483613013565b915061478f82614728565b604082019050919050565b600060208201905081810360008301526147b381614777565b9050919050565b60006147c5826130c3565b91506147d0836130c3565b9250828210156147e3576147e26139d9565b5b828203905092915050565b600081905092915050565b50565b60006148096000836147ee565b9150614814826147f9565b600082019050919050565b600061482a826147fc565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b600061486a601483613013565b915061487582614834565b602082019050919050565b600060208201905081810360008301526148998161485d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006148fc603283613013565b9150614907826148a0565b604082019050919050565b6000602082019050818103600083015261492b816148ef565b9050919050565b600061493d826130c3565b9150614948836130c3565b92508261495857614957613e06565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006149b982614992565b6149c3818561499d565b93506149d3818560208601613024565b6149dc81613057565b840191505092915050565b60006080820190506149fc6000830187613126565b614a096020830186613126565b614a166040830185613190565b8181036060830152614a2881846149ae565b905095945050505050565b600081519050614a4281612f79565b92915050565b600060208284031215614a5e57614a5d612eb8565b5b6000614a6c84828501614a33565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614aab602083613013565b9150614ab682614a75565b602082019050919050565b60006020820190508181036000830152614ada81614a9e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614b17601c83613013565b9150614b2282614ae1565b602082019050919050565b60006020820190508181036000830152614b4681614b0a565b905091905056fea264697066735822122034b582fccad5b4f7de3e588f4b0f43b5eca290873aab31a43d29d3b5ffcaa7aa64736f6c63430008090033

Deployed Bytecode Sourcemap

34741:7862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36394:8;;;41588:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22856:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23807:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40645:94;;;;;;;;;;;;;:::i;:::-;;25122:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24645:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41747:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40208:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26012:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37970:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36621:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40958:298;;;;;;;;;;;;;:::i;:::-;;26422:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35766:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41890:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23501:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35984:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23231:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4593:94;;;;;;;;;;;;;:::i;:::-;;42233:172;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35702:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3942:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37204:177;;;;;;;;;;;;;:::i;:::-;;23976:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25415:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38335:664;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42442:147;;;;;;;;;;;;;:::i;:::-;;40789:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26678:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36738:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39595:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39058:525;;;;;;;;;;;;;:::i;:::-;;25781:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37026:170;;;;;;;;;;;;;:::i;:::-;;4842:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41588:87;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41661:6:::1;41653:5;;:14;;;;;;;;;;;;;;;;;;41588:87:::0;:::o;22856:305::-;22958:4;23010:25;22995:40;;;:11;:40;;;;:105;;;;23067:33;23052:48;;;:11;:48;;;;22995:105;:158;;;;23117:36;23141:11;23117:23;:36::i;:::-;22995:158;22975:178;;22856:305;;;:::o;23807:100::-;23861:13;23894:5;23887:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23807:100;:::o;40645:94::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40712:19:::1;;40695:14;:36;;;;40645:94::o:0;25122:221::-;25198:7;25226:16;25234:7;25226;:16::i;:::-;25218:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25311:15;:24;25327:7;25311:24;;;;;;;;;;;;;;;;;;;;;25304:31;;25122:221;;;:::o;24645:411::-;24726:13;24742:23;24757:7;24742:14;:23::i;:::-;24726:39;;24790:5;24784:11;;:2;:11;;;;24776:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24884:5;24868:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24893:37;24910:5;24917:12;:10;:12::i;:::-;24893:16;:37::i;:::-;24868:62;24846:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25027:21;25036:2;25040:7;25027:8;:21::i;:::-;24715:341;24645:411;;:::o;41747:94::-;41790:4;41814:19;;41807:26;;41747:94;:::o;40208:374::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40325:14:::1;;40315:6;40298:14;;:23;;;;:::i;:::-;:41;;40290:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;40392:6;40387:174;40408:6;40404:1;:10;40387:174;;;40436:40;40446:9;40474:1;40457:14;;:18;;;;:::i;:::-;40436:9;:40::i;:::-;40514:1;40491:19;;:24;;;;;;;:::i;:::-;;;;;;;;40548:1;40530:14;;:19;;;;;;;:::i;:::-;;;;;;;;40416:3;;;;;:::i;:::-;;;;40387:174;;;;40208:374:::0;;:::o;26012:339::-;26207:41;26226:12;:10;:12::i;:::-;26240:7;26207:18;:41::i;:::-;26199:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26315:28;26325:4;26331:2;26335:7;26315:9;:28::i;:::-;26012:339;;;:::o;37970:306::-;38069:4;38086:12;38136:4;38143;38111:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38101:48;;;;;;38086:63;;38176:92;38249:4;38196:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;38186:69;;;;;;38257:2;38261;38265;38176:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38167:101;;:5;;;;;;;;;;;:101;;;38160:108;;;37970:306;;;;;;:::o;36621:109::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36714:8:::1;36696:15;:26;;;;;;;;;;;;:::i;:::-;;36621:109:::0;:::o;40958:298::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41006:15:::1;41024:16;:14;:16::i;:::-;41006:34;;41069:1;41059:7;:11;41051:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41122:49;41140:7;:5;:7::i;:::-;41167:3;41161:2;41151:7;:12;;;;:::i;:::-;41150:20;;;;:::i;:::-;41122:9;:49::i;:::-;41183:45;41201:7;:5;:7::i;:::-;41211:16;:14;:16::i;:::-;41183:9;:45::i;:::-;40995:261;40958:298::o:0;26422:185::-;26560:39;26577:4;26583:2;26587:7;26560:39;;;;;;;;;;;;:16;:39::i;:::-;26422:185;;;:::o;35766:60::-;;;;;;;;;;;;;;;;;:::o;41890:297::-;41931:5;41973:1;41952:17;;:22;41948:232;;;41998:12;41991:19;;;;41948:232;42065:1;42041:20;;:25;42037:143;;;42090:13;42083:20;;;;42037:143;42152:16;42145:23;;41890:297;;:::o;23501:239::-;23573:7;23593:13;23609:7;:16;23617:7;23609:16;;;;;;;;;;;;;;;;;;;;;23593:32;;23661:1;23644:19;;:5;:19;;;;23636:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23727:5;23720:12;;;23501:239;;;:::o;35984:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23231:208::-;23303:7;23348:1;23331:19;;:5;:19;;;;23323:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23415:9;:16;23425:5;23415:16;;;;;;;;;;;;;;;;23408:23;;23231:208;;;:::o;4593:94::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4658:21:::1;4676:1;4658:9;:21::i;:::-;4593:94::o:0;42233:172::-;42277:7;42319:1;42305:10;;:15;;42297:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42387:10;;42380:17;;42233:172;:::o;35702:57::-;;;;;;;;;;;;;;;;;:::o;3942:87::-;3988:7;4015:6;;;;;;;;;;;4008:13;;3942:87;:::o;37204:177::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37282:13:::1;37267:28;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:28;;;;;;;;:::i;:::-;;;37259:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37358:15;37335:20;:38;;;;37204:177::o:0;23976:104::-;24032:13;24065:7;24058:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23976:104;:::o;25415:295::-;25530:12;:10;:12::i;:::-;25518:24;;:8;:24;;;;25510:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25630:8;25585:18;:32;25604:12;:10;:12::i;:::-;25585:32;;;;;;;;;;;;;;;:42;25618:8;25585:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25683:8;25654:48;;25669:12;:10;:12::i;:::-;25654:48;;;25693:8;25654:48;;;;;;:::i;:::-;;;;;;;;25415:295;;:::o;38335:664::-;38406:2;38411;38415;37472:41;37493:10;37504:2;37507;37510;37472:20;:41::i;:::-;37463:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38437:16:::1;38456:11;:9;:11::i;:::-;38437:30;;38500:12;38486:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;38478:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;38571:16;38557:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;38549:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38675:14;;38653:19;;:36;38645:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;38780:1;38743:22;:34;38766:10;38743:34;;;;;;;;;;;;;;;;:38;38735:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;38834:11;38848:9;:7;:9::i;:::-;38834:23;;38868:26;38878:10;38890:3;38868:9;:26::i;:::-;38943:1;38905:22;:34;38928:10;38905:34;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;38978:1;38955:19;;:24;;;;;;;:::i;:::-;;;;;;;;38426:573;;38335:664:::0;;;;;;:::o;42442:147::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42510:1:::1;42496:10;;:15;42488:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;42566:15;42553:10;:28;;;;42442:147::o:0;40789:109::-;40845:4;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40869:21:::1;40862:28;;40789:109:::0;:::o;26678:328::-;26853:41;26872:12;:10;:12::i;:::-;26886:7;26853:18;:41::i;:::-;26845:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26959:39;26973:4;26979:2;26983:7;26992:5;26959:13;:39::i;:::-;26678:328;;;;:::o;36738:125::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36841:14:::1;36825:13;:30;;;;;;;;;;;;:::i;:::-;;36738:125:::0;:::o;39595:568::-;39669:13;39703:17;39711:8;39703:7;:17::i;:::-;39695:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39898:1;39884:10;;:15;39880:272;;;39923:13;39916:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39880:272;39988:21;40012:10;:8;:10::i;:::-;39988:34;;40068:1;40050:7;40044:21;:25;:96;;;;;;;;;;;;;;;;;40096:7;40105:19;:8;:17;:19::i;:::-;40079:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40044:96;40037:103;;;39595:568;;;;:::o;39058:525::-;39102:16;39121:11;:9;:11::i;:::-;39102:30;;39165:16;39151:30;;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;39143:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39255:14;;39233:19;;:36;39225:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;39363:1;39323:25;:37;39349:10;39323:37;;;;;;;;;;;;;;;;:41;39315:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;39417:11;39431:9;:7;:9::i;:::-;39417:23;;39451:26;39461:10;39473:3;39451:9;:26::i;:::-;39529:1;39488:25;:37;39514:10;39488:37;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;39564:1;39541:19;;:24;;;;;;;:::i;:::-;;;;;;;;39091:492;;39058:525::o;25781:164::-;25878:4;25902:18;:25;25921:5;25902:25;;;;;;;;;;;;;;;:35;25928:8;25902:35;;;;;;;;;;;;;;;;;;;;;;;;;25895:42;;25781:164;;;;:::o;37026:170::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37104:12:::1;37089:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;37081:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37173:15;37153:17;:35;;;;37026:170::o:0;4842:192::-;4173:12;:10;:12::i;:::-;4162:23;;:7;:5;:7::i;:::-;:23;;;4154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4951:1:::1;4931:22;;:8;:22;;;;4923:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5007:19;5017:8;5007:9;:19::i;:::-;4842:192:::0;:::o;2730:98::-;2783:7;2810:10;2803:17;;2730:98;:::o;15928:157::-;16013:4;16052:25;16037:40;;;:11;:40;;;;16030:47;;15928:157;;;:::o;28516:127::-;28581:4;28633:1;28605:30;;:7;:16;28613:7;28605:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28598:37;;28516:127;;;:::o;32498:174::-;32600:2;32573:15;:24;32589:7;32573:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32656:7;32652:2;32618:46;;32627:23;32642:7;32627:14;:23::i;:::-;32618:46;;;;;;;;;;;;32498:174;;:::o;29500:110::-;29576:26;29586:2;29590:7;29576:26;;;;;;;;;;;;:9;:26::i;:::-;29500:110;;:::o;28810:348::-;28903:4;28928:16;28936:7;28928;:16::i;:::-;28920:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29004:13;29020:23;29035:7;29020:14;:23::i;:::-;29004:39;;29073:5;29062:16;;:7;:16;;;:51;;;;29106:7;29082:31;;:20;29094:7;29082:11;:20::i;:::-;:31;;;29062:51;:87;;;;29117:32;29134:5;29141:7;29117:16;:32::i;:::-;29062:87;29054:96;;;28810:348;;;;:::o;31802:578::-;31961:4;31934:31;;:23;31949:7;31934:14;:23::i;:::-;:31;;;31926:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32044:1;32030:16;;:2;:16;;;;32022:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32100:39;32121:4;32127:2;32131:7;32100:20;:39::i;:::-;32204:29;32221:1;32225:7;32204:8;:29::i;:::-;32265:1;32246:9;:15;32256:4;32246:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32294:1;32277:9;:13;32287:2;32277:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32325:2;32306:7;:16;32314:7;32306:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32364:7;32360:2;32345:27;;32354:4;32345:27;;;;;;;;;;;;31802:578;;;:::o;41331:183::-;41412:9;41427:7;:12;;41447:6;41427:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41411:47;;;41477:4;41469:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;41400:114;41331:183;;:::o;5042:173::-;5098:16;5117:6;;;;;;;;;;;5098:25;;5143:8;5134:6;;:17;;;;;;;;;;;;;;;;;;5198:8;5167:40;;5188:8;5167:40;;;;;;;;;;;;5087:128;5042:173;:::o;36919:99::-;36960:7;37009:1;36987:19;;:23;;;;:::i;:::-;36980:30;;36919:99;:::o;27888:315::-;28045:28;28055:4;28061:2;28065:7;28045:9;:28::i;:::-;28092:48;28115:4;28121:2;28125:7;28134:5;28092:22;:48::i;:::-;28084:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27888:315;;;;:::o;36447:116::-;36507:13;36540:15;36533:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36447:116;:::o;346:723::-;402:13;632:1;623:5;:10;619:53;;;650:10;;;;;;;;;;;;;;;;;;;;;619:53;682:12;697:5;682:20;;713:14;738:78;753:1;745:4;:9;738:78;;771:8;;;;;:::i;:::-;;;;802:2;794:10;;;;;:::i;:::-;;;738:78;;;826:19;858:6;848:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;826:39;;876:154;892:1;883:5;:10;876:154;;920:1;910:11;;;;;:::i;:::-;;;987:2;979:5;:10;;;;:::i;:::-;966:2;:24;;;;:::i;:::-;953:39;;936:6;943;936:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1016:2;1007:11;;;;;:::i;:::-;;;876:154;;;1054:6;1040:21;;;;;346:723;;;;:::o;29837:321::-;29967:18;29973:2;29977:7;29967:5;:18::i;:::-;30018:54;30049:1;30053:2;30057:7;30066:5;30018:22;:54::i;:::-;29996:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29837:321;;;:::o;34608:126::-;;;;:::o;33237:799::-;33392:4;33413:15;:2;:13;;;:15::i;:::-;33409:620;;;33465:2;33449:36;;;33486:12;:10;:12::i;:::-;33500:4;33506:7;33515:5;33449:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33445:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33708:1;33691:6;:13;:18;33687:272;;;33734:60;;;;;;;;;;:::i;:::-;;;;;;;;33687:272;33909:6;33903:13;33894:6;33890:2;33886:15;33879:38;33445:529;33582:41;;;33572:51;;;:6;:51;;;;33565:58;;;;;33409:620;34013:4;34006:11;;33237:799;;;;;;;:::o;30494:382::-;30588:1;30574:16;;:2;:16;;;;30566:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30647:16;30655:7;30647;:16::i;:::-;30646:17;30638:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30709:45;30738:1;30742:2;30746:7;30709:20;:45::i;:::-;30784:1;30767:9;:13;30777:2;30767:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30815:2;30796:7;:16;30804:7;30796:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30860:7;30856:2;30835:33;;30852:1;30835:33;;;;;;;;;;;;30494:382;;:::o;5988:387::-;6048:4;6256:12;6323:7;6311:20;6303:28;;6366:1;6359:4;:8;6352:15;;;5988:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:149::-;1212:7;1252:66;1245:5;1241:78;1230:89;;1176:149;;;:::o;1331:120::-;1403:23;1420:5;1403:23;:::i;:::-;1396:5;1393:34;1383:62;;1441:1;1438;1431:12;1383:62;1331:120;:::o;1457:137::-;1502:5;1540:6;1527:20;1518:29;;1556:32;1582:5;1556:32;:::i;:::-;1457:137;;;;:::o;1600:327::-;1658:6;1707:2;1695:9;1686:7;1682:23;1678:32;1675:119;;;1713:79;;:::i;:::-;1675:119;1833:1;1858:52;1902:7;1893:6;1882:9;1878:22;1858:52;:::i;:::-;1848:62;;1804:116;1600:327;;;;:::o;1933:90::-;1967:7;2010:5;2003:13;1996:21;1985:32;;1933:90;;;:::o;2029:109::-;2110:21;2125:5;2110:21;:::i;:::-;2105:3;2098:34;2029:109;;:::o;2144:210::-;2231:4;2269:2;2258:9;2254:18;2246:26;;2282:65;2344:1;2333:9;2329:17;2320:6;2282:65;:::i;:::-;2144:210;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:474::-;5693:6;5701;5750:2;5738:9;5729:7;5725:23;5721:32;5718:119;;;5756:79;;:::i;:::-;5718:119;5876:1;5901:53;5946:7;5937:6;5926:9;5922:22;5901:53;:::i;:::-;5891:63;;5847:117;6003:2;6029:53;6074:7;6065:6;6054:9;6050:22;6029:53;:::i;:::-;6019:63;;5974:118;5625:474;;;;;:::o;6105:619::-;6182:6;6190;6198;6247:2;6235:9;6226:7;6222:23;6218:32;6215:119;;;6253:79;;:::i;:::-;6215:119;6373:1;6398:53;6443:7;6434:6;6423:9;6419:22;6398:53;:::i;:::-;6388:63;;6344:117;6500:2;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6471:118;6628:2;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6599:118;6105:619;;;;;:::o;6730:86::-;6765:7;6805:4;6798:5;6794:16;6783:27;;6730:86;;;:::o;6822:118::-;6893:22;6909:5;6893:22;:::i;:::-;6886:5;6883:33;6873:61;;6930:1;6927;6920:12;6873:61;6822:118;:::o;6946:135::-;6990:5;7028:6;7015:20;7006:29;;7044:31;7069:5;7044:31;:::i;:::-;6946:135;;;;:::o;7087:77::-;7124:7;7153:5;7142:16;;7087:77;;;:::o;7170:122::-;7243:24;7261:5;7243:24;:::i;:::-;7236:5;7233:35;7223:63;;7282:1;7279;7272:12;7223:63;7170:122;:::o;7298:139::-;7344:5;7382:6;7369:20;7360:29;;7398:33;7425:5;7398:33;:::i;:::-;7298:139;;;;:::o;7443:761::-;7527:6;7535;7543;7551;7600:3;7588:9;7579:7;7575:23;7571:33;7568:120;;;7607:79;;:::i;:::-;7568:120;7727:1;7752:53;7797:7;7788:6;7777:9;7773:22;7752:53;:::i;:::-;7742:63;;7698:117;7854:2;7880:51;7923:7;7914:6;7903:9;7899:22;7880:51;:::i;:::-;7870:61;;7825:116;7980:2;8006:53;8051:7;8042:6;8031:9;8027:22;8006:53;:::i;:::-;7996:63;;7951:118;8108:2;8134:53;8179:7;8170:6;8159:9;8155:22;8134:53;:::i;:::-;8124:63;;8079:118;7443:761;;;;;;;:::o;8210:117::-;8319:1;8316;8309:12;8333:117;8442:1;8439;8432:12;8456:180;8504:77;8501:1;8494:88;8601:4;8598:1;8591:15;8625:4;8622:1;8615:15;8642:281;8725:27;8747:4;8725:27;:::i;:::-;8717:6;8713:40;8855:6;8843:10;8840:22;8819:18;8807:10;8804:34;8801:62;8798:88;;;8866:18;;:::i;:::-;8798:88;8906:10;8902:2;8895:22;8685:238;8642:281;;:::o;8929:129::-;8963:6;8990:20;;:::i;:::-;8980:30;;9019:33;9047:4;9039:6;9019:33;:::i;:::-;8929:129;;;:::o;9064:308::-;9126:4;9216:18;9208:6;9205:30;9202:56;;;9238:18;;:::i;:::-;9202:56;9276:29;9298:6;9276:29;:::i;:::-;9268:37;;9360:4;9354;9350:15;9342:23;;9064:308;;;:::o;9378:154::-;9462:6;9457:3;9452;9439:30;9524:1;9515:6;9510:3;9506:16;9499:27;9378:154;;;:::o;9538:412::-;9616:5;9641:66;9657:49;9699:6;9657:49;:::i;:::-;9641:66;:::i;:::-;9632:75;;9730:6;9723:5;9716:21;9768:4;9761:5;9757:16;9806:3;9797:6;9792:3;9788:16;9785:25;9782:112;;;9813:79;;:::i;:::-;9782:112;9903:41;9937:6;9932:3;9927;9903:41;:::i;:::-;9622:328;9538:412;;;;;:::o;9970:340::-;10026:5;10075:3;10068:4;10060:6;10056:17;10052:27;10042:122;;10083:79;;:::i;:::-;10042:122;10200:6;10187:20;10225:79;10300:3;10292:6;10285:4;10277:6;10273:17;10225:79;:::i;:::-;10216:88;;10032:278;9970:340;;;;:::o;10316:509::-;10385:6;10434:2;10422:9;10413:7;10409:23;10405:32;10402:119;;;10440:79;;:::i;:::-;10402:119;10588:1;10577:9;10573:17;10560:31;10618:18;10610:6;10607:30;10604:117;;;10640:79;;:::i;:::-;10604:117;10745:63;10800:7;10791:6;10780:9;10776:22;10745:63;:::i;:::-;10735:73;;10531:287;10316:509;;;;:::o;10831:180::-;10879:77;10876:1;10869:88;10976:4;10973:1;10966:15;11000:4;10997:1;10990:15;11017:115;11100:1;11093:5;11090:12;11080:46;;11106:18;;:::i;:::-;11080:46;11017:115;:::o;11138:131::-;11185:7;11214:5;11203:16;;11220:43;11257:5;11220:43;:::i;:::-;11138:131;;;:::o;11275:::-;11333:9;11366:34;11394:5;11366:34;:::i;:::-;11353:47;;11275:131;;;:::o;11412:147::-;11507:45;11546:5;11507:45;:::i;:::-;11502:3;11495:58;11412:147;;:::o;11565:238::-;11666:4;11704:2;11693:9;11689:18;11681:26;;11717:79;11793:1;11782:9;11778:17;11769:6;11717:79;:::i;:::-;11565:238;;;;:::o;11809:116::-;11879:21;11894:5;11879:21;:::i;:::-;11872:5;11869:32;11859:60;;11915:1;11912;11905:12;11859:60;11809:116;:::o;11931:133::-;11974:5;12012:6;11999:20;11990:29;;12028:30;12052:5;12028:30;:::i;:::-;11931:133;;;;:::o;12070:468::-;12135:6;12143;12192:2;12180:9;12171:7;12167:23;12163:32;12160:119;;;12198:79;;:::i;:::-;12160:119;12318:1;12343:53;12388:7;12379:6;12368:9;12364:22;12343:53;:::i;:::-;12333:63;;12289:117;12445:2;12471:50;12513:7;12504:6;12493:9;12489:22;12471:50;:::i;:::-;12461:60;;12416:115;12070:468;;;;;:::o;12544:615::-;12619:6;12627;12635;12684:2;12672:9;12663:7;12659:23;12655:32;12652:119;;;12690:79;;:::i;:::-;12652:119;12810:1;12835:51;12878:7;12869:6;12858:9;12854:22;12835:51;:::i;:::-;12825:61;;12781:115;12935:2;12961:53;13006:7;12997:6;12986:9;12982:22;12961:53;:::i;:::-;12951:63;;12906:118;13063:2;13089:53;13134:7;13125:6;13114:9;13110:22;13089:53;:::i;:::-;13079:63;;13034:118;12544:615;;;;;:::o;13165:307::-;13226:4;13316:18;13308:6;13305:30;13302:56;;;13338:18;;:::i;:::-;13302:56;13376:29;13398:6;13376:29;:::i;:::-;13368:37;;13460:4;13454;13450:15;13442:23;;13165:307;;;:::o;13478:410::-;13555:5;13580:65;13596:48;13637:6;13596:48;:::i;:::-;13580:65;:::i;:::-;13571:74;;13668:6;13661:5;13654:21;13706:4;13699:5;13695:16;13744:3;13735:6;13730:3;13726:16;13723:25;13720:112;;;13751:79;;:::i;:::-;13720:112;13841:41;13875:6;13870:3;13865;13841:41;:::i;:::-;13561:327;13478:410;;;;;:::o;13907:338::-;13962:5;14011:3;14004:4;13996:6;13992:17;13988:27;13978:122;;14019:79;;:::i;:::-;13978:122;14136:6;14123:20;14161:78;14235:3;14227:6;14220:4;14212:6;14208:17;14161:78;:::i;:::-;14152:87;;13968:277;13907:338;;;;:::o;14251:943::-;14346:6;14354;14362;14370;14419:3;14407:9;14398:7;14394:23;14390:33;14387:120;;;14426:79;;:::i;:::-;14387:120;14546:1;14571:53;14616:7;14607:6;14596:9;14592:22;14571:53;:::i;:::-;14561:63;;14517:117;14673:2;14699:53;14744:7;14735:6;14724:9;14720:22;14699:53;:::i;:::-;14689:63;;14644:118;14801:2;14827:53;14872:7;14863:6;14852:9;14848:22;14827:53;:::i;:::-;14817:63;;14772:118;14957:2;14946:9;14942:18;14929:32;14988:18;14980:6;14977:30;14974:117;;;15010:79;;:::i;:::-;14974:117;15115:62;15169:7;15160:6;15149:9;15145:22;15115:62;:::i;:::-;15105:72;;14900:287;14251:943;;;;;;;:::o;15200:474::-;15268:6;15276;15325:2;15313:9;15304:7;15300:23;15296:32;15293:119;;;15331:79;;:::i;:::-;15293:119;15451:1;15476:53;15521:7;15512:6;15501:9;15497:22;15476:53;:::i;:::-;15466:63;;15422:117;15578:2;15604:53;15649:7;15640:6;15629:9;15625:22;15604:53;:::i;:::-;15594:63;;15549:118;15200:474;;;;;:::o;15680:182::-;15820:34;15816:1;15808:6;15804:14;15797:58;15680:182;:::o;15868:366::-;16010:3;16031:67;16095:2;16090:3;16031:67;:::i;:::-;16024:74;;16107:93;16196:3;16107:93;:::i;:::-;16225:2;16220:3;16216:12;16209:19;;15868:366;;;:::o;16240:419::-;16406:4;16444:2;16433:9;16429:18;16421:26;;16493:9;16487:4;16483:20;16479:1;16468:9;16464:17;16457:47;16521:131;16647:4;16521:131;:::i;:::-;16513:139;;16240:419;;;:::o;16665:180::-;16713:77;16710:1;16703:88;16810:4;16807:1;16800:15;16834:4;16831:1;16824:15;16851:320;16895:6;16932:1;16926:4;16922:12;16912:22;;16979:1;16973:4;16969:12;17000:18;16990:81;;17056:4;17048:6;17044:17;17034:27;;16990:81;17118:2;17110:6;17107:14;17087:18;17084:38;17081:84;;;17137:18;;:::i;:::-;17081:84;16902:269;16851:320;;;:::o;17177:231::-;17317:34;17313:1;17305:6;17301:14;17294:58;17386:14;17381:2;17373:6;17369:15;17362:39;17177:231;:::o;17414:366::-;17556:3;17577:67;17641:2;17636:3;17577:67;:::i;:::-;17570:74;;17653:93;17742:3;17653:93;:::i;:::-;17771:2;17766:3;17762:12;17755:19;;17414:366;;;:::o;17786:419::-;17952:4;17990:2;17979:9;17975:18;17967:26;;18039:9;18033:4;18029:20;18025:1;18014:9;18010:17;18003:47;18067:131;18193:4;18067:131;:::i;:::-;18059:139;;17786:419;;;:::o;18211:220::-;18351:34;18347:1;18339:6;18335:14;18328:58;18420:3;18415:2;18407:6;18403:15;18396:28;18211:220;:::o;18437:366::-;18579:3;18600:67;18664:2;18659:3;18600:67;:::i;:::-;18593:74;;18676:93;18765:3;18676:93;:::i;:::-;18794:2;18789:3;18785:12;18778:19;;18437:366;;;:::o;18809:419::-;18975:4;19013:2;19002:9;18998:18;18990:26;;19062:9;19056:4;19052:20;19048:1;19037:9;19033:17;19026:47;19090:131;19216:4;19090:131;:::i;:::-;19082:139;;18809:419;;;:::o;19234:243::-;19374:34;19370:1;19362:6;19358:14;19351:58;19443:26;19438:2;19430:6;19426:15;19419:51;19234:243;:::o;19483:366::-;19625:3;19646:67;19710:2;19705:3;19646:67;:::i;:::-;19639:74;;19722:93;19811:3;19722:93;:::i;:::-;19840:2;19835:3;19831:12;19824:19;;19483:366;;;:::o;19855:419::-;20021:4;20059:2;20048:9;20044:18;20036:26;;20108:9;20102:4;20098:20;20094:1;20083:9;20079:17;20072:47;20136:131;20262:4;20136:131;:::i;:::-;20128:139;;19855:419;;;:::o;20280:180::-;20328:77;20325:1;20318:88;20425:4;20422:1;20415:15;20449:4;20446:1;20439:15;20466:305;20506:3;20525:20;20543:1;20525:20;:::i;:::-;20520:25;;20559:20;20577:1;20559:20;:::i;:::-;20554:25;;20713:1;20645:66;20641:74;20638:1;20635:81;20632:107;;;20719:18;;:::i;:::-;20632:107;20763:1;20760;20756:9;20749:16;;20466:305;;;;:::o;20777:180::-;20917:32;20913:1;20905:6;20901:14;20894:56;20777:180;:::o;20963:366::-;21105:3;21126:67;21190:2;21185:3;21126:67;:::i;:::-;21119:74;;21202:93;21291:3;21202:93;:::i;:::-;21320:2;21315:3;21311:12;21304:19;;20963:366;;;:::o;21335:419::-;21501:4;21539:2;21528:9;21524:18;21516:26;;21588:9;21582:4;21578:20;21574:1;21563:9;21559:17;21552:47;21616:131;21742:4;21616:131;:::i;:::-;21608:139;;21335:419;;;:::o;21760:233::-;21799:3;21822:24;21840:5;21822:24;:::i;:::-;21813:33;;21868:66;21861:5;21858:77;21855:103;;;21938:18;;:::i;:::-;21855:103;21985:1;21978:5;21974:13;21967:20;;21760:233;;;:::o;21999:236::-;22139:34;22135:1;22127:6;22123:14;22116:58;22208:19;22203:2;22195:6;22191:15;22184:44;21999:236;:::o;22241:366::-;22383:3;22404:67;22468:2;22463:3;22404:67;:::i;:::-;22397:74;;22480:93;22569:3;22480:93;:::i;:::-;22598:2;22593:3;22589:12;22582:19;;22241:366;;;:::o;22613:419::-;22779:4;22817:2;22806:9;22802:18;22794:26;;22866:9;22860:4;22856:20;22852:1;22841:9;22837:17;22830:47;22894:131;23020:4;22894:131;:::i;:::-;22886:139;;22613:419;;;:::o;23038:94::-;23071:8;23119:5;23115:2;23111:14;23090:35;;23038:94;;;:::o;23138:::-;23177:7;23206:20;23220:5;23206:20;:::i;:::-;23195:31;;23138:94;;;:::o;23238:100::-;23277:7;23306:26;23326:5;23306:26;:::i;:::-;23295:37;;23238:100;;;:::o;23344:157::-;23449:45;23469:24;23487:5;23469:24;:::i;:::-;23449:45;:::i;:::-;23444:3;23437:58;23344:157;;:::o;23507:397::-;23647:3;23662:75;23733:3;23724:6;23662:75;:::i;:::-;23762:2;23757:3;23753:12;23746:19;;23775:75;23846:3;23837:6;23775:75;:::i;:::-;23875:2;23870:3;23866:12;23859:19;;23895:3;23888:10;;23507:397;;;;;:::o;23910:148::-;24012:11;24049:3;24034:18;;23910:148;;;;:::o;24064:214::-;24204:66;24200:1;24192:6;24188:14;24181:90;24064:214;:::o;24284:402::-;24444:3;24465:85;24547:2;24542:3;24465:85;:::i;:::-;24458:92;;24559:93;24648:3;24559:93;:::i;:::-;24677:2;24672:3;24668:12;24661:19;;24284:402;;;:::o;24692:79::-;24731:7;24760:5;24749:16;;24692:79;;;:::o;24777:157::-;24882:45;24902:24;24920:5;24902:24;:::i;:::-;24882:45;:::i;:::-;24877:3;24870:58;24777:157;;:::o;24940:522::-;25153:3;25175:148;25319:3;25175:148;:::i;:::-;25168:155;;25333:75;25404:3;25395:6;25333:75;:::i;:::-;25433:2;25428:3;25424:12;25417:19;;25453:3;25446:10;;24940:522;;;;:::o;25468:118::-;25555:24;25573:5;25555:24;:::i;:::-;25550:3;25543:37;25468:118;;:::o;25592:112::-;25675:22;25691:5;25675:22;:::i;:::-;25670:3;25663:35;25592:112;;:::o;25710:545::-;25883:4;25921:3;25910:9;25906:19;25898:27;;25935:71;26003:1;25992:9;25988:17;25979:6;25935:71;:::i;:::-;26016:68;26080:2;26069:9;26065:18;26056:6;26016:68;:::i;:::-;26094:72;26162:2;26151:9;26147:18;26138:6;26094:72;:::i;:::-;26176;26244:2;26233:9;26229:18;26220:6;26176:72;:::i;:::-;25710:545;;;;;;;:::o;26261:221::-;26401:34;26397:1;26389:6;26385:14;26378:58;26470:4;26465:2;26457:6;26453:15;26446:29;26261:221;:::o;26488:366::-;26630:3;26651:67;26715:2;26710:3;26651:67;:::i;:::-;26644:74;;26727:93;26816:3;26727:93;:::i;:::-;26845:2;26840:3;26836:12;26829:19;;26488:366;;;:::o;26860:419::-;27026:4;27064:2;27053:9;27049:18;27041:26;;27113:9;27107:4;27103:20;27099:1;27088:9;27084:17;27077:47;27141:131;27267:4;27141:131;:::i;:::-;27133:139;;26860:419;;;:::o;27285:348::-;27325:7;27348:20;27366:1;27348:20;:::i;:::-;27343:25;;27382:20;27400:1;27382:20;:::i;:::-;27377:25;;27570:1;27502:66;27498:74;27495:1;27492:81;27487:1;27480:9;27473:17;27469:105;27466:131;;;27577:18;;:::i;:::-;27466:131;27625:1;27622;27618:9;27607:20;;27285:348;;;;:::o;27639:180::-;27687:77;27684:1;27677:88;27784:4;27781:1;27774:15;27808:4;27805:1;27798:15;27825:185;27865:1;27882:20;27900:1;27882:20;:::i;:::-;27877:25;;27916:20;27934:1;27916:20;:::i;:::-;27911:25;;27955:1;27945:35;;27960:18;;:::i;:::-;27945:35;28002:1;27999;27995:9;27990:14;;27825:185;;;;:::o;28016:228::-;28156:34;28152:1;28144:6;28140:14;28133:58;28225:11;28220:2;28212:6;28208:15;28201:36;28016:228;:::o;28250:366::-;28392:3;28413:67;28477:2;28472:3;28413:67;:::i;:::-;28406:74;;28489:93;28578:3;28489:93;:::i;:::-;28607:2;28602:3;28598:12;28591:19;;28250:366;;;:::o;28622:419::-;28788:4;28826:2;28815:9;28811:18;28803:26;;28875:9;28869:4;28865:20;28861:1;28850:9;28846:17;28839:47;28903:131;29029:4;28903:131;:::i;:::-;28895:139;;28622:419;;;:::o;29047:229::-;29187:34;29183:1;29175:6;29171:14;29164:58;29256:12;29251:2;29243:6;29239:15;29232:37;29047:229;:::o;29282:366::-;29424:3;29445:67;29509:2;29504:3;29445:67;:::i;:::-;29438:74;;29521:93;29610:3;29521:93;:::i;:::-;29639:2;29634:3;29630:12;29623:19;;29282:366;;;:::o;29654:419::-;29820:4;29858:2;29847:9;29843:18;29835:26;;29907:9;29901:4;29897:20;29893:1;29882:9;29878:17;29871:47;29935:131;30061:4;29935:131;:::i;:::-;29927:139;;29654:419;;;:::o;30079:231::-;30219:34;30215:1;30207:6;30203:14;30196:58;30288:14;30283:2;30275:6;30271:15;30264:39;30079:231;:::o;30316:366::-;30458:3;30479:67;30543:2;30538:3;30479:67;:::i;:::-;30472:74;;30555:93;30644:3;30555:93;:::i;:::-;30673:2;30668:3;30664:12;30657:19;;30316:366;;;:::o;30688:419::-;30854:4;30892:2;30881:9;30877:18;30869:26;;30941:9;30935:4;30931:20;30927:1;30916:9;30912:17;30905:47;30969:131;31095:4;30969:131;:::i;:::-;30961:139;;30688:419;;;:::o;31113:174::-;31253:26;31249:1;31241:6;31237:14;31230:50;31113:174;:::o;31293:366::-;31435:3;31456:67;31520:2;31515:3;31456:67;:::i;:::-;31449:74;;31532:93;31621:3;31532:93;:::i;:::-;31650:2;31645:3;31641:12;31634:19;;31293:366;;;:::o;31665:419::-;31831:4;31869:2;31858:9;31854:18;31846:26;;31918:9;31912:4;31908:20;31904:1;31893:9;31889:17;31882:47;31946:131;32072:4;31946:131;:::i;:::-;31938:139;;31665:419;;;:::o;32090:175::-;32230:27;32226:1;32218:6;32214:14;32207:51;32090:175;:::o;32271:366::-;32413:3;32434:67;32498:2;32493:3;32434:67;:::i;:::-;32427:74;;32510:93;32599:3;32510:93;:::i;:::-;32628:2;32623:3;32619:12;32612:19;;32271:366;;;:::o;32643:419::-;32809:4;32847:2;32836:9;32832:18;32824:26;;32896:9;32890:4;32886:20;32882:1;32871:9;32867:17;32860:47;32924:131;33050:4;32924:131;:::i;:::-;32916:139;;32643:419;;;:::o;33068:167::-;33208:19;33204:1;33196:6;33192:14;33185:43;33068:167;:::o;33241:366::-;33383:3;33404:67;33468:2;33463:3;33404:67;:::i;:::-;33397:74;;33480:93;33569:3;33480:93;:::i;:::-;33598:2;33593:3;33589:12;33582:19;;33241:366;;;:::o;33613:419::-;33779:4;33817:2;33806:9;33802:18;33794:26;;33866:9;33860:4;33856:20;33852:1;33841:9;33837:17;33830:47;33894:131;34020:4;33894:131;:::i;:::-;33886:139;;33613:419;;;:::o;34038:171::-;34178:23;34174:1;34166:6;34162:14;34155:47;34038:171;:::o;34215:366::-;34357:3;34378:67;34442:2;34437:3;34378:67;:::i;:::-;34371:74;;34454:93;34543:3;34454:93;:::i;:::-;34572:2;34567:3;34563:12;34556:19;;34215:366;;;:::o;34587:419::-;34753:4;34791:2;34780:9;34776:18;34768:26;;34840:9;34834:4;34830:20;34826:1;34815:9;34811:17;34804:47;34868:131;34994:4;34868:131;:::i;:::-;34860:139;;34587:419;;;:::o;35012:229::-;35152:34;35148:1;35140:6;35136:14;35129:58;35221:12;35216:2;35208:6;35204:15;35197:37;35012:229;:::o;35247:366::-;35389:3;35410:67;35474:2;35469:3;35410:67;:::i;:::-;35403:74;;35486:93;35575:3;35486:93;:::i;:::-;35604:2;35599:3;35595:12;35588:19;;35247:366;;;:::o;35619:419::-;35785:4;35823:2;35812:9;35808:18;35800:26;;35872:9;35866:4;35862:20;35858:1;35847:9;35843:17;35836:47;35900:131;36026:4;35900:131;:::i;:::-;35892:139;;35619:419;;;:::o;36044:222::-;36184:34;36180:1;36172:6;36168:14;36161:58;36253:5;36248:2;36240:6;36236:15;36229:30;36044:222;:::o;36272:366::-;36414:3;36435:67;36499:2;36494:3;36435:67;:::i;:::-;36428:74;;36511:93;36600:3;36511:93;:::i;:::-;36629:2;36624:3;36620:12;36613:19;;36272:366;;;:::o;36644:419::-;36810:4;36848:2;36837:9;36833:18;36825:26;;36897:9;36891:4;36887:20;36883:1;36872:9;36868:17;36861:47;36925:131;37051:4;36925:131;:::i;:::-;36917:139;;36644:419;;;:::o;37069:176::-;37209:28;37205:1;37197:6;37193:14;37186:52;37069:176;:::o;37251:366::-;37393:3;37414:67;37478:2;37473:3;37414:67;:::i;:::-;37407:74;;37490:93;37579:3;37490:93;:::i;:::-;37608:2;37603:3;37599:12;37592:19;;37251:366;;;:::o;37623:419::-;37789:4;37827:2;37816:9;37812:18;37804:26;;37876:9;37870:4;37866:20;37862:1;37851:9;37847:17;37840:47;37904:131;38030:4;37904:131;:::i;:::-;37896:139;;37623:419;;;:::o;38048:234::-;38188:34;38184:1;38176:6;38172:14;38165:58;38257:17;38252:2;38244:6;38240:15;38233:42;38048:234;:::o;38288:366::-;38430:3;38451:67;38515:2;38510:3;38451:67;:::i;:::-;38444:74;;38527:93;38616:3;38527:93;:::i;:::-;38645:2;38640:3;38636:12;38629:19;;38288:366;;;:::o;38660:419::-;38826:4;38864:2;38853:9;38849:18;38841:26;;38913:9;38907:4;38903:20;38899:1;38888:9;38884:17;38877:47;38941:131;39067:4;38941:131;:::i;:::-;38933:139;;38660:419;;;:::o;39085:377::-;39191:3;39219:39;39252:5;39219:39;:::i;:::-;39274:89;39356:6;39351:3;39274:89;:::i;:::-;39267:96;;39372:52;39417:6;39412:3;39405:4;39398:5;39394:16;39372:52;:::i;:::-;39449:6;39444:3;39440:16;39433:23;;39195:267;39085:377;;;;:::o;39468:155::-;39608:7;39604:1;39596:6;39592:14;39585:31;39468:155;:::o;39629:400::-;39789:3;39810:84;39892:1;39887:3;39810:84;:::i;:::-;39803:91;;39903:93;39992:3;39903:93;:::i;:::-;40021:1;40016:3;40012:11;40005:18;;39629:400;;;:::o;40035:701::-;40316:3;40338:95;40429:3;40420:6;40338:95;:::i;:::-;40331:102;;40450:95;40541:3;40532:6;40450:95;:::i;:::-;40443:102;;40562:148;40706:3;40562:148;:::i;:::-;40555:155;;40727:3;40720:10;;40035:701;;;;;:::o;40742:178::-;40882:30;40878:1;40870:6;40866:14;40859:54;40742:178;:::o;40926:366::-;41068:3;41089:67;41153:2;41148:3;41089:67;:::i;:::-;41082:74;;41165:93;41254:3;41165:93;:::i;:::-;41283:2;41278:3;41274:12;41267:19;;40926:366;;;:::o;41298:419::-;41464:4;41502:2;41491:9;41487:18;41479:26;;41551:9;41545:4;41541:20;41537:1;41526:9;41522:17;41515:47;41579:131;41705:4;41579:131;:::i;:::-;41571:139;;41298:419;;;:::o;41723:171::-;41863:23;41859:1;41851:6;41847:14;41840:47;41723:171;:::o;41900:366::-;42042:3;42063:67;42127:2;42122:3;42063:67;:::i;:::-;42056:74;;42139:93;42228:3;42139:93;:::i;:::-;42257:2;42252:3;42248:12;42241:19;;41900:366;;;:::o;42272:419::-;42438:4;42476:2;42465:9;42461:18;42453:26;;42525:9;42519:4;42515:20;42511:1;42500:9;42496:17;42489:47;42553:131;42679:4;42553:131;:::i;:::-;42545:139;;42272:419;;;:::o;42697:225::-;42837:34;42833:1;42825:6;42821:14;42814:58;42906:8;42901:2;42893:6;42889:15;42882:33;42697:225;:::o;42928:366::-;43070:3;43091:67;43155:2;43150:3;43091:67;:::i;:::-;43084:74;;43167:93;43256:3;43167:93;:::i;:::-;43285:2;43280:3;43276:12;43269:19;;42928:366;;;:::o;43300:419::-;43466:4;43504:2;43493:9;43489:18;43481:26;;43553:9;43547:4;43543:20;43539:1;43528:9;43524:17;43517:47;43581:131;43707:4;43581:131;:::i;:::-;43573:139;;43300:419;;;:::o;43725:231::-;43865:34;43861:1;43853:6;43849:14;43842:58;43934:14;43929:2;43921:6;43917:15;43910:39;43725:231;:::o;43962:366::-;44104:3;44125:67;44189:2;44184:3;44125:67;:::i;:::-;44118:74;;44201:93;44290:3;44201:93;:::i;:::-;44319:2;44314:3;44310:12;44303:19;;43962:366;;;:::o;44334:419::-;44500:4;44538:2;44527:9;44523:18;44515:26;;44587:9;44581:4;44577:20;44573:1;44562:9;44558:17;44551:47;44615:131;44741:4;44615:131;:::i;:::-;44607:139;;44334:419;;;:::o;44759:228::-;44899:34;44895:1;44887:6;44883:14;44876:58;44968:11;44963:2;44955:6;44951:15;44944:36;44759:228;:::o;44993:366::-;45135:3;45156:67;45220:2;45215:3;45156:67;:::i;:::-;45149:74;;45232:93;45321:3;45232:93;:::i;:::-;45350:2;45345:3;45341:12;45334:19;;44993:366;;;:::o;45365:419::-;45531:4;45569:2;45558:9;45554:18;45546:26;;45618:9;45612:4;45608:20;45604:1;45593:9;45589:17;45582:47;45646:131;45772:4;45646:131;:::i;:::-;45638:139;;45365:419;;;:::o;45790:223::-;45930:34;45926:1;45918:6;45914:14;45907:58;45999:6;45994:2;45986:6;45982:15;45975:31;45790:223;:::o;46019:366::-;46161:3;46182:67;46246:2;46241:3;46182:67;:::i;:::-;46175:74;;46258:93;46347:3;46258:93;:::i;:::-;46376:2;46371:3;46367:12;46360:19;;46019:366;;;:::o;46391:419::-;46557:4;46595:2;46584:9;46580:18;46572:26;;46644:9;46638:4;46634:20;46630:1;46619:9;46615:17;46608:47;46672:131;46798:4;46672:131;:::i;:::-;46664:139;;46391:419;;;:::o;46816:191::-;46856:4;46876:20;46894:1;46876:20;:::i;:::-;46871:25;;46910:20;46928:1;46910:20;:::i;:::-;46905:25;;46949:1;46946;46943:8;46940:34;;;46954:18;;:::i;:::-;46940:34;46999:1;46996;46992:9;46984:17;;46816:191;;;;:::o;47013:147::-;47114:11;47151:3;47136:18;;47013:147;;;;:::o;47166:114::-;;:::o;47286:398::-;47445:3;47466:83;47547:1;47542:3;47466:83;:::i;:::-;47459:90;;47558:93;47647:3;47558:93;:::i;:::-;47676:1;47671:3;47667:11;47660:18;;47286:398;;;:::o;47690:379::-;47874:3;47896:147;48039:3;47896:147;:::i;:::-;47889:154;;48060:3;48053:10;;47690:379;;;:::o;48075:170::-;48215:22;48211:1;48203:6;48199:14;48192:46;48075:170;:::o;48251:366::-;48393:3;48414:67;48478:2;48473:3;48414:67;:::i;:::-;48407:74;;48490:93;48579:3;48490:93;:::i;:::-;48608:2;48603:3;48599:12;48592:19;;48251:366;;;:::o;48623:419::-;48789:4;48827:2;48816:9;48812:18;48804:26;;48876:9;48870:4;48866:20;48862:1;48851:9;48847:17;48840:47;48904:131;49030:4;48904:131;:::i;:::-;48896:139;;48623:419;;;:::o;49048:237::-;49188:34;49184:1;49176:6;49172:14;49165:58;49257:20;49252:2;49244:6;49240:15;49233:45;49048:237;:::o;49291:366::-;49433:3;49454:67;49518:2;49513:3;49454:67;:::i;:::-;49447:74;;49530:93;49619:3;49530:93;:::i;:::-;49648:2;49643:3;49639:12;49632:19;;49291:366;;;:::o;49663:419::-;49829:4;49867:2;49856:9;49852:18;49844:26;;49916:9;49910:4;49906:20;49902:1;49891:9;49887:17;49880:47;49944:131;50070:4;49944:131;:::i;:::-;49936:139;;49663:419;;;:::o;50088:176::-;50120:1;50137:20;50155:1;50137:20;:::i;:::-;50132:25;;50171:20;50189:1;50171:20;:::i;:::-;50166:25;;50210:1;50200:35;;50215:18;;:::i;:::-;50200:35;50256:1;50253;50249:9;50244:14;;50088:176;;;;:::o;50270:180::-;50318:77;50315:1;50308:88;50415:4;50412:1;50405:15;50439:4;50436:1;50429:15;50456:98;50507:6;50541:5;50535:12;50525:22;;50456:98;;;:::o;50560:168::-;50643:11;50677:6;50672:3;50665:19;50717:4;50712:3;50708:14;50693:29;;50560:168;;;;:::o;50734:360::-;50820:3;50848:38;50880:5;50848:38;:::i;:::-;50902:70;50965:6;50960:3;50902:70;:::i;:::-;50895:77;;50981:52;51026:6;51021:3;51014:4;51007:5;51003:16;50981:52;:::i;:::-;51058:29;51080:6;51058:29;:::i;:::-;51053:3;51049:39;51042:46;;50824:270;50734:360;;;;:::o;51100:640::-;51295:4;51333:3;51322:9;51318:19;51310:27;;51347:71;51415:1;51404:9;51400:17;51391:6;51347:71;:::i;:::-;51428:72;51496:2;51485:9;51481:18;51472:6;51428:72;:::i;:::-;51510;51578:2;51567:9;51563:18;51554:6;51510:72;:::i;:::-;51629:9;51623:4;51619:20;51614:2;51603:9;51599:18;51592:48;51657:76;51728:4;51719:6;51657:76;:::i;:::-;51649:84;;51100:640;;;;;;;:::o;51746:141::-;51802:5;51833:6;51827:13;51818:22;;51849:32;51875:5;51849:32;:::i;:::-;51746:141;;;;:::o;51893:349::-;51962:6;52011:2;51999:9;51990:7;51986:23;51982:32;51979:119;;;52017:79;;:::i;:::-;51979:119;52137:1;52162:63;52217:7;52208:6;52197:9;52193:22;52162:63;:::i;:::-;52152:73;;52108:127;51893:349;;;;:::o;52248:182::-;52388:34;52384:1;52376:6;52372:14;52365:58;52248:182;:::o;52436:366::-;52578:3;52599:67;52663:2;52658:3;52599:67;:::i;:::-;52592:74;;52675:93;52764:3;52675:93;:::i;:::-;52793:2;52788:3;52784:12;52777:19;;52436:366;;;:::o;52808:419::-;52974:4;53012:2;53001:9;52997:18;52989:26;;53061:9;53055:4;53051:20;53047:1;53036:9;53032:17;53025:47;53089:131;53215:4;53089:131;:::i;:::-;53081:139;;52808:419;;;:::o;53233:178::-;53373:30;53369:1;53361:6;53357:14;53350:54;53233:178;:::o;53417:366::-;53559:3;53580:67;53644:2;53639:3;53580:67;:::i;:::-;53573:74;;53656:93;53745:3;53656:93;:::i;:::-;53774:2;53769:3;53765:12;53758:19;;53417:366;;;:::o;53789:419::-;53955:4;53993:2;53982:9;53978:18;53970:26;;54042:9;54036:4;54032:20;54028:1;54017:9;54013:17;54006:47;54070:131;54196:4;54070:131;:::i;:::-;54062:139;;53789:419;;;:::o

Swarm Source

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