ERC-721
Overview
Max Total Supply
375 ShitK
Holders
130
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 ShitKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
ShitKnight
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-09 */ // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: contracts/ShitKnight.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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 TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract ShitKnight is Ownable, ERC721A, ReentrancyGuard { struct Config { uint256 maxSupply; uint256 reserved; uint256 firstFreeMint; uint256 mintPrice; uint256 maxTokenPerAddress; string baseTokenUrl; } Config public config= Config(6666, 0, 1000, 0.005 ether, 10, ""); bool public isMintStarted= false; uint256 public maxFreeMintAmountPerTx=3; uint256 public maxMintAmountPerTx=10; constructor() ERC721A("ShitKnight.wtf", "ShitK") { } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function _baseURI() internal view override returns (string memory) { return config.baseTokenUrl; } function setBaseURI(string calldata baseURI) external onlyOwner { config.baseTokenUrl = baseURI; } function setmintPrice(uint256 mintPrice) external onlyOwner { config.mintPrice = mintPrice; } function setConfig(Config calldata config_) external onlyOwner { config = config_; } function toggleMintStart() external onlyOwner { isMintStarted = !isMintStarted; } function withdraw() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function batchMint( address[] calldata addresses, uint256[] calldata quantities ) external nonReentrant onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { _safeMint(addresses[i], quantities[i]); } } function setBundleProps( uint256 maxFreeMintAmountPerTx_, uint256 maxMintAmountPerTx_ ) external onlyOwner { maxFreeMintAmountPerTx = maxFreeMintAmountPerTx_; maxMintAmountPerTx = maxMintAmountPerTx_; } function mint(uint256 quantity) external payable nonReentrant { require(isMintStarted, "Not started"); require(tx.origin == msg.sender, "Contracts not allowed"); uint256 pubMintSupply = config.maxSupply - config.reserved; require( totalSupply() + quantity <= pubMintSupply, "Exceed sales max limit" ); if (totalSupply() >= config.firstFreeMint) { require( quantity <= maxMintAmountPerTx, "Mint quantity need smaller" ); uint256 cost; unchecked { cost = config.mintPrice * quantity; } require(msg.value == cost, "wrong payment"); } else { require( numberMinted(msg.sender) + quantity <=maxFreeMintAmountPerTx, "can not free mint this many" ); } _safeMint(msg.sender, quantity); } function publicmint(uint256 quantity) external payable nonReentrant { require(isMintStarted, "Not started"); require(tx.origin == msg.sender, "Contracts not allowed"); uint256 pubMintSupply = config.maxSupply - config.reserved; require( totalSupply() + quantity <= pubMintSupply, "Exceed sales max limit" ); require( quantity <= maxMintAmountPerTx, "Mint quantity need smaller every tx" ); uint256 cost; unchecked { cost = config.mintPrice*quantity; } require(msg.value == cost, "wrong payment"); _safeMint(msg.sender, quantity); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"reserved","type":"uint256"},{"internalType":"uint256","name":"firstFreeMint","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxTokenPerAddress","type":"uint256"},{"internalType":"string","name":"baseTokenUrl","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxFreeMintAmountPerTx_","type":"uint256"},{"internalType":"uint256","name":"maxMintAmountPerTx_","type":"uint256"}],"name":"setBundleProps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"reserved","type":"uint256"},{"internalType":"uint256","name":"firstFreeMint","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxTokenPerAddress","type":"uint256"},{"internalType":"string","name":"baseTokenUrl","type":"string"}],"internalType":"struct ShitKnight.Config","name":"config_","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setmintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMintStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060c00160405280611a0a8152602001600081526020016103e881526020016611c37937e080008152602001600a815260200160405180602001604052806000815250815250600a600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050190805190602001906200009f9291906200028e565b5050506000601060006101000a81548160ff0219169083151502179055506003601155600a601255348015620000d457600080fd5b506040518060400160405280600e81526020017f536869744b6e696768742e7774660000000000000000000000000000000000008152506040518060400160405280600581526020017f536869744b0000000000000000000000000000000000000000000000000000008152506200016162000155620001b960201b60201c565b620001c160201b60201c565b8160039080519060200190620001799291906200028e565b508060049080519060200190620001929291906200028e565b50620001a36200028560201b60201c565b60018190555050506001600981905550620003a2565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b8280546200029c906200036d565b90600052602060002090601f016020900481019282620002c057600085556200030c565b82601f10620002db57805160ff19168380011785556200030c565b828001600101855582156200030c579182015b828111156200030b578251825591602001919060010190620002ee565b5b5090506200031b91906200031f565b5090565b5b808211156200033a57600081600090555060010162000320565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200038657607f821691505b6020821081036200039c576200039b6200033e565b5b50919050565b61441880620003b26000396000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063a424aa5011610095578063c87b56dd11610064578063c87b56dd14610645578063dc33e68114610682578063e985e9c5146106bf578063f2fde38b146106fc576101d8565b8063a424aa50146105b3578063ad52e588146105dc578063b488cf18146105f3578063b88d4fde1461061c576101d8565b806394354fd0116100d157806394354fd01461051857806395d89b4114610543578063a0712d681461056e578063a22cb4651461058a576101d8565b8063715018a61461048a578063715e6e58146104a157806379502c55146104bd5780638da5cb5b146104ed576101d8565b80633ccfd60b1161017a578063604906dc11610149578063604906dc146103bc5780636352211e146103e7578063685731071461042457806370a082311461044d576101d8565b80633ccfd60b1461032a57806342842e0e14610341578063488299aa1461036a57806355f804b314610393576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab5780631869e7d4146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612e99565b610725565b6040516102119190612ee1565b60405180910390f35b34801561022657600080fd5b5061022f610807565b60405161023c9190612f95565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612fed565b610899565b604051610279919061305b565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906130a2565b610915565b005b3480156102b757600080fd5b506102c0610a1f565b6040516102cd91906130f1565b60405180910390f35b3480156102e257600080fd5b506102eb610a36565b6040516102f89190612ee1565b60405180910390f35b34801561030d57600080fd5b506103286004803603810190610323919061310c565b610a49565b005b34801561033657600080fd5b5061033f610a59565b005b34801561034d57600080fd5b506103686004803603810190610363919061310c565b610bd9565b005b34801561037657600080fd5b50610391600480360381019061038c9190613183565b610bf9565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613231565b610c8a565b005b3480156103c857600080fd5b506103d1610d1f565b6040516103de91906130f1565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190612fed565b610d25565b60405161041b919061305b565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061332a565b610d3b565b005b34801561045957600080fd5b50610474600480360381019061046f91906133ab565b610e7e565b60405161048191906130f1565b60405180910390f35b34801561049657600080fd5b5061049f610f4d565b005b6104bb60048036038101906104b69190612fed565b610fd5565b005b3480156104c957600080fd5b506104d26111f8565b6040516104e4969594939291906133d8565b60405180910390f35b3480156104f957600080fd5b506105026112aa565b60405161050f919061305b565b60405180910390f35b34801561052457600080fd5b5061052d6112d3565b60405161053a91906130f1565b60405180910390f35b34801561054f57600080fd5b506105586112d9565b6040516105659190612f95565b60405180910390f35b61058860048036038101906105839190612fed565b61136b565b005b34801561059657600080fd5b506105b160048036038101906105ac919061346c565b6115ff565b005b3480156105bf57600080fd5b506105da60048036038101906105d591906134ac565b611776565b005b3480156105e857600080fd5b506105f1611804565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190612fed565b6118ac565b005b34801561062857600080fd5b50610643600480360381019061063e919061361c565b611935565b005b34801561065157600080fd5b5061066c60048036038101906106679190612fed565b6119b1565b6040516106799190612f95565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906133ab565b611a4f565b6040516106b691906130f1565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061369f565b611a61565b6040516106f39190612ee1565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e91906133ab565b611af5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080057506107ff82611bec565b5b9050919050565b6060600380546108169061370e565b80601f01602080910402602001604051908101604052809291908181526020018280546108429061370e565b801561088f5780601f106108645761010080835404028352916020019161088f565b820191906000526020600020905b81548152906001019060200180831161087257829003601f168201915b5050505050905090565b60006108a482611c56565b6108da576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092082610d25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610987576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a6611ca4565b73ffffffffffffffffffffffffffffffffffffffff16141580156109d857506109d6816109d1611ca4565b611a61565b155b15610a0f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1a838383611cac565b505050565b6000610a29611d5e565b6002546001540303905090565b601060009054906101000a900460ff1681565b610a54838383611d67565b505050565b610a61611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610a7f6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc9061378b565b60405180910390fd5b600260095403610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b11906137f7565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610b4890613848565b60006040518083038185875af1925050503d8060008114610b85576040519150601f19603f3d011682016040523d82523d6000602084013e610b8a565b606091505b5050905080610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906138a9565b60405180910390fd5b506001600981905550565b610bf483838360405180602001604052806000815250611935565b505050565b610c01611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610c1f6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c9061378b565b60405180910390fd5b80600a8181610c849190613d24565b90505050565b610c92611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610cb06112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd9061378b565b60405180910390fd5b8181600a6005019190610d1a929190612d47565b505050565b60115481565b6000610d308261221b565b600001519050919050565b600260095403610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d77906137f7565b60405180910390fd5b6002600981905550610d90611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610dae6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061378b565b60405180910390fd5b60005b84849050811015610e6f57610e5c858583818110610e2857610e27613d32565b5b9050602002016020810190610e3d91906133ab565b848484818110610e5057610e4f613d32565b5b905060200201356124aa565b8080610e6790613d90565b915050610e07565b50600160098190555050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f55611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610f736112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc09061378b565b60405180910390fd5b610fd360006124c8565b565b60026009540361101a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611011906137f7565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613e24565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613e90565b60405180910390fd5b6000600a60010154600a600001546110f79190613eb0565b90508082611103610a1f565b61110d9190613ee4565b111561114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114590613f86565b60405180910390fd5b601254821115611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90614018565b60405180910390fd5b600082600a600301540290508034146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890614084565b60405180910390fd5b6111eb33846124aa565b5050600160098190555050565b600a8060000154908060010154908060020154908060030154908060040154908060050180546112279061370e565b80601f01602080910402602001604051908101604052809291908181526020018280546112539061370e565b80156112a05780601f10611275576101008083540402835291602001916112a0565b820191906000526020600020905b81548152906001019060200180831161128357829003601f168201915b5050505050905086565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6060600480546112e89061370e565b80601f01602080910402602001604051908101604052809291908181526020018280546113149061370e565b80156113615780601f1061133657610100808354040283529160200191611361565b820191906000526020600020905b81548152906001019060200180831161134457829003601f168201915b5050505050905090565b6002600954036113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a7906137f7565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90613e24565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90613e90565b60405180910390fd5b6000600a60010154600a6000015461148d9190613eb0565b90508082611499610a1f565b6114a39190613ee4565b11156114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90613f86565b60405180910390fd5b600a600201546114f2610a1f565b106115905760125482111561153c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611533906140f0565b60405180910390fd5b600082600a6003015402905080341461158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190614084565b60405180910390fd5b506115e9565b6011548261159d33611a4f565b6115a79190613ee4565b11156115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061415c565b60405180910390fd5b5b6115f333836124aa565b50600160098190555050565b611607611ca4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361166b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611678611ca4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611725611ca4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176a9190612ee1565b60405180910390a35050565b61177e611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661179c6112aa565b73ffffffffffffffffffffffffffffffffffffffff16146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e99061378b565b60405180910390fd5b81601181905550806012819055505050565b61180c611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661182a6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118779061378b565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6118b4611ca4565b73ffffffffffffffffffffffffffffffffffffffff166118d26112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f9061378b565b60405180910390fd5b80600a6003018190555050565b611940848484611d67565b61195f8373ffffffffffffffffffffffffffffffffffffffff1661258c565b80156119745750611972848484846125af565b155b156119ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606119bc82611c56565b6119f2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119fc6126ff565b90506000815103611a1c5760405180602001604052806000815250611a47565b80611a2684612794565b604051602001611a379291906141b8565b6040516020818303038152906040525b915050919050565b6000611a5a826128f4565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611afd611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611b1b6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061378b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd79061424e565b60405180910390fd5b611be9816124c8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611c61611d5e565b11158015611c70575060015482105b8015611c9d575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611d728261221b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ddd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611dfe611ca4565b73ffffffffffffffffffffffffffffffffffffffff161480611e2d5750611e2c85611e27611ca4565b611a61565b5b80611e725750611e3b611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611e5a84610899565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611eab576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f11576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f1e858585600161295e565b611f2a60008487611cac565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036121a95760015482146121a857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122148585856001612964565b5050505050565b612223612dcd565b600082905080612231611d5e565b11158015612240575060015481105b15612473576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161247157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123555780925050506124a5565b5b60011561247057818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461246b5780925050506124a5565b612356565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6124c482826040518060200160405280600081525061296a565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125d5611ca4565b8786866040518563ffffffff1660e01b81526004016125f794939291906142c3565b6020604051808303816000875af192505050801561263357506040513d601f19601f820116820180604052508101906126309190614324565b60015b6126ac573d8060008114612663576040519150601f19603f3d011682016040523d82523d6000602084013e612668565b606091505b5060008151036126a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a60050180546127119061370e565b80601f016020809104026020016040519081016040528092919081815260200182805461273d9061370e565b801561278a5780601f1061275f5761010080835404028352916020019161278a565b820191906000526020600020905b81548152906001019060200180831161276d57829003601f168201915b5050505050905090565b6060600082036127db576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128ef565b600082905060005b6000821461280d5780806127f690613d90565b915050600a826128069190614380565b91506127e3565b60008167ffffffffffffffff811115612829576128286134f1565b5b6040519080825280601f01601f19166020018201604052801561285b5781602001600182028036833780820191505090505b5090505b600085146128e8576001826128749190613eb0565b9150600a8561288391906143b1565b603061288f9190613ee4565b60f81b8183815181106128a5576128a4613d32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128e19190614380565b945061285f565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612977838383600161297c565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036129e9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612a23576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a30600086838761295e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612bfa5750612bf98773ffffffffffffffffffffffffffffffffffffffff1661258c565b5b15612cbf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c6f60008884806001019550886125af565b612ca5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612c00578260015414612cba57600080fd5b612d2a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612cc0575b816001819055505050612d406000868387612964565b5050505050565b828054612d539061370e565b90600052602060002090601f016020900481019282612d755760008555612dbc565b82601f10612d8e57803560ff1916838001178555612dbc565b82800160010185558215612dbc579182015b82811115612dbb578235825591602001919060010190612da0565b5b509050612dc99190612e10565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e29576000816000905550600101612e11565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e7681612e41565b8114612e8157600080fd5b50565b600081359050612e9381612e6d565b92915050565b600060208284031215612eaf57612eae612e37565b5b6000612ebd84828501612e84565b91505092915050565b60008115159050919050565b612edb81612ec6565b82525050565b6000602082019050612ef66000830184612ed2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f36578082015181840152602081019050612f1b565b83811115612f45576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f6782612efc565b612f718185612f07565b9350612f81818560208601612f18565b612f8a81612f4b565b840191505092915050565b60006020820190508181036000830152612faf8184612f5c565b905092915050565b6000819050919050565b612fca81612fb7565b8114612fd557600080fd5b50565b600081359050612fe781612fc1565b92915050565b60006020828403121561300357613002612e37565b5b600061301184828501612fd8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130458261301a565b9050919050565b6130558161303a565b82525050565b6000602082019050613070600083018461304c565b92915050565b61307f8161303a565b811461308a57600080fd5b50565b60008135905061309c81613076565b92915050565b600080604083850312156130b9576130b8612e37565b5b60006130c78582860161308d565b92505060206130d885828601612fd8565b9150509250929050565b6130eb81612fb7565b82525050565b600060208201905061310660008301846130e2565b92915050565b60008060006060848603121561312557613124612e37565b5b60006131338682870161308d565b93505060206131448682870161308d565b925050604061315586828701612fd8565b9150509250925092565b600080fd5b600060c0828403121561317a5761317961315f565b5b81905092915050565b60006020828403121561319957613198612e37565b5b600082013567ffffffffffffffff8111156131b7576131b6612e3c565b5b6131c384828501613164565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131f1576131f06131cc565b5b8235905067ffffffffffffffff81111561320e5761320d6131d1565b5b60208301915083600182028301111561322a576132296131d6565b5b9250929050565b6000806020838503121561324857613247612e37565b5b600083013567ffffffffffffffff81111561326657613265612e3c565b5b613272858286016131db565b92509250509250929050565b60008083601f840112613294576132936131cc565b5b8235905067ffffffffffffffff8111156132b1576132b06131d1565b5b6020830191508360208202830111156132cd576132cc6131d6565b5b9250929050565b60008083601f8401126132ea576132e96131cc565b5b8235905067ffffffffffffffff811115613307576133066131d1565b5b602083019150836020820283011115613323576133226131d6565b5b9250929050565b6000806000806040858703121561334457613343612e37565b5b600085013567ffffffffffffffff81111561336257613361612e3c565b5b61336e8782880161327e565b9450945050602085013567ffffffffffffffff81111561339157613390612e3c565b5b61339d878288016132d4565b925092505092959194509250565b6000602082840312156133c1576133c0612e37565b5b60006133cf8482850161308d565b91505092915050565b600060c0820190506133ed60008301896130e2565b6133fa60208301886130e2565b61340760408301876130e2565b61341460608301866130e2565b61342160808301856130e2565b81810360a08301526134338184612f5c565b9050979650505050505050565b61344981612ec6565b811461345457600080fd5b50565b60008135905061346681613440565b92915050565b6000806040838503121561348357613482612e37565b5b60006134918582860161308d565b92505060206134a285828601613457565b9150509250929050565b600080604083850312156134c3576134c2612e37565b5b60006134d185828601612fd8565b92505060206134e285828601612fd8565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352982612f4b565b810181811067ffffffffffffffff82111715613548576135476134f1565b5b80604052505050565b600061355b612e2d565b90506135678282613520565b919050565b600067ffffffffffffffff821115613587576135866134f1565b5b61359082612f4b565b9050602081019050919050565b82818337600083830152505050565b60006135bf6135ba8461356c565b613551565b9050828152602081018484840111156135db576135da6134ec565b5b6135e684828561359d565b509392505050565b600082601f830112613603576136026131cc565b5b81356136138482602086016135ac565b91505092915050565b6000806000806080858703121561363657613635612e37565b5b60006136448782880161308d565b94505060206136558782880161308d565b935050604061366687828801612fd8565b925050606085013567ffffffffffffffff81111561368757613686612e3c565b5b613693878288016135ee565b91505092959194509250565b600080604083850312156136b6576136b5612e37565b5b60006136c48582860161308d565b92505060206136d58582860161308d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061372657607f821691505b602082108103613739576137386136df565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613775602083612f07565b91506137808261373f565b602082019050919050565b600060208201905081810360008301526137a481613768565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006137e1601f83612f07565b91506137ec826137ab565b602082019050919050565b60006020820190508181036000830152613810816137d4565b9050919050565b600081905092915050565b50565b6000613832600083613817565b915061383d82613822565b600082019050919050565b600061385382613825565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613893601083612f07565b915061389e8261385d565b602082019050919050565b600060208201905081810360008301526138c281613886565b9050919050565b600081356138d681612fc1565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613918846138df565b9350801983169250808416831791505092915050565b6000819050919050565b600061395361394e61394984612fb7565b61392e565b612fb7565b9050919050565b6000819050919050565b61396d82613938565b6139806139798261395a565b83546138ec565b8255505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126139b3576139b2613987565b5b80840192508235915067ffffffffffffffff8211156139d5576139d461398c565b5b6020830192506001820236038313156139f1576139f0613991565b5b509250929050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a29565b613a708683613a29565b95508019841693508086168417925050509392505050565b613a9183613938565b613aa5613a9d8261395a565b848454613a36565b825550505050565b600090565b613aba613aad565b613ac5818484613a88565b505050565b5b81811015613ae957613ade600082613ab2565b600181019050613acb565b5050565b601f821115613b2e57613aff81613a04565b613b0884613a19565b81016020851015613b17578190505b613b2b613b2385613a19565b830182613aca565b50505b505050565b600082821c905092915050565b6000613b5160001984600802613b33565b1980831691505092915050565b6000613b6a8383613b40565b9150826002028217905092915050565b613b8483836139f9565b67ffffffffffffffff811115613b9d57613b9c6134f1565b5b613ba7825461370e565b613bb2828285613aed565b6000601f831160018114613be15760008415613bcf578287013590505b613bd98582613b5e565b865550613c41565b601f198416613bef86613a04565b60005b82811015613c1757848901358255600182019150602085019450602081019050613bf2565b86831015613c345784890135613c30601f891682613b40565b8355505b6001600288020188555050505b50505050505050565b613c55838383613b7a565b505050565b600081016000830180613c6c816138c9565b9050613c788184613964565b505050600181016020830180613c8d816138c9565b9050613c998184613964565b505050600281016040830180613cae816138c9565b9050613cba8184613964565b505050600381016060830180613ccf816138c9565b9050613cdb8184613964565b505050600481016080830180613cf0816138c9565b9050613cfc8184613964565b5050506005810160a08301613d118185613996565b613d1c818386613c4a565b505050505050565b613d2e8282613c5a565b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d9b82612fb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dcd57613dcc613d61565b5b600182019050919050565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b6000613e0e600b83612f07565b9150613e1982613dd8565b602082019050919050565b60006020820190508181036000830152613e3d81613e01565b9050919050565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b6000613e7a601583612f07565b9150613e8582613e44565b602082019050919050565b60006020820190508181036000830152613ea981613e6d565b9050919050565b6000613ebb82612fb7565b9150613ec683612fb7565b925082821015613ed957613ed8613d61565b5b828203905092915050565b6000613eef82612fb7565b9150613efa83612fb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f2f57613f2e613d61565b5b828201905092915050565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b6000613f70601683612f07565b9150613f7b82613f3a565b602082019050919050565b60006020820190508181036000830152613f9f81613f63565b9050919050565b7f4d696e74207175616e74697479206e65656420736d616c6c657220657665727960008201527f2074780000000000000000000000000000000000000000000000000000000000602082015250565b6000614002602383612f07565b915061400d82613fa6565b604082019050919050565b6000602082019050818103600083015261403181613ff5565b9050919050565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b600061406e600d83612f07565b915061407982614038565b602082019050919050565b6000602082019050818103600083015261409d81614061565b9050919050565b7f4d696e74207175616e74697479206e65656420736d616c6c6572000000000000600082015250565b60006140da601a83612f07565b91506140e5826140a4565b602082019050919050565b60006020820190508181036000830152614109816140cd565b9050919050565b7f63616e206e6f742066726565206d696e742074686973206d616e790000000000600082015250565b6000614146601b83612f07565b915061415182614110565b602082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b600081905092915050565b600061419282612efc565b61419c818561417c565b93506141ac818560208601612f18565b80840191505092915050565b60006141c48285614187565b91506141d08284614187565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614238602683612f07565b9150614243826141dc565b604082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006142958261426e565b61429f8185614279565b93506142af818560208601612f18565b6142b881612f4b565b840191505092915050565b60006080820190506142d8600083018761304c565b6142e5602083018661304c565b6142f260408301856130e2565b8181036060830152614304818461428a565b905095945050505050565b60008151905061431e81612e6d565b92915050565b60006020828403121561433a57614339612e37565b5b60006143488482850161430f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061438b82612fb7565b915061439683612fb7565b9250826143a6576143a5614351565b5b828204905092915050565b60006143bc82612fb7565b91506143c783612fb7565b9250826143d7576143d6614351565b5b82820690509291505056fea26469706673582212209a795a08ddd54b4ce0426d04b139fe007dcc25bf81a249c5bccb3ce62f8ae96664736f6c634300080e0033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c8063715018a611610102578063a424aa5011610095578063c87b56dd11610064578063c87b56dd14610645578063dc33e68114610682578063e985e9c5146106bf578063f2fde38b146106fc576101d8565b8063a424aa50146105b3578063ad52e588146105dc578063b488cf18146105f3578063b88d4fde1461061c576101d8565b806394354fd0116100d157806394354fd01461051857806395d89b4114610543578063a0712d681461056e578063a22cb4651461058a576101d8565b8063715018a61461048a578063715e6e58146104a157806379502c55146104bd5780638da5cb5b146104ed576101d8565b80633ccfd60b1161017a578063604906dc11610149578063604906dc146103bc5780636352211e146103e7578063685731071461042457806370a082311461044d576101d8565b80633ccfd60b1461032a57806342842e0e14610341578063488299aa1461036a57806355f804b314610393576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab5780631869e7d4146102d657806323b872dd14610301576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612e99565b610725565b6040516102119190612ee1565b60405180910390f35b34801561022657600080fd5b5061022f610807565b60405161023c9190612f95565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612fed565b610899565b604051610279919061305b565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a491906130a2565b610915565b005b3480156102b757600080fd5b506102c0610a1f565b6040516102cd91906130f1565b60405180910390f35b3480156102e257600080fd5b506102eb610a36565b6040516102f89190612ee1565b60405180910390f35b34801561030d57600080fd5b506103286004803603810190610323919061310c565b610a49565b005b34801561033657600080fd5b5061033f610a59565b005b34801561034d57600080fd5b506103686004803603810190610363919061310c565b610bd9565b005b34801561037657600080fd5b50610391600480360381019061038c9190613183565b610bf9565b005b34801561039f57600080fd5b506103ba60048036038101906103b59190613231565b610c8a565b005b3480156103c857600080fd5b506103d1610d1f565b6040516103de91906130f1565b60405180910390f35b3480156103f357600080fd5b5061040e60048036038101906104099190612fed565b610d25565b60405161041b919061305b565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061332a565b610d3b565b005b34801561045957600080fd5b50610474600480360381019061046f91906133ab565b610e7e565b60405161048191906130f1565b60405180910390f35b34801561049657600080fd5b5061049f610f4d565b005b6104bb60048036038101906104b69190612fed565b610fd5565b005b3480156104c957600080fd5b506104d26111f8565b6040516104e4969594939291906133d8565b60405180910390f35b3480156104f957600080fd5b506105026112aa565b60405161050f919061305b565b60405180910390f35b34801561052457600080fd5b5061052d6112d3565b60405161053a91906130f1565b60405180910390f35b34801561054f57600080fd5b506105586112d9565b6040516105659190612f95565b60405180910390f35b61058860048036038101906105839190612fed565b61136b565b005b34801561059657600080fd5b506105b160048036038101906105ac919061346c565b6115ff565b005b3480156105bf57600080fd5b506105da60048036038101906105d591906134ac565b611776565b005b3480156105e857600080fd5b506105f1611804565b005b3480156105ff57600080fd5b5061061a60048036038101906106159190612fed565b6118ac565b005b34801561062857600080fd5b50610643600480360381019061063e919061361c565b611935565b005b34801561065157600080fd5b5061066c60048036038101906106679190612fed565b6119b1565b6040516106799190612f95565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906133ab565b611a4f565b6040516106b691906130f1565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061369f565b611a61565b6040516106f39190612ee1565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e91906133ab565b611af5565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061080057506107ff82611bec565b5b9050919050565b6060600380546108169061370e565b80601f01602080910402602001604051908101604052809291908181526020018280546108429061370e565b801561088f5780601f106108645761010080835404028352916020019161088f565b820191906000526020600020905b81548152906001019060200180831161087257829003601f168201915b5050505050905090565b60006108a482611c56565b6108da576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092082610d25565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610987576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109a6611ca4565b73ffffffffffffffffffffffffffffffffffffffff16141580156109d857506109d6816109d1611ca4565b611a61565b155b15610a0f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1a838383611cac565b505050565b6000610a29611d5e565b6002546001540303905090565b601060009054906101000a900460ff1681565b610a54838383611d67565b505050565b610a61611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610a7f6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc9061378b565b60405180910390fd5b600260095403610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b11906137f7565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610b4890613848565b60006040518083038185875af1925050503d8060008114610b85576040519150601f19603f3d011682016040523d82523d6000602084013e610b8a565b606091505b5050905080610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc5906138a9565b60405180910390fd5b506001600981905550565b610bf483838360405180602001604052806000815250611935565b505050565b610c01611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610c1f6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c9061378b565b60405180910390fd5b80600a8181610c849190613d24565b90505050565b610c92611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610cb06112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd9061378b565b60405180910390fd5b8181600a6005019190610d1a929190612d47565b505050565b60115481565b6000610d308261221b565b600001519050919050565b600260095403610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d77906137f7565b60405180910390fd5b6002600981905550610d90611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610dae6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb9061378b565b60405180910390fd5b60005b84849050811015610e6f57610e5c858583818110610e2857610e27613d32565b5b9050602002016020810190610e3d91906133ab565b848484818110610e5057610e4f613d32565b5b905060200201356124aa565b8080610e6790613d90565b915050610e07565b50600160098190555050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ee5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610f55611ca4565b73ffffffffffffffffffffffffffffffffffffffff16610f736112aa565b73ffffffffffffffffffffffffffffffffffffffff1614610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc09061378b565b60405180910390fd5b610fd360006124c8565b565b60026009540361101a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611011906137f7565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613e24565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613e90565b60405180910390fd5b6000600a60010154600a600001546110f79190613eb0565b90508082611103610a1f565b61110d9190613ee4565b111561114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114590613f86565b60405180910390fd5b601254821115611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90614018565b60405180910390fd5b600082600a600301540290508034146111e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d890614084565b60405180910390fd5b6111eb33846124aa565b5050600160098190555050565b600a8060000154908060010154908060020154908060030154908060040154908060050180546112279061370e565b80601f01602080910402602001604051908101604052809291908181526020018280546112539061370e565b80156112a05780601f10611275576101008083540402835291602001916112a0565b820191906000526020600020905b81548152906001019060200180831161128357829003601f168201915b5050505050905086565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60125481565b6060600480546112e89061370e565b80601f01602080910402602001604051908101604052809291908181526020018280546113149061370e565b80156113615780601f1061133657610100808354040283529160200191611361565b820191906000526020600020905b81548152906001019060200180831161134457829003601f168201915b5050505050905090565b6002600954036113b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a7906137f7565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe90613e24565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90613e90565b60405180910390fd5b6000600a60010154600a6000015461148d9190613eb0565b90508082611499610a1f565b6114a39190613ee4565b11156114e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114db90613f86565b60405180910390fd5b600a600201546114f2610a1f565b106115905760125482111561153c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611533906140f0565b60405180910390fd5b600082600a6003015402905080341461158a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158190614084565b60405180910390fd5b506115e9565b6011548261159d33611a4f565b6115a79190613ee4565b11156115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df9061415c565b60405180910390fd5b5b6115f333836124aa565b50600160098190555050565b611607611ca4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361166b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611678611ca4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611725611ca4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161176a9190612ee1565b60405180910390a35050565b61177e611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661179c6112aa565b73ffffffffffffffffffffffffffffffffffffffff16146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e99061378b565b60405180910390fd5b81601181905550806012819055505050565b61180c611ca4565b73ffffffffffffffffffffffffffffffffffffffff1661182a6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118779061378b565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6118b4611ca4565b73ffffffffffffffffffffffffffffffffffffffff166118d26112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f9061378b565b60405180910390fd5b80600a6003018190555050565b611940848484611d67565b61195f8373ffffffffffffffffffffffffffffffffffffffff1661258c565b80156119745750611972848484846125af565b155b156119ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606119bc82611c56565b6119f2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119fc6126ff565b90506000815103611a1c5760405180602001604052806000815250611a47565b80611a2684612794565b604051602001611a379291906141b8565b6040516020818303038152906040525b915050919050565b6000611a5a826128f4565b9050919050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611afd611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611b1b6112aa565b73ffffffffffffffffffffffffffffffffffffffff1614611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061378b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd79061424e565b60405180910390fd5b611be9816124c8565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611c61611d5e565b11158015611c70575060015482105b8015611c9d575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611d728261221b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611ddd576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611dfe611ca4565b73ffffffffffffffffffffffffffffffffffffffff161480611e2d5750611e2c85611e27611ca4565b611a61565b5b80611e725750611e3b611ca4565b73ffffffffffffffffffffffffffffffffffffffff16611e5a84610899565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611eab576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f11576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f1e858585600161295e565b611f2a60008487611cac565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036121a95760015482146121a857878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122148585856001612964565b5050505050565b612223612dcd565b600082905080612231611d5e565b11158015612240575060015481105b15612473576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161247157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123555780925050506124a5565b5b60011561247057818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461246b5780925050506124a5565b612356565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6124c482826040518060200160405280600081525061296a565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125d5611ca4565b8786866040518563ffffffff1660e01b81526004016125f794939291906142c3565b6020604051808303816000875af192505050801561263357506040513d601f19601f820116820180604052508101906126309190614324565b60015b6126ac573d8060008114612663576040519150601f19603f3d011682016040523d82523d6000602084013e612668565b606091505b5060008151036126a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a60050180546127119061370e565b80601f016020809104026020016040519081016040528092919081815260200182805461273d9061370e565b801561278a5780601f1061275f5761010080835404028352916020019161278a565b820191906000526020600020905b81548152906001019060200180831161276d57829003601f168201915b5050505050905090565b6060600082036127db576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128ef565b600082905060005b6000821461280d5780806127f690613d90565b915050600a826128069190614380565b91506127e3565b60008167ffffffffffffffff811115612829576128286134f1565b5b6040519080825280601f01601f19166020018201604052801561285b5781602001600182028036833780820191505090505b5090505b600085146128e8576001826128749190613eb0565b9150600a8561288391906143b1565b603061288f9190613ee4565b60f81b8183815181106128a5576128a4613d32565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128e19190614380565b945061285f565b8093505050505b919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b612977838383600161297c565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036129e9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612a23576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a30600086838761295e565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612bfa5750612bf98773ffffffffffffffffffffffffffffffffffffffff1661258c565b5b15612cbf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c6f60008884806001019550886125af565b612ca5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612c00578260015414612cba57600080fd5b612d2a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612cc0575b816001819055505050612d406000868387612964565b5050505050565b828054612d539061370e565b90600052602060002090601f016020900481019282612d755760008555612dbc565b82601f10612d8e57803560ff1916838001178555612dbc565b82800160010185558215612dbc579182015b82811115612dbb578235825591602001919060010190612da0565b5b509050612dc99190612e10565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e29576000816000905550600101612e11565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e7681612e41565b8114612e8157600080fd5b50565b600081359050612e9381612e6d565b92915050565b600060208284031215612eaf57612eae612e37565b5b6000612ebd84828501612e84565b91505092915050565b60008115159050919050565b612edb81612ec6565b82525050565b6000602082019050612ef66000830184612ed2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f36578082015181840152602081019050612f1b565b83811115612f45576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f6782612efc565b612f718185612f07565b9350612f81818560208601612f18565b612f8a81612f4b565b840191505092915050565b60006020820190508181036000830152612faf8184612f5c565b905092915050565b6000819050919050565b612fca81612fb7565b8114612fd557600080fd5b50565b600081359050612fe781612fc1565b92915050565b60006020828403121561300357613002612e37565b5b600061301184828501612fd8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130458261301a565b9050919050565b6130558161303a565b82525050565b6000602082019050613070600083018461304c565b92915050565b61307f8161303a565b811461308a57600080fd5b50565b60008135905061309c81613076565b92915050565b600080604083850312156130b9576130b8612e37565b5b60006130c78582860161308d565b92505060206130d885828601612fd8565b9150509250929050565b6130eb81612fb7565b82525050565b600060208201905061310660008301846130e2565b92915050565b60008060006060848603121561312557613124612e37565b5b60006131338682870161308d565b93505060206131448682870161308d565b925050604061315586828701612fd8565b9150509250925092565b600080fd5b600060c0828403121561317a5761317961315f565b5b81905092915050565b60006020828403121561319957613198612e37565b5b600082013567ffffffffffffffff8111156131b7576131b6612e3c565b5b6131c384828501613164565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131f1576131f06131cc565b5b8235905067ffffffffffffffff81111561320e5761320d6131d1565b5b60208301915083600182028301111561322a576132296131d6565b5b9250929050565b6000806020838503121561324857613247612e37565b5b600083013567ffffffffffffffff81111561326657613265612e3c565b5b613272858286016131db565b92509250509250929050565b60008083601f840112613294576132936131cc565b5b8235905067ffffffffffffffff8111156132b1576132b06131d1565b5b6020830191508360208202830111156132cd576132cc6131d6565b5b9250929050565b60008083601f8401126132ea576132e96131cc565b5b8235905067ffffffffffffffff811115613307576133066131d1565b5b602083019150836020820283011115613323576133226131d6565b5b9250929050565b6000806000806040858703121561334457613343612e37565b5b600085013567ffffffffffffffff81111561336257613361612e3c565b5b61336e8782880161327e565b9450945050602085013567ffffffffffffffff81111561339157613390612e3c565b5b61339d878288016132d4565b925092505092959194509250565b6000602082840312156133c1576133c0612e37565b5b60006133cf8482850161308d565b91505092915050565b600060c0820190506133ed60008301896130e2565b6133fa60208301886130e2565b61340760408301876130e2565b61341460608301866130e2565b61342160808301856130e2565b81810360a08301526134338184612f5c565b9050979650505050505050565b61344981612ec6565b811461345457600080fd5b50565b60008135905061346681613440565b92915050565b6000806040838503121561348357613482612e37565b5b60006134918582860161308d565b92505060206134a285828601613457565b9150509250929050565b600080604083850312156134c3576134c2612e37565b5b60006134d185828601612fd8565b92505060206134e285828601612fd8565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61352982612f4b565b810181811067ffffffffffffffff82111715613548576135476134f1565b5b80604052505050565b600061355b612e2d565b90506135678282613520565b919050565b600067ffffffffffffffff821115613587576135866134f1565b5b61359082612f4b565b9050602081019050919050565b82818337600083830152505050565b60006135bf6135ba8461356c565b613551565b9050828152602081018484840111156135db576135da6134ec565b5b6135e684828561359d565b509392505050565b600082601f830112613603576136026131cc565b5b81356136138482602086016135ac565b91505092915050565b6000806000806080858703121561363657613635612e37565b5b60006136448782880161308d565b94505060206136558782880161308d565b935050604061366687828801612fd8565b925050606085013567ffffffffffffffff81111561368757613686612e3c565b5b613693878288016135ee565b91505092959194509250565b600080604083850312156136b6576136b5612e37565b5b60006136c48582860161308d565b92505060206136d58582860161308d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061372657607f821691505b602082108103613739576137386136df565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613775602083612f07565b91506137808261373f565b602082019050919050565b600060208201905081810360008301526137a481613768565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006137e1601f83612f07565b91506137ec826137ab565b602082019050919050565b60006020820190508181036000830152613810816137d4565b9050919050565b600081905092915050565b50565b6000613832600083613817565b915061383d82613822565b600082019050919050565b600061385382613825565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613893601083612f07565b915061389e8261385d565b602082019050919050565b600060208201905081810360008301526138c281613886565b9050919050565b600081356138d681612fc1565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613918846138df565b9350801983169250808416831791505092915050565b6000819050919050565b600061395361394e61394984612fb7565b61392e565b612fb7565b9050919050565b6000819050919050565b61396d82613938565b6139806139798261395a565b83546138ec565b8255505050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126139b3576139b2613987565b5b80840192508235915067ffffffffffffffff8211156139d5576139d461398c565b5b6020830192506001820236038313156139f1576139f0613991565b5b509250929050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a667fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a29565b613a708683613a29565b95508019841693508086168417925050509392505050565b613a9183613938565b613aa5613a9d8261395a565b848454613a36565b825550505050565b600090565b613aba613aad565b613ac5818484613a88565b505050565b5b81811015613ae957613ade600082613ab2565b600181019050613acb565b5050565b601f821115613b2e57613aff81613a04565b613b0884613a19565b81016020851015613b17578190505b613b2b613b2385613a19565b830182613aca565b50505b505050565b600082821c905092915050565b6000613b5160001984600802613b33565b1980831691505092915050565b6000613b6a8383613b40565b9150826002028217905092915050565b613b8483836139f9565b67ffffffffffffffff811115613b9d57613b9c6134f1565b5b613ba7825461370e565b613bb2828285613aed565b6000601f831160018114613be15760008415613bcf578287013590505b613bd98582613b5e565b865550613c41565b601f198416613bef86613a04565b60005b82811015613c1757848901358255600182019150602085019450602081019050613bf2565b86831015613c345784890135613c30601f891682613b40565b8355505b6001600288020188555050505b50505050505050565b613c55838383613b7a565b505050565b600081016000830180613c6c816138c9565b9050613c788184613964565b505050600181016020830180613c8d816138c9565b9050613c998184613964565b505050600281016040830180613cae816138c9565b9050613cba8184613964565b505050600381016060830180613ccf816138c9565b9050613cdb8184613964565b505050600481016080830180613cf0816138c9565b9050613cfc8184613964565b5050506005810160a08301613d118185613996565b613d1c818386613c4a565b505050505050565b613d2e8282613c5a565b5050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d9b82612fb7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dcd57613dcc613d61565b5b600182019050919050565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b6000613e0e600b83612f07565b9150613e1982613dd8565b602082019050919050565b60006020820190508181036000830152613e3d81613e01565b9050919050565b7f436f6e747261637473206e6f7420616c6c6f7765640000000000000000000000600082015250565b6000613e7a601583612f07565b9150613e8582613e44565b602082019050919050565b60006020820190508181036000830152613ea981613e6d565b9050919050565b6000613ebb82612fb7565b9150613ec683612fb7565b925082821015613ed957613ed8613d61565b5b828203905092915050565b6000613eef82612fb7565b9150613efa83612fb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f2f57613f2e613d61565b5b828201905092915050565b7f4578636565642073616c6573206d6178206c696d697400000000000000000000600082015250565b6000613f70601683612f07565b9150613f7b82613f3a565b602082019050919050565b60006020820190508181036000830152613f9f81613f63565b9050919050565b7f4d696e74207175616e74697479206e65656420736d616c6c657220657665727960008201527f2074780000000000000000000000000000000000000000000000000000000000602082015250565b6000614002602383612f07565b915061400d82613fa6565b604082019050919050565b6000602082019050818103600083015261403181613ff5565b9050919050565b7f77726f6e67207061796d656e7400000000000000000000000000000000000000600082015250565b600061406e600d83612f07565b915061407982614038565b602082019050919050565b6000602082019050818103600083015261409d81614061565b9050919050565b7f4d696e74207175616e74697479206e65656420736d616c6c6572000000000000600082015250565b60006140da601a83612f07565b91506140e5826140a4565b602082019050919050565b60006020820190508181036000830152614109816140cd565b9050919050565b7f63616e206e6f742066726565206d696e742074686973206d616e790000000000600082015250565b6000614146601b83612f07565b915061415182614110565b602082019050919050565b6000602082019050818103600083015261417581614139565b9050919050565b600081905092915050565b600061419282612efc565b61419c818561417c565b93506141ac818560208601612f18565b80840191505092915050565b60006141c48285614187565b91506141d08284614187565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614238602683612f07565b9150614243826141dc565b604082019050919050565b600060208201905081810360008301526142678161422b565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006142958261426e565b61429f8185614279565b93506142af818560208601612f18565b6142b881612f4b565b840191505092915050565b60006080820190506142d8600083018761304c565b6142e5602083018661304c565b6142f260408301856130e2565b8181036060830152614304818461428a565b905095945050505050565b60008151905061431e81612e6d565b92915050565b60006020828403121561433a57614339612e37565b5b60006143488482850161430f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061438b82612fb7565b915061439683612fb7565b9250826143a6576143a5614351565b5b828204905092915050565b60006143bc82612fb7565b91506143c783612fb7565b9250826143d7576143d6614351565b5b82820690509291505056fea26469706673582212209a795a08ddd54b4ce0426d04b139fe007dcc25bf81a249c5bccb3ce62f8ae96664736f6c634300080e0033
Deployed Bytecode Sourcemap
47522:3697:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29776:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32889:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34392:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33955:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29025:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47869:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35257:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48756:186;;;;;;;;;;;;;:::i;:::-;;35498:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48547:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48311:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47908:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32697:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48951:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30145:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2606:103;;;;;;;;;;;;;:::i;:::-;;50487:727;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47798:64;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;1955:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47954:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33058:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49482:997;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34668:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49226:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48653:95;;;;;;;;;;;;;:::i;:::-;;48431:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35754:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33233:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48070:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35026:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2864:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29776:305;29878:4;29930:25;29915:40;;;:11;:40;;;;:105;;;;29987:33;29972:48;;;:11;:48;;;;29915:105;:158;;;;30037:36;30061:11;30037:23;:36::i;:::-;29915:158;29895:178;;29776:305;;;:::o;32889:100::-;32943:13;32976:5;32969:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32889:100;:::o;34392:204::-;34460:7;34485:16;34493:7;34485;:16::i;:::-;34480:64;;34510:34;;;;;;;;;;;;;;34480:64;34564:15;:24;34580:7;34564:24;;;;;;;;;;;;;;;;;;;;;34557:31;;34392:204;;;:::o;33955:371::-;34028:13;34044:24;34060:7;34044:15;:24::i;:::-;34028:40;;34089:5;34083:11;;:2;:11;;;34079:48;;34103:24;;;;;;;;;;;;;;34079:48;34160:5;34144:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34170:37;34187:5;34194:12;:10;:12::i;:::-;34170:16;:37::i;:::-;34169:38;34144:63;34140:138;;;34231:35;;;;;;;;;;;;;;34140:138;34290:28;34299:2;34303:7;34312:5;34290:8;:28::i;:::-;34017:309;33955:371;;:::o;29025:303::-;29069:7;29294:15;:13;:15::i;:::-;29279:12;;29263:13;;:28;:46;29256:53;;29025:303;:::o;47869:32::-;;;;;;;;;;;;;:::o;35257:170::-;35391:28;35401:4;35407:2;35411:7;35391:9;:28::i;:::-;35257:170;;;:::o;48756:186::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5235:1:::1;5833:7;;:19:::0;5825:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5235:1;5966:7;:18;;;;48820:12:::2;48838:10;:15;;48861:21;48838:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48819:68;;;48906:7;48898:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;48808:134;5191:1:::1;6145:7;:22;;;;48756:186::o:0;35498:185::-;35636:39;35653:4;35659:2;35663:7;35636:39;;;;;;;;;;;;:16;:39::i;:::-;35498:185;;;:::o;48547:98::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48630:7:::1;48621:6;:16;;;;;;:::i;:::-;;;;48547:98:::0;:::o;48311:112::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48408:7:::1;;48386:6;:19;;:29;;;;;;;:::i;:::-;;48311:112:::0;;:::o;47908:39::-;;;;:::o;32697:125::-;32761:7;32788:21;32801:7;32788:12;:21::i;:::-;:26;;;32781:33;;32697:125;;;:::o;48951:267::-;5235:1;5833:7;;:19;5825:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5235:1;5966:7;:18;;;;2186:12:::1;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49104:9:::2;49099:112;49123:9;;:16;;49119:1;:20;49099:112;;;49161:38;49171:9;;49181:1;49171:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;49185:10;;49196:1;49185:13;;;;;;;:::i;:::-;;;;;;;;49161:9;:38::i;:::-;49141:3;;;;;:::i;:::-;;;;49099:112;;;;5191:1:::0;6145:7;:22;;;;48951:267;;;;:::o;30145:206::-;30209:7;30250:1;30233:19;;:5;:19;;;30229:60;;30261:28;;;;;;;;;;;;;;30229:60;30315:12;:19;30328:5;30315:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30307:36;;30300:43;;30145:206;;;:::o;2606:103::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2671:30:::1;2698:1;2671:18;:30::i;:::-;2606:103::o:0;50487:727::-;5235:1;5833:7;;:19;5825:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5235:1;5966:7;:18;;;;50576:13:::1;;;;;;;;;;;50568:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;50637:10;50624:23;;:9;:23;;;50616:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50684:21;50727:6;:15;;;50708:6;:16;;;:34;;;;:::i;:::-;50684:58;;50803:13;50791:8;50775:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:41;;50753:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;50911:18;;50899:8;:30;;50877:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;51011:12;51084:8;51067:6;:16;;;:25;51059:33;;51135:4;51122:9;:17;51114:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;51175:31;51185:10;51197:8;51175:9;:31::i;:::-;50557:657;;5191:1:::0;6145:7;:22;;;;50487:727;:::o;47798:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1955:87::-;2001:7;2028:6;;;;;;;;;;;2021:13;;1955:87;:::o;47954:36::-;;;;:::o;33058:104::-;33114:13;33147:7;33140:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33058:104;:::o;49482:997::-;5235:1;5833:7;;:19;5825:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5235:1;5966:7;:18;;;;49565:13:::1;;;;;;;;;;;49557:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;49626:10;49613:23;;:9;:23;;;49605:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49673:21;49716:6;:15;;;49697:6;:16;;;:34;;;;:::i;:::-;49673:58;;49792:13;49780:8;49764:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:41;;49742:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;49892:6;:20;;;49875:13;:11;:13::i;:::-;:37;49871:559;;49967:18;;49955:8;:30;;49929:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;50083:12;50166:8;50147:6;:16;;;:27;50139:35;;50225:4;50212:9;:17;50204:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49914:345;49871:559;;;50339:22;;50328:8;50301:24;50314:10;50301:12;:24::i;:::-;:35;;;;:::i;:::-;:60;;50279:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;49871:559;50440:31;50450:10;50462:8;50440:9;:31::i;:::-;49546:933;5191:1:::0;6145:7;:22;;;;49482:997;:::o;34668:287::-;34779:12;:10;:12::i;:::-;34767:24;;:8;:24;;;34763:54;;34800:17;;;;;;;;;;;;;;34763:54;34875:8;34830:18;:32;34849:12;:10;:12::i;:::-;34830:32;;;;;;;;;;;;;;;:42;34863:8;34830:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34928:8;34899:48;;34914:12;:10;:12::i;:::-;34899:48;;;34938:8;34899:48;;;;;;:::i;:::-;;;;;;;;34668:287;;:::o;49226:248::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49392:23:::1;49367:22;:48;;;;49447:19;49426:18;:40;;;;49226:248:::0;;:::o;48653:95::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48727:13:::1;;;;;;;;;;;48726:14;48710:13;;:30;;;;;;;;;;;;;;;;;;48653:95::o:0;48431:108::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48522:9:::1;48503:6;:16;;:28;;;;48431:108:::0;:::o;35754:369::-;35921:28;35931:4;35937:2;35941:7;35921:9;:28::i;:::-;35964:15;:2;:13;;;:15::i;:::-;:76;;;;;35984:56;36015:4;36021:2;36025:7;36034:5;35984:30;:56::i;:::-;35983:57;35964:76;35960:156;;;36064:40;;;;;;;;;;;;;;35960:156;35754:369;;;;:::o;33233:318::-;33306:13;33337:16;33345:7;33337;:16::i;:::-;33332:59;;33362:29;;;;;;;;;;;;;;33332:59;33404:21;33428:10;:8;:10::i;:::-;33404:34;;33481:1;33462:7;33456:21;:26;:87;;;;;;;;;;;;;;;;;33509:7;33518:18;:7;:16;:18::i;:::-;33492:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33456:87;33449:94;;;33233:318;;;:::o;48070:113::-;48128:7;48155:20;48169:5;48155:13;:20::i;:::-;48148:27;;48070:113;;;:::o;35026:164::-;35123:4;35147:18;:25;35166:5;35147:25;;;;;;;;;;;;;;;:35;35173:8;35147:35;;;;;;;;;;;;;;;;;;;;;;;;;35140:42;;35026:164;;;;:::o;2864:201::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2973:1:::1;2953:22;;:8;:22;;::::0;2945:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3029:28;3048:8;3029:18;:28::i;:::-;2864:201:::0;:::o;13654:157::-;13739:4;13778:25;13763:40;;;:11;:40;;;;13756:47;;13654:157;;;:::o;36378:174::-;36435:4;36478:7;36459:15;:13;:15::i;:::-;:26;;:53;;;;;36499:13;;36489:7;:23;36459:53;:85;;;;;36517:11;:20;36529:7;36517:20;;;;;;;;;;;:27;;;;;;;;;;;;36516:28;36459:85;36452:92;;36378:174;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;44535:196::-;44677:2;44650:15;:24;44666:7;44650:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44715:7;44711:2;44695:28;;44704:5;44695:28;;;;;;;;;;;;44535:196;;;:::o;28799:92::-;28855:7;28882:1;28875:8;;28799:92;:::o;39478:2130::-;39593:35;39631:21;39644:7;39631:12;:21::i;:::-;39593:59;;39691:4;39669:26;;:13;:18;;;:26;;;39665:67;;39704:28;;;;;;;;;;;;;;39665:67;39745:22;39787:4;39771:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39808:36;39825:4;39831:12;:10;:12::i;:::-;39808:16;:36::i;:::-;39771:73;:126;;;;39885:12;:10;:12::i;:::-;39861:36;;:20;39873:7;39861:11;:20::i;:::-;:36;;;39771:126;39745:153;;39916:17;39911:66;;39942:35;;;;;;;;;;;;;;39911:66;40006:1;39992:16;;:2;:16;;;39988:52;;40017:23;;;;;;;;;;;;;;39988:52;40053:43;40075:4;40081:2;40085:7;40094:1;40053:21;:43::i;:::-;40161:35;40178:1;40182:7;40191:4;40161:8;:35::i;:::-;40522:1;40492:12;:18;40505:4;40492:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40566:1;40538:12;:16;40551:2;40538:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40584:31;40618:11;:20;40630:7;40618:20;;;;;;;;;;;40584:54;;40669:2;40653:8;:13;;;:18;;;;;;;;;;;;;;;;;;40719:15;40686:8;:23;;;:49;;;;;;;;;;;;;;;;;;40987:19;41019:1;41009:7;:11;40987:33;;41035:31;41069:11;:24;41081:11;41069:24;;;;;;;;;;;41035:58;;41137:1;41112:27;;:8;:13;;;;;;;;;;;;:27;;;41108:384;;41322:13;;41307:11;:28;41303:174;;41376:4;41360:8;:13;;;:20;;;;;;;;;;;;;;;;;;41429:13;:28;;;41403:8;:23;;;:54;;;;;;;;;;;;;;;;;;41303:174;41108:384;40467:1036;;;41539:7;41535:2;41520:27;;41529:4;41520:27;;;;;;;;;;;;41558:42;41579:4;41585:2;41589:7;41598:1;41558:20;:42::i;:::-;39582:2026;;39478:2130;;;:::o;31526:1109::-;31588:21;;:::i;:::-;31622:12;31637:7;31622:22;;31705:4;31686:15;:13;:15::i;:::-;:23;;:47;;;;;31720:13;;31713:4;:20;31686:47;31682:886;;;31754:31;31788:11;:17;31800:4;31788:17;;;;;;;;;;;31754:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31829:9;:16;;;31824:729;;31900:1;31874:28;;:9;:14;;;:28;;;31870:101;;31938:9;31931:16;;;;;;31870:101;32273:261;32280:4;32273:261;;;32313:6;;;;;;;;32358:11;:17;32370:4;32358:17;;;;;;;;;;;32346:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32432:1;32406:28;;:9;:14;;;:28;;;32402:109;;32474:9;32467:16;;;;;;32402:109;32273:261;;;31824:729;31735:833;31682:886;32596:31;;;;;;;;;;;;;;31526:1109;;;;:::o;36560:104::-;36629:27;36639:2;36643:8;36629:27;;;;;;;;;;;;:9;:27::i;:::-;36560:104;;:::o;3225:191::-;3299:16;3318:6;;;;;;;;;;;3299:25;;3344:8;3335:6;;:17;;;;;;;;;;;;;;;;;;3399:8;3368:40;;3389:8;3368:40;;;;;;;;;;;;3288:128;3225:191;:::o;16105:326::-;16165:4;16422:1;16400:7;:19;;;:23;16393:30;;16105:326;;;:::o;45223:667::-;45386:4;45423:2;45407:36;;;45444:12;:10;:12::i;:::-;45458:4;45464:7;45473:5;45407:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45403:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45658:1;45641:6;:13;:18;45637:235;;45687:40;;;;;;;;;;;;;;45637:235;45830:6;45824:13;45815:6;45811:2;45807:15;45800:38;45403:480;45536:45;;;45526:55;;;:6;:55;;;;45519:62;;;45223:667;;;;;;:::o;48191:112::-;48243:13;48276:6;:19;;48269:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48191:112;:::o;23740:723::-;23796:13;24026:1;24017:5;:10;24013:53;;24044:10;;;;;;;;;;;;;;;;;;;;;24013:53;24076:12;24091:5;24076:20;;24107:14;24132:78;24147:1;24139:4;:9;24132:78;;24165:8;;;;;:::i;:::-;;;;24196:2;24188:10;;;;;:::i;:::-;;;24132:78;;;24220:19;24252:6;24242:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24220:39;;24270:154;24286:1;24277:5;:10;24270:154;;24314:1;24304:11;;;;;:::i;:::-;;;24381:2;24373:5;:10;;;;:::i;:::-;24360:2;:24;;;;:::i;:::-;24347:39;;24330:6;24337;24330:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;24410:2;24401:11;;;;;:::i;:::-;;;24270:154;;;24448:6;24434:21;;;;;23740:723;;;;:::o;30433:137::-;30494:7;30529:12;:19;30542:5;30529:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;30521:41;;30514:48;;30433:137;;;:::o;46538:159::-;;;;;:::o;47356:158::-;;;;;:::o;37027:163::-;37150:32;37156:2;37160:8;37170:5;37177:4;37150:5;:32::i;:::-;37027:163;;;:::o;37449:1775::-;37588:20;37611:13;;37588:36;;37653:1;37639:16;;:2;:16;;;37635:48;;37664:19;;;;;;;;;;;;;;37635:48;37710:1;37698:8;:13;37694:44;;37720:18;;;;;;;;;;;;;;37694:44;37751:61;37781:1;37785:2;37789:12;37803:8;37751:21;:61::i;:::-;38124:8;38089:12;:16;38102:2;38089:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38188:8;38148:12;:16;38161:2;38148:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38247:2;38214:11;:25;38226:12;38214:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38314:15;38264:11;:25;38276:12;38264:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38347:20;38370:12;38347:35;;38397:11;38426:8;38411:12;:23;38397:37;;38455:4;:23;;;;;38463:15;:2;:13;;;:15::i;:::-;38455:23;38451:641;;;38499:314;38555:12;38551:2;38530:38;;38547:1;38530:38;;;;;;;;;;;;38596:69;38635:1;38639:2;38643:14;;;;;;38659:5;38596:30;:69::i;:::-;38591:174;;38701:40;;;;;;;;;;;;;;38591:174;38808:3;38792:12;:19;38499:314;;38894:12;38877:13;;:29;38873:43;;38908:8;;;38873:43;38451:641;;;38957:120;39013:14;;;;;;39009:2;38988:40;;39005:1;38988:40;;;;;;;;;;;;39072:3;39056:12;:19;38957:120;;38451:641;39122:12;39106:13;:28;;;;38064:1082;;39156:60;39185:1;39189:2;39193:12;39207:8;39156:20;:60::i;:::-;37577:1647;37449:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6070:231;6142:5;6183:3;6174:6;6169:3;6165:16;6161:26;6158:113;;;6190:79;;:::i;:::-;6158:113;6289:6;6280:15;;6070:231;;;;:::o;6307:541::-;6392:6;6441:2;6429:9;6420:7;6416:23;6412:32;6409:119;;;6447:79;;:::i;:::-;6409:119;6595:1;6584:9;6580:17;6567:31;6625:18;6617:6;6614:30;6611:117;;;6647:79;;:::i;:::-;6611:117;6752:79;6823:7;6814:6;6803:9;6799:22;6752:79;:::i;:::-;6742:89;;6538:303;6307:541;;;;:::o;6854:117::-;6963:1;6960;6953:12;6977:117;7086:1;7083;7076:12;7100:117;7209:1;7206;7199:12;7237:553;7295:8;7305:6;7355:3;7348:4;7340:6;7336:17;7332:27;7322:122;;7363:79;;:::i;:::-;7322:122;7476:6;7463:20;7453:30;;7506:18;7498:6;7495:30;7492:117;;;7528:79;;:::i;:::-;7492:117;7642:4;7634:6;7630:17;7618:29;;7696:3;7688:4;7680:6;7676:17;7666:8;7662:32;7659:41;7656:128;;;7703:79;;:::i;:::-;7656:128;7237:553;;;;;:::o;7796:529::-;7867:6;7875;7924:2;7912:9;7903:7;7899:23;7895:32;7892:119;;;7930:79;;:::i;:::-;7892:119;8078:1;8067:9;8063:17;8050:31;8108:18;8100:6;8097:30;8094:117;;;8130:79;;:::i;:::-;8094:117;8243:65;8300:7;8291:6;8280:9;8276:22;8243:65;:::i;:::-;8225:83;;;;8021:297;7796:529;;;;;:::o;8348:568::-;8421:8;8431:6;8481:3;8474:4;8466:6;8462:17;8458:27;8448:122;;8489:79;;:::i;:::-;8448:122;8602:6;8589:20;8579:30;;8632:18;8624:6;8621:30;8618:117;;;8654:79;;:::i;:::-;8618:117;8768:4;8760:6;8756:17;8744:29;;8822:3;8814:4;8806:6;8802:17;8792:8;8788:32;8785:41;8782:128;;;8829:79;;:::i;:::-;8782:128;8348:568;;;;;:::o;8939:::-;9012:8;9022:6;9072:3;9065:4;9057:6;9053:17;9049:27;9039:122;;9080:79;;:::i;:::-;9039:122;9193:6;9180:20;9170:30;;9223:18;9215:6;9212:30;9209:117;;;9245:79;;:::i;:::-;9209:117;9359:4;9351:6;9347:17;9335:29;;9413:3;9405:4;9397:6;9393:17;9383:8;9379:32;9376:41;9373:128;;;9420:79;;:::i;:::-;9373:128;8939:568;;;;;:::o;9513:934::-;9635:6;9643;9651;9659;9708:2;9696:9;9687:7;9683:23;9679:32;9676:119;;;9714:79;;:::i;:::-;9676:119;9862:1;9851:9;9847:17;9834:31;9892:18;9884:6;9881:30;9878:117;;;9914:79;;:::i;:::-;9878:117;10027:80;10099:7;10090:6;10079:9;10075:22;10027:80;:::i;:::-;10009:98;;;;9805:312;10184:2;10173:9;10169:18;10156:32;10215:18;10207:6;10204:30;10201:117;;;10237:79;;:::i;:::-;10201:117;10350:80;10422:7;10413:6;10402:9;10398:22;10350:80;:::i;:::-;10332:98;;;;10127:313;9513:934;;;;;;;:::o;10453:329::-;10512:6;10561:2;10549:9;10540:7;10536:23;10532:32;10529:119;;;10567:79;;:::i;:::-;10529:119;10687:1;10712:53;10757:7;10748:6;10737:9;10733:22;10712:53;:::i;:::-;10702:63;;10658:117;10453:329;;;;:::o;10788:866::-;11041:4;11079:3;11068:9;11064:19;11056:27;;11093:71;11161:1;11150:9;11146:17;11137:6;11093:71;:::i;:::-;11174:72;11242:2;11231:9;11227:18;11218:6;11174:72;:::i;:::-;11256;11324:2;11313:9;11309:18;11300:6;11256:72;:::i;:::-;11338;11406:2;11395:9;11391:18;11382:6;11338:72;:::i;:::-;11420:73;11488:3;11477:9;11473:19;11464:6;11420:73;:::i;:::-;11541:9;11535:4;11531:20;11525:3;11514:9;11510:19;11503:49;11569:78;11642:4;11633:6;11569:78;:::i;:::-;11561:86;;10788:866;;;;;;;;;:::o;11660:116::-;11730:21;11745:5;11730:21;:::i;:::-;11723:5;11720:32;11710:60;;11766:1;11763;11756:12;11710:60;11660:116;:::o;11782:133::-;11825:5;11863:6;11850:20;11841:29;;11879:30;11903:5;11879:30;:::i;:::-;11782:133;;;;:::o;11921:468::-;11986:6;11994;12043:2;12031:9;12022:7;12018:23;12014:32;12011:119;;;12049:79;;:::i;:::-;12011:119;12169:1;12194:53;12239:7;12230:6;12219:9;12215:22;12194:53;:::i;:::-;12184:63;;12140:117;12296:2;12322:50;12364:7;12355:6;12344:9;12340:22;12322:50;:::i;:::-;12312:60;;12267:115;11921:468;;;;;:::o;12395:474::-;12463:6;12471;12520:2;12508:9;12499:7;12495:23;12491:32;12488:119;;;12526:79;;:::i;:::-;12488:119;12646:1;12671:53;12716:7;12707:6;12696:9;12692:22;12671:53;:::i;:::-;12661:63;;12617:117;12773:2;12799:53;12844:7;12835:6;12824:9;12820:22;12799:53;:::i;:::-;12789:63;;12744:118;12395:474;;;;;:::o;12875:117::-;12984:1;12981;12974:12;12998:180;13046:77;13043:1;13036:88;13143:4;13140:1;13133:15;13167:4;13164:1;13157:15;13184:281;13267:27;13289:4;13267:27;:::i;:::-;13259:6;13255:40;13397:6;13385:10;13382:22;13361:18;13349:10;13346:34;13343:62;13340:88;;;13408:18;;:::i;:::-;13340:88;13448:10;13444:2;13437:22;13227:238;13184:281;;:::o;13471:129::-;13505:6;13532:20;;:::i;:::-;13522:30;;13561:33;13589:4;13581:6;13561:33;:::i;:::-;13471:129;;;:::o;13606:307::-;13667:4;13757:18;13749:6;13746:30;13743:56;;;13779:18;;:::i;:::-;13743:56;13817:29;13839:6;13817:29;:::i;:::-;13809:37;;13901:4;13895;13891:15;13883:23;;13606:307;;;:::o;13919:154::-;14003:6;13998:3;13993;13980:30;14065:1;14056:6;14051:3;14047:16;14040:27;13919:154;;;:::o;14079:410::-;14156:5;14181:65;14197:48;14238:6;14197:48;:::i;:::-;14181:65;:::i;:::-;14172:74;;14269:6;14262:5;14255:21;14307:4;14300:5;14296:16;14345:3;14336:6;14331:3;14327:16;14324:25;14321:112;;;14352:79;;:::i;:::-;14321:112;14442:41;14476:6;14471:3;14466;14442:41;:::i;:::-;14162:327;14079:410;;;;;:::o;14508:338::-;14563:5;14612:3;14605:4;14597:6;14593:17;14589:27;14579:122;;14620:79;;:::i;:::-;14579:122;14737:6;14724:20;14762:78;14836:3;14828:6;14821:4;14813:6;14809:17;14762:78;:::i;:::-;14753:87;;14569:277;14508:338;;;;:::o;14852:943::-;14947:6;14955;14963;14971;15020:3;15008:9;14999:7;14995:23;14991:33;14988:120;;;15027:79;;:::i;:::-;14988:120;15147:1;15172:53;15217:7;15208:6;15197:9;15193:22;15172:53;:::i;:::-;15162:63;;15118:117;15274:2;15300:53;15345:7;15336:6;15325:9;15321:22;15300:53;:::i;:::-;15290:63;;15245:118;15402:2;15428:53;15473:7;15464:6;15453:9;15449:22;15428:53;:::i;:::-;15418:63;;15373:118;15558:2;15547:9;15543:18;15530:32;15589:18;15581:6;15578:30;15575:117;;;15611:79;;:::i;:::-;15575:117;15716:62;15770:7;15761:6;15750:9;15746:22;15716:62;:::i;:::-;15706:72;;15501:287;14852:943;;;;;;;:::o;15801:474::-;15869:6;15877;15926:2;15914:9;15905:7;15901:23;15897:32;15894:119;;;15932:79;;:::i;:::-;15894:119;16052:1;16077:53;16122:7;16113:6;16102:9;16098:22;16077:53;:::i;:::-;16067:63;;16023:117;16179:2;16205:53;16250:7;16241:6;16230:9;16226:22;16205:53;:::i;:::-;16195:63;;16150:118;15801:474;;;;;:::o;16281:180::-;16329:77;16326:1;16319:88;16426:4;16423:1;16416:15;16450:4;16447:1;16440:15;16467:320;16511:6;16548:1;16542:4;16538:12;16528:22;;16595:1;16589:4;16585:12;16616:18;16606:81;;16672:4;16664:6;16660:17;16650:27;;16606:81;16734:2;16726:6;16723:14;16703:18;16700:38;16697:84;;16753:18;;:::i;:::-;16697:84;16518:269;16467:320;;;:::o;16793:182::-;16933:34;16929:1;16921:6;16917:14;16910:58;16793:182;:::o;16981:366::-;17123:3;17144:67;17208:2;17203:3;17144:67;:::i;:::-;17137:74;;17220:93;17309:3;17220:93;:::i;:::-;17338:2;17333:3;17329:12;17322:19;;16981:366;;;:::o;17353:419::-;17519:4;17557:2;17546:9;17542:18;17534:26;;17606:9;17600:4;17596:20;17592:1;17581:9;17577:17;17570:47;17634:131;17760:4;17634:131;:::i;:::-;17626:139;;17353:419;;;:::o;17778:181::-;17918:33;17914:1;17906:6;17902:14;17895:57;17778:181;:::o;17965:366::-;18107:3;18128:67;18192:2;18187:3;18128:67;:::i;:::-;18121:74;;18204:93;18293:3;18204:93;:::i;:::-;18322:2;18317:3;18313:12;18306:19;;17965:366;;;:::o;18337:419::-;18503:4;18541:2;18530:9;18526:18;18518:26;;18590:9;18584:4;18580:20;18576:1;18565:9;18561:17;18554:47;18618:131;18744:4;18618:131;:::i;:::-;18610:139;;18337:419;;;:::o;18762:147::-;18863:11;18900:3;18885:18;;18762:147;;;;:::o;18915:114::-;;:::o;19035:398::-;19194:3;19215:83;19296:1;19291:3;19215:83;:::i;:::-;19208:90;;19307:93;19396:3;19307:93;:::i;:::-;19425:1;19420:3;19416:11;19409:18;;19035:398;;;:::o;19439:379::-;19623:3;19645:147;19788:3;19645:147;:::i;:::-;19638:154;;19809:3;19802:10;;19439:379;;;:::o;19824:166::-;19964:18;19960:1;19952:6;19948:14;19941:42;19824:166;:::o;19996:366::-;20138:3;20159:67;20223:2;20218:3;20159:67;:::i;:::-;20152:74;;20235:93;20324:3;20235:93;:::i;:::-;20353:2;20348:3;20344:12;20337:19;;19996:366;;;:::o;20368:419::-;20534:4;20572:2;20561:9;20557:18;20549:26;;20621:9;20615:4;20611:20;20607:1;20596:9;20592:17;20585:47;20649:131;20775:4;20649:131;:::i;:::-;20641:139;;20368:419;;;:::o;20979:186::-;21024:11;21073:3;21060:17;21086:33;21113:5;21086:33;:::i;:::-;21153:5;21129:29;;21036:129;20979:186;;;:::o;21171:92::-;21203:8;21250:5;21247:1;21243:13;21222:34;;21171:92;;;:::o;21269:290::-;21327:6;21356:66;21443:22;21456:8;21443:22;:::i;:::-;21431:34;;21498:4;21494:9;21487:5;21483:21;21474:30;;21547:4;21537:8;21533:19;21526:5;21523:30;21513:40;;21334:225;21269:290;;;;:::o;21565:60::-;21593:3;21614:5;21607:12;;21565:60;;;:::o;21631:142::-;21681:9;21714:53;21732:34;21741:24;21759:5;21741:24;:::i;:::-;21732:34;:::i;:::-;21714:53;:::i;:::-;21701:66;;21631:142;;;:::o;21779:75::-;21822:3;21843:5;21836:12;;21779:75;;;:::o;21860:262::-;21970:39;22001:7;21970:39;:::i;:::-;22031:84;22073:41;22097:16;22073:41;:::i;:::-;22066:4;22060:11;22031:84;:::i;:::-;22025:4;22018:98;21936:186;21860:262;;:::o;22128:117::-;22237:1;22234;22227:12;22251:117;22360:1;22357;22350:12;22374:117;22483:1;22480;22473:12;22497:725;22575:4;22581:6;22637:11;22624:25;22737:1;22731:4;22727:12;22716:8;22700:14;22696:29;22692:48;22672:18;22668:73;22658:168;;22745:79;;:::i;:::-;22658:168;22857:18;22847:8;22843:33;22835:41;;22909:4;22896:18;22886:28;;22937:18;22929:6;22926:30;22923:117;;;22959:79;;:::i;:::-;22923:117;23067:2;23061:4;23057:13;23049:21;;23124:4;23116:6;23112:17;23096:14;23092:38;23086:4;23082:49;23079:136;;;23134:79;;:::i;:::-;23079:136;22588:634;22497:725;;;;;:::o;23228:97::-;23287:6;23315:3;23305:13;;23228:97;;;;:::o;23331:141::-;23380:4;23403:3;23395:11;;23426:3;23423:1;23416:14;23460:4;23457:1;23447:18;23439:26;;23331:141;;;:::o;23478:93::-;23515:6;23562:2;23557;23550:5;23546:14;23542:23;23532:33;;23478:93;;;:::o;23577:107::-;23621:8;23671:5;23665:4;23661:16;23640:37;;23577:107;;;;:::o;23690:393::-;23759:6;23809:1;23797:10;23793:18;23832:97;23862:66;23851:9;23832:97;:::i;:::-;23950:39;23980:8;23969:9;23950:39;:::i;:::-;23938:51;;24022:4;24018:9;24011:5;24007:21;23998:30;;24071:4;24061:8;24057:19;24050:5;24047:30;24037:40;;23766:317;;23690:393;;;;;:::o;24089:269::-;24199:39;24230:7;24199:39;:::i;:::-;24260:91;24309:41;24333:16;24309:41;:::i;:::-;24301:6;24294:4;24288:11;24260:91;:::i;:::-;24254:4;24247:105;24165:193;24089:269;;;:::o;24364:73::-;24409:3;24364:73;:::o;24443:189::-;24520:32;;:::i;:::-;24561:65;24619:6;24611;24605:4;24561:65;:::i;:::-;24496:136;24443:189;;:::o;24638:186::-;24698:120;24715:3;24708:5;24705:14;24698:120;;;24769:39;24806:1;24799:5;24769:39;:::i;:::-;24742:1;24735:5;24731:13;24722:22;;24698:120;;;24638:186;;:::o;24830:543::-;24931:2;24926:3;24923:11;24920:446;;;24965:38;24997:5;24965:38;:::i;:::-;25049:29;25067:10;25049:29;:::i;:::-;25039:8;25035:44;25232:2;25220:10;25217:18;25214:49;;;25253:8;25238:23;;25214:49;25276:80;25332:22;25350:3;25332:22;:::i;:::-;25322:8;25318:37;25305:11;25276:80;:::i;:::-;24935:431;;24920:446;24830:543;;;:::o;25379:117::-;25433:8;25483:5;25477:4;25473:16;25452:37;;25379:117;;;;:::o;25502:169::-;25546:6;25579:51;25627:1;25623:6;25615:5;25612:1;25608:13;25579:51;:::i;:::-;25575:56;25660:4;25654;25650:15;25640:25;;25553:118;25502:169;;;;:::o;25676:295::-;25752:4;25898:29;25923:3;25917:4;25898:29;:::i;:::-;25890:37;;25960:3;25957:1;25953:11;25947:4;25944:21;25936:29;;25676:295;;;;:::o;25976:1403::-;26100:44;26140:3;26135;26100:44;:::i;:::-;26209:18;26201:6;26198:30;26195:56;;;26231:18;;:::i;:::-;26195:56;26275:38;26307:4;26301:11;26275:38;:::i;:::-;26360:67;26420:6;26412;26406:4;26360:67;:::i;:::-;26454:1;26483:2;26475:6;26472:14;26500:1;26495:632;;;;27171:1;27188:6;27185:84;;;27244:9;27239:3;27235:19;27222:33;27213:42;;27185:84;27295:67;27355:6;27348:5;27295:67;:::i;:::-;27289:4;27282:81;27144:229;26465:908;;26495:632;26547:4;26543:9;26535:6;26531:22;26581:37;26613:4;26581:37;:::i;:::-;26640:1;26654:215;26668:7;26665:1;26662:14;26654:215;;;26754:9;26749:3;26745:19;26732:33;26724:6;26717:49;26805:1;26797:6;26793:14;26783:24;;26852:2;26841:9;26837:18;26824:31;;26691:4;26688:1;26684:12;26679:17;;26654:215;;;26897:6;26888:7;26885:19;26882:186;;;26962:9;26957:3;26953:19;26940:33;27005:48;27047:4;27039:6;27035:17;27024:9;27005:48;:::i;:::-;26997:6;26990:64;26905:163;26882:186;27114:1;27110;27102:6;27098:14;27094:22;27088:4;27081:36;26502:625;;;26465:908;;26075:1304;;;25976:1403;;;:::o;27385:218::-;27500:97;27589:7;27580;27574:4;27500:97;:::i;:::-;27385:218;;;:::o;27609:2184::-;27783:1;27777:4;27773:12;27829:1;27822:5;27818:13;27879:12;27922:42;27950:13;27922:42;:::i;:::-;27905:59;;27978:78;28042:13;28030:10;27978:78;:::i;:::-;27740:327;;;28120:1;28114:4;28110:12;28166:2;28159:5;28155:14;28217:12;28260:42;28288:13;28260:42;:::i;:::-;28243:59;;28316:78;28380:13;28368:10;28316:78;:::i;:::-;28077:328;;;28458:1;28452:4;28448:12;28504:2;28497:5;28493:14;28555:12;28598:42;28626:13;28598:42;:::i;:::-;28581:59;;28654:78;28718:13;28706:10;28654:78;:::i;:::-;28415:328;;;28796:1;28790:4;28786:12;28842:2;28835:5;28831:14;28893:12;28936:42;28964:13;28936:42;:::i;:::-;28919:59;;28992:78;29056:13;29044:10;28992:78;:::i;:::-;28753:328;;;29134:1;29128:4;29124:12;29180:3;29173:5;29169:15;29232:12;29275:42;29303:13;29275:42;:::i;:::-;29258:59;;29331:78;29395:13;29383:10;29331:78;:::i;:::-;29091:329;;;29473:1;29467:4;29463:12;29519:3;29512:5;29508:15;29586:63;29636:12;29629:5;29586:63;:::i;:::-;29663:112;29761:13;29746;29734:10;29663:112;:::i;:::-;29430:356;;;;27609:2184;;:::o;29799:252::-;29933:112;30037:7;30031:4;29933:112;:::i;:::-;29799:252;;:::o;30057:180::-;30105:77;30102:1;30095:88;30202:4;30199:1;30192:15;30226:4;30223:1;30216:15;30243:180;30291:77;30288:1;30281:88;30388:4;30385:1;30378:15;30412:4;30409:1;30402:15;30429:233;30468:3;30491:24;30509:5;30491:24;:::i;:::-;30482:33;;30537:66;30530:5;30527:77;30524:103;;30607:18;;:::i;:::-;30524:103;30654:1;30647:5;30643:13;30636:20;;30429:233;;;:::o;30668:161::-;30808:13;30804:1;30796:6;30792:14;30785:37;30668:161;:::o;30835:366::-;30977:3;30998:67;31062:2;31057:3;30998:67;:::i;:::-;30991:74;;31074:93;31163:3;31074:93;:::i;:::-;31192:2;31187:3;31183:12;31176:19;;30835:366;;;:::o;31207:419::-;31373:4;31411:2;31400:9;31396:18;31388:26;;31460:9;31454:4;31450:20;31446:1;31435:9;31431:17;31424:47;31488:131;31614:4;31488:131;:::i;:::-;31480:139;;31207:419;;;:::o;31632:171::-;31772:23;31768:1;31760:6;31756:14;31749:47;31632:171;:::o;31809:366::-;31951:3;31972:67;32036:2;32031:3;31972:67;:::i;:::-;31965:74;;32048:93;32137:3;32048:93;:::i;:::-;32166:2;32161:3;32157:12;32150:19;;31809:366;;;:::o;32181:419::-;32347:4;32385:2;32374:9;32370:18;32362:26;;32434:9;32428:4;32424:20;32420:1;32409:9;32405:17;32398:47;32462:131;32588:4;32462:131;:::i;:::-;32454:139;;32181:419;;;:::o;32606:191::-;32646:4;32666:20;32684:1;32666:20;:::i;:::-;32661:25;;32700:20;32718:1;32700:20;:::i;:::-;32695:25;;32739:1;32736;32733:8;32730:34;;;32744:18;;:::i;:::-;32730:34;32789:1;32786;32782:9;32774:17;;32606:191;;;;:::o;32803:305::-;32843:3;32862:20;32880:1;32862:20;:::i;:::-;32857:25;;32896:20;32914:1;32896:20;:::i;:::-;32891:25;;33050:1;32982:66;32978:74;32975:1;32972:81;32969:107;;;33056:18;;:::i;:::-;32969:107;33100:1;33097;33093:9;33086:16;;32803:305;;;;:::o;33114:172::-;33254:24;33250:1;33242:6;33238:14;33231:48;33114:172;:::o;33292:366::-;33434:3;33455:67;33519:2;33514:3;33455:67;:::i;:::-;33448:74;;33531:93;33620:3;33531:93;:::i;:::-;33649:2;33644:3;33640:12;33633:19;;33292:366;;;:::o;33664:419::-;33830:4;33868:2;33857:9;33853:18;33845:26;;33917:9;33911:4;33907:20;33903:1;33892:9;33888:17;33881:47;33945:131;34071:4;33945:131;:::i;:::-;33937:139;;33664:419;;;:::o;34089:222::-;34229:34;34225:1;34217:6;34213:14;34206:58;34298:5;34293:2;34285:6;34281:15;34274:30;34089:222;:::o;34317:366::-;34459:3;34480:67;34544:2;34539:3;34480:67;:::i;:::-;34473:74;;34556:93;34645:3;34556:93;:::i;:::-;34674:2;34669:3;34665:12;34658:19;;34317:366;;;:::o;34689:419::-;34855:4;34893:2;34882:9;34878:18;34870:26;;34942:9;34936:4;34932:20;34928:1;34917:9;34913:17;34906:47;34970:131;35096:4;34970:131;:::i;:::-;34962:139;;34689:419;;;:::o;35114:163::-;35254:15;35250:1;35242:6;35238:14;35231:39;35114:163;:::o;35283:366::-;35425:3;35446:67;35510:2;35505:3;35446:67;:::i;:::-;35439:74;;35522:93;35611:3;35522:93;:::i;:::-;35640:2;35635:3;35631:12;35624:19;;35283:366;;;:::o;35655:419::-;35821:4;35859:2;35848:9;35844:18;35836:26;;35908:9;35902:4;35898:20;35894:1;35883:9;35879:17;35872:47;35936:131;36062:4;35936:131;:::i;:::-;35928:139;;35655:419;;;:::o;36080:176::-;36220:28;36216:1;36208:6;36204:14;36197:52;36080:176;:::o;36262:366::-;36404:3;36425:67;36489:2;36484:3;36425:67;:::i;:::-;36418:74;;36501:93;36590:3;36501:93;:::i;:::-;36619:2;36614:3;36610:12;36603:19;;36262:366;;;:::o;36634:419::-;36800:4;36838:2;36827:9;36823:18;36815:26;;36887:9;36881:4;36877:20;36873:1;36862:9;36858:17;36851:47;36915:131;37041:4;36915:131;:::i;:::-;36907:139;;36634:419;;;:::o;37059:177::-;37199:29;37195:1;37187:6;37183:14;37176:53;37059:177;:::o;37242:366::-;37384:3;37405:67;37469:2;37464:3;37405:67;:::i;:::-;37398:74;;37481:93;37570:3;37481:93;:::i;:::-;37599:2;37594:3;37590:12;37583:19;;37242:366;;;:::o;37614:419::-;37780:4;37818:2;37807:9;37803:18;37795:26;;37867:9;37861:4;37857:20;37853:1;37842:9;37838:17;37831:47;37895:131;38021:4;37895:131;:::i;:::-;37887:139;;37614:419;;;:::o;38039:148::-;38141:11;38178:3;38163:18;;38039:148;;;;:::o;38193:377::-;38299:3;38327:39;38360:5;38327:39;:::i;:::-;38382:89;38464:6;38459:3;38382:89;:::i;:::-;38375:96;;38480:52;38525:6;38520:3;38513:4;38506:5;38502:16;38480:52;:::i;:::-;38557:6;38552:3;38548:16;38541:23;;38303:267;38193:377;;;;:::o;38576:435::-;38756:3;38778:95;38869:3;38860:6;38778:95;:::i;:::-;38771:102;;38890:95;38981:3;38972:6;38890:95;:::i;:::-;38883:102;;39002:3;38995:10;;38576:435;;;;;:::o;39017:225::-;39157:34;39153:1;39145:6;39141:14;39134:58;39226:8;39221:2;39213:6;39209:15;39202:33;39017:225;:::o;39248:366::-;39390:3;39411:67;39475:2;39470:3;39411:67;:::i;:::-;39404:74;;39487:93;39576:3;39487:93;:::i;:::-;39605:2;39600:3;39596:12;39589:19;;39248:366;;;:::o;39620:419::-;39786:4;39824:2;39813:9;39809:18;39801:26;;39873:9;39867:4;39863:20;39859:1;39848:9;39844:17;39837:47;39901:131;40027:4;39901:131;:::i;:::-;39893:139;;39620:419;;;:::o;40045:98::-;40096:6;40130:5;40124:12;40114:22;;40045:98;;;:::o;40149:168::-;40232:11;40266:6;40261:3;40254:19;40306:4;40301:3;40297:14;40282:29;;40149:168;;;;:::o;40323:360::-;40409:3;40437:38;40469:5;40437:38;:::i;:::-;40491:70;40554:6;40549:3;40491:70;:::i;:::-;40484:77;;40570:52;40615:6;40610:3;40603:4;40596:5;40592:16;40570:52;:::i;:::-;40647:29;40669:6;40647:29;:::i;:::-;40642:3;40638:39;40631:46;;40413:270;40323:360;;;;:::o;40689:640::-;40884:4;40922:3;40911:9;40907:19;40899:27;;40936:71;41004:1;40993:9;40989:17;40980:6;40936:71;:::i;:::-;41017:72;41085:2;41074:9;41070:18;41061:6;41017:72;:::i;:::-;41099;41167:2;41156:9;41152:18;41143:6;41099:72;:::i;:::-;41218:9;41212:4;41208:20;41203:2;41192:9;41188:18;41181:48;41246:76;41317:4;41308:6;41246:76;:::i;:::-;41238:84;;40689:640;;;;;;;:::o;41335:141::-;41391:5;41422:6;41416:13;41407:22;;41438:32;41464:5;41438:32;:::i;:::-;41335:141;;;;:::o;41482:349::-;41551:6;41600:2;41588:9;41579:7;41575:23;41571:32;41568:119;;;41606:79;;:::i;:::-;41568:119;41726:1;41751:63;41806:7;41797:6;41786:9;41782:22;41751:63;:::i;:::-;41741:73;;41697:127;41482:349;;;;:::o;41837:180::-;41885:77;41882:1;41875:88;41982:4;41979:1;41972:15;42006:4;42003:1;41996:15;42023:185;42063:1;42080:20;42098:1;42080:20;:::i;:::-;42075:25;;42114:20;42132:1;42114:20;:::i;:::-;42109:25;;42153:1;42143:35;;42158:18;;:::i;:::-;42143:35;42200:1;42197;42193:9;42188:14;;42023:185;;;;:::o;42214:176::-;42246:1;42263:20;42281:1;42263:20;:::i;:::-;42258:25;;42297:20;42315:1;42297:20;:::i;:::-;42292:25;;42336:1;42326:35;;42341:18;;:::i;:::-;42326:35;42382:1;42379;42375:9;42370:14;;42214:176;;;;:::o
Swarm Source
ipfs://9a795a08ddd54b4ce0426d04b139fe007dcc25bf81a249c5bccb3ce62f8ae966
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.