ETH Price: $3,097.40 (-1.17%)

Token

Robotos (ROBO)
 

Overview

Max Total Supply

9,999 ROBO

Holders

5,401

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 ROBO
0xec717856820681f6307239b4bcc8bec607911be8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Robotos is a collection of algorithmically generated droid characters designed by Pablo Stanley and minted as NFTs on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Robotos

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.4.3 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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/[email protected]


pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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/utils/[email protected]


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/introspection/[email protected]


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/[email protected]


pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/access/[email protected]


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 contracts/Robotos.sol


pragma solidity ^0.8.0;


contract Robotos is ERC721Enumerable, Ownable {

    using Strings for uint256;

    string public _baseTokenURI;
    uint256 public _price = 0.05 ether;
    uint256 public _maxSupply = 9999;
    bool public _preSaleIsActive = false;
    bool public _saleIsActive = false;

    address a1 = 0x63989a803b61581683B54AB6188ffa0F4bAAdf28;
    address a2 = 0x273Dc0347CB3AbA026F8A4704B1E1a81a3647Cf3;
    address a3 = 0x81a76401a46FA740c911e374324E4046b84cFA33;

    constructor(string memory baseURI) ERC721("Robotos", "ROBO") {
        setBaseURI(baseURI);

        for (uint256 i = 0; i < 36; i++) {
            if (i < 16) {
                _safeMint(a1, i);
            }
            else if (i < 26) {
                _safeMint(a2, i);
            }
            else if (i < 36) {
                _safeMint(a3, i);
            }
        }
    }

    function preSaleMint() public payable {
        uint256 supply = totalSupply();

        require(_preSaleIsActive,                   "presale_not_active");
        require(balanceOf(msg.sender) == 0,         "presale_wallet_limit_met");
        require(supply < 900,                       "max_token_supply_exceeded");
        require(msg.value >= _price,                "insufficient_payment_value");

        _safeMint(msg.sender, supply);
    }

    function mint(uint256 mintCount) public payable {
        uint256 supply = totalSupply();

        require(_saleIsActive,                      "sale_not_active");
        require(mintCount <= 18,                    "max_mint_count_exceeded");
        require(supply + mintCount <= _maxSupply,   "max_token_supply_exceeded");
        require(msg.value >= _price * mintCount,    "insufficient_payment_value");

        for (uint256 i = 0; i < mintCount; i++) {
            _safeMint(msg.sender, supply + i);
        }
        if (supply + mintCount == _maxSupply) {
            withdrawAll();
        }
    }

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

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

    function setPrice(uint256 price) public onlyOwner {
        _price = price;
    }

    function preSaleStart() public onlyOwner {
        _preSaleIsActive = true;
    }

    function preSaleStop() public onlyOwner {
        _preSaleIsActive = false;
    }

    function saleStart() public onlyOwner {
        _saleIsActive = true;
    }

    function saleStop() public onlyOwner {
        _saleIsActive = false;
    }

    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function withdrawAll() public payable onlyOwner {
        uint256 _each = address(this).balance / 3;
        require(payable(a1).send(_each));
        require(payable(a2).send(_each));
        require(payable(a3).send(_each));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preSaleStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266b1a2bc2ec50000600c5561270f600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055507363989a803b61581683b54ab6188ffa0f4baadf28600e60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073273dc0347cb3aba026f8a4704b1e1a81a3647cf3600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507381a76401a46fa740c911e374324e4046b84cfa33601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200015757600080fd5b5060405162005d5538038062005d5583398181016040528101906200017d91906200109e565b6040518060400160405280600781526020017f526f626f746f73000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f524f424f0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200020192919062000f39565b5080600190805190602001906200021a92919062000f39565b5050506200023d620002316200034260201b60201c565b6200034a60201b60201c565b6200024e816200041060201b60201c565b60005b60248110156200033a5760108110156200029f5762000299600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682620004bb60201b60201c565b62000324565b601a811015620002e357620002dd600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682620004bb60201b60201c565b62000323565b6024811015620003225762000321601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682620004bb60201b60201c565b5b5b5b8080620003319062001537565b91505062000251565b505062001756565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004206200034260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000446620004e160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200049f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049690620012e5565b60405180910390fd5b80600b9080519060200190620004b792919062000f39565b5050565b620004dd8282604051806020016040528060008152506200050b60201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200051d83836200057960201b60201c565b6200053260008484846200075f60201b60201c565b62000574576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056b906200125d565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005e390620012c3565b60405180910390fd5b620005fd816200091960201b60201c565b1562000640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000637906200127f565b60405180910390fd5b62000654600083836200098560201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620006a6919062001393565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200078d8473ffffffffffffffffffffffffffffffffffffffff1662000acc60201b62001c821760201c565b156200090c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620007bf6200034260201b60201c565b8786866040518563ffffffff1660e01b8152600401620007e3949392919062001209565b602060405180830381600087803b158015620007fe57600080fd5b505af19250505080156200083257506040513d601f19601f820116820180604052508101906200082f919062001072565b60015b620008bb573d806000811462000865576040519150601f19603f3d011682016040523d82523d6000602084013e6200086a565b606091505b50600081511415620008b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008aa906200125d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000911565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200099d83838362000adf60201b62001c951760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620009ea57620009e48162000ae460201b60201c565b62000a32565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000a315762000a30838262000b2d60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000a7f5762000a798162000caa60201b60201c565b62000ac7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000ac65762000ac5828262000df260201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000b478462000e7e60201b62000e031760201c565b62000b539190620013f0565b905060006007600084815260200190815260200160002054905081811462000c39576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000cc09190620013f0565b905060006009600084815260200190815260200160002054905060006008838154811062000d17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000d60577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000dd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000e0a8362000e7e60201b62000e031760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000ef2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ee990620012a1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000f4790620014cb565b90600052602060002090601f01602090048101928262000f6b576000855562000fb7565b82601f1062000f8657805160ff191683800117855562000fb7565b8280016001018555821562000fb7579182015b8281111562000fb657825182559160200191906001019062000f99565b5b50905062000fc6919062000fca565b5090565b5b8082111562000fe557600081600090555060010162000fcb565b5090565b60006200100062000ffa8462001330565b62001307565b9050828152602081018484840111156200101957600080fd5b6200102684828562001495565b509392505050565b6000815190506200103f816200173c565b92915050565b600082601f8301126200105757600080fd5b81516200106984826020860162000fe9565b91505092915050565b6000602082840312156200108557600080fd5b600062001095848285016200102e565b91505092915050565b600060208284031215620010b157600080fd5b600082015167ffffffffffffffff811115620010cc57600080fd5b620010da8482850162001045565b91505092915050565b620010ee816200142b565b82525050565b6000620011018262001366565b6200110d818562001371565b93506200111f81856020860162001495565b6200112a8162001612565b840191505092915050565b60006200114460328362001382565b9150620011518262001623565b604082019050919050565b60006200116b601c8362001382565b9150620011788262001672565b602082019050919050565b600062001192602a8362001382565b91506200119f826200169b565b604082019050919050565b6000620011b960208362001382565b9150620011c682620016ea565b602082019050919050565b6000620011e060208362001382565b9150620011ed8262001713565b602082019050919050565b62001203816200148b565b82525050565b6000608082019050620012206000830187620010e3565b6200122f6020830186620010e3565b6200123e6040830185620011f8565b8181036060830152620012528184620010f4565b905095945050505050565b60006020820190508181036000830152620012788162001135565b9050919050565b600060208201905081810360008301526200129a816200115c565b9050919050565b60006020820190508181036000830152620012bc8162001183565b9050919050565b60006020820190508181036000830152620012de81620011aa565b9050919050565b600060208201905081810360008301526200130081620011d1565b9050919050565b60006200131362001326565b905062001321828262001501565b919050565b6000604051905090565b600067ffffffffffffffff8211156200134e576200134d620015e3565b5b620013598262001612565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620013a0826200148b565b9150620013ad836200148b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620013e557620013e462001585565b5b828201905092915050565b6000620013fd826200148b565b91506200140a836200148b565b92508282101562001420576200141f62001585565b5b828203905092915050565b600062001438826200146b565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620014b557808201518184015260208101905062001498565b83811115620014c5576000848401525b50505050565b60006002820490506001821680620014e457607f821691505b60208210811415620014fb57620014fa620015b4565b5b50919050565b6200150c8262001612565b810181811067ffffffffffffffff821117156200152e576200152d620015e3565b5b80604052505050565b600062001544826200148b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200157a576200157962001585565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62001747816200143f565b81146200175357600080fd5b50565b6145ef80620017666000396000f3fe6080604052600436106101f95760003560e01c80638078059c1161010d578063ab0bcc41116100a0578063cfc86f7b1161006f578063cfc86f7b146106be578063d8c7a797146106e9578063e985e9c514610714578063ef305cec14610751578063f2fde38b14610768576101f9565b8063ab0bcc4114610637578063ace6cf111461064e578063b88d4fde14610658578063c87b56dd14610681576101f9565b806391b7f5ed116100dc57806391b7f5ed1461059e57806395d89b41146105c7578063a0712d68146105f2578063a22cb4651461060e576101f9565b80638078059c146105155780638462151c1461052c578063853828b6146105695780638da5cb5b14610573576101f9565b806323b872dd1161019057806355f804b31161015f57806355f804b3146104305780635d893ba0146104595780636352211e1461048457806370a08231146104c1578063715018a6146104fe576101f9565b806323b872dd146103645780632f745c591461038d57806342842e0e146103ca5780634f6ccce7146103f3576101f9565b80630d5624b3116101cc5780630d5624b3146102cc57806318160ddd146102e357806322f4596f1461030e578063235b6ea114610339576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061319b565b610791565b60405161023291906137a1565b60405180910390f35b34801561024757600080fd5b5061025061080b565b60405161025d91906137bc565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061322e565b61089d565b60405161029a9190613718565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c5919061315f565b610922565b005b3480156102d857600080fd5b506102e1610a3a565b005b3480156102ef57600080fd5b506102f8610ad3565b6040516103059190613ade565b60405180910390f35b34801561031a57600080fd5b50610323610ae0565b6040516103309190613ade565b60405180910390f35b34801561034557600080fd5b5061034e610ae6565b60405161035b9190613ade565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613059565b610aec565b005b34801561039957600080fd5b506103b460048036038101906103af919061315f565b610b4c565b6040516103c19190613ade565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613059565b610bf1565b005b3480156103ff57600080fd5b5061041a6004803603810190610415919061322e565b610c11565b6040516104279190613ade565b60405180910390f35b34801561043c57600080fd5b50610457600480360381019061045291906131ed565b610ca8565b005b34801561046557600080fd5b5061046e610d3e565b60405161047b91906137a1565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061322e565b610d51565b6040516104b89190613718565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190612ff4565b610e03565b6040516104f59190613ade565b60405180910390f35b34801561050a57600080fd5b50610513610ebb565b005b34801561052157600080fd5b5061052a610f43565b005b34801561053857600080fd5b50610553600480360381019061054e9190612ff4565b610fdc565b604051610560919061377f565b60405180910390f35b6105716110d6565b005b34801561057f57600080fd5b50610588611286565b6040516105959190613718565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c0919061322e565b6112b0565b005b3480156105d357600080fd5b506105dc611336565b6040516105e991906137bc565b60405180910390f35b61060c6004803603810190610607919061322e565b6113c8565b005b34801561061a57600080fd5b5061063560048036038101906106309190613123565b61155d565b005b34801561064357600080fd5b5061064c6116de565b005b610656611777565b005b34801561066457600080fd5b5061067f600480360381019061067a91906130a8565b6118b3565b005b34801561068d57600080fd5b506106a860048036038101906106a3919061322e565b611915565b6040516106b591906137bc565b60405180910390f35b3480156106ca57600080fd5b506106d36119bc565b6040516106e091906137bc565b60405180910390f35b3480156106f557600080fd5b506106fe611a4a565b60405161070b91906137a1565b60405180910390f35b34801561072057600080fd5b5061073b6004803603810190610736919061301d565b611a5d565b60405161074891906137a1565b60405180910390f35b34801561075d57600080fd5b50610766611af1565b005b34801561077457600080fd5b5061078f600480360381019061078a9190612ff4565b611b8a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610804575061080382611c9a565b5b9050919050565b60606000805461081a90613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461084690613dc7565b80156108935780601f1061086857610100808354040283529160200191610893565b820191906000526020600020905b81548152906001019060200180831161087657829003601f168201915b5050505050905090565b60006108a882611d7c565b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de9061397e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092d82610d51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590613a1e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109bd611de8565b73ffffffffffffffffffffffffffffffffffffffff1614806109ec57506109eb816109e6611de8565b611a5d565b5b610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a22906138be565b60405180910390fd5b610a358383611df0565b505050565b610a42611de8565b73ffffffffffffffffffffffffffffffffffffffff16610a60611286565b73ffffffffffffffffffffffffffffffffffffffff1614610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad9061399e565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b6000600880549050905090565b600d5481565b600c5481565b610afd610af7611de8565b82611ea9565b610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613a5e565b60405180910390fd5b610b47838383611f87565b505050565b6000610b5783610e03565b8210610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f906137de565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c0c838383604051806020016040528060008152506118b3565b505050565b6000610c1b610ad3565b8210610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390613a9e565b60405180910390fd5b60088281548110610c96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610cb0611de8565b73ffffffffffffffffffffffffffffffffffffffff16610cce611286565b73ffffffffffffffffffffffffffffffffffffffff1614610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b9061399e565b60405180910390fd5b80600b9080519060200190610d3a929190612e18565b5050565b600e60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df1906138fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b906138de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ec3611de8565b73ffffffffffffffffffffffffffffffffffffffff16610ee1611286565b73ffffffffffffffffffffffffffffffffffffffff1614610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061399e565b60405180910390fd5b610f4160006121e3565b565b610f4b611de8565b73ffffffffffffffffffffffffffffffffffffffff16610f69611286565b73ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb69061399e565b60405180910390fd5b6000600e60016101000a81548160ff021916908315150217905550565b60606000610fe983610e03565b905060008167ffffffffffffffff81111561102d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561105b5781602001602082028036833780820191505090505b50905060005b828110156110cb576110738582610b4c565b8282815181106110ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806110c390613e2a565b915050611061565b508092505050919050565b6110de611de8565b73ffffffffffffffffffffffffffffffffffffffff166110fc611286565b73ffffffffffffffffffffffffffffffffffffffff1614611152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111499061399e565b60405180910390fd5b60006003476111619190613c52565b9050600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506111c357600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061122357600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061128357600080fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b8611de8565b73ffffffffffffffffffffffffffffffffffffffff166112d6611286565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113239061399e565b60405180910390fd5b80600c8190555050565b60606001805461134590613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461137190613dc7565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b5050505050905090565b60006113d2610ad3565b9050600e60019054906101000a900460ff16611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a9061393e565b60405180910390fd5b6012821115611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e9061391e565b60405180910390fd5b600d5482826114769190613bfc565b11156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613a7e565b60405180910390fd5b81600c546114c59190613c83565b341015611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90613a3e565b60405180910390fd5b60005b8281101561153a576115273382846115229190613bfc565b6122a9565b808061153290613e2a565b91505061150a565b50600d54828261154a9190613bfc565b1415611559576115586110d6565b5b5050565b611565611de8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca9061387e565b60405180910390fd5b80600560006115e0611de8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168d611de8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d291906137a1565b60405180910390a35050565b6116e6611de8565b73ffffffffffffffffffffffffffffffffffffffff16611704611286565b73ffffffffffffffffffffffffffffffffffffffff161461175a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117519061399e565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b6000611781610ad3565b9050600e60009054906101000a900460ff166117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990613abe565b60405180910390fd5b60006117dd33610e03565b1461181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906139fe565b60405180910390fd5b6103848110611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613a7e565b60405180910390fd5b600c543410156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613a3e565b60405180910390fd5b6118b033826122a9565b50565b6118c46118be611de8565b83611ea9565b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613a5e565b60405180910390fd5b61190f848484846122c7565b50505050565b606061192082611d7c565b61195f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611956906139de565b60405180910390fd5b6000611969612323565b9050600081511161198957604051806020016040528060008152506119b4565b80611993846123b5565b6040516020016119a49291906136f4565b6040516020818303038152906040525b915050919050565b600b80546119c990613dc7565b80601f01602080910402602001604051908101604052809291908181526020018280546119f590613dc7565b8015611a425780601f10611a1757610100808354040283529160200191611a42565b820191906000526020600020905b815481529060010190602001808311611a2557829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611af9611de8565b73ffffffffffffffffffffffffffffffffffffffff16611b17611286565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b649061399e565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b611b92611de8565b73ffffffffffffffffffffffffffffffffffffffff16611bb0611286565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd9061399e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6d9061381e565b60405180910390fd5b611c7f816121e3565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d6557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d755750611d7482612562565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e6383610d51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611eb482611d7c565b611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea9061389e565b60405180910390fd5b6000611efe83610d51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f6d57508373ffffffffffffffffffffffffffffffffffffffff16611f558461089d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f7e5750611f7d8185611a5d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fa782610d51565b73ffffffffffffffffffffffffffffffffffffffff1614611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff4906139be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561206d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120649061385e565b60405180910390fd5b6120788383836125cc565b612083600082611df0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120d39190613cdd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461212a9190613bfc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122c38282604051806020016040528060008152506126e0565b5050565b6122d2848484611f87565b6122de8484848461273b565b61231d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612314906137fe565b60405180910390fd5b50505050565b6060600b805461233290613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461235e90613dc7565b80156123ab5780601f10612380576101008083540402835291602001916123ab565b820191906000526020600020905b81548152906001019060200180831161238e57829003601f168201915b5050505050905090565b606060008214156123fd576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061255d565b600082905060005b6000821461242f57808061241890613e2a565b915050600a826124289190613c52565b9150612405565b60008167ffffffffffffffff811115612471577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a35781602001600182028036833780820191505090505b5090505b60008514612556576001826124bc9190613cdd565b9150600a856124cb9190613e73565b60306124d79190613bfc565b60f81b818381518110612513577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561254f9190613c52565b94506124a7565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125d7838383611c95565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261a57612615816128d2565b612659565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461265857612657838261291b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561269c5761269781612a88565b6126db565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126da576126d98282612bcb565b5b5b505050565b6126ea8383612c4a565b6126f7600084848461273b565b612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d906137fe565b60405180910390fd5b505050565b600061275c8473ffffffffffffffffffffffffffffffffffffffff16611c82565b156128c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612785611de8565b8786866040518563ffffffff1660e01b81526004016127a79493929190613733565b602060405180830381600087803b1580156127c157600080fd5b505af19250505080156127f257506040513d601f19601f820116820180604052508101906127ef91906131c4565b60015b612875573d8060008114612822576040519150601f19603f3d011682016040523d82523d6000602084013e612827565b606091505b5060008151141561286d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612864906137fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128ca565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161292884610e03565b6129329190613cdd565b9050600060076000848152602001908152602001600020549050818114612a17576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a9c9190613cdd565b9050600060096000848152602001908152602001600020549050600060088381548110612af2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612baf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612bd683610e03565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb19061395e565b60405180910390fd5b612cc381611d7c565b15612d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfa9061383e565b60405180910390fd5b612d0f600083836125cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5f9190613bfc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e2490613dc7565b90600052602060002090601f016020900481019282612e465760008555612e8d565b82601f10612e5f57805160ff1916838001178555612e8d565b82800160010185558215612e8d579182015b82811115612e8c578251825591602001919060010190612e71565b5b509050612e9a9190612e9e565b5090565b5b80821115612eb7576000816000905550600101612e9f565b5090565b6000612ece612ec984613b1e565b613af9565b905082815260208101848484011115612ee657600080fd5b612ef1848285613d85565b509392505050565b6000612f0c612f0784613b4f565b613af9565b905082815260208101848484011115612f2457600080fd5b612f2f848285613d85565b509392505050565b600081359050612f468161455d565b92915050565b600081359050612f5b81614574565b92915050565b600081359050612f708161458b565b92915050565b600081519050612f858161458b565b92915050565b600082601f830112612f9c57600080fd5b8135612fac848260208601612ebb565b91505092915050565b600082601f830112612fc657600080fd5b8135612fd6848260208601612ef9565b91505092915050565b600081359050612fee816145a2565b92915050565b60006020828403121561300657600080fd5b600061301484828501612f37565b91505092915050565b6000806040838503121561303057600080fd5b600061303e85828601612f37565b925050602061304f85828601612f37565b9150509250929050565b60008060006060848603121561306e57600080fd5b600061307c86828701612f37565b935050602061308d86828701612f37565b925050604061309e86828701612fdf565b9150509250925092565b600080600080608085870312156130be57600080fd5b60006130cc87828801612f37565b94505060206130dd87828801612f37565b93505060406130ee87828801612fdf565b925050606085013567ffffffffffffffff81111561310b57600080fd5b61311787828801612f8b565b91505092959194509250565b6000806040838503121561313657600080fd5b600061314485828601612f37565b925050602061315585828601612f4c565b9150509250929050565b6000806040838503121561317257600080fd5b600061318085828601612f37565b925050602061319185828601612fdf565b9150509250929050565b6000602082840312156131ad57600080fd5b60006131bb84828501612f61565b91505092915050565b6000602082840312156131d657600080fd5b60006131e484828501612f76565b91505092915050565b6000602082840312156131ff57600080fd5b600082013567ffffffffffffffff81111561321957600080fd5b61322584828501612fb5565b91505092915050565b60006020828403121561324057600080fd5b600061324e84828501612fdf565b91505092915050565b600061326383836136d6565b60208301905092915050565b61327881613d11565b82525050565b600061328982613b90565b6132938185613bbe565b935061329e83613b80565b8060005b838110156132cf5781516132b68882613257565b97506132c183613bb1565b9250506001810190506132a2565b5085935050505092915050565b6132e581613d23565b82525050565b60006132f682613b9b565b6133008185613bcf565b9350613310818560208601613d94565b61331981613f60565b840191505092915050565b600061332f82613ba6565b6133398185613be0565b9350613349818560208601613d94565b61335281613f60565b840191505092915050565b600061336882613ba6565b6133728185613bf1565b9350613382818560208601613d94565b80840191505092915050565b600061339b602b83613be0565b91506133a682613f71565b604082019050919050565b60006133be603283613be0565b91506133c982613fc0565b604082019050919050565b60006133e1602683613be0565b91506133ec8261400f565b604082019050919050565b6000613404601c83613be0565b915061340f8261405e565b602082019050919050565b6000613427602483613be0565b915061343282614087565b604082019050919050565b600061344a601983613be0565b9150613455826140d6565b602082019050919050565b600061346d602c83613be0565b9150613478826140ff565b604082019050919050565b6000613490603883613be0565b915061349b8261414e565b604082019050919050565b60006134b3602a83613be0565b91506134be8261419d565b604082019050919050565b60006134d6602983613be0565b91506134e1826141ec565b604082019050919050565b60006134f9601783613be0565b91506135048261423b565b602082019050919050565b600061351c600f83613be0565b915061352782614264565b602082019050919050565b600061353f602083613be0565b915061354a8261428d565b602082019050919050565b6000613562602c83613be0565b915061356d826142b6565b604082019050919050565b6000613585602083613be0565b915061359082614305565b602082019050919050565b60006135a8602983613be0565b91506135b38261432e565b604082019050919050565b60006135cb602f83613be0565b91506135d68261437d565b604082019050919050565b60006135ee601883613be0565b91506135f9826143cc565b602082019050919050565b6000613611602183613be0565b915061361c826143f5565b604082019050919050565b6000613634601a83613be0565b915061363f82614444565b602082019050919050565b6000613657603183613be0565b91506136628261446d565b604082019050919050565b600061367a601983613be0565b9150613685826144bc565b602082019050919050565b600061369d602c83613be0565b91506136a8826144e5565b604082019050919050565b60006136c0601283613be0565b91506136cb82614534565b602082019050919050565b6136df81613d7b565b82525050565b6136ee81613d7b565b82525050565b6000613700828561335d565b915061370c828461335d565b91508190509392505050565b600060208201905061372d600083018461326f565b92915050565b6000608082019050613748600083018761326f565b613755602083018661326f565b61376260408301856136e5565b818103606083015261377481846132eb565b905095945050505050565b60006020820190508181036000830152613799818461327e565b905092915050565b60006020820190506137b660008301846132dc565b92915050565b600060208201905081810360008301526137d68184613324565b905092915050565b600060208201905081810360008301526137f78161338e565b9050919050565b60006020820190508181036000830152613817816133b1565b9050919050565b60006020820190508181036000830152613837816133d4565b9050919050565b60006020820190508181036000830152613857816133f7565b9050919050565b600060208201905081810360008301526138778161341a565b9050919050565b600060208201905081810360008301526138978161343d565b9050919050565b600060208201905081810360008301526138b781613460565b9050919050565b600060208201905081810360008301526138d781613483565b9050919050565b600060208201905081810360008301526138f7816134a6565b9050919050565b60006020820190508181036000830152613917816134c9565b9050919050565b60006020820190508181036000830152613937816134ec565b9050919050565b600060208201905081810360008301526139578161350f565b9050919050565b6000602082019050818103600083015261397781613532565b9050919050565b6000602082019050818103600083015261399781613555565b9050919050565b600060208201905081810360008301526139b781613578565b9050919050565b600060208201905081810360008301526139d78161359b565b9050919050565b600060208201905081810360008301526139f7816135be565b9050919050565b60006020820190508181036000830152613a17816135e1565b9050919050565b60006020820190508181036000830152613a3781613604565b9050919050565b60006020820190508181036000830152613a5781613627565b9050919050565b60006020820190508181036000830152613a778161364a565b9050919050565b60006020820190508181036000830152613a978161366d565b9050919050565b60006020820190508181036000830152613ab781613690565b9050919050565b60006020820190508181036000830152613ad7816136b3565b9050919050565b6000602082019050613af360008301846136e5565b92915050565b6000613b03613b14565b9050613b0f8282613df9565b919050565b6000604051905090565b600067ffffffffffffffff821115613b3957613b38613f31565b5b613b4282613f60565b9050602081019050919050565b600067ffffffffffffffff821115613b6a57613b69613f31565b5b613b7382613f60565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c0782613d7b565b9150613c1283613d7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4757613c46613ea4565b5b828201905092915050565b6000613c5d82613d7b565b9150613c6883613d7b565b925082613c7857613c77613ed3565b5b828204905092915050565b6000613c8e82613d7b565b9150613c9983613d7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cd257613cd1613ea4565b5b828202905092915050565b6000613ce882613d7b565b9150613cf383613d7b565b925082821015613d0657613d05613ea4565b5b828203905092915050565b6000613d1c82613d5b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613db2578082015181840152602081019050613d97565b83811115613dc1576000848401525b50505050565b60006002820490506001821680613ddf57607f821691505b60208210811415613df357613df2613f02565b5b50919050565b613e0282613f60565b810181811067ffffffffffffffff82111715613e2157613e20613f31565b5b80604052505050565b6000613e3582613d7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6857613e67613ea4565b5b600182019050919050565b6000613e7e82613d7b565b9150613e8983613d7b565b925082613e9957613e98613ed3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d61785f6d696e745f636f756e745f6578636565646564000000000000000000600082015250565b7f73616c655f6e6f745f6163746976650000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f70726573616c655f77616c6c65745f6c696d69745f6d65740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e745f7061796d656e745f76616c7565000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d61785f746f6b656e5f737570706c795f657863656564656400000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f70726573616c655f6e6f745f6163746976650000000000000000000000000000600082015250565b61456681613d11565b811461457157600080fd5b50565b61457d81613d23565b811461458857600080fd5b50565b61459481613d2f565b811461459f57600080fd5b50565b6145ab81613d7b565b81146145b657600080fd5b5056fea2646970667358221220c91d872ef8a5010f506f503e271a9d120bb0fa2a253c26b683dd116de0188bfe64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5646484d623748324151774646594a62516e345067443374366470715a6d55576569444d4452586b6a45726e3f000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80638078059c1161010d578063ab0bcc41116100a0578063cfc86f7b1161006f578063cfc86f7b146106be578063d8c7a797146106e9578063e985e9c514610714578063ef305cec14610751578063f2fde38b14610768576101f9565b8063ab0bcc4114610637578063ace6cf111461064e578063b88d4fde14610658578063c87b56dd14610681576101f9565b806391b7f5ed116100dc57806391b7f5ed1461059e57806395d89b41146105c7578063a0712d68146105f2578063a22cb4651461060e576101f9565b80638078059c146105155780638462151c1461052c578063853828b6146105695780638da5cb5b14610573576101f9565b806323b872dd1161019057806355f804b31161015f57806355f804b3146104305780635d893ba0146104595780636352211e1461048457806370a08231146104c1578063715018a6146104fe576101f9565b806323b872dd146103645780632f745c591461038d57806342842e0e146103ca5780634f6ccce7146103f3576101f9565b80630d5624b3116101cc5780630d5624b3146102cc57806318160ddd146102e357806322f4596f1461030e578063235b6ea114610339576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061319b565b610791565b60405161023291906137a1565b60405180910390f35b34801561024757600080fd5b5061025061080b565b60405161025d91906137bc565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061322e565b61089d565b60405161029a9190613718565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c5919061315f565b610922565b005b3480156102d857600080fd5b506102e1610a3a565b005b3480156102ef57600080fd5b506102f8610ad3565b6040516103059190613ade565b60405180910390f35b34801561031a57600080fd5b50610323610ae0565b6040516103309190613ade565b60405180910390f35b34801561034557600080fd5b5061034e610ae6565b60405161035b9190613ade565b60405180910390f35b34801561037057600080fd5b5061038b60048036038101906103869190613059565b610aec565b005b34801561039957600080fd5b506103b460048036038101906103af919061315f565b610b4c565b6040516103c19190613ade565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613059565b610bf1565b005b3480156103ff57600080fd5b5061041a6004803603810190610415919061322e565b610c11565b6040516104279190613ade565b60405180910390f35b34801561043c57600080fd5b50610457600480360381019061045291906131ed565b610ca8565b005b34801561046557600080fd5b5061046e610d3e565b60405161047b91906137a1565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a6919061322e565b610d51565b6040516104b89190613718565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190612ff4565b610e03565b6040516104f59190613ade565b60405180910390f35b34801561050a57600080fd5b50610513610ebb565b005b34801561052157600080fd5b5061052a610f43565b005b34801561053857600080fd5b50610553600480360381019061054e9190612ff4565b610fdc565b604051610560919061377f565b60405180910390f35b6105716110d6565b005b34801561057f57600080fd5b50610588611286565b6040516105959190613718565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c0919061322e565b6112b0565b005b3480156105d357600080fd5b506105dc611336565b6040516105e991906137bc565b60405180910390f35b61060c6004803603810190610607919061322e565b6113c8565b005b34801561061a57600080fd5b5061063560048036038101906106309190613123565b61155d565b005b34801561064357600080fd5b5061064c6116de565b005b610656611777565b005b34801561066457600080fd5b5061067f600480360381019061067a91906130a8565b6118b3565b005b34801561068d57600080fd5b506106a860048036038101906106a3919061322e565b611915565b6040516106b591906137bc565b60405180910390f35b3480156106ca57600080fd5b506106d36119bc565b6040516106e091906137bc565b60405180910390f35b3480156106f557600080fd5b506106fe611a4a565b60405161070b91906137a1565b60405180910390f35b34801561072057600080fd5b5061073b6004803603810190610736919061301d565b611a5d565b60405161074891906137a1565b60405180910390f35b34801561075d57600080fd5b50610766611af1565b005b34801561077457600080fd5b5061078f600480360381019061078a9190612ff4565b611b8a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610804575061080382611c9a565b5b9050919050565b60606000805461081a90613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461084690613dc7565b80156108935780601f1061086857610100808354040283529160200191610893565b820191906000526020600020905b81548152906001019060200180831161087657829003601f168201915b5050505050905090565b60006108a882611d7c565b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de9061397e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092d82610d51565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561099e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099590613a1e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109bd611de8565b73ffffffffffffffffffffffffffffffffffffffff1614806109ec57506109eb816109e6611de8565b611a5d565b5b610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a22906138be565b60405180910390fd5b610a358383611df0565b505050565b610a42611de8565b73ffffffffffffffffffffffffffffffffffffffff16610a60611286565b73ffffffffffffffffffffffffffffffffffffffff1614610ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aad9061399e565b60405180910390fd5b6001600e60006101000a81548160ff021916908315150217905550565b6000600880549050905090565b600d5481565b600c5481565b610afd610af7611de8565b82611ea9565b610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613a5e565b60405180910390fd5b610b47838383611f87565b505050565b6000610b5783610e03565b8210610b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8f906137de565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c0c838383604051806020016040528060008152506118b3565b505050565b6000610c1b610ad3565b8210610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5390613a9e565b60405180910390fd5b60088281548110610c96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610cb0611de8565b73ffffffffffffffffffffffffffffffffffffffff16610cce611286565b73ffffffffffffffffffffffffffffffffffffffff1614610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b9061399e565b60405180910390fd5b80600b9080519060200190610d3a929190612e18565b5050565b600e60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df1906138fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b906138de565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ec3611de8565b73ffffffffffffffffffffffffffffffffffffffff16610ee1611286565b73ffffffffffffffffffffffffffffffffffffffff1614610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e9061399e565b60405180910390fd5b610f4160006121e3565b565b610f4b611de8565b73ffffffffffffffffffffffffffffffffffffffff16610f69611286565b73ffffffffffffffffffffffffffffffffffffffff1614610fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb69061399e565b60405180910390fd5b6000600e60016101000a81548160ff021916908315150217905550565b60606000610fe983610e03565b905060008167ffffffffffffffff81111561102d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561105b5781602001602082028036833780820191505090505b50905060005b828110156110cb576110738582610b4c565b8282815181106110ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806110c390613e2a565b915050611061565b508092505050919050565b6110de611de8565b73ffffffffffffffffffffffffffffffffffffffff166110fc611286565b73ffffffffffffffffffffffffffffffffffffffff1614611152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111499061399e565b60405180910390fd5b60006003476111619190613c52565b9050600e60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506111c357600080fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061122357600080fd5b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061128357600080fd5b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112b8611de8565b73ffffffffffffffffffffffffffffffffffffffff166112d6611286565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113239061399e565b60405180910390fd5b80600c8190555050565b60606001805461134590613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461137190613dc7565b80156113be5780601f10611393576101008083540402835291602001916113be565b820191906000526020600020905b8154815290600101906020018083116113a157829003601f168201915b5050505050905090565b60006113d2610ad3565b9050600e60019054906101000a900460ff16611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a9061393e565b60405180910390fd5b6012821115611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e9061391e565b60405180910390fd5b600d5482826114769190613bfc565b11156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90613a7e565b60405180910390fd5b81600c546114c59190613c83565b341015611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe90613a3e565b60405180910390fd5b60005b8281101561153a576115273382846115229190613bfc565b6122a9565b808061153290613e2a565b91505061150a565b50600d54828261154a9190613bfc565b1415611559576115586110d6565b5b5050565b611565611de8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca9061387e565b60405180910390fd5b80600560006115e0611de8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168d611de8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d291906137a1565b60405180910390a35050565b6116e6611de8565b73ffffffffffffffffffffffffffffffffffffffff16611704611286565b73ffffffffffffffffffffffffffffffffffffffff161461175a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117519061399e565b60405180910390fd5b6001600e60016101000a81548160ff021916908315150217905550565b6000611781610ad3565b9050600e60009054906101000a900460ff166117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990613abe565b60405180910390fd5b60006117dd33610e03565b1461181d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611814906139fe565b60405180910390fd5b6103848110611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613a7e565b60405180910390fd5b600c543410156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613a3e565b60405180910390fd5b6118b033826122a9565b50565b6118c46118be611de8565b83611ea9565b611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613a5e565b60405180910390fd5b61190f848484846122c7565b50505050565b606061192082611d7c565b61195f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611956906139de565b60405180910390fd5b6000611969612323565b9050600081511161198957604051806020016040528060008152506119b4565b80611993846123b5565b6040516020016119a49291906136f4565b6040516020818303038152906040525b915050919050565b600b80546119c990613dc7565b80601f01602080910402602001604051908101604052809291908181526020018280546119f590613dc7565b8015611a425780601f10611a1757610100808354040283529160200191611a42565b820191906000526020600020905b815481529060010190602001808311611a2557829003601f168201915b505050505081565b600e60009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611af9611de8565b73ffffffffffffffffffffffffffffffffffffffff16611b17611286565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b649061399e565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b611b92611de8565b73ffffffffffffffffffffffffffffffffffffffff16611bb0611286565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd9061399e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6d9061381e565b60405180910390fd5b611c7f816121e3565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d6557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d755750611d7482612562565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e6383610d51565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611eb482611d7c565b611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea9061389e565b60405180910390fd5b6000611efe83610d51565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f6d57508373ffffffffffffffffffffffffffffffffffffffff16611f558461089d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f7e5750611f7d8185611a5d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fa782610d51565b73ffffffffffffffffffffffffffffffffffffffff1614611ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff4906139be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561206d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120649061385e565b60405180910390fd5b6120788383836125cc565b612083600082611df0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120d39190613cdd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461212a9190613bfc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122c38282604051806020016040528060008152506126e0565b5050565b6122d2848484611f87565b6122de8484848461273b565b61231d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612314906137fe565b60405180910390fd5b50505050565b6060600b805461233290613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461235e90613dc7565b80156123ab5780601f10612380576101008083540402835291602001916123ab565b820191906000526020600020905b81548152906001019060200180831161238e57829003601f168201915b5050505050905090565b606060008214156123fd576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061255d565b600082905060005b6000821461242f57808061241890613e2a565b915050600a826124289190613c52565b9150612405565b60008167ffffffffffffffff811115612471577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a35781602001600182028036833780820191505090505b5090505b60008514612556576001826124bc9190613cdd565b9150600a856124cb9190613e73565b60306124d79190613bfc565b60f81b818381518110612513577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561254f9190613c52565b94506124a7565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125d7838383611c95565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261a57612615816128d2565b612659565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461265857612657838261291b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561269c5761269781612a88565b6126db565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126da576126d98282612bcb565b5b5b505050565b6126ea8383612c4a565b6126f7600084848461273b565b612736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272d906137fe565b60405180910390fd5b505050565b600061275c8473ffffffffffffffffffffffffffffffffffffffff16611c82565b156128c5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612785611de8565b8786866040518563ffffffff1660e01b81526004016127a79493929190613733565b602060405180830381600087803b1580156127c157600080fd5b505af19250505080156127f257506040513d601f19601f820116820180604052508101906127ef91906131c4565b60015b612875573d8060008114612822576040519150601f19603f3d011682016040523d82523d6000602084013e612827565b606091505b5060008151141561286d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612864906137fe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128ca565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161292884610e03565b6129329190613cdd565b9050600060076000848152602001908152602001600020549050818114612a17576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a9c9190613cdd565b9050600060096000848152602001908152602001600020549050600060088381548110612af2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612baf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612bd683610e03565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb19061395e565b60405180910390fd5b612cc381611d7c565b15612d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfa9061383e565b60405180910390fd5b612d0f600083836125cc565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d5f9190613bfc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e2490613dc7565b90600052602060002090601f016020900481019282612e465760008555612e8d565b82601f10612e5f57805160ff1916838001178555612e8d565b82800160010185558215612e8d579182015b82811115612e8c578251825591602001919060010190612e71565b5b509050612e9a9190612e9e565b5090565b5b80821115612eb7576000816000905550600101612e9f565b5090565b6000612ece612ec984613b1e565b613af9565b905082815260208101848484011115612ee657600080fd5b612ef1848285613d85565b509392505050565b6000612f0c612f0784613b4f565b613af9565b905082815260208101848484011115612f2457600080fd5b612f2f848285613d85565b509392505050565b600081359050612f468161455d565b92915050565b600081359050612f5b81614574565b92915050565b600081359050612f708161458b565b92915050565b600081519050612f858161458b565b92915050565b600082601f830112612f9c57600080fd5b8135612fac848260208601612ebb565b91505092915050565b600082601f830112612fc657600080fd5b8135612fd6848260208601612ef9565b91505092915050565b600081359050612fee816145a2565b92915050565b60006020828403121561300657600080fd5b600061301484828501612f37565b91505092915050565b6000806040838503121561303057600080fd5b600061303e85828601612f37565b925050602061304f85828601612f37565b9150509250929050565b60008060006060848603121561306e57600080fd5b600061307c86828701612f37565b935050602061308d86828701612f37565b925050604061309e86828701612fdf565b9150509250925092565b600080600080608085870312156130be57600080fd5b60006130cc87828801612f37565b94505060206130dd87828801612f37565b93505060406130ee87828801612fdf565b925050606085013567ffffffffffffffff81111561310b57600080fd5b61311787828801612f8b565b91505092959194509250565b6000806040838503121561313657600080fd5b600061314485828601612f37565b925050602061315585828601612f4c565b9150509250929050565b6000806040838503121561317257600080fd5b600061318085828601612f37565b925050602061319185828601612fdf565b9150509250929050565b6000602082840312156131ad57600080fd5b60006131bb84828501612f61565b91505092915050565b6000602082840312156131d657600080fd5b60006131e484828501612f76565b91505092915050565b6000602082840312156131ff57600080fd5b600082013567ffffffffffffffff81111561321957600080fd5b61322584828501612fb5565b91505092915050565b60006020828403121561324057600080fd5b600061324e84828501612fdf565b91505092915050565b600061326383836136d6565b60208301905092915050565b61327881613d11565b82525050565b600061328982613b90565b6132938185613bbe565b935061329e83613b80565b8060005b838110156132cf5781516132b68882613257565b97506132c183613bb1565b9250506001810190506132a2565b5085935050505092915050565b6132e581613d23565b82525050565b60006132f682613b9b565b6133008185613bcf565b9350613310818560208601613d94565b61331981613f60565b840191505092915050565b600061332f82613ba6565b6133398185613be0565b9350613349818560208601613d94565b61335281613f60565b840191505092915050565b600061336882613ba6565b6133728185613bf1565b9350613382818560208601613d94565b80840191505092915050565b600061339b602b83613be0565b91506133a682613f71565b604082019050919050565b60006133be603283613be0565b91506133c982613fc0565b604082019050919050565b60006133e1602683613be0565b91506133ec8261400f565b604082019050919050565b6000613404601c83613be0565b915061340f8261405e565b602082019050919050565b6000613427602483613be0565b915061343282614087565b604082019050919050565b600061344a601983613be0565b9150613455826140d6565b602082019050919050565b600061346d602c83613be0565b9150613478826140ff565b604082019050919050565b6000613490603883613be0565b915061349b8261414e565b604082019050919050565b60006134b3602a83613be0565b91506134be8261419d565b604082019050919050565b60006134d6602983613be0565b91506134e1826141ec565b604082019050919050565b60006134f9601783613be0565b91506135048261423b565b602082019050919050565b600061351c600f83613be0565b915061352782614264565b602082019050919050565b600061353f602083613be0565b915061354a8261428d565b602082019050919050565b6000613562602c83613be0565b915061356d826142b6565b604082019050919050565b6000613585602083613be0565b915061359082614305565b602082019050919050565b60006135a8602983613be0565b91506135b38261432e565b604082019050919050565b60006135cb602f83613be0565b91506135d68261437d565b604082019050919050565b60006135ee601883613be0565b91506135f9826143cc565b602082019050919050565b6000613611602183613be0565b915061361c826143f5565b604082019050919050565b6000613634601a83613be0565b915061363f82614444565b602082019050919050565b6000613657603183613be0565b91506136628261446d565b604082019050919050565b600061367a601983613be0565b9150613685826144bc565b602082019050919050565b600061369d602c83613be0565b91506136a8826144e5565b604082019050919050565b60006136c0601283613be0565b91506136cb82614534565b602082019050919050565b6136df81613d7b565b82525050565b6136ee81613d7b565b82525050565b6000613700828561335d565b915061370c828461335d565b91508190509392505050565b600060208201905061372d600083018461326f565b92915050565b6000608082019050613748600083018761326f565b613755602083018661326f565b61376260408301856136e5565b818103606083015261377481846132eb565b905095945050505050565b60006020820190508181036000830152613799818461327e565b905092915050565b60006020820190506137b660008301846132dc565b92915050565b600060208201905081810360008301526137d68184613324565b905092915050565b600060208201905081810360008301526137f78161338e565b9050919050565b60006020820190508181036000830152613817816133b1565b9050919050565b60006020820190508181036000830152613837816133d4565b9050919050565b60006020820190508181036000830152613857816133f7565b9050919050565b600060208201905081810360008301526138778161341a565b9050919050565b600060208201905081810360008301526138978161343d565b9050919050565b600060208201905081810360008301526138b781613460565b9050919050565b600060208201905081810360008301526138d781613483565b9050919050565b600060208201905081810360008301526138f7816134a6565b9050919050565b60006020820190508181036000830152613917816134c9565b9050919050565b60006020820190508181036000830152613937816134ec565b9050919050565b600060208201905081810360008301526139578161350f565b9050919050565b6000602082019050818103600083015261397781613532565b9050919050565b6000602082019050818103600083015261399781613555565b9050919050565b600060208201905081810360008301526139b781613578565b9050919050565b600060208201905081810360008301526139d78161359b565b9050919050565b600060208201905081810360008301526139f7816135be565b9050919050565b60006020820190508181036000830152613a17816135e1565b9050919050565b60006020820190508181036000830152613a3781613604565b9050919050565b60006020820190508181036000830152613a5781613627565b9050919050565b60006020820190508181036000830152613a778161364a565b9050919050565b60006020820190508181036000830152613a978161366d565b9050919050565b60006020820190508181036000830152613ab781613690565b9050919050565b60006020820190508181036000830152613ad7816136b3565b9050919050565b6000602082019050613af360008301846136e5565b92915050565b6000613b03613b14565b9050613b0f8282613df9565b919050565b6000604051905090565b600067ffffffffffffffff821115613b3957613b38613f31565b5b613b4282613f60565b9050602081019050919050565b600067ffffffffffffffff821115613b6a57613b69613f31565b5b613b7382613f60565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c0782613d7b565b9150613c1283613d7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4757613c46613ea4565b5b828201905092915050565b6000613c5d82613d7b565b9150613c6883613d7b565b925082613c7857613c77613ed3565b5b828204905092915050565b6000613c8e82613d7b565b9150613c9983613d7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cd257613cd1613ea4565b5b828202905092915050565b6000613ce882613d7b565b9150613cf383613d7b565b925082821015613d0657613d05613ea4565b5b828203905092915050565b6000613d1c82613d5b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613db2578082015181840152602081019050613d97565b83811115613dc1576000848401525b50505050565b60006002820490506001821680613ddf57607f821691505b60208210811415613df357613df2613f02565b5b50919050565b613e0282613f60565b810181811067ffffffffffffffff82111715613e2157613e20613f31565b5b80604052505050565b6000613e3582613d7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6857613e67613ea4565b5b600182019050919050565b6000613e7e82613d7b565b9150613e8983613d7b565b925082613e9957613e98613ed3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f6d61785f6d696e745f636f756e745f6578636565646564000000000000000000600082015250565b7f73616c655f6e6f745f6163746976650000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f70726573616c655f77616c6c65745f6c696d69745f6d65740000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e745f7061796d656e745f76616c7565000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f6d61785f746f6b656e5f737570706c795f657863656564656400000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f70726573616c655f6e6f745f6163746976650000000000000000000000000000600082015250565b61456681613d11565b811461457157600080fd5b50565b61457d81613d23565b811461458857600080fd5b50565b61459481613d2f565b811461459f57600080fd5b50565b6145ab81613d7b565b81146145b657600080fd5b5056fea2646970667358221220c91d872ef8a5010f506f503e271a9d120bb0fa2a253c26b683dd116de0188bfe64736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5646484d623748324151774646594a62516e345067443374366470715a6d55576569444d4452586b6a45726e3f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmVFHMb7H2AQwFFYJbQn4PgD3t6dpqZmUWeiDMDRXkjErn?

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d5646484d623748324151774646594a62516e34506744337436647071
Arg [4] : 5a6d55576569444d4452586b6a45726e3f000000000000000000000000000000


Deployed Bytecode Sourcemap

43120:3240:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34624:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21513:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23072:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22595:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45416:83;;;;;;;;;;;;;:::i;:::-;;35264:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43284:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43243:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23962:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34932:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24372:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35454:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45215:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43366:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21207:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20937:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42425:94;;;;;;;;;;;;;:::i;:::-;;45683:77;;;;;;;;;;;;;:::i;:::-;;45768:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46120:237;;;:::i;:::-;;41774:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45325:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21682:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44465:620;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23365:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45598:77;;;;;;;;;;;;;:::i;:::-;;44001:456;;;:::i;:::-;;24628:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21857:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43209:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43323:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23731:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45507:83;;;;;;;;;;;;;:::i;:::-;;42674:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34624:224;34726:4;34765:35;34750:50;;;:11;:50;;;;:90;;;;34804:36;34828:11;34804:23;:36::i;:::-;34750:90;34743:97;;34624:224;;;:::o;21513:100::-;21567:13;21600:5;21593:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21513:100;:::o;23072:221::-;23148:7;23176:16;23184:7;23176;:16::i;:::-;23168:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23261:15;:24;23277:7;23261:24;;;;;;;;;;;;;;;;;;;;;23254:31;;23072:221;;;:::o;22595:411::-;22676:13;22692:23;22707:7;22692:14;:23::i;:::-;22676:39;;22740:5;22734:11;;:2;:11;;;;22726:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22834:5;22818:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22843:37;22860:5;22867:12;:10;:12::i;:::-;22843:16;:37::i;:::-;22818:62;22796:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22977:21;22986:2;22990:7;22977:8;:21::i;:::-;22595:411;;;:::o;45416:83::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45487:4:::1;45468:16;;:23;;;;;;;;;;;;;;;;;;45416:83::o:0;35264:113::-;35325:7;35352:10;:17;;;;35345:24;;35264:113;:::o;43284:32::-;;;;:::o;43243:34::-;;;;:::o;23962:339::-;24157:41;24176:12;:10;:12::i;:::-;24190:7;24157:18;:41::i;:::-;24149:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24265:28;24275:4;24281:2;24285:7;24265:9;:28::i;:::-;23962:339;;;:::o;34932:256::-;35029:7;35065:23;35082:5;35065:16;:23::i;:::-;35057:5;:31;35049:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35154:12;:19;35167:5;35154:19;;;;;;;;;;;;;;;:26;35174:5;35154:26;;;;;;;;;;;;35147:33;;34932:256;;;;:::o;24372:185::-;24510:39;24527:4;24533:2;24537:7;24510:39;;;;;;;;;;;;:16;:39::i;:::-;24372:185;;;:::o;35454:233::-;35529:7;35565:30;:28;:30::i;:::-;35557:5;:38;35549:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35662:10;35673:5;35662:17;;;;;;;;;;;;;;;;;;;;;;;;35655:24;;35454:233;;;:::o;45215:102::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45302:7:::1;45286:13;:23;;;;;;;;;;;;:::i;:::-;;45215:102:::0;:::o;43366:33::-;;;;;;;;;;;;;:::o;21207:239::-;21279:7;21299:13;21315:7;:16;21323:7;21315:16;;;;;;;;;;;;;;;;;;;;;21299:32;;21367:1;21350:19;;:5;:19;;;;21342:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21433:5;21426:12;;;21207:239;;;:::o;20937:208::-;21009:7;21054:1;21037:19;;:5;:19;;;;21029:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21121:9;:16;21131:5;21121:16;;;;;;;;;;;;;;;;21114:23;;20937:208;;;:::o;42425:94::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42490:21:::1;42508:1;42490:9;:21::i;:::-;42425:94::o:0;45683:77::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45747:5:::1;45731:13;;:21;;;;;;;;;;;;;;;;;;45683:77::o:0;45768:344::-;45827:16;45856:18;45877:16;45887:5;45877:9;:16::i;:::-;45856:37;;45904:25;45946:10;45932:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45904:53;;45973:9;45968:111;45992:10;45988:1;:14;45968:111;;;46038:29;46058:5;46065:1;46038:19;:29::i;:::-;46024:8;46033:1;46024:11;;;;;;;;;;;;;;;;;;;;;:43;;;;;46004:3;;;;;:::i;:::-;;;;45968:111;;;;46096:8;46089:15;;;;45768:344;;;:::o;46120:237::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46179:13:::1;46219:1;46195:21;:25;;;;:::i;:::-;46179:41;;46247:2;;;;;;;;;;;46239:16;;:23;46256:5;46239:23;;;;;;;;;;;;;;;;;;;;;;;46231:32;;;::::0;::::1;;46290:2;;;;;;;;;;;46282:16;;:23;46299:5;46282:23;;;;;;;;;;;;;;;;;;;;;;;46274:32;;;::::0;::::1;;46333:2;;;;;;;;;;;46325:16;;:23;46342:5;46325:23;;;;;;;;;;;;;;;;;;;;;;;46317:32;;;::::0;::::1;;42065:1;46120:237::o:0;41774:87::-;41820:7;41847:6;;;;;;;;;;;41840:13;;41774:87;:::o;45325:83::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45395:5:::1;45386:6;:14;;;;45325:83:::0;:::o;21682:104::-;21738:13;21771:7;21764:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21682:104;:::o;44465:620::-;44524:14;44541:13;:11;:13::i;:::-;44524:30;;44575:13;;;;;;;;;;;44567:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44661:2;44648:9;:15;;44640:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;44751:10;;44738:9;44729:6;:18;;;;:::i;:::-;:32;;44721:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;44834:9;44825:6;;:18;;;;:::i;:::-;44812:9;:31;;44804:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44895:9;44890:100;44914:9;44910:1;:13;44890:100;;;44945:33;44955:10;44976:1;44967:6;:10;;;;:::i;:::-;44945:9;:33::i;:::-;44925:3;;;;;:::i;:::-;;;;44890:100;;;;45026:10;;45013:9;45004:6;:18;;;;:::i;:::-;:32;45000:78;;;45053:13;:11;:13::i;:::-;45000:78;44465:620;;:::o;23365:295::-;23480:12;:10;:12::i;:::-;23468:24;;:8;:24;;;;23460:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23580:8;23535:18;:32;23554:12;:10;:12::i;:::-;23535:32;;;;;;;;;;;;;;;:42;23568:8;23535:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23633:8;23604:48;;23619:12;:10;:12::i;:::-;23604:48;;;23643:8;23604:48;;;;;;:::i;:::-;;;;;;;;23365:295;;:::o;45598:77::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45663:4:::1;45647:13;;:20;;;;;;;;;;;;;;;;;;45598:77::o:0;44001:456::-;44050:14;44067:13;:11;:13::i;:::-;44050:30;;44101:16;;;;;;;;;;;44093:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44202:1;44177:21;44187:10;44177:9;:21::i;:::-;:26;44169:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44268:3;44259:6;:12;44251:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;44355:6;;44342:9;:19;;44334:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44420:29;44430:10;44442:6;44420:9;:29::i;:::-;44001:456;:::o;24628:328::-;24803:41;24822:12;:10;:12::i;:::-;24836:7;24803:18;:41::i;:::-;24795:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24909:39;24923:4;24929:2;24933:7;24942:5;24909:13;:39::i;:::-;24628:328;;;;:::o;21857:334::-;21930:13;21964:16;21972:7;21964;:16::i;:::-;21956:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22045:21;22069:10;:8;:10::i;:::-;22045:34;;22121:1;22103:7;22097:21;:25;:86;;;;;;;;;;;;;;;;;22149:7;22158:18;:7;:16;:18::i;:::-;22132:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22097:86;22090:93;;;21857:334;;;:::o;43209:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43323:36::-;;;;;;;;;;;;;:::o;23731:164::-;23828:4;23852:18;:25;23871:5;23852:25;;;;;;;;;;;;;;;:35;23878:8;23852:35;;;;;;;;;;;;;;;;;;;;;;;;;23845:42;;23731:164;;;;:::o;45507:83::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45577:5:::1;45558:16;;:24;;;;;;;;;;;;;;;;;;45507:83::o:0;42674:192::-;42005:12;:10;:12::i;:::-;41994:23;;:7;:5;:7::i;:::-;:23;;;41986:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42783:1:::1;42763:22;;:8;:22;;;;42755:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42839:19;42849:8;42839:9;:19::i;:::-;42674:192:::0;:::o;8232:387::-;8292:4;8500:12;8567:7;8555:20;8547:28;;8610:1;8603:4;:8;8596:15;;;8232:387;;;:::o;32562:126::-;;;;:::o;20568:305::-;20670:4;20722:25;20707:40;;;:11;:40;;;;:105;;;;20779:33;20764:48;;;:11;:48;;;;20707:105;:158;;;;20829:36;20853:11;20829:23;:36::i;:::-;20707:158;20687:178;;20568:305;;;:::o;26466:127::-;26531:4;26583:1;26555:30;;:7;:16;26563:7;26555:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26548:37;;26466:127;;;:::o;15976:98::-;16029:7;16056:10;16049:17;;15976:98;:::o;30448:174::-;30550:2;30523:15;:24;30539:7;30523:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30606:7;30602:2;30568:46;;30577:23;30592:7;30577:14;:23::i;:::-;30568:46;;;;;;;;;;;;30448:174;;:::o;26760:348::-;26853:4;26878:16;26886:7;26878;:16::i;:::-;26870:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26954:13;26970:23;26985:7;26970:14;:23::i;:::-;26954:39;;27023:5;27012:16;;:7;:16;;;:51;;;;27056:7;27032:31;;:20;27044:7;27032:11;:20::i;:::-;:31;;;27012:51;:87;;;;27067:32;27084:5;27091:7;27067:16;:32::i;:::-;27012:87;27004:96;;;26760:348;;;;:::o;29752:578::-;29911:4;29884:31;;:23;29899:7;29884:14;:23::i;:::-;:31;;;29876:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29994:1;29980:16;;:2;:16;;;;29972:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30050:39;30071:4;30077:2;30081:7;30050:20;:39::i;:::-;30154:29;30171:1;30175:7;30154:8;:29::i;:::-;30215:1;30196:9;:15;30206:4;30196:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30244:1;30227:9;:13;30237:2;30227:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30275:2;30256:7;:16;30264:7;30256:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30314:7;30310:2;30295:27;;30304:4;30295:27;;;;;;;;;;;;29752:578;;;:::o;42874:173::-;42930:16;42949:6;;;;;;;;;;;42930:25;;42975:8;42966:6;;:17;;;;;;;;;;;;;;;;;;43030:8;42999:40;;43020:8;42999:40;;;;;;;;;;;;42874:173;;:::o;27450:110::-;27526:26;27536:2;27540:7;27526:26;;;;;;;;;;;;:9;:26::i;:::-;27450:110;;:::o;25838:315::-;25995:28;26005:4;26011:2;26015:7;25995:9;:28::i;:::-;26042:48;26065:4;26071:2;26075:7;26084:5;26042:22;:48::i;:::-;26034:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25838:315;;;;:::o;45093:114::-;45153:13;45186;45179:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45093:114;:::o;16507:723::-;16563:13;16793:1;16784:5;:10;16780:53;;;16811:10;;;;;;;;;;;;;;;;;;;;;16780:53;16843:12;16858:5;16843:20;;16874:14;16899:78;16914:1;16906:4;:9;16899:78;;16932:8;;;;;:::i;:::-;;;;16963:2;16955:10;;;;;:::i;:::-;;;16899:78;;;16987:19;17019:6;17009:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16987:39;;17037:154;17053:1;17044:5;:10;17037:154;;17081:1;17071:11;;;;;:::i;:::-;;;17148:2;17140:5;:10;;;;:::i;:::-;17127:2;:24;;;;:::i;:::-;17114:39;;17097:6;17104;17097:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17177:2;17168:11;;;;;:::i;:::-;;;17037:154;;;17215:6;17201:21;;;;;16507:723;;;;:::o;19068:157::-;19153:4;19192:25;19177:40;;;:11;:40;;;;19170:47;;19068:157;;;:::o;36300:589::-;36444:45;36471:4;36477:2;36481:7;36444:26;:45::i;:::-;36522:1;36506:18;;:4;:18;;;36502:187;;;36541:40;36573:7;36541:31;:40::i;:::-;36502:187;;;36611:2;36603:10;;:4;:10;;;36599:90;;36630:47;36663:4;36669:7;36630:32;:47::i;:::-;36599:90;36502:187;36717:1;36703:16;;:2;:16;;;36699:183;;;36736:45;36773:7;36736:36;:45::i;:::-;36699:183;;;36809:4;36803:10;;:2;:10;;;36799:83;;36830:40;36858:2;36862:7;36830:27;:40::i;:::-;36799:83;36699:183;36300:589;;;:::o;27787:321::-;27917:18;27923:2;27927:7;27917:5;:18::i;:::-;27968:54;27999:1;28003:2;28007:7;28016:5;27968:22;:54::i;:::-;27946:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27787:321;;;:::o;31187:803::-;31342:4;31363:15;:2;:13;;;:15::i;:::-;31359:624;;;31415:2;31399:36;;;31436:12;:10;:12::i;:::-;31450:4;31456:7;31465:5;31399:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31395:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31662:1;31645:6;:13;:18;31641:272;;;31688:60;;;;;;;;;;:::i;:::-;;;;;;;;31641:272;31863:6;31857:13;31848:6;31844:2;31840:15;31833:38;31395:533;31532:45;;;31522:55;;;:6;:55;;;;31515:62;;;;;31359:624;31967:4;31960:11;;31187:803;;;;;;;:::o;37612:164::-;37716:10;:17;;;;37689:15;:24;37705:7;37689:24;;;;;;;;;;;:44;;;;37744:10;37760:7;37744:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37612:164;:::o;38403:988::-;38669:22;38719:1;38694:22;38711:4;38694:16;:22::i;:::-;:26;;;;:::i;:::-;38669:51;;38731:18;38752:17;:26;38770:7;38752:26;;;;;;;;;;;;38731:47;;38899:14;38885:10;:28;38881:328;;38930:19;38952:12;:18;38965:4;38952:18;;;;;;;;;;;;;;;:34;38971:14;38952:34;;;;;;;;;;;;38930:56;;39036:11;39003:12;:18;39016:4;39003:18;;;;;;;;;;;;;;;:30;39022:10;39003:30;;;;;;;;;;;:44;;;;39153:10;39120:17;:30;39138:11;39120:30;;;;;;;;;;;:43;;;;38881:328;;39305:17;:26;39323:7;39305:26;;;;;;;;;;;39298:33;;;39349:12;:18;39362:4;39349:18;;;;;;;;;;;;;;;:34;39368:14;39349:34;;;;;;;;;;;39342:41;;;38403:988;;;;:::o;39686:1079::-;39939:22;39984:1;39964:10;:17;;;;:21;;;;:::i;:::-;39939:46;;39996:18;40017:15;:24;40033:7;40017:24;;;;;;;;;;;;39996:45;;40368:19;40390:10;40401:14;40390:26;;;;;;;;;;;;;;;;;;;;;;;;40368:48;;40454:11;40429:10;40440;40429:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40565:10;40534:15;:28;40550:11;40534:28;;;;;;;;;;;:41;;;;40706:15;:24;40722:7;40706:24;;;;;;;;;;;40699:31;;;40741:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39686:1079;;;;:::o;37190:221::-;37275:14;37292:20;37309:2;37292:16;:20::i;:::-;37275:37;;37350:7;37323:12;:16;37336:2;37323:16;;;;;;;;;;;;;;;:24;37340:6;37323:24;;;;;;;;;;;:34;;;;37397:6;37368:17;:26;37386:7;37368:26;;;;;;;;;;;:35;;;;37190:221;;;:::o;28444:382::-;28538:1;28524:16;;:2;:16;;;;28516:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28597:16;28605:7;28597;:16::i;:::-;28596:17;28588:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28659:45;28688:1;28692:2;28696:7;28659:20;:45::i;:::-;28734:1;28717:9;:13;28727:2;28717:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28765:2;28746:7;:16;28754:7;28746:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28810:7;28806:2;28785:33;;28802:1;28785:33;;;;;;;;;;;;28444:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:179::-;6155:10;6176:46;6218:3;6210:6;6176:46;:::i;:::-;6254:4;6249:3;6245:14;6231:28;;6166:99;;;;:::o;6271:118::-;6358:24;6376:5;6358:24;:::i;:::-;6353:3;6346:37;6336:53;;:::o;6425:732::-;6544:3;6573:54;6621:5;6573:54;:::i;:::-;6643:86;6722:6;6717:3;6643:86;:::i;:::-;6636:93;;6753:56;6803:5;6753:56;:::i;:::-;6832:7;6863:1;6848:284;6873:6;6870:1;6867:13;6848:284;;;6949:6;6943:13;6976:63;7035:3;7020:13;6976:63;:::i;:::-;6969:70;;7062:60;7115:6;7062:60;:::i;:::-;7052:70;;6908:224;6895:1;6892;6888:9;6883:14;;6848:284;;;6852:14;7148:3;7141:10;;6549:608;;;;;;;:::o;7163:109::-;7244:21;7259:5;7244:21;:::i;:::-;7239:3;7232:34;7222:50;;:::o;7278:360::-;7364:3;7392:38;7424:5;7392:38;:::i;:::-;7446:70;7509:6;7504:3;7446:70;:::i;:::-;7439:77;;7525:52;7570:6;7565:3;7558:4;7551:5;7547:16;7525:52;:::i;:::-;7602:29;7624:6;7602:29;:::i;:::-;7597:3;7593:39;7586:46;;7368:270;;;;;:::o;7644:364::-;7732:3;7760:39;7793:5;7760:39;:::i;:::-;7815:71;7879:6;7874:3;7815:71;:::i;:::-;7808:78;;7895:52;7940:6;7935:3;7928:4;7921:5;7917:16;7895:52;:::i;:::-;7972:29;7994:6;7972:29;:::i;:::-;7967:3;7963:39;7956:46;;7736:272;;;;;:::o;8014:377::-;8120:3;8148:39;8181:5;8148:39;:::i;:::-;8203:89;8285:6;8280:3;8203:89;:::i;:::-;8196:96;;8301:52;8346:6;8341:3;8334:4;8327:5;8323:16;8301:52;:::i;:::-;8378:6;8373:3;8369:16;8362:23;;8124:267;;;;;:::o;8397:366::-;8539:3;8560:67;8624:2;8619:3;8560:67;:::i;:::-;8553:74;;8636:93;8725:3;8636:93;:::i;:::-;8754:2;8749:3;8745:12;8738:19;;8543:220;;;:::o;8769:366::-;8911:3;8932:67;8996:2;8991:3;8932:67;:::i;:::-;8925:74;;9008:93;9097:3;9008:93;:::i;:::-;9126:2;9121:3;9117:12;9110:19;;8915:220;;;:::o;9141:366::-;9283:3;9304:67;9368:2;9363:3;9304:67;:::i;:::-;9297:74;;9380:93;9469:3;9380:93;:::i;:::-;9498:2;9493:3;9489:12;9482:19;;9287:220;;;:::o;9513:366::-;9655:3;9676:67;9740:2;9735:3;9676:67;:::i;:::-;9669:74;;9752:93;9841:3;9752:93;:::i;:::-;9870:2;9865:3;9861:12;9854:19;;9659:220;;;:::o;9885:366::-;10027:3;10048:67;10112:2;10107:3;10048:67;:::i;:::-;10041:74;;10124:93;10213:3;10124:93;:::i;:::-;10242:2;10237:3;10233:12;10226:19;;10031:220;;;:::o;10257:366::-;10399:3;10420:67;10484:2;10479:3;10420:67;:::i;:::-;10413:74;;10496:93;10585:3;10496:93;:::i;:::-;10614:2;10609:3;10605:12;10598:19;;10403:220;;;:::o;10629:366::-;10771:3;10792:67;10856:2;10851:3;10792:67;:::i;:::-;10785:74;;10868:93;10957:3;10868:93;:::i;:::-;10986:2;10981:3;10977:12;10970:19;;10775:220;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11147:220;;;:::o;11373:366::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11519:220;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11891:220;;;:::o;12117:366::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12263:220;;;:::o;12489:366::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12635:220;;;:::o;12861:366::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;13007:220;;;:::o;13233:366::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13379:220;;;:::o;13605:366::-;13747:3;13768:67;13832:2;13827:3;13768:67;:::i;:::-;13761:74;;13844:93;13933:3;13844:93;:::i;:::-;13962:2;13957:3;13953:12;13946:19;;13751:220;;;:::o;13977:366::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;14123:220;;;:::o;14349:366::-;14491:3;14512:67;14576:2;14571:3;14512:67;:::i;:::-;14505:74;;14588:93;14677:3;14588:93;:::i;:::-;14706:2;14701:3;14697:12;14690:19;;14495:220;;;:::o;14721:366::-;14863:3;14884:67;14948:2;14943:3;14884:67;:::i;:::-;14877:74;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14867:220;;;:::o;15093:366::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15239:220;;;:::o;15465:366::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15611:220;;;:::o;15837:366::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15983:220;;;:::o;16209:366::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16355:220;;;:::o;16581:366::-;16723:3;16744:67;16808:2;16803:3;16744:67;:::i;:::-;16737:74;;16820:93;16909:3;16820:93;:::i;:::-;16938:2;16933:3;16929:12;16922:19;;16727:220;;;:::o;16953:366::-;17095:3;17116:67;17180:2;17175:3;17116:67;:::i;:::-;17109:74;;17192:93;17281:3;17192:93;:::i;:::-;17310:2;17305:3;17301:12;17294:19;;17099:220;;;:::o;17325:108::-;17402:24;17420:5;17402:24;:::i;:::-;17397:3;17390:37;17380:53;;:::o;17439:118::-;17526:24;17544:5;17526:24;:::i;:::-;17521:3;17514:37;17504:53;;:::o;17563:435::-;17743:3;17765:95;17856:3;17847:6;17765:95;:::i;:::-;17758:102;;17877:95;17968:3;17959:6;17877:95;:::i;:::-;17870:102;;17989:3;17982:10;;17747:251;;;;;:::o;18004:222::-;18097:4;18135:2;18124:9;18120:18;18112:26;;18148:71;18216:1;18205:9;18201:17;18192:6;18148:71;:::i;:::-;18102:124;;;;:::o;18232:640::-;18427:4;18465:3;18454:9;18450:19;18442:27;;18479:71;18547:1;18536:9;18532:17;18523:6;18479:71;:::i;:::-;18560:72;18628:2;18617:9;18613:18;18604:6;18560:72;:::i;:::-;18642;18710:2;18699:9;18695:18;18686:6;18642:72;:::i;:::-;18761:9;18755:4;18751:20;18746:2;18735:9;18731:18;18724:48;18789:76;18860:4;18851:6;18789:76;:::i;:::-;18781:84;;18432:440;;;;;;;:::o;18878:373::-;19021:4;19059:2;19048:9;19044:18;19036:26;;19108:9;19102:4;19098:20;19094:1;19083:9;19079:17;19072:47;19136:108;19239:4;19230:6;19136:108;:::i;:::-;19128:116;;19026:225;;;;:::o;19257:210::-;19344:4;19382:2;19371:9;19367:18;19359:26;;19395:65;19457:1;19446:9;19442:17;19433:6;19395:65;:::i;:::-;19349:118;;;;:::o;19473:313::-;19586:4;19624:2;19613:9;19609:18;19601:26;;19673:9;19667:4;19663:20;19659:1;19648:9;19644:17;19637:47;19701:78;19774:4;19765:6;19701:78;:::i;:::-;19693:86;;19591:195;;;;:::o;19792:419::-;19958:4;19996:2;19985:9;19981:18;19973:26;;20045:9;20039:4;20035:20;20031:1;20020:9;20016:17;20009:47;20073:131;20199:4;20073:131;:::i;:::-;20065:139;;19963:248;;;:::o;20217:419::-;20383:4;20421:2;20410:9;20406:18;20398:26;;20470:9;20464:4;20460:20;20456:1;20445:9;20441:17;20434:47;20498:131;20624:4;20498:131;:::i;:::-;20490:139;;20388:248;;;:::o;20642:419::-;20808:4;20846:2;20835:9;20831:18;20823:26;;20895:9;20889:4;20885:20;20881:1;20870:9;20866:17;20859:47;20923:131;21049:4;20923:131;:::i;:::-;20915:139;;20813:248;;;:::o;21067:419::-;21233:4;21271:2;21260:9;21256:18;21248:26;;21320:9;21314:4;21310:20;21306:1;21295:9;21291:17;21284:47;21348:131;21474:4;21348:131;:::i;:::-;21340:139;;21238:248;;;:::o;21492:419::-;21658:4;21696:2;21685:9;21681:18;21673:26;;21745:9;21739:4;21735:20;21731:1;21720:9;21716:17;21709:47;21773:131;21899:4;21773:131;:::i;:::-;21765:139;;21663:248;;;:::o;21917:419::-;22083:4;22121:2;22110:9;22106:18;22098:26;;22170:9;22164:4;22160:20;22156:1;22145:9;22141:17;22134:47;22198:131;22324:4;22198:131;:::i;:::-;22190:139;;22088:248;;;:::o;22342:419::-;22508:4;22546:2;22535:9;22531:18;22523:26;;22595:9;22589:4;22585:20;22581:1;22570:9;22566:17;22559:47;22623:131;22749:4;22623:131;:::i;:::-;22615:139;;22513:248;;;:::o;22767:419::-;22933:4;22971:2;22960:9;22956:18;22948:26;;23020:9;23014:4;23010:20;23006:1;22995:9;22991:17;22984:47;23048:131;23174:4;23048:131;:::i;:::-;23040:139;;22938:248;;;:::o;23192:419::-;23358:4;23396:2;23385:9;23381:18;23373:26;;23445:9;23439:4;23435:20;23431:1;23420:9;23416:17;23409:47;23473:131;23599:4;23473:131;:::i;:::-;23465:139;;23363:248;;;:::o;23617:419::-;23783:4;23821:2;23810:9;23806:18;23798:26;;23870:9;23864:4;23860:20;23856:1;23845:9;23841:17;23834:47;23898:131;24024:4;23898:131;:::i;:::-;23890:139;;23788:248;;;:::o;24042:419::-;24208:4;24246:2;24235:9;24231:18;24223:26;;24295:9;24289:4;24285:20;24281:1;24270:9;24266:17;24259:47;24323:131;24449:4;24323:131;:::i;:::-;24315:139;;24213:248;;;:::o;24467:419::-;24633:4;24671:2;24660:9;24656:18;24648:26;;24720:9;24714:4;24710:20;24706:1;24695:9;24691:17;24684:47;24748:131;24874:4;24748:131;:::i;:::-;24740:139;;24638:248;;;:::o;24892:419::-;25058:4;25096:2;25085:9;25081:18;25073:26;;25145:9;25139:4;25135:20;25131:1;25120:9;25116:17;25109:47;25173:131;25299:4;25173:131;:::i;:::-;25165:139;;25063:248;;;:::o;25317:419::-;25483:4;25521:2;25510:9;25506:18;25498:26;;25570:9;25564:4;25560:20;25556:1;25545:9;25541:17;25534:47;25598:131;25724:4;25598:131;:::i;:::-;25590:139;;25488:248;;;:::o;25742:419::-;25908:4;25946:2;25935:9;25931:18;25923:26;;25995:9;25989:4;25985:20;25981:1;25970:9;25966:17;25959:47;26023:131;26149:4;26023:131;:::i;:::-;26015:139;;25913:248;;;:::o;26167:419::-;26333:4;26371:2;26360:9;26356:18;26348:26;;26420:9;26414:4;26410:20;26406:1;26395:9;26391:17;26384:47;26448:131;26574:4;26448:131;:::i;:::-;26440:139;;26338:248;;;:::o;26592:419::-;26758:4;26796:2;26785:9;26781:18;26773:26;;26845:9;26839:4;26835:20;26831:1;26820:9;26816:17;26809:47;26873:131;26999:4;26873:131;:::i;:::-;26865:139;;26763:248;;;:::o;27017:419::-;27183:4;27221:2;27210:9;27206:18;27198:26;;27270:9;27264:4;27260:20;27256:1;27245:9;27241:17;27234:47;27298:131;27424:4;27298:131;:::i;:::-;27290:139;;27188:248;;;:::o;27442:419::-;27608:4;27646:2;27635:9;27631:18;27623:26;;27695:9;27689:4;27685:20;27681:1;27670:9;27666:17;27659:47;27723:131;27849:4;27723:131;:::i;:::-;27715:139;;27613:248;;;:::o;27867:419::-;28033:4;28071:2;28060:9;28056:18;28048:26;;28120:9;28114:4;28110:20;28106:1;28095:9;28091:17;28084:47;28148:131;28274:4;28148:131;:::i;:::-;28140:139;;28038:248;;;:::o;28292:419::-;28458:4;28496:2;28485:9;28481:18;28473:26;;28545:9;28539:4;28535:20;28531:1;28520:9;28516:17;28509:47;28573:131;28699:4;28573:131;:::i;:::-;28565:139;;28463:248;;;:::o;28717:419::-;28883:4;28921:2;28910:9;28906:18;28898:26;;28970:9;28964:4;28960:20;28956:1;28945:9;28941:17;28934:47;28998:131;29124:4;28998:131;:::i;:::-;28990:139;;28888:248;;;:::o;29142:419::-;29308:4;29346:2;29335:9;29331:18;29323:26;;29395:9;29389:4;29385:20;29381:1;29370:9;29366:17;29359:47;29423:131;29549:4;29423:131;:::i;:::-;29415:139;;29313:248;;;:::o;29567:419::-;29733:4;29771:2;29760:9;29756:18;29748:26;;29820:9;29814:4;29810:20;29806:1;29795:9;29791:17;29784:47;29848:131;29974:4;29848:131;:::i;:::-;29840:139;;29738:248;;;:::o;29992:222::-;30085:4;30123:2;30112:9;30108:18;30100:26;;30136:71;30204:1;30193:9;30189:17;30180:6;30136:71;:::i;:::-;30090:124;;;;:::o;30220:129::-;30254:6;30281:20;;:::i;:::-;30271:30;;30310:33;30338:4;30330:6;30310:33;:::i;:::-;30261:88;;;:::o;30355:75::-;30388:6;30421:2;30415:9;30405:19;;30395:35;:::o;30436:307::-;30497:4;30587:18;30579:6;30576:30;30573:2;;;30609:18;;:::i;:::-;30573:2;30647:29;30669:6;30647:29;:::i;:::-;30639:37;;30731:4;30725;30721:15;30713:23;;30502:241;;;:::o;30749:308::-;30811:4;30901:18;30893:6;30890:30;30887:2;;;30923:18;;:::i;:::-;30887:2;30961:29;30983:6;30961:29;:::i;:::-;30953:37;;31045:4;31039;31035:15;31027:23;;30816:241;;;:::o;31063:132::-;31130:4;31153:3;31145:11;;31183:4;31178:3;31174:14;31166:22;;31135:60;;;:::o;31201:114::-;31268:6;31302:5;31296:12;31286:22;;31275:40;;;:::o;31321:98::-;31372:6;31406:5;31400:12;31390:22;;31379:40;;;:::o;31425:99::-;31477:6;31511:5;31505:12;31495:22;;31484:40;;;:::o;31530:113::-;31600:4;31632;31627:3;31623:14;31615:22;;31605:38;;;:::o;31649:184::-;31748:11;31782:6;31777:3;31770:19;31822:4;31817:3;31813:14;31798:29;;31760:73;;;;:::o;31839:168::-;31922:11;31956:6;31951:3;31944:19;31996:4;31991:3;31987:14;31972:29;;31934:73;;;;:::o;32013:169::-;32097:11;32131:6;32126:3;32119:19;32171:4;32166:3;32162:14;32147:29;;32109:73;;;;:::o;32188:148::-;32290:11;32327:3;32312:18;;32302:34;;;;:::o;32342:305::-;32382:3;32401:20;32419:1;32401:20;:::i;:::-;32396:25;;32435:20;32453:1;32435:20;:::i;:::-;32430:25;;32589:1;32521:66;32517:74;32514:1;32511:81;32508:2;;;32595:18;;:::i;:::-;32508:2;32639:1;32636;32632:9;32625:16;;32386:261;;;;:::o;32653:185::-;32693:1;32710:20;32728:1;32710:20;:::i;:::-;32705:25;;32744:20;32762:1;32744:20;:::i;:::-;32739:25;;32783:1;32773:2;;32788:18;;:::i;:::-;32773:2;32830:1;32827;32823:9;32818:14;;32695:143;;;;:::o;32844:348::-;32884:7;32907:20;32925:1;32907:20;:::i;:::-;32902:25;;32941:20;32959:1;32941:20;:::i;:::-;32936:25;;33129:1;33061:66;33057:74;33054:1;33051:81;33046:1;33039:9;33032:17;33028:105;33025:2;;;33136:18;;:::i;:::-;33025:2;33184:1;33181;33177:9;33166:20;;32892:300;;;;:::o;33198:191::-;33238:4;33258:20;33276:1;33258:20;:::i;:::-;33253:25;;33292:20;33310:1;33292:20;:::i;:::-;33287:25;;33331:1;33328;33325:8;33322:2;;;33336:18;;:::i;:::-;33322:2;33381:1;33378;33374:9;33366:17;;33243:146;;;;:::o;33395:96::-;33432:7;33461:24;33479:5;33461:24;:::i;:::-;33450:35;;33440:51;;;:::o;33497:90::-;33531:7;33574:5;33567:13;33560:21;33549:32;;33539:48;;;:::o;33593:149::-;33629:7;33669:66;33662:5;33658:78;33647:89;;33637:105;;;:::o;33748:126::-;33785:7;33825:42;33818:5;33814:54;33803:65;;33793:81;;;:::o;33880:77::-;33917:7;33946:5;33935:16;;33925:32;;;:::o;33963:154::-;34047:6;34042:3;34037;34024:30;34109:1;34100:6;34095:3;34091:16;34084:27;34014:103;;;:::o;34123:307::-;34191:1;34201:113;34215:6;34212:1;34209:13;34201:113;;;34300:1;34295:3;34291:11;34285:18;34281:1;34276:3;34272:11;34265:39;34237:2;34234:1;34230:10;34225:15;;34201:113;;;34332:6;34329:1;34326:13;34323:2;;;34412:1;34403:6;34398:3;34394:16;34387:27;34323:2;34172:258;;;;:::o;34436:320::-;34480:6;34517:1;34511:4;34507:12;34497:22;;34564:1;34558:4;34554:12;34585:18;34575:2;;34641:4;34633:6;34629:17;34619:27;;34575:2;34703;34695:6;34692:14;34672:18;34669:38;34666:2;;;34722:18;;:::i;:::-;34666:2;34487:269;;;;:::o;34762:281::-;34845:27;34867:4;34845:27;:::i;:::-;34837:6;34833:40;34975:6;34963:10;34960:22;34939:18;34927:10;34924:34;34921:62;34918:2;;;34986:18;;:::i;:::-;34918:2;35026:10;35022:2;35015:22;34805:238;;;:::o;35049:233::-;35088:3;35111:24;35129:5;35111:24;:::i;:::-;35102:33;;35157:66;35150:5;35147:77;35144:2;;;35227:18;;:::i;:::-;35144:2;35274:1;35267:5;35263:13;35256:20;;35092:190;;;:::o;35288:176::-;35320:1;35337:20;35355:1;35337:20;:::i;:::-;35332:25;;35371:20;35389:1;35371:20;:::i;:::-;35366:25;;35410:1;35400:2;;35415:18;;:::i;:::-;35400:2;35456:1;35453;35449:9;35444:14;;35322:142;;;;:::o;35470:180::-;35518:77;35515:1;35508:88;35615:4;35612:1;35605:15;35639:4;35636:1;35629:15;35656:180;35704:77;35701:1;35694:88;35801:4;35798:1;35791:15;35825:4;35822:1;35815:15;35842:180;35890:77;35887:1;35880:88;35987:4;35984:1;35977:15;36011:4;36008:1;36001:15;36028:180;36076:77;36073:1;36066:88;36173:4;36170:1;36163:15;36197:4;36194:1;36187:15;36214:102;36255:6;36306:2;36302:7;36297:2;36290:5;36286:14;36282:28;36272:38;;36262:54;;;:::o;36322:230::-;36462:34;36458:1;36450:6;36446:14;36439:58;36531:13;36526:2;36518:6;36514:15;36507:38;36428:124;:::o;36558:237::-;36698:34;36694:1;36686:6;36682:14;36675:58;36767:20;36762:2;36754:6;36750:15;36743:45;36664:131;:::o;36801:225::-;36941:34;36937:1;36929:6;36925:14;36918:58;37010:8;37005:2;36997:6;36993:15;36986:33;36907:119;:::o;37032:178::-;37172:30;37168:1;37160:6;37156:14;37149:54;37138:72;:::o;37216:223::-;37356:34;37352:1;37344:6;37340:14;37333:58;37425:6;37420:2;37412:6;37408:15;37401:31;37322:117;:::o;37445:175::-;37585:27;37581:1;37573:6;37569:14;37562:51;37551:69;:::o;37626:231::-;37766:34;37762:1;37754:6;37750:14;37743:58;37835:14;37830:2;37822:6;37818:15;37811:39;37732:125;:::o;37863:243::-;38003:34;37999:1;37991:6;37987:14;37980:58;38072:26;38067:2;38059:6;38055:15;38048:51;37969:137;:::o;38112:229::-;38252:34;38248:1;38240:6;38236:14;38229:58;38321:12;38316:2;38308:6;38304:15;38297:37;38218:123;:::o;38347:228::-;38487:34;38483:1;38475:6;38471:14;38464:58;38556:11;38551:2;38543:6;38539:15;38532:36;38453:122;:::o;38581:173::-;38721:25;38717:1;38709:6;38705:14;38698:49;38687:67;:::o;38760:165::-;38900:17;38896:1;38888:6;38884:14;38877:41;38866:59;:::o;38931:182::-;39071:34;39067:1;39059:6;39055:14;39048:58;39037:76;:::o;39119:231::-;39259:34;39255:1;39247:6;39243:14;39236:58;39328:14;39323:2;39315:6;39311:15;39304:39;39225:125;:::o;39356:182::-;39496:34;39492:1;39484:6;39480:14;39473:58;39462:76;:::o;39544:228::-;39684:34;39680:1;39672:6;39668:14;39661:58;39753:11;39748:2;39740:6;39736:15;39729:36;39650:122;:::o;39778:234::-;39918:34;39914:1;39906:6;39902:14;39895:58;39987:17;39982:2;39974:6;39970:15;39963:42;39884:128;:::o;40018:174::-;40158:26;40154:1;40146:6;40142:14;40135:50;40124:68;:::o;40198:220::-;40338:34;40334:1;40326:6;40322:14;40315:58;40407:3;40402:2;40394:6;40390:15;40383:28;40304:114;:::o;40424:176::-;40564:28;40560:1;40552:6;40548:14;40541:52;40530:70;:::o;40606:236::-;40746:34;40742:1;40734:6;40730:14;40723:58;40815:19;40810:2;40802:6;40798:15;40791:44;40712:130;:::o;40848:175::-;40988:27;40984:1;40976:6;40972:14;40965:51;40954:69;:::o;41029:231::-;41169:34;41165:1;41157:6;41153:14;41146:58;41238:14;41233:2;41225:6;41221:15;41214:39;41135:125;:::o;41266:168::-;41406:20;41402:1;41394:6;41390:14;41383:44;41372:62;:::o;41440:122::-;41513:24;41531:5;41513:24;:::i;:::-;41506:5;41503:35;41493:2;;41552:1;41549;41542:12;41493:2;41483:79;:::o;41568:116::-;41638:21;41653:5;41638:21;:::i;:::-;41631:5;41628:32;41618:2;;41674:1;41671;41664:12;41618:2;41608:76;:::o;41690:120::-;41762:23;41779:5;41762:23;:::i;:::-;41755:5;41752:34;41742:2;;41800:1;41797;41790:12;41742:2;41732:78;:::o;41816:122::-;41889:24;41907:5;41889:24;:::i;:::-;41882:5;41879:35;41869:2;;41928:1;41925;41918:12;41869:2;41859:79;:::o

Swarm Source

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